新类型 PSWindows 预览
2022-6-21 10:34:49 Author: mp.weixin.qq.com(查看原文) 阅读量:1 收藏

写在前面

  记得在  AntSword新类型 CmdLinux 预览 这篇文章最后立了个 Flag (Windows 下纯命令执行WebShell的图形化连接) 一直没解决,今天有了个雏形,主要是证明了这个思路可行。

正文

老规矩,先看视频。(公众号视频不清晰的,可以点阅读原文去 B 站看 720P 的)。

看完视频我们来说说具体的实现。想看代码的直接去 (https://github.com/AntSwordProject/antSword/commit/dc3c1680bae523cd823444dd19933a1a237a2ec2)

因为 AntSword 的历史原因,数据格式的设定都是为脚本语言来设计的,输出相对比较灵活,所以 CMD 类的 WebShell 在使用 AntSword 时最麻烦的事情就是数据格式的输出了。最开始我是想用 cmd.exe 来完成数据格式的切割和拼接。算了不扯这么多了,反正就是 cmd.exe 麻烦的一匹,最后看上了 Powershell

Powershell 的好处都有啥

  1. 丰富的内置模块

这个你们应该比我熟太多了,我就不展开了。类比 ls 命令的 Get-ChildItem (简写 gci) ,创建文件时用的 New-Item, 发起 http 请求时的 Invoke-WebRequest 等等,可以极大的方便我们去构造Payload. 除此之外,PowerShell 提供的 Foreach-Object , Select-Object, Where-Object 等操作也是很方便的。

比如 create_file 可以这样来实现:

try {  [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('#{base64::content}'))|New-Item -ItemType File -Force -Path '#{path}' -ErrorAction Stop|Out-Null;  '1';}catch{  '0';}

2. 调用 C#/.Net

这个就有意思多了,因为 PowerShell 的版本原因,有些命令的一些参数在低版本下根本没有,没错我说的就是上面那个 New-Item,在高版本有 -Encoding 参数用来设置写入文件时的字符编码,然而低版本没有,在没有的时候就按系统默认的编码来了。此时就很容易因为字符编码的问题导致二进制数据上传出错

所以现在写文件的 Payload 长这个样子

$C=[byte[]] -split ('#{buffer::content}' -replace '..', '0x$& ');[System.IO.File]::WriteAllBytes('#{path}',$C);return '1';

直接调用 System.IO.File 的静态方法 WriteAllBytes 以二进制方式写入文件

嗯,静态方法好是好,可是也不够丰富呀。于是 New-Object 这个方法让我看到了。这玩意儿是真好使,举个例子:

// PowerShell$conn=New-Object System.Data.Odbc.OdbcConnection($connstr);
// C#System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection(connstr);

看出来区别了吗?基本没啥区别。这样就可以直接把 ASPXCsharp 类型中的 Payload 改改,然后一个新的连接类型 PSWindows 就这么诞生了。

说点需要注意的地方

1. 文件下载只能下载文本类的文件

因为 cmd 类的 WebShell 在使用 Download 的时候,原理是先将文件输出到 stdout 然后再到 response 之后到 AntSword。目前的 Download 请求是直接怼的二进制流,所以在传输的时候是没有经过编码/加密转换的。

于是问题来了,PowerShell 的 Stdout 它不能显示扩展 ASCII 码表的字符。什么意思?比如说一张图片的文件头是 ff d8 ff e0 00 10 4a 46 , 输出到 PowerShell 的 Stdout 后就成了 ff 3f 3f 10 4a 46 49 46

结论: 不在 ASCII 可显示范围内的字符都会给你整成 3F,难受。所以目前的 Download 机制下,下载二进制文件时会不正常。这块后期考虑更改 download 机制来解决。

2. 关于文件权限

文件权限不再是以我们熟知的 0777 这样的八进制数来表示了,而是用 darhs 这五个组合来表示,具体看微软文档中的表示:

而目前仅支持 rhs 这三个属性的修改,当然了,你要想改更多的属性你自己写 powershell 命令去

3. 有关视频当中查询数据库出现的类型转换问题

我后面再抽时间看看怎么整,我现在用的是 GetString方法,没来得及研究那么多。另外像 insert/update/delete 这些语句也是支持的,视频当中没演示,自已去测试环境里试吧。

写在最后

PowerShell 封杀那么严重,实战中有没有用?嗯,不知道,自行解决,我只是学习用。

CMD类的连接,这玩意儿的意义在哪里?嗯,直连RCE漏洞,没有语言的限制 Python/Go/Balabala...,无文件落地,比如像...就不比如了。

就这样吧,Byebye~


不如关注一波再走?


文章来源: https://mp.weixin.qq.com/s?__biz=MzI0MDI5MTQ3OQ==&mid=2247484525&idx=1&sn=065cfe093785a05cefbc90e3ba1993c3&chksm=e91c5f95de6bd683f5f7f90f8558b34c106ee517df807e0bb6da05dc22c863bf6ae29681474e&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh