Vous êtes victime d’un incident de sécurité ? Contactez notre CERT

22/10/2025

Cybersecurity Insights

European Cyber Week 2025: Challenges & Write ups

Team CESTI

Like every year, the European Cyber Week organized an online qualification round for their CTF event that will take place during the event in November. AMOSSYS, once again, helped on this qualification phase by creating a couple of challenges. These challenges were of various complexity and various themes (like crackme, forensic or crypto).

This year, the theme of the CTF is the space, thus our challenges were designed around this topic. One challenge was meant to crack a software deployed on a satellite and locked up by an automatic protection. The forensic one was based on a post-mortem analysis of a drone communication. Finally, to find the flag of the cryptographic one, the challengers had to break a post-quantum Key Exchange Mechanism.

On this post, we provide the detailed write-ups for these three challenges, in case you didn’t manage to find the flags.

Challenges

Sky Seal 10

The Silent Packets

Learning from error

Write Ups

Sky Seal 10

The year is 2039. Humanity has grown heavily reliant on an ultra-secure satellite network known as SkyNet Quantum Link. But disaster strikes: a critical node, Satellite #10 – Sky Seal, suddenly goes dark.

A cybersecurity analyst team uncovers that an automatic lockdown has been triggered. To restore access, a valid authentication key must be regenerated.

Your objective is to analyze the binary file, understand the internal logic, and reconstruct the legitimate key that will restore access to the satellite’s data systems.

Time is critical. The longer Sky Seal 10 stays offline, the greater the risk of downstream system collapse.

A binary is given and a key is asked when executed.

				
					$ ./sky_seal_10
Welcome to the sky_seal_10 challenge!

Key:
				
			

The challenger has to find the correct key. It is now time to reverse the binary using IDA Pro or Ghidra to understand the logic.

Before to start, the binary validates the input type. A 16-bytes string composed of hexadecimal chars is required.

				
					fn validate_input(input: &str) {
    let re: Regex = Regex::new(r"^[0-9a-fA-F]{32}$").unwrap();
    if !re.is_match(input) {
        println!("Key must be 32 hex chars!");
        println!("Exiting.");
        process::exit(0);
    }
}
				
			

The entered key is then splitted into two parts. Each part is checked in a dedicated function.

In the first function, the first part of the key is checked.

				
					fn check_key_part_0(internal_state: &mut InternalState, key_part_0: &[u8]) -> i32 {
    let mut tmp: [u8; 8] = [0xe4, 0x7f, 0x85, 0xa2, 0x5c, 0x31, 0x56, 0x19];
    let key: [u8; 4] = [0x89, 0x9F, 0x22, 0x76];
    for i in 4..8 {
        tmp[i] ^= key[i % 4];
        internal_state.tick += 1;
    }
    for i in 0..8 {
        if key_part_0[i]!= tmp[i] {
            return -1;
            }
        internal_state.tick += 2;
    }
    0
}


				
			

An array (tmp on the picture) is xored with an internal key array (key) modulo 4. Only the second part of the array is xored, not the first part. Also, a tick value is incremented from 0 to 4. After that, the first part of the entered key is checked byte by byte against the obtained value. During this phase, the tick value is incremented by 2 each round. So, at the end, if the entered key is good, the tick value is 20.

In the second function, the second part of the key is checked.

				
					fn check_key_part_1(tick: u8, key_part_1: &[u8]) -> i32 {
    let mut tmp: [u8; 8] = [0; 8];
    let tmp_final: [u8; 8] = [0xea, 0xc6, 0xd5, 0x9a, 0x08, 0x3f, 0x27, 0xea];
    for i in 0..8 {
        tmp[i] = key_part_1[i].rotate_left(tick.into());
        tmp[i] ^= tick - i as u8;
        tmp[i] = tmp[i].rotate_right(tick.into());
    }
    for i in 0..8 {
        if tmp[i]!= tmp_final[i] {
            return -1;
        }
    }
    0
}

				
			

For each byte of the key, the following operations are performed:

  • rotation left by tick value
  • the result is xored with the tick value – i (i being the iteration number from 0 to 7)
  • rotation right by tick value is applied on the result

At the end, the obtained array is compared byte by byte with the tmp_final array. By following these instructions, the following Python3 script can be implemented in order to solve the challenge.

				
					#!/usr/bin/python3
-- coding: utf-8 --

def ror(value, nb):
    nb %= 8
    return value >> nb | (value << (8 - nb)) & 0xff

def rol(value, nb):
    nb %= 8
    return ((value << nb) & 0xff) | (value >> (8 - nb))

def compute_key_part_0(tick):
    tmp = [0xe4, 0x7f, 0x85, 0xa2, 0x5c, 0x31, 0x56, 0x19]
    key = [0x89, 0x9F, 0x22, 0x76]
    for i in range(4, 8):
        tmp[i] ^= key[i % 4]
        tick += 1
    for i in range(8):
tick += 2
    return tick, tmp

def compute_key_part_1(tick):
    tmp_final = [0xea, 0xc6, 0xd5, 0x9a, 0x08, 0x3f, 0x27, 0xea]
    tmp = [0] * 8
    for i in range(8):
        tmp[i] = ror(tmp_final[i], tick)
        tmp[i] ^= tick – i
        tmp[i] = rol(tmp[i], tick)
    return 0, tmp

if name == 'main':
    #print('[+] The two parts of the original key must be found')
    #print('[+] Use Ghidra or IDA to understand the logic')
    #print('[+] A first function is dedicated to check the first part of the key')
    #print('[+] A second function is dedicated to check the second part of the key')
    #print('[+] The size of the key is 16 bytes')
    #print('[+] Also, a tick is incremented during each check')
    #print()

    tick, key_part_0 = compute_key_part_0(0)
    print('key_part_0:', ''.join('{:02x}'.format(x) for x in key_part_0))

    tick, key_part_1 = compute_key_part_1(tick)
    print('key_part_1:', ''.join('{:02x}'.format(x) for x in key_part_1))

    key = key_part_0 + key_part_1
    print('key:', ''.join('{:02x}'.format(x) for x in key))

				
			

If the two functions succeed, the encrypted flag is decrypted and printed.

				
					$ python3 solve.py
key_part_0: e47f85a2d5ae746f
key_part_1: abf7f48b09cfc73a
key: e47f85a2d5ae746fabf7f48b09cfc73a
				
			

To finish, the flag is obtained by executing the binary with the good key.

				
					$ ./sky_seal_10
Welcome to the sky_seal_10 challenge!

Key: e47f85a2d5ae746fabf7f48b09cfc73a

Good key, congratulations! You can validate the challenge using the following flag: ECW{UNL0CK3D_BY_REV3RS3_ENG1N3!}

				
			

The Silent Packets

April 2025 – In a sensitive maritime surveillance context, one of our autonomous drones operating offshore experienced a critical security incident.

This drone was remotely operated via a satellite link and was equipped with an onboard Linux system integrating both OT and IT layers, including a web-based supervision server for operators.

Log data shows that the drone temporarily:

  • lost its GPS connection,
  • experienced partial communication jamming,
  • and most notably: an unknown kernel module was dynamically loaded.

It is explained in the challenge’s description that a kernel module is dynamically loaded. We can infer that the pcap file contains a communication with the server.

This server receives an HTTP request with the TCP URG flag set. It is a furtivity technique used by attackers to communicate bytes. Those bytes form a key (up to a terminating NUL byte) which is then used as an argument to load a kernel module (.ko). The module applies transformations (XOR / encryption) and produces a final payload: a JPEG image that contains hidden data. The final extraction is performed with steghide using the author value (hinted by a ROT13 message in the module) as the passphrase.

1. Pcap Analysis

1.1. Goal

Identify TCP segments with the URG flag and extract the bytes carried by those segments.

The objective here is to retrieve how a key is transfered to the remote server. At first, the pcap seems to be a simple benign HTTP exchange. However, the URG flag is a bit odd for such a communication. This furtivity step is known as TCP Urgent Pointer. On each packet, an extra byte is added after the checksum which does not interfer with the original HTTP exchange. The same exchange is splitted in several pacets. As a result, the reconscruted HTTP request does not show these extra bytes.

1.2. Retrieving the key

				
					$ tshark -r output.pcap -Y "tcp.flags.urg == 1" -T fields -e tcp.seq -e tcp.payload[0:1]
1 ba
22 da
42 55
62 c0
82 ff
102 ee
122 00

				
			

Concatenate payload values without 0x00 (end char) to build the key. Because the key is understandable and short, it could be visually reconstructed using wireshark too. The final key exchanged in the pcap is 0xbada55c0ffee.

2. Kernel module analysis

In the dmesg.txt file, one can read at the end of the file that the module named kern_http is odd. No verficiation is performed or signature is found. In addition, the module is loaded last and a print explains that a payload is written to /tmp/flag. This is the file to retrieve. After inspection either dynamic or static of the kernel module, it appears that the flag is ciphered. The key was retrieved in step 1. It is known that the expected file to retrieve is a JPG file as shown in the reverse of the kernel module. As a result, it is possible to retrieve the IV since the key, the ciphertext and the headers bytes are known (jpeg ones). Once you have retrieved the IV (which appear to be not initialized, therefore null), use the key 0xbada55c0ffee with the AES-CBC mode to retrieve the original picture.

3. Steganography

The module included a ROT13-encoded note in the module’s description field instructing the solver to use the author value as the passphrase for the final step. Such author is M&NTIS.

You can extract hidden data with steghide:

				
					steghide extract -sf candidate.jpg -p "M&NTIS"
				
			

The extracted file contains the real final flag: ECW{gg_U_d4s4rv3_a_c00kie_but_h3r3_is_a_Fl4G}.

Learning from error

A communication has been intercepted containing encrypted data by the DOSEAL initiative (Defensive Operation for Satellite Encrypted Analysis Localization). It seems to be related to a KEM public key that our experts confirmed to be a post-quantum mechanism, and the corresponding public key has been found. The secret key is nowhere to be found.

However, our informant has provided the DOSEAL key generation source code and a memory dump of one generation.

Can the secret document of the DOSEAL initiative be retrieved?

This challenge is based on FrodoKEM post-quantum mechanism where a KEM shared secret is used to encrypt a secret document (that contains the flag).

Five files are given:

  • doseal_ciphertext.bin: a FrodoKEM-1344 ciphertext
  • doseal_dump.bin: a memory dump of a FrodoKEM-1344 key generation
  • doseal_teplay.pub: a FrodoKEM-1344 public key
  • frodokem_keygen.c: source code of FrodoKEM-1344 key generation
  • output.txt: a secret document encrypted with AES-256-CBC where the key is the secret key encapsulated in the file doseal_ciphertext.bin

The goal seems to be clear: the AES key is needed to decrypt the secret document, so the FrodoKEM-1344 private key must be reconstructed to execute a decapsulation.

1. Overview of FrodoKEM key generation

FrodoKEM is quite simple. Its key generation uses matrices:

  • S: secret matrix of dimension 1344×8 (part of the secret key)
  • E: error matrix of dimension 1344×8 (secret, but not kept after generation)
  • A: public key of dimension 1344×1344
  • B: public key calculatedd as B = AS + E

2. Source code analysis

The analysis of the source code shows that several values MUST be cleaned from memory according to the comments. It is the case for the buffer mat_e:

				
					  uint16_t mat_e[N*NBAR]; // must be CLEANED
				
			

However, it is not explicitely erased using the function memory_cleanse() contrary to the matrix mat_s which is the matrix of the secret key.

3. Dump analysis

Since the error matrix is not erased, it is highly probable to find it in the memory dump. In FrodoKEM, each coefficient of this matrix is sampled according to a distribution and is an integer between -6 and 6 (for FrodoKEM-1344). The coefficients are integers reduced modulo 216 so they are represented in memory as 16-bit integers.

As a consequence, the error matrix should be represented in memory as a buffer of bytes 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, which is easily located in a memory dump.

Indeed, a buffer of size 2 x 1344 x 8 bytes is present from offset 0x0820 which corresponds exactly to the number of bytes to represent this matrix.

Thus, the matrix E can be reconstructed.

4. Reconstructing the secret key

The matrix A is a square matrix and it might be possible to invert. Then, the secret matrix S can be retrived by calculating: S = A-1 (B – E).

One condition for the matrix A to be invertible is that its determinant must be coprime with the modulus 216, so it must be odd.

Fortunately, this is the case, then the KEM secret key can be reconstructed. It is the concatenation of the following elements (this can be found at the end of the key generation in the source code):

  • s: used for rejection in case of decapsulation failure, not necessary here for a correct decapsulation in the challenge context
  • public key: seed for matrix A and packed version of B
  • ST: secret matrix transposed
  • pkh: hash of the public key with SHAKE256

Then it can be used for a decapsulation.

5. Decapsulation and flag

For this part, an external implementation can be used. Since the source code points to https://frodokem.org, a reference implementation can be found there that contains a C version and a Python version: https://github.com/Microsoft/PQCrypto-LWEKE.

6. Source code of solution

A Sagemath solution using PARI for the matrix inversion (faster than the generic implementation of Sagemath) is given below. A much faster matrix inversion (1 second) is possible using a C implementation, available on the following link: https://github.com/AMOSSYS/challenges/tree/main/ECW-2025/Learning-from-error

				
					from hashlib import shake_128, shake_256
from sage.all import Matrix, Zmod, pari, ZZ
import json
try:
    from Cryptodome.Cipher import AES
    from Cryptodome.Util.Padding import unpad
except:
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import unpad

# challenge files
PUBLIC_KEY_PATH = "files/doseal_tepley.pub"
DUMP_PATH = "files/doseal_dump.bin" 
CIPHERTEXT_PATH = "files/doseal_ciphertext.bin"
OUTPUT_PATH = "files/output.txt"

# FrodoKEM-1344 parameters
N = 1344
NBAR = 8
LEN_A = 16
LEN_SE = 64
LEN_SEC = 32

Zq = Zmod(2**16)

# ===================
# retrieve secret key
# ===================

# load public key
pk_raw = open(PUBLIC_KEY_PATH, 'rb').read()
pkh = shake_256(pk_raw).digest(32) # public key hash
seed_a = pk_raw[:LEN_A]
b = pk_raw[LEN_A:]

# generate matrix A
A = Matrix(Zq, N)
for i in range(N):
    buffer = shake_128(bytes([i % 256, i >> 8]) + seed_a).digest(2*N)
    for j in range(N):
        A[i,j] = buffer[2*j] | (buffer[2*j + 1] << 8)

# unpack matrix B
B = Matrix(Zq, N, NBAR)
for i in range(N):
    for j in range(NBAR):
        B[i,j] = (b[2*(i*NBAR + j)] << 8) | b[2*(i*NBAR + j) + 1]

# get error matrix E from dump (present at offset 2080 of size 2*N*NBAR bytes)
data = open(DUMP_PATH, 'rb').read()[2080:2080 + 2*N*NBAR]
E = Matrix(Zq, N, NBAR)
for i in range(N):
    for j in range(NBAR):
        E[i,j] = data[2*(i*NBAR + j)] | (data[2*(i*NBAR + j) + 1] << 8)

# calculate A^-1 through PARI since it's faster
# A must be converted as an integer matrix to be used with pari.matinvmod
A_ZZ = A.change_ring(ZZ)
A_pari = pari(A_ZZ)
A_inv = pari.matinvmod(A_pari, 2**16).sage()

# calculate S = A^(-1)*(B - E)
S = A_inv*(B - E)

# =============
# decapsulation
# =============

# load ciphertext
ct = open(CIPHERTEXT_PATH, 'rb').read()
c1 = ct[:2*N*NBAR]
c2 = ct[2*N*NBAR:2*N*NBAR + 2*NBAR*NBAR]
salt = ct[2*N*NBAR + 2*NBAR*NBAR:]

# unpack matrix B'
Bp = Matrix(Zq, NBAR, N)
for i in range(NBAR):
    for j in range(N):
        Bp[i,j] = (c1[2*(i*N + j)] << 8) | c1[2*(i*N + j) + 1]

# unpack matrix C
C = Matrix(Zq, NBAR, NBAR)
for i in range(NBAR):
    for j in range(NBAR):
        C[i,j] = (c2[2*(i*NBAR + j)] << 8) | c2[2*(i*NBAR + j) + 1]

# calculate M = C - B'*S
M = C - Bp*S

# decode M by rounding the four msb of each coefficient into a 32-byte buffer
buffer = []
for i in range(NBAR):
    for j in range(NBAR):
        if j % 2 == 0:
            # 4 lsb of a new byte
            buffer.append(round(ZZ(M[i,j]) / 2**12))
        else:
            # 4 msb of current byte
            buffer[-1] |= (round(ZZ(M[i,j]) / 2**12) << 4)
u = bytes(buffer)

# derive secret value k
buffer = shake_256(pkh + u + salt).digest(LEN_SE + LEN_SEC)
k = buffer[LEN_SE:]

# derive shared secret
ss = shake_256(ct + k).digest(LEN_SEC)

# ==========================
# secret document decryption
# ==========================

data = json.loads(open(OUTPUT_PATH, "r").read())
iv = bytes.fromhex(data['iv'])
ciphertext = bytes.fromhex(data['encrypted'])

cipher = AES.new(ss, AES.MODE_CBC, iv=iv)
secret_document = unpad(cipher.decrypt(ciphertext), 16)
print(secret_document.decode('utf-8'))

				
			

Voir les Cybersecurity insights

22 décembre 2025
Recently, our team performed a security audit of SmallStep Certificates PKI. This audit was focused on the cryptographic aspects of […]
18 décembre 2025
Almond est classé Leader dans l'étude Blueprint® 2025-2026 dédiée aux SOC managés pour le mid-market, et visionnaire sur les grandes […]
4 novembre 2025
Comme chaque année, SWIFT met à jour son standard CSCF et apporte son lot de nouveautés. Il peut s'avérer complexe […]
20 octobre 2025
La référence mondiale ISG distingue Almond dans les six domaines clés de la cybersécurité, confirmant la solidité de son expertise […]
10 septembre 2025
Téléchargez l'étude complète "Voices of CISOs" en complétant le formulaire ci-dessous.
24 juillet 2025
Longtemps perçue comme une affaire d’État ou de grandes entreprises, la cybersécurité s’impose désormais comme un levier structurant de gouvernance […]
22 juillet 2025
M&NTIS Platform est une solution SaaS destinée au test d'efficacité de produits de défense et d'architectures de supervision. Une nouvelle […]
16 juillet 2025
De la météo à la géolocalisation, des télécommunications à la défense, nos infrastructures spatiales sont devenues un incontournable de notre […]
16 juillet 2025
Découvrez cette synthèse réalisée par nos experts du SEAL, à partir des recommandations du NIST et de l’ANSSI.
24 juin 2025
Un premier billet a traité en détails l’échange de clé. Ce nouveau billet a pour sujet le reste de la […]

Nous vous souhaitons de joyeuses fêtes de fin d’année hautes en couleur et à l’année prochaine pour une année 2025 exaltante ! 🎉

🎁 Merci à tous pour votre participation au quiz de l’avent, nous contacterons le gagnant très prochainement.

🎅 Chez Almond, l’esprit festif des fêtes de fin d’année est arrivé en avance !

Nos collaborateurs ont profité d’une soirée chaleureuse et joyeuse dans l’un des restaurants les plus spectaculaires de Paris, Le Cirque avec un cocktail dinatoire, des surprises et un Secret Santa.

Et un peu plus de magie de Noël ? Almond a également ouvert ses portes aux familles de nos collaborateurs pour une après-midi conviviale autour de l’arbre de Noël. Les enfants ont été captivés par des contes enchantés, de 1001 contes Constance Felix et ont savouré un goûter délicieux avec des chocolats chauds préparés par les Empotés. Le Père Noël a distribué des coloriages géants et des cadeaux pour le plus grand bonheur des enfants 🎁

Jour 23 |

Jour 22 | Laquelle de ces menaces n’est pas un cryptoransomware ?

  • Réponse 1 : Lockbit3
  • Réponse 2 : Phobos
  • Réponse 3 : NotPetya
  • Réponse 4 : WannaCry

Laïus explicatif : Bien que NotPetya ressemble à un ransomware, il s’agit en réalité d’un wiper. Ce malware rend indisponible les fichiers de la victime, mais ne fournit aucun moyen de les déchiffrer, même après le paiement de la rançon. L’objectif principal de NotPetya n’est pas l’extorsion financière, mais la destruction de données.
En cas d’incident, voici les coordonnées de notre CERT : [email protected] +33 (0)1 83 75 36 94

Jour 21 | Vous dialoguez via votre terminal avec un service distant et vous vous rendez compte qu'il contient un stack-based overflow. Vous cherchez à l'exploiter à l'aveugle et trouvez finalement l'offset de l'adresse de retour, après avoir contourné les éventuelles protections. Vous cherchez maintenant un stop gadget pour continuer votre exploitation. Quelle est son utilité :

  • Réponse 1 : interrompre à la demande le flux d’exécution du binaire distant le temps de l’exploitation
  • Réponse 2 : obtenir une exécution fiable et maîtrisée avec un comportement reproductible
  • Réponse 3 : pouvoir mettre en pause le binaire temporairement pendant l’envoi de la payload
  • Réponse 4 : pouvoir stopper proprement le binaire afin d’éviter un éventuel crash à la fin de l’exploitation

Laïus explicatif : L’exploitation se déroulant en aveugle, il est nécessaire de trouver une adresse permettant d’obtenir un comportement particulier et reproductible à chaque exécution, comme l’affichage du texte « Bye ». Si une telle adresse est trouvée, elle correspond au stop gadget. Il permettra donc de continuer l’exploitation et de valider ou invalider nos déductions lors de l’exécution du binaire.

Jour 20 | Le terme "spam" pour désigner les messages indésirables provient initialement

  • Réponse 1 : D’une marque de jambon en boîte
  • Réponse 2 : D’un acronyme signifiant « Stupid Pointless Annoying Messages »
  • Réponse 3 : D’un sketch des Monty Python
  • Réponse 4 : D’un code utilisé pendant la Seconde Guerre mondiale

Laïus explicatif : Ce mot, à l’origine un acronyme de : SPiced hAM (du jambon épicé en boîte vendue par une entreprise américaine), est repris en masse, pour brouiller la conversation, dans un sketch des Monty Python.

Jour 19 | L’acronyme PACS désigne  :

A. Un format permettant la visualisation des images dans l’imagerie médicale

B. Un système d’archivage et de communication d’images dans l’imagerie médicale

C. Un prestataire d’audit et de conseil en cybersécurité

D. Un pacte civil de solidarité

  • Réponse 1 : L’ensemble des réponses
  • Réponse 2 : Réponses C et D
  • Réponse 3 : Réponses B, C et D
  • Réponse 4 : Réponses A, C et D

Laïus explicatif :

Un PACS, dans le secteur de l’imagerie médicale, désigne effectivement un système (et non un format) signifiant « Picturing Archiving and Communication System » permettant de gérer les images médicales grâce à des fonctions d’archivage.

De plus, depuis septembre, l’ANSSI a publié un référentiel d’exigences qui permet aux commanditaires de prestations de sécurité de bénéficier de garanties sur les compétences des prestataires, sur le processus d’accompagnement et de conseil, ainsi que sur la sécurité des systèmes d’information associés. Ce référentiel vise à reconnaître officiellement les prestataires en tant que « Prestataires d’accompagnement et de conseil en sécurité ».
Enfin, en France, le PACS désigne aussi une forme d’union civile dénommée Pacs.

Jour 18 | En quelle année l'ANSSI prévoit de ne plus recommander l'utilisation de certains algorithmes de chiffrement classiques en raison de l'augmentation de la puissance de calcul des ordinateurs classiques et de la menace posée par les ordinateurs quantiques ?

  • Réponse 1 : 2026
  • Réponse 2 : 2030
  • Réponse 3 : 2035
  • Réponse 4 : 2050

Laïus explicatif : Dans son dernier avis sur la migration vers la cryptographie post quantique, paru en janvier 2024, l’ANSSI encourage tous les éditeurs à mettre en œuvre dès à présent une hybridation entre la cryptographie standard et la cryptographie post-quantique (pour les produits qui doivent protéger des informations après 2030) et recommande d’utiliser en priorité la cryptographie post-quantique à partir de 2030.  

Jour 17 | Quelle est la dernière course à laquelle j’ai participé ?

  • Réponse 1 : Le Vendée Globe
  • Réponse 2 : National Figaro 3 en équipage
  • Réponse 3 : La Solitaire du Figaro Paprec
  • Réponse 4 : Le Havre Allmercup

Laïus explicatif : Le National Figaro 2024 s’est déroulé du 4 au 6 octobre dernier à Lorient. Thomas et son équipe sont arrivés en 2e position ! Cette course clôture ainsi la saison 2024 sur le circuit Figaro. 

  • Réponse 1 : Aetheris

  • Réponse 2 : Venopie

  • Réponse 3 : Lumidus

  • Réponse 4 : Pandama

Laïus explicatif : Au sein de la plateforme d’attaque – défense M&NTIS, le scénario Pandama propose une kill chain dont l’impact, après compromission du contrôleur de domaine, permet de déployer, par GPO, une charge utile effaçant les données présentes sur les systèmes de fichiers du SI simulé.

Pour rappel, basé sur les technologies d’émulation d’adversaire et de Cyber Range, M&NTIS permet d’exécuter des campagnes d’attaques réalistes afin de challenger dans un environnement immersif les procédures et l’expertise des équipes SOC et CERT. M&NTIS répond ainsi aux enjeux d’amélioration continue de la défense.

Jour 15 | Quel type de menace ne fait pas parti de l’insider threat?

  • Réponse 1 : Malicious
  • Réponse 2 : Ransomware group
  • Réponse 3 : Negligent
  • Réponse 4 : Vendors

Laïus explicatif : Almond a proposé une étude sur la menace interne qui décrit chaque type d’insider. Les groupes de ransomware sont externes à l’entreprise mais peuvent recruter des employées pour récupérer des accès valides et compromettre l’entreprise. Retrouvez l’étude ici.

Jour 14 | Selon vous, quelle proportion des cyberattaques réussies sont liées à une erreur humaine ?

  • Réponse 1 : 40%

  • Réponse 2 : 100%

  • Réponse 3 : 70%

  • Réponse 4 : 90%

Laïus explicatif : 90% des cyberattaques trouvent leur origine dans une erreur humaine. L’erreur humaine en cybersécurité englobe toutes les actions, conscientes ou non, qui exposent les systèmes et les données à des menaces. Cela inclut des gestes apparemment innocents, comme le fait de :

  • Cliquer sur les liens malveillants
  • Utiliser des mots de passe faibles ou partagés
  • Partager des informations sensibles
  • Négliger la mise à jour des logiciels et systèmes
  • Commettre une erreur de configuration ou mal administrer les accès
  • Utiliser des clés USB non sécurisées ou prévenant de sources inconnues

Jour 13 | Almond & Amossys sont présents en France et à l’international pour garantir proximité et réactivité grâce à nos services 24/7. Dans quels pays se trouvent nos équipes ?

  • Réponse 1 : FRA – CHE – AUS – JPN

  • Réponse 2 : FRA – CAN – CHE – KOR

  • Réponse 3 : FRA – AUS – CAN – GBR

  • Réponse 4 : FRA – BEL – ITA – USA

Jour 12 | Challenge OSINT

Val Thorens

Laïus explicatif : Depuis plusieurs années consécutives, notre CSE organise des séjours à Val Thorens pour profiter des sports d’hiver. Que l’on aime dévaler les pistes de ski à toute allure, tenter l’aventure en prenant des cours d’initiation ou simplement déguster une raclette après une randonnée raquette et un passage à la piscine et au sauna, ce séjour est l’occasion de partager des moments convivaux avec ses collègues ! TIC, TAC, le prochain séjour ski approche à grands pas !

Jour 11 | Parmi ces propositions, quelle technique Mitre Atta&ck est la plus utilisée par les attaquants ?

  • Réponse 1 : OS Credential Dumping
  • Réponse 2 : Valid Account
  • Réponse 3 : Impair Defenses
  • Réponse 4 : Remote services

Laïus explicatif : L’achat ou la récupération de comptes valides sont de plus en plus commun. Certains cybercriminels appelés Initial Access Broker se spécialisent dans la compromission de victimes dans le but de récupérer des identifiants valides qui seront ensuite vendus à d’autres cybercriminels comme les groupes de ransomware.

Jour 10 | Parmi ces structures de données de la mémoire dans Windows, quelle est celle qui permet de lister les processus en cours d’exécution ?

  • Réponse 1 : EPROCESS
  • Réponse 2 : Kernel Debugger Data Block (KDBG)
  • Réponse 3 : Kernel Processor Control Region (KPCR)
  • Réponse 4 : Process Environment Block (PEB)

Laïus explicatif : La structure EPROCESS (Executive Process) est utilisée par Windows pour gérer chaque processus en cours d’exécution. Elle contient des informations essentielles comme l’identifiant du processus (PID), l’état, les threads associés, et d’autres données nécessaires au système pour suivre les processus actifs. En analysant les structures EPROCESS, on peut lister les processus actuellement en mémoire. Le PEB est lié à chaque processus de manière individuelle. Enfin le KPCR est nécessaire pour trouver l’adresse du KDB qui à son tour permettra de pointer vers le EPROCESS.  

Jour 9 | Quel est le problème si la suite cryptographique TLS_RSA_WITH_AES_256_CBC_SHA256 est utilisée avec l'extension encrypt_then_mac pour la sécurité d'une communication TLS ?

  • Réponse 1 : L’algorithme de chiffrement est trop faible

  • Réponse 2 : L’intégrité de la communication n’est pas assurée

  • Réponse 3 : Il n’y a pas la propriété de confidentialité persistante (Perfect Forward Secrecy)

  • Réponse 4 : Le serveur n’est pas correctement authentifié

Laïus explicatif : La bonne réponse est le manque de confidentialité persistante.

La suite TLS_RSA_WITH_AES_256_CBC_SHA256 utilise la clé publique RSA du serveur pour chiffrer le secret partagé utilisé pour sécuriser les échanges de la session TLS : en cas de compromission de la clé privée du serveur, l’ensemble des échanges des sessions passées peuvent être déchiffrés par un attaquant.
La confidentialité persistante (connue sous le nom de Perfect Forward Secrecy en anglais) consiste en l’utilisation d’un échange Diffie-Hellman éphémère pour négocier le secret partagé, sans utilisation de la clé RSA du serveur.

Jour 8 | Quel est l'avantage d'utiliser un outil de couverture de code lors d'une session de fuzzing ?

  • Réponse 1 : Réduire le temps de fuzzing en optimisant certaines instructions assembleur.

  • Réponse 2 : Utiliser la technique de « pré-chauffage » du harnais (« warming code attack »).

  • Réponse 3 : Pouvoir analyser facilement les sections de code atteintes par le fuzzer.

  • Réponse 4 : Ne pas prendre en compte les vulnérabilités de type use-after-free.

Laïus explicatif : Les outils de couverture de code (“code coverage” en anglais) permettent de savoir avec précision quelles lignes de code d’un programme qui ont réellement été exécutées. Lors d’une session de “fuzzing”, ces outils peuvent aider l’analyste à savoir si les fonctions ciblées ont été atteintes par le fuzzer. Cette technique a notamment été utilisée par un membre de l’équipe Offsec pour trouver une vulnérabilité dans une bibliothèque open-source (voir notre article de blog)

Jour 7 | Quelle est la principale éthique qui doit être prise en compte dans le développement de l’Intelligence Artificielle ?

  • Réponse 1 : L’équité et la non-discrimination

  • Réponse 2 : La transparence des algorithmes utilisés

  • Réponse 3 : La sécurité et la confidentialité des données

  • Réponse 4 : Toutes les réponses

Laïus explicatif : L’équité et la non-discrimination sont des principes fondamentaux dans le développement de l’IA. Les systèmes d’IA doivent être conçus pour éviter les biais et assurer qu’ils ne favorisent pas des groupes spécifiques au détriment d’autres, afin de garantir un traitement juste et égal pour tous les utilisateurs. La transparence des algorithmes est cruciale. Les utilisateurs doivent comprendre comment les décisions sont prises par l’IA, ce qui inclut la possibilité d’expliquer les résultats ou actions générés par un système d’intelligence artificielle, afin d’éviter des décisions opaques ou injustes. La sécurité et la confidentialité des données sont enfin des préoccupations majeures lorsque l’on développe des systèmes d’IA, car ces technologies peuvent collecter et traiter des informations sensibles, ce qui soulève des questions sur la protection des données personnelles et la vie privée.

Jour 6 | Selon vous, en moyenne combien de ransomware ont eu lieu par jour en 2023 dans le monde ?

  • Réponse 1 : 1 par jour

  • Réponse 2 : 100 par jour

  • Réponse 3 : 30 par jour

  • Réponse 4 : 12 par jour

Laïus explicatif : En moyenne 12 attaques ransomware ont été signalées par jour par des victimes dans le monde en 2023 selon les chiffres d’Almond. Pour plus d’informations, n’hésitez pas à consulter notre Threat Landscape.

Jour 5 | Challenge de stéganographie

Réponse : PASSI RGS, PASSI LPM, CESTI, ANJ, Cybersecurity made in Europe, PCI QSA Company et Swift

Etape 1 : Observer l’image, trouver 3 logos cachés (Cybersecurity made in Europe, PCI QSA Company & Swift) et une indication pour chercher dans les métadonnées du fichier. 

Etape 2 : Challenge de stéganographie

En lançant dans son terminal un des outils les plus courants, « binwalk », on trouve une image JPEG dans le PDF. En extrayant les données grâce au même outil et en renommant le fichier en .jpeg, on voit apparaitre une image cachée. Ensuite, en utilisant « steghide », on peut extraire le fichier avec le mot de passe « Almond ». Ce fichier contient une suite de caractère encodée en base64. En la déchiffrant, on obtient les quatre autres certifications : PASSI RGS, PASSI LPM, CESTI et ANJ. 

Jour 4 | Concernant les accompagnements de la nouvelle qualification PACS de l’ANSSI, sur la portée Sécurité des Architectures, quels sont les domaines qui font partie du périmètre possible d’un accompagnement ?

  • Réponse 1 : la sécurité réseau, l’authentification, et l’administration du SI

  • Réponse 2 : la sécurité réseau, la sécurité système, et les mécanismes de chiffrement

  • Réponse 3 : l’administration du SI, le cloisonnement, les sauvegardes, et la stratégie de détection/réponse

  • Réponse 4 : tous ces sujets et plus encore

  • Laïus explicatif : Le référentiel PACS, sur la portée Sécurité des Architectures, porte bien sur tous les sujets liés de près ou de loin aux infrastructures du SI. La liste n’est pas exhaustive et est à adapter à chaque prestation d’accompagnement suivant le périmètre d’intervention. Dans le référentiel, l’ANSSI propose une liste de sujets à adresser dans un rapport PACS page 28 et 29.

    https://cyber.gouv.fr/sites/default/files/document/PACS_referentiel-exigences_v1.0.pdf

Jour 3 | Quel référentiel permet la certification de produits de sécurité ?

  • Réponse 1 : NIS2

  • Réponse 2 : Critères Communs

  • Réponse 3 : PASSI

  • Réponse 4 : ISO27001

Laïus explicatif : Le schéma Critères Communs est un ensemble de normes et méthodologies permettant de cadrer les moyens utilisés pour évaluer, de manière impartiale, la sécurité d’un produit de sécurité (logiciel ou matériel). Ce schéma est reconnu internationalement au travers de plusieurs accords (SOG-IS, CCRA et prochainement EUCC).

Le référentiel PASSI permet la qualification, par l’ANSSI, des prestataires d’audit de la sécurité des SI. ISO27001 est la norme décrivant les bonnes pratiques à suivre dans la mise en place d’un SMSI. Enfin, NIS2 est une directive visant à harmoniser et à renforcer la cybersécurité du marché européen.

Jour 2 | Quel est l’artefact forensique qui permet de prouver une exécution d’un programme sous Windows ?

  • Réponse 1 : JumpList

  • Réponse 2 : ShimCache

  • Réponse 3 : $MFT

  • Réponse 4 : Prefetch

Laïus explicatif : Le Prefetch est un artefact spécifique à Windows qui optimise le chargement des programmes. Lorsqu’un programme est exécuté pour la première fois, Windows crée un fichier dans le dossier C:\Windows\Prefetch, qui contient des informations sur le programme et les ressources qu’il a utilisées. Ces fichiers incluent également des horodatages correspondant à la première et aux dernières exécutions. L’existence d’un fichier Prefetch (.pf) pour un programme est une preuve solide qu’il a été exécuté. C’est l’un des artefacts forensiques les plus fiables pour prouver l’exécution d’un programme.

Jour 1 | Quel texte européen permettra qu’à partir de fin 2027, tous les produits vendus dans l’UE et comprenant des composants numériques seront exempts de vulnérabilités et maintenus pendant tout leur cycle de vie ? #DigitalTrust

  • Réponse 1 : Le Cyber Security Act
  • Réponse 2 : Le Cyber Resilience Act
  • Réponse 3 : La Directive REC
  • Réponse 4 : La Directive NIS2 

Laïus explicatif : Le Cyber Resilience Act, qui a été publié ces derniers jours au Journal Officiel de l’Union Européenne est entré en vigueur le 10 décembre 2024. A compter de cette date, les fabricants et éditeurs doivent adapter leur processus pour pouvoir continuer à vendre des produits au sein de l’UE après le 10/12/2027.

EU Cyber Resilience Act | Shaping Europe’s digital future