没有合适的资源?快使用搜索试试~ 我知道了~
深入探究Windows平台客户端安全问题-进程地址空间入侵和白加黑高阶利用1
需积分: 0 0 下载量 190 浏览量
2022-08-08
23:09:44
上传
评论
收藏 1.13MB DOCX 举报
温馨提示
试读
14页
可以看出此种注入方法存在的限制1. 进程使用了Explorer Shell Extension函数2. 用户点击了右键限制确实是多了点,但是我们可以再减少一点,
资源详情
资源评论
资源推荐
1. 看雪论坛
2. 『编程技术』
发新帖
[
原创
]
深入探究
Windows
平台客户端安全问题
-
进程地址空间入
侵和白加黑高阶利用
tishion 2014-9-8 00:03 34635
前言
为了避免被读者骂“标题党”,笔者在文章开头先澄清一下这个高大尚的“进程地址空间入侵”
的可替代词语—注入。
看完第一句还能看到这里的读者一般有两种:1.初学者,实在是不懂所以需要学习的同学 2
.大牛,只是想看看笔者打算怎么来炒“注入”这盘冷饭。
好吧,如很多人都知道的一样,Windows 平台下的远程模块”注入“是盘冷饭,但是却很少
有人对这个技术做一个全面,系统,深入的讲解。因为笔者现在是在职的开发人员,不像学
生时代一个月能写五六篇文章那样高产,现在的状态也就是每年两篇看雪精华帖,所以笔者
力求自己现在写的每篇文章都能推陈出新,浅显易懂,并且对问题的本质,利用方法,解决
方法等多方面都进行介绍。
进程地址空间入侵[Process Address Space Intrusion](注入)
注入就是使一个非目标进程所拥有的 Dll 模块通过某种手段被目标进程加载到自己的地址空
间,并且使得该 Dll 模块中的代码得到执行权限。说到这里可能大部分人就会想到通过 Create
RemoteThread 传入 LoadLibraryA/W 和目标模块路径的字符串来让一个目标进程主动加载
目标模块这种方法。确实这个方法都被许多人讲烂了,但是读者有没有仔细思考过这种行为
的本质是什么?Windows 平台下的所有进程的虚拟地址空间都是独立的,这样就保证了每
个进程的先对稳定性和安全行,但是 Windows 也提供了对非自身进程的其他进程的地址空
间进行访问的能力,比如 Reader/WriteProcessMemory 函数,这样就可以提供了一种向远
程进程写入一段可执行的代码,并且让这段代码得到执行权限/机会的能力,发散一下思维,
注入一整个模块其实也是通过某种手段在目标进程的地址空间开辟出一个能容纳目标模块
的内存 Section,然后让这个模块里面所含的代码得到执行权限。所以上面所说的“注入”其
实本质上就是一种进程地址空间入侵。
由于 Windows 系统在设计上的灵活性和完整性,系统本身就已经提供了非常多的进程空间
入侵手段,这里总结一下:
1. 通过 CreateRemoteThread 创建远程线程调用 LoadLibrary
2. 通过 QueueUserAPC 挂载 APC 调用 LoadLibrary
3. 向远程进程中写入一段简单的 Shell Code,在 Shell Code 调用 LoadLibrary
4. 修改远程线程的 Context,在其 Context 中构造调用 LoadLibray 的堆栈状态
5. Lsp 注入
6. 输入法注入
7. Explorer Shell Extension 注入
8. 通过 SetWindowsHookEx 或者 SetWinEventHook 函数设置全局钩子
9. Dll 模块劫持(LPK.dll,ComRes.dll, 以及开发者犯错构成的模块劫持)
以上是笔者自己总结的现有的所有的进程地址空间入侵的方法,如果读者觉得有遗漏,还请
不吝指出。有一点需要明确,以上所有方法都需要 LoadLibrary 函数的介入,因为要把一个
模块加载到一个进程空间就涉及到 PE Loader 相关的操作了,所以直接使用 Windows 自身
的加载方法可以省却很多麻烦。上述方法中的 1~6 都是比较有名的方法,而且各大安全软
件厂商也都有比较成熟的防御方法,所以本文就不做深入的讲解了,下面笔者将对 7,8,9
这三种方法的原理和利用进行详细深入的探讨,至于防御方法还是需要更多人去研究了。
Explorer Shell Extension 注入法
原理
这种注入方法知道的人比较少,也因为该种注入方法有不少限制,所以一般适用性不太大,
但是正由于其不引起人们的注意,所以某些安全软件都会没有对其做相应的防护。先说一下
该方法的大致思路,因为 Windows 的 Explorer Shell 提供了非常高的可扩展性,所以这也
提供了一种进程去加载一个指定 DLL 模块的途径。比如 Explorer 中的右键菜单,当你在桌
面空白或者某个文件对象上点击右键的时候 Explorer 会把当前系统中注册的需要显示的右
键菜单所在的 Dll 模块加载到 Explorer 进程中,然后调用响应的接口显示出菜单项目。看到
了么,轻而易举的将一个进程注入到了 Explorer 进程中,但是一般选择 Explorer 作为目标
进程没有太大实际意义,所以这种方法就没有用处了么?不是这样的,应该这样说,凡是使
用了 Windows Shell 函数的进程都遵循这一规则,比如一个进程使用了 GetOpenFileName
这个函数,这个函数的作用就是弹出一个常见的文件选择对话框,如果用户在弹出的对话框
中单击鼠标右键,那么当前进程还是要遵照 Shell Extension 的规则把当前系统中当前用户
注册的所有右键菜单的模块都加载到该进程中。可以看出此种注入方法存在的限制
1. 进程使用了 Explorer Shell Extension 函数
2. 用户点击了右键
限制确实是多了点,但是我们可以再减少一点,选择右键菜单的 Shell 扩展并不是最明智的
做法,更简单的方法是选择 ShellIconOverlayIdentifiers 这个扩展点来进行注入,这个扩展
点作用是控制 Explorer 中的文件对象的图标,比如我们常用的 SVN 和 GIT 软件,他们都会
注册这个扩展点来实现对文件和文件夹图标的添加额外显示元素,如下图所示:
使用这个扩展点的好处是,只要 Explorer 的对话框显示出来,这些扩展点注册的模块就会
立即被加载起来,无需用户去点击右键菜单,在这个扩展点加载模块时候的堆栈如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
ModLoad: 00000000`73e00000 00000000`73e0d000 E:\Users\xxxxx\Desktop\spookshellext\Release\SpookShlExt.dll
ntdll!NtMapViewOfSection+0xa:
00000000`77b7153a c3 ret
0:000> .effmach x86
Effective machine: x86 compatible (x86)
0:000:x86> kvn 5000
# ChildEBP RetAddr Args to Child
00 002dbd10 77d3bf70 0000027c ffffffff 002dbe3c ntdll32!NtMapViewOfSection+0x12 (FPO: [10,0,0])
01 002dbd64 77d3c5fb 0000027c 00000000 00000000 ntdll32!LdrpMapViewOfSection+0xc7 (FPO: [Non-Fpo])
02 002dbe58 77d3c42c 002dbea4 012dc004 00000000 ntdll32!LdrpFindOrMapDll+0x333 (FPO: [Non-Fpo])
03 002dbfd8 77d3c558 002dc03c 002dc004 00000000 ntdll32!LdrpLoadDll+0x2b2 (FPO: [Non-Fpo])
04 002dc010 75962c95 002dc004 002dc054 002dc03c ntdll32!LdrLoadDll+0xaa (FPO: [Non-Fpo])
05 002dc04c 764a9d43 00000000 00000000 00556614 KERNELBASE!LoadLibraryExW+0x1f1 (FPO: [Non-Fpo])
06 002dc068 764a9cc7 00000000 002dc0e4 00000008 ole32!LoadLibraryWithLogging+0x16 (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\common\loadfree.cxx @ 157]
07 002dc08c 764a9bb6 002dc0e4 002dc0b0 002dc0b4 ole32!CClassCache::CDllPathEntry::LoadDll+0xa9 (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\com\objact\dllcache.cxx @ 1925]
08 002dc0bc 764a90be 002dc0e4 002dc3cc 002dc0dc ole32!CClassCache::CDllPathEntry::Create_rl+0x37 (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\com\objact\dllcache.cxx @ 1783]
09 002dc308 764a8f93 00000001 002dc3cc 002dc338 ole32!CClassCache::CClassEntry::CreateDllClassEntry_rl+0xd4 (FPO: [Non-Fpo]) (CONV:
thiscall) [d:\w7rtm\com\ole32\com\objact\dllcache.cxx @ 886]
0a 002dc350 764a8e99 00000001 00525464 002dc37c ole32!CClassCache::GetClassObjectActivator+0x224 (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\com\objact\dllcache.cxx @ 4795]
0b 002dc388 764a8c57 002dc3cc 00000000 002dc9d4 ole32!CClassCache::GetClassObject+0x30 (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\com\objact\dllcache.cxx @ 4574]
0c 002dc404 764c3170 765c6444 00000000 002dc9d4 ole32!CServerContextActivator::CreateInstance+0x110 (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\com\objact\actvator.cxx @ 974]
0d 002dc444 764a8dca 002dc9d4 00000000 002dcf38 ole32!ActivationPropertiesIn::DelegateCreateInstance+0x108 (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\actprops\actprops.cxx @ 1917]
0e 002dc498 764a8d3f 765c646c 00000000 002dc9d4 ole32!CApartmentActivator::CreateInstance+0x112 (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\com\objact\actvator.cxx @ 2268]
0f 002dc4b8 764a8ac2 765c6494 00000001 00000000 ole32!CProcessActivator::CCICallback+0x6d (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\com\objact\actvator.cxx @ 1737]
10 002dc4d8 764a8a73 765c6494 002dc830 00000000 ole32!CProcessActivator::AttemptActivation+0x2c (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\com\objact\actvator.cxx @ 1630]
11 002dc514 764a8e2d 765c6494 002dc830 00000000 ole32!CProcessActivator::ActivateByContext+0x4f (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\com\objact\actvator.cxx @ 1487]
12 002dc53c 764c3170 765c6494 00000000 002dc9d4 ole32!CProcessActivator::CreateInstance+0x49 (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\com\objact\actvator.cxx @ 1377]
13 002dc57c 764c2ef4 002dc9d4 00000000 002dcf38 ole32!ActivationPropertiesIn::DelegateCreateInstance+0x108 (FPO: [Non-Fpo]) (CONV: stdcall)
[d:\w7rtm\com\ole32\actprops\actprops.cxx @ 1917]
14 002dc7dc 764c3170 765c6448 00000000 002dc9d4 ole32!CClientContextActivator::CreateInstance+0xb0 (FPO: [Non-Fpo]) (CONV: stdcall)
剩余13页未读,继续阅读
洪蛋蛋
- 粉丝: 21
- 资源: 335
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0