Wie sich Bot-Netze enttarnen lassen

24.06.2005 von f niemann
Per Reverse Engineering konnte die Wirkungsweise von Bots entschlüsselt werden. Die Analyse der Kommandos führte zu Botnet-Betreibern in Italien und Deutschland. Volker Schwaberow ist IT-Experte bei Services for Business IT Ruhr GmbH in Gelsenkirchen. Andreas Schäfer-Thiel ist DV-Spezialist in der Logistikbranche.

Eines Nachmittags bekam Heinrich Müller (Name geändert) eine mittlere Krise. Er hatte seinen neuen Computer mit Windows XP Professional und der T-Online-Software installiert und hatte seit fünf Minuten eine DSL-Verbindung aufgebaut, als ein merkwürdiges Fenster auf seinem Bildschirm auftauchte. Der Dialog versprach ein Anti-Spyware-Programm, das zudem Viren entfernen könne. Müller wurde misstrauisch und rief die ihm bekannten IT-Sicherheitsexperten des "Team Seekuhrity". Auf ihr Geheiß trennte er die Netzverbindung. Er tat gut daran.

Problemfall Bot-Netze "Bot-Netze sind kein neues Phänomen. Sie gibt es schon einige Zeit und auch die Gefahren sind bekannt", erläutert Thorsten Holz, Mitglied des deutschen Honeynet-Projekts. Diese Organisation konfiguriert Rechner so, dass sie für Botnets anfällig sind, um so möglichst viel über solche Umtriebe zu erfahren und Methoden zum Aufspüren solcher Netze zu entwickeln. Müllers Rechner wurde von einem Wurm befallen, der eine bekannte Sicherheitslücke in Microsofts "Local Authority Subsystem Service" (kurz LSASS) ausnutzte. Der Windows-Installation fehlten das Servicepack 2 und weitere Sicherheits-Updates. Team Seekuhrity wollte den Schädling ausfindig machen und richtete auf einem eigenen PC mittels der Virtualisierungssoftware "VMware" und einem Internet-Router ein "Honeypot"-System ein. Bei einem "Honigtopf" werden die Sicherheitsmechanismen bewusst heruntergefahren, so dass Viren und Würmer leichtes Spiel haben und geradezu angelockt werden.

Nach nicht einmal drei Minuten schlug der Netzwerk-Sniffer "Ethereal" Alarm und meldete die ersten Live-Angriffe. Die VMware-Konsole informierte über ansteigende Systemlast. Im "System32"-Verzeichnis des Rechners tauchten verdächtige Dateien mit einer Dateigröße von 0 Bytes auf. Die Router-LEDs begannen wie wild zu flackern - ein Indiz für rege Kommunikation mit dem Internet. Nachdem die virtuelle Netzwerkkarte deaktiviert wurde, stoppte zwar der Datenaustausch, die Systemauslastung blieb hingegen hoch.

Systeme schützen und patchen Nutzer, die ihre Systeme weder patchen noch vor Viren und Trojanern schützen, können Opfer eines Bot-Netzes werden. Ihre Computer könnten zu Zombies mutieren, die, ferngesteuert Spam und Viren verbreiten. Zudem versuchen Bots, Passwörter zu knacken sowie Denial-of-Service-Attacken auf Web-Server zu starten. Eine Analyse der Log-Files des Sniffers deckte Charakteristiken des Wurms auf. Seine Attacken richteten sich gegen den unter der Windows-Umgebung freigegebenen Port 445. Der Schädling übertrug Shellcode und speicherte einen TFTP-Server auf dem System. Anschließend wurde die eigentliche Komponente des Wurms nachgeladen und gestartet. Abgesehen von der verwendeten IP-Adresse war das Angriffsmuster nicht ungewöhnlich, weshalb sich Team Seekuhrity den Wurm selbst genauer anschaute.

Über einschlägige Datenbanken im Internet ließ sich der Wurmtyp bestimmen. Der Name der verwendeten Executable-Datei wurde gleich von zwei großen Wurm-Familien verwendet: vom "W32/Codbot.Z" sowie von mehreren Varianten des "SDBot/Rbot". Die Dateien wurden in Textfiles ("*.txt") umbenannt, um sie mit "Wordpad" betrachten zu können. Die Datei ähnelte einer unter Windows üblichen Portable-Execution-Datei (PE); sie enthielt aber weder Zeichenketten noch Blöcke eines Binärcodes. Fazit: Die Datei wurde gepackt. Viel gravierender war jedoch, dass der Executable-Packer nicht zu erkennen war. Meist lässt sich dieser an Einträgen in der PE-Datei ausfindig machen. In vielen Fällen wird der UPX-Packer verwendet.

Team Seekuhrity entpackte die Komponente manuell mittels des Process-Dumpers "Lord PE" des Programmierers Yoda. Ein Process-Dumper speichert den Kontext eines laufenden Prozesses und damit dessen Code. Tatsächlich gelang es, die ungeschützte Executable-Datei des Wurms zu reproduzieren.

Peer-to-Peer-Bots Bedienten sich die Botnets bisher dem Hypertext Transfer Protocol und Internet Relay Chat, so gibt es laut Holz nun Bestrebungen, solche Verbünde über Peer-to-Peer-Nezte zu errichten. Während für die IRC-Variante ein zentraler Server erforderlich ist, durch dessen Lahmlegung auf das Botnetz zusammenbricht, wäre dies bei Peer-to-Peer-gestützten Bot-Netzen sehr viel schwieriger. Um die Prozesse der Komponenten des Bots zu analysieren, mussten die Daten noch disassembliert werden. Ein Disassembler wandelt Binär-Code in eine lesbare Form (Assembler beziehungsweise Mnemonic-Code) um. Ein Tool dieser Kategorie ist "Interactive Disassembler Pro (IDA Pro)" von Data Rescue SA aus Belgien. IDA Pro untersuchte in der Programmdatei Cross-Referenzen auf Funktionen und listete Referenzen auf Import- und Export-Zeichenketten auf.

Die Importe und Exporte der PE-Executable-Datei werden innerhalb einer IDB-Datei gespeichert. Die IDB Datei ist eine Datenbank zum "Opfer", beziehungsweise zu der von IDA Pro disassemblierten Datei.

Nach der Analyse kann der Anwender den Quelltext untersuchen. In ihrer Analyse stieß Team Seekuhrity auf die Registry-Zeichenketten: "SoftwareMicrosoftWindowsCurrentVersionRun" und "SoftwareMicrosoftWindowsCurrentVersionRunServices".

Diese Zeichenketten sorgen dafür, dass der Wurm beim Booten des Rechners startet. Bots enthalten Kommandos, mit denen sich korrumpierte Rechner fernsteuern und dazu bringen lassen, den Wurm zu verbreiten. Im hier dargestellten Fall tauchten in der Executable-Datei DNS-Namen auf. Socket-Code nutzte diese Netzadressen, um ein IRC-Netz zu kontaktieren. Dies ließ sich mit dem Ethereal-Log korrelieren und förderte folgenden Ablauf zutage: Der IRC-Client des Wurms baut eine Verbindung mit Server X auf. Der Client loggt sich über ein im Bot-Code verstecktes Passwort in den IRC-Server ein. Dieses Passwort schützt den IRC-Server vor unerwünschten Gästen. Der Client nimmt den Namen "BOT-XXXXX" an, wobei XXXXX für eine numerische Bot-Bezeichnung steht. Diese Kennung berechnet ein Zufallszahlengenerator.

Die Annahme des Namens quittiert der Bot gegenüber dem IRC-Server mit dem IRC-Kommando NICK BOT-123456. Ferner setzt der Bot-Code - ebenfalls nach Zufallsprinzip - einen Userhost (USER axyiw). Der Bot tritt einem geschützten Chat-Kanal bei; das Kennwort steht ebenfalls im Bot-Code (JOIN # ).

Der Channel-Mode war so eingestellt, dass alle zugeschalteten Benutzer (Bots) nicht sichtbar waren. Das Ethereal-Log gab die Anzahl der Benutzer mit 1476 an. Das Channel-Topic veranlasste die Bots, auf den remoten Rechnern Netzwerk-Ports zu scannen ("Random-Scan"). Die Rechner suchten andere Computer im Internet auf und testeten, ob der Port 445 geöffnet war.

Auf diesen Opfern sollte der Exploit-Code ausgeführt werden. Neben dem Random Scan beinhaltete der Bot-Code noch weitere Kommandos:

.data:00437934 aAdvscan db 'advscan',0.data:00437A3C aUdpflood db 'udpflood',0.data:00437AC8 aPingflood db 'pingflood',0.data:00437B70 aTcpflood db 'tcpflood',0.data:00437C60 aEmail db 'email',0.data:00437CDC aHttpcon db 'httpcon',0

Das Kommando advscan scannt eine vorgegebene Anzahl an IP-Adressen. Die Befehle udpflood, pingflood, tcpflood starten einen DoS-Angriff auf IP-Adressen, und email versendet Nachrichten. Ein Nutzer mit Channel-Admin-Rechten kann die Kommandos in das Channel-Topic einfügen und ausführen lassen, da Channel-Admin und die Bots interagieren.

Passwortknacker und Spam-Schleuder

Neben dieser Interaktion gestattet der Code, private Nachrichten zu interpretieren. Der Betreiber dieses Bot-Netzwerks kann einzelnen Bots dedizierte Aufgaben zuteilen. Beispielsweise kann ein Bot innerhalb des Netzes neue Spam-Nachrichten verschicken, während andere DDoS-Attacken starten. Bots können zu Drohnen umfunktioniert werden, die das Internet nach weiteren verwundbaren Windows-Rechnern durchforsten.

Das Mail-Kommando ruft eine SMTP-Komponente auf, die sich eines vorgefertigten Headers bedient. Der E-Mail-Vorspann findet sich im disassemblierten Code:

.data:00437C70 SMTP_Component_SMTP_Header db 'helo $rndnick',0Ah.data:00437C70 ; DATA XREF: sub_412044+9084_o.data:00437C70 db 'mail from: ',0Ah.data:00437C70 db 'rcpt to: ',0Ah.data:00437C70 db 'data',0Ah.data:00437C70 db 'subject: %s',0Ah.data:00437C70 db 'from: %s',0Ah.data:00437C70 db '%s',0Ah.data:00437C70 db '.',0Ah,0.data:00437CBC SMTP_Component_Email_sent db '[EMAIL]: Message sent to %s.',0

Die SMTP-Komponente lässt sich sowohl für den Versand von Spam als auch zur Verbreitung des Wurms verwenden Hier einige signifikante Stellen aus der SMTP-Komponente:

.text:0041B03E lea eax, [ebp+var_4054].text:0041B044 push eax.text:0041B045 push [ebp+var_4058].text:0041B04B call WSAStartup.text:0041B051 lea eax, [ebp+var_3DC4].text:0041B057 push eax.text:0041B058 call gethostbyname.text:0041B05E mov [ebp+var_39C4], eax.text:0041B064 push 6.text:0041B066 push 1.text:0041B068 push 2.text:0041B06A call socket.text:0041B070 mov [ebp+var_4060], eax.text:0041B076 mov word ptr [ebp+var_4070], 2.text:0041B07F mov eax, [ebp+var_39C4].text:0041B085 mov eax, [eax+0Ch].text:0041B088 mov eax, [eax].text:0041B08A mov eax, [eax].text:0041B08C mov [ebp+var_406C], eax.text:0041B092 push [ebp+var_4074].text:0041B098 call htons.text:0041B09E mov word ptr [ebp+var_4070+2], ax.text:0041B0A5 lea eax, [ebp+var_3AC4].text:0041B0AB push eax.text:0041B0AC lea eax, [ebp+var_3CC4].text:0041B0B2 push eax.text:0041B0B3 lea eax, [ebp+var_3AC4].text:0041B0B9 push eax.text:0041B0BA lea eax, [ebp+var_3BC4].text:0041B0C0 push eax.text:0041B0C1 lea eax, [ebp+var_3CC4].text:0041B0C7 push eax.text:0041B0C8 push offset SMTP_Component_SMTP_Header ; "helo$rndnick

mail from:

rcpt to: "...

Die Komponenten des Bots setzen sich aus wild miteinander kombinierten Code-Snippets im Compiler zusammen. Weitere Analysen des Binär-Codes förderten einen HTTP-, FTP- sowie TFTP-Server, weiteren Exploit-Code und einen Brute-Force-Passwortknacker zutage. Ein integrierter Keylogger sollte dabei Benutzerdaten ausspähen. Folgendes Code-Snippet stach ins Auge:

.text:00417D12 mov eax, [ebp+var_BC].text:00417D18 push [ebp+eax*4+var_98].text:00417D1F call capture_user_webcam.text:00417D24 add esp, 10h.text:00417D27 test eax, eax.text:00417D29 jnz short loc_417D4E.text:00417D2B mov eax, [ebp+var_BC].text:00417D31 push [ebp+eax*4+var_98].text:00417D38 push offset aCaptureWebcamC ; "[CAPTURE]: Webcam capturesaved to: %s."....text:00417D3D lea eax, [ebp+var_858].text:00417D43 push eax

Verfolgt man die Funktion capture_user_webcam, wird klar ersichtlich, was hier passiert:

.text:00402C6C push ebp.text:00402C6D mov ebp, esp.text:00402C6F sub esp, 6Ch.text:00402C72 push 1.text:00402C74 push dword_4454D4.text:00402C7A push 78h.text:00402C7C push 0A0h.text:00402C81 push 0.text:00402C83 push 0.text:00402C85 push 40000000h.text:00402C8A push offset aWindow ; "Window".text:00402C8F call capCreateCaptureWindowA.text:00402C95 mov [ebp+var_4], eax.text:00402C98 cmp [ebp+var_4], 0.text:00402C9C jnz short loc_402CA6.text:00402C9E push 1.text:00402CA0 pop eax.text:00402CA1 jmp locret_402F4FEntscheidend ist hierbei der Punkt.text:00402C8F call capCreateCaptureWindowA

Im "Microsoft Developer Network" wird die Funktion capCreateCaptureWindowA so definiert:

capCreateCaptureWindowThe capCreateCaptureWindow function creates a capture window.HWND VFWAPI capCreateCaptureWindow(LPCSTR lpszWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWnd,int nID);

Die Funktion ermöglicht es, eine am Zielrechner angeschlossene Webcam zu überwachen. Ferner beinhaltet der Code den erwähnten Keylogger, der auf Internet-Seiten wie etwa die des Online-Bezahlsystems Paypal (www.paypal.com) reagiert.

Bot-Netzwerk wird enttarnt

Sicherlich reichen die gewonnenen Erkenntnisse aus, um den Wurm mittels Scan-Engine zu deaktivieren oder zu blockieren. Doch Team Seekuhrity wollte das Bot-Netzwerk verstehen und die Betreiber enttarnen. Man hätte die jeweiligen Anteile des Client-Codes nachprogrammieren und die Verbindung zu den IRC-Servern beobachten können. Dies hätte aber vielleicht den Lauschangriff verraten. Aus diesem Grund legten die Autoren die bösartigen Kommandos lahm, ohne die Kommunikation mit dem Bot-Netz zu unterbinden. Diese Codes bedienen sich der Winsock2-Library. Auf diese Weise ließen sich dem Bot-Verbund Informationen entlocken.

Assembler-Befehl "NOP" deaktiviert Schadensroutinen

Alle schadhaften Netzoperationen im binären Objekt wurden durch das x86-Assembler-Kommando "NOP" (No Operation) ersetzt. Aufrufe von Send- und Update-Funktionen, die Inhalte über das Netzwerk-Interface versendeten, ließen sich so deaktivieren. Heraus kam eine harmlose Variante des Bots, die zwar Kommandos vom IRC-Server entgegennahm, aber kaum noch etwas ausführte. Anstelle von Fehlermeldungen übermittelte der modifizierte Bot stets einen "OK"-Statuscode an das Netzwerk. Nach eingehender Überprüfung im virtuellen Netz ging die "infizierte" Honeypot-Maschine ins Internet. Die Bot-Betreiber hatten keine Möglichkeit, den Rechner als Lauscher zu identifizieren. Dies war jedoch nur möglich, weil die Bot-Schreiber ihren Code nicht ausreichend geschützt hatten und dieser vollständig lesbar gemacht werden konnte.

Wie sich der Bot modifizieren lässt, soll ein Beispiel demonstrieren. Der Bot-Code enthält einen TFTP-Server, der zum Nachladen von Code-Elementen oder für Updates verwendet wird. Im disassemblierten Binär-Code findet sich folgende Referenz:

.text:0040127A loc_40127A: ; CODE XREF: Bot_Services_Start+B4_j.text:0040127A push offset unk_43C038.text:0040127F push offset unk_43BF34.text:00401284 push dword_43C144.text:0040128A push offset aTftpServerStar ; "[TFTP]: Server started onPort: %d, Fil"....text:0040128F lea eax, [ebp+var_200].text:00401295 push eax

Hier meldet das Programm den Start des TFTP-Servers gegenüber dem Bot-Netzwerk. Folgt man der Referenz auf diese Zeichenkette, wird folgender Code sichtbar:

.text:004012B6 lea eax, [ebp+var_204].text:004012BC push eax.text:004012BD push 0.text:004012BF push offset dword_43BF30.text:004012C4 push offset sub_4204C0.text:004012C9 push 0.text:004012CB push 0.text:004012CD call ds:CreateThread.text:004012D3 mov ecx, dword_43C13C.text:004012D9 imul ecx, 234h.text:004012DF mov dword_44AE0C[ecx], eax.text:004012E5 mov eax, dword_43C13C.text:004012EA imul eax, 234h.text:004012F0 cmp dword_44AE0C[eax], 0.text:004012F7 jz short loc_40130E.text:004012F9.text:004012F9 loc_4012F9: ; CODE XREF: Bot_Services_Start+163_j.text:004012F9 cmp dword_43C1D0, 0.text:00401300 jnz short loc_40130C.text:00401302 push 32h.text:00401304 call ds:dword_42B048.text:0040130A jmp short loc_4012F9.text:0040130C ; .text:0040130C.text:0040130C loc_40130C: ; CODE XREF: Bot_Services_Start+159_j.text:0040130C jmp short loc_401329

Es ist nunmehr der Aufruf eines Threads. Ein Thread ist eine Art Programmfaden, welcher innerhalb eines Prozesses - neben anderen Aufgaben her - abläuft. Threads teilen sich Ressourcen eines Prozesses und gestatten so eine Parallelität, die auf Ebene der Prozesse nicht möglich ist.

Im Thread ist folgender Teil von Belang:

.text:004012BF push offset dword_43BF30.text:004012C4 push offset sub_4204C0.text:004012C9 push 0.text:004012CB push 0.text:004012CD call ds:CreateThread

Der Anteil .text:004012C4 push offset sub_4204C0 stellt den Verweis auf alle Funktionen des TFTP-Servers dar, die innerhalb des ausgelösten Threads behandelt werden. Da für jeden Netzwerkdienst des Bots ein Thread generiert wird, modifizierten die Autoren die Funktionen so, dass der Thread nicht aufgerufen werden kann, allerdings trotzdem einen positiven Wert zurückgibt. Im Falle des TFTP-Servers war das die Meldung [TFTP]: Ser-ver started, während in Wirklichkeit gar keine TFTP-Funktion existierte.

Bot-Betreiber ausfindig machen

Anhand von Namen und Daten konnte über einschlägige Suchmaschinen ein zweiter IRC-Server identifiziert werden. Dort unterhielt sich die Person, deren Codename sowohl innerhalb des Bot-Codes, als auch in bestimmten Teilen der Kommunikation zwischen Bot und Bot-Netzwerk auftauchte. Die Betreiber stammen aus Deutschland und Italien.

Durch die Ermittlung ihrer Identität könnten diese Zeitgenossen zur Rechenschaft gezogen werden. Warum dies viel zu selten geschieht, entzieht sich der Kenntnis der Autoren. Täglich entstehen Dutzende Bot-Netzwerke, die persönliche und schützenswerte Daten von Benutzern abgreifen und deren Systeme darüber hinaus missbräuchlich nutzen. Appelle an die Nutzer, Patches einzuspielen, um längst bekannte Sicherheitslücken zu schließen, liegen nahe, lösen aber nur bekannte Probleme.

Das Fazit der Untersuchungen liegt in dem technischen Beweis, dass Betreiber von Bot-Netzwerken aufgespürt werden können. Die hier dargestellten Methoden eignen sich dazu, um Personen zu enttarnen, die nach Ansicht der Autoren kriminell handeln.

Spammer mieten Bot-Netze Die Betreiber von Botnets sind zum Teil Spaßvögel, aber auch Geschäftemacher: Nach den Erfahrungen von Holz vermieten Bot-Betreiber ihre Netze zum Beispiel an Spammer, die auf diese Weise Mail-Müll versenden können. Obwohl von Bot-Netzen eine potenzielle Gefahr ausgeht, können Strafverfolger nicht aktiv werden. "Da es sich um ein Antragsdelikt handelt, kann die Polizei oder das Bundeskriminalamt erst einschreiten, wenn jemand Anzeige erstattet", erläutert Dirk Häger, Experte für Trojaner beim Bundesamt für Sicherheit in der Informa-tionstechnik.

Patches und Virenscanner beugen nur vor

Das Patchen von Systemen und regelmäßige Updates von Virensignaturen können nur als vorbeugende Maßnahme verstanden werden. Sie schützen in der Regel vor Missbräuchen von Sicherheitslücken. Sind Systeme bereits befallen, können sich Anwender nicht mehr auf die Anti-Viren-Tools allein verlassen. In einigen Fällen entfernte der Virenkiller zwar die Dateien des Wurms, sein Code lief aber noch immer als Prozess.

Die Erkenntnisse haben gezeigt, dass Bot-Code modular ist, beliebig modifiziert und sogar automatisch aktualisiert werden kann. Dieses stellt eine nicht zu unterschätzende Gefahr dar.