记得在 AntSword新类型 CmdLinux 预览 这篇文章最后立了个 Flag (Windows 下纯命令执行WebShell的图形化连接) 一直没解决,今天有了个雏形,主要是证明了这个思路可行。
正文
老规矩,先看视频。(嫌公众号视频不清晰的,可以点阅读原文去 B 站看 720P 的)。
看完视频我们来说说具体的实现。想看代码的直接去 (https://github.com/AntSwordProject/antSword/commit/dc3c1680bae523cd823444dd19933a1a237a2ec2)
因为 AntSword 的历史原因,数据格式的设定都是为脚本语言来设计的,输出相对比较灵活,所以 CMD 类的 WebShell 在使用 AntSword 时最麻烦的事情就是数据格式的输出了。最开始我是想用 cmd.exe 来完成数据格式的切割和拼接。算了不扯这么多了,反正就是 cmd.exe 麻烦的一匹,最后看上了 Powershell
Powershell 的好处都有啥
丰富的内置模块
这个你们应该比我熟太多了,我就不展开了。类比 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~
不如关注一波再走?