Vision general
Traveler se compone de dos binarios Nim que viven en sistemas distintos pero coordinados:
-
Leymano (Sender – Linux/WSL2)
- Sistema operativo: Linux / WSL2 (por ejemplo, Kali).
- Lee el archivo de shellcode crudo
payload.bin. - Genera una clave de sesion de 1 byte y cifra en memoria todo el buffer mediante XOR.
- Abre un socket
AF_VSOCKapuntando aCID 2(host Windows) y al puerto acordado (5005por defecto). - Envía: clave (1 byte) → tamaño (4 bytes) → stream cifrado.
-
Anchor (Receiver – Windows)
- Sistema operativo: Windows 10/11 con WSL2 / Hyper-V.
- Descubre el GUID de la VM WSL actual ejecutando
hcsdiag listy aplicando regex sobre la salida. - Construye un GUID de servicio a partir del puerto (
makeServiceGUID) y lo registra en:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\GuestCommunicationServices\<ServiceGUID>. - Abre un socket
AF_HYPERVy hacebindusando elVmIdde WSL y elServiceIdcalculado. - Pone un listener que acepta una conexion, recibe el stream, lo descifra y ejecuta el payload por callback.
Flujo de datos
- Preparacion del payload en Linux (
payload.binen crudo). - Cifrado y envio con Leymano:
sessionKeyaleatoria.xorData(payload, sessionKey).- Envio de clave, tamano y buffer cifrado por AF_VSOCK.
- Recepcion y descifrado con Anchor:
- Lectura de clave y tamano desde el socket AF_HYPERV.
- Reserva de memoria RW con
VirtualAlloc. - Recepcion del stream cifrado en ese buffer.
- Bucle XOR para descifrar in-place.
- Cambio de permisos a RX mediante
VirtualProtect.
- Ejecucion indirecta:
- Se castea el puntero al shellcode al tipo de callback esperado por
EnumSystemLocalesA. - Se llama a la API, que a su vez invoca el shellcode como si fuera una funcion de enumeracion.
- Se castea el puntero al shellcode al tipo de callback esperado por
Diagrama de alto nivel
flowchart LR
subgraph Guest [Linux / WSL2]
L[Leymano<br/>Sender] -->|"Clave + tamaño + stream cifrado"| VS[AF_VSOCK]
end
VS -->|"Trafico interno hypervisor"| HV[AF_HYPERV / VM Bus]
subgraph Host [Windows]
HV --> A[Anchor<br/>Receiver]
A -->|"Descifrado in-place"| MEM[Buffer RX]
MEM -->|"Callback EnumSystemLocalesA"| SC[Shellcode]
end