使用Intel PT与IPTAnalyzer进行漏洞利用
Posted 嘶吼专业版
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Intel PT与IPTAnalyzer进行漏洞利用相关的知识,希望对你有一定的参考价值。
英特尔PT(处理器跟踪)是一项最新的英特尔CPU的技术,Intel Skylake和更高版本的CPU型号都已经具有了此功能。你可以使用触发和过滤功能在指令级别跟踪代码执行。通过本文,我们希望探索该技术在漏洞利用分析中的实际应用。
0x01 在Windows上使用Intel PT
在Windows上记录Intel PT的信息主要可以使用三种方法。
[WindowsIntelPT](https://github.com/intelpt/WindowsIntelPT)
[WinIPT](https://github.com/ionescu007/winipt)
[Intel® Debug Extensions for WinDbg* for Intel® Processor Trace](https://software.intel.com/en-us/intel-system-studio-2019-windbg-pt-user-guide-windows-introducing-the-intel-debug-extensions-for-windbg-for-intel-processor-trace)
要分析记录的数据包,可以使用Intel的libipt,Libipt是可以解码Intel PT数据包的标准库,它提供了ptdump和ptexd基本工具。
https://github.com/intel/libipt
Instruction Source
Intel PT仅记录控制流更改。要解码Intel PT跟踪,我们需要执行指令的image文件。如果在代码执行的某些区域没有匹配的image,则可能会丢失一些执行信息。在没有静态image文件可用的JIT代码执行中,可能会发生这种情况,甚至shellcode都很难跟踪,因为shellcode指令仅存在于内存中。
因为Intel PT不会保存指令字节或内存内容,所以你需要为每个IP(指令指针)提供指令字节。例如,下面显示了ptxed命令的工作方式。
记录压缩
在现实世界中使用Intel PT的一个障碍是处理Intel PT跟踪文件所需的大量CPU时间,跟踪文件已被压缩,在使用之前都需要先对其进行解压缩,Libipt库可用于解码过程,但它更多是单线程操作。
方法
数据包
IPT压缩中使用的数据包的说明可以从《英特尔®64和IA-32体系结构软件开发人员手册》中找到。
https://software.intel.com/en-us/articles/intel-sdm
有许多数据包用于实现记录机制,但是,很少有重要的数据包类型起主要作用。
PSB数据包
PSB数据包用作跟踪数据包解码的同步点。它是跟踪日志中的边界,在其中可以独立执行减压过程而没有任何副作用,此偏移在libipt库代码中称为“同步偏移”,因为这是跟踪文件中的偏移,你可以在其中安全地开始解码以下数据包。
TIP (Target IP)
TNT (Taken Not-Taken)
TNT数据包用于指示是否进行条件转移。因为可以从过程映像中推断出那些流量控制,所以不会记录任何无条件的分支跳转。
总体而言,解压缩过程如下图所示。这更多是过于简化的视图,但是它可以向你展示解压缩的工作原理,IntelPT日志可用于重建完整的指令执行并在指令字节的帮助下控制流的变化,没有指令字节,它仅给出完整指令执行的部分视图。
跟踪日志
这是IPT跟踪日志的一个片段,该片段使用libipt中的ptdump转换为文本形式。它以PSB数据包开头,该位置指示你可以安全地解码后续数据包的位置,目前有一些与填充和定时相关的数据包可以忽略。
000000000000001c psb
000000000000002c pad
000000000000002d pad
000000000000002e pad
在偏移量3db处,有一个tip.pge数据包。这意味着指令指针位于数据包指示的位置00007ffbb7d63470。
...
00000000000003db tip.pge 3: 00007ffbb7d63470
00000000000003e2 pad
00000000000003e3 pad
seg000:00007FFBB7D63470 mov rcx, [rsp+20h]
seg000:00007FFBB7D63475 mov edx, [rsp+28h]
seg000:00007FFBB7D63479 mov r8d, [rsp+2Ch]
seg000:00007FFBB7D6347E mov rax, gs:60h
seg000:00007FFBB7D63487 mov r9, [rax+58h]
seg000:00007FFBB7D6348B mov rax, [r9+r8*8]
seg000:00007FFBB7D6348F call sub_7FFBB7D63310
seg000:00007FFBB7D63310 sub rsp, 48h
seg000:00007FFBB7D63314 mov [rsp+48h+var_28], rcx
seg000:00007FFBB7D63319 mov [rsp+48h+var_20], rdx
seg000:00007FFBB7D6331E mov [rsp+48h+var_18], r8
seg000:00007FFBB7D63323 mov [rsp+48h+var_10], r9
seg000:00007FFBB7D63328 mov rcx, rax
seg000:00007FFBB7D6332B mov rax, cs:7FFBB7E381E0h
seg000:00007FFBB7D63332 call rax
...
00000000000003ee tip 2: ????????b7d4fb70
00000000000003f3 pad
...
解码从00007ffbb7d4fb70继续,直到它在00007FFBB7D4FB8C处有条件跳转指令为止。
seg000:00007FFBB7D4FB70 mov rdx, cs:7FFBB7E38380h
seg000:00007FFBB7D4FB77 mov rax, rcx
seg000:00007FFBB7D4FB7A shr rax, 9
seg000:00007FFBB7D4FB7E mov rdx, [rdx+rax*8]
seg000:00007FFBB7D4FB82 mov rax, rcx
seg000:00007FFBB7D4FB85 shr rax, 3
seg000:00007FFBB7D4FB89 test cl, 0Fh
seg000:00007FFBB7D4FB8C jnz short loc_7FFBB7D4FB95
seg000:00007FFBB7D4FB8E bt rdx, rax
seg000:00007FFBB7D4FB92 jnb short loc_7FFBB7D4FBA0
seg000:00007FFBB7D4FB94 retn
此时,tnt数据包将为你提供是否执行条件跳转的信息。以下带有2个“ ..”的tnt.8数据包表示,它没有进行两次无条件跳转。
00000000000003fe tnt.8 ..
接下来,它将在00007FFBB7D4FB94处遇到ret指令。
seg000:00007FFBB7D4FB94 retn
00000000000003ff tip 2: ????????b7d63334
seg000:00007FFBB7D63334 mov rax, rcx
seg000:00007FFBB7D63337 mov rcx, [rsp+48h+var_28]
seg000:00007FFBB7D6333C mov rdx, [rsp+48h+var_20]
seg000:00007FFBB7D63341 mov r8, [rsp+48h+var_18]
seg000:00007FFBB7D63346 mov r9, [rsp+48h+var_10]
seg000:00007FFBB7D6334B add rsp, 48h
IPTA 分析工具
IPT压缩机制非常有效,需要拆卸引擎的帮助来重建完整指令。即使是很短的IPT跟踪记录,也需要大量CPU资源进行解压缩。一种方法是,可以应用IP过滤来限制输出,以最大程度地减少跟踪输出量。有时出于研究目的,不可避免的需要处理大量跟踪日志。
https://github.com/ohjeongwook/iptanalyzer
案例研究:CVE-2017-11882
CVE-2017-11882是Microsoft Office公式编辑器中的漏洞,这是练习将IPT用于漏洞分析的良好练习目标。我们将说明如何使用IPT和IPTAnalyzer高效执行漏洞利用分析。
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-11882
IPT 日志收集
你可以使用各种方法来生成IPT跟踪日志。我使用WinIPT生成跟踪日志。
https://github.com/ionescu007/winipt https://www.virustotal.com/gui/file/abbdd98106284eb83582fa08e3452cf43e22edde9e86ffb8e9386c8e97440624/detection
我们使用了恶意样本abbdd98106284eb83582fa08e3452cf43e22edde9e86ffb8e9386c8e97440624来复制利用条件,使用进程ID和日志文件名运行ipttool.exe,进程ID 2736是易受攻击的公式编辑器进程,跟踪输出将保存到EQNEDT32.pt文件中。
C:\Analysis\DebuggingPackage\TargetMachine\WinIPT>ipttool.exe --trace 2736 EQNEDT32.pt
/-----------------------------------------\
|=== Windows 10 RS5 1809 IPT Test Tool ===|
|=== Copyright (c) 2018 Alex Ionescu ===|
|=== http://github.com/ionescu007 ===|
|=== http://www.windows-internals.com ===|
\-----------------------------------------/
[+] Found active trace with 1476395324 bytes so far
[+] Trace contains 11 thread headers
[+] Trace Entry 0 for TID 2520
Trace Size: 134217728 [Ring Buffer Offset: 4715184]
Timing Mode: MTC Packets [MTC Frequency: 3, ClockTsc Ratio: 83]
[+] Trace Entry 1 for TID 1CA8
Trace Size: 134217728 [Ring Buffer Offset: 95936]
Timing Mode: MTC Packets [MTC Frequency: 3, ClockTsc Ratio: 83]
[+] Trace Entry 2 for TID 8AC
Trace Size: 134217728 [Ring Buffer Offset: 63152]
Timing Mode: MTC Packets [MTC Frequency: 3, ClockTsc Ratio: 83]
[+] Trace Entry 3 for TID 1A88
Trace Size: 134217728 [Ring Buffer Offset: 4560]
Timing Mode: MTC Packets [MTC Frequency: 3, ClockTsc Ratio: 83]
[+] Trace Entry 4 for TID 1964
Trace Size: 134217728 [Ring Buffer Offset: 45184]
Timing Mode: MTC Packets [MTC Frequency: 3, ClockTsc Ratio: 83]
[+] Trace Entry 5 for TID 22D0
Trace Size: 134217728 [Ring Buffer Offset: 6768]
Timing Mode: MTC Packets [MTC Frequency: 3, ClockTsc Ratio: 83]
[+] Trace Entry 6 for TID 73C
Trace Size: 134217728 [Ring Buffer Offset: 32480]
Timing Mode: MTC Packets [MTC Frequency: 3, ClockTsc Ratio: 83]
[+] Trace Entry 7 for TID 1684
Trace Size: 134217728 [Ring Buffer Offset: 285264]
Timing Mode: MTC Packets [MTC Frequency: 3, ClockTsc Ratio: 83]
[+] Trace Entry 8 for TID 3C4
Trace Size: 134217728 [Ring Buffer Offset: 99056]
Timing Mode: MTC Packets [MTC Frequency: 3, ClockTsc Ratio: 83]
[+] Trace Entry 9 for TID 610
Trace Size: 134217728 [Ring Buffer Offset: 4812464]
Timing Mode: MTC Packets [MTC Frequency: 3, ClockTsc Ratio: 83]
[+] Trace Entry 10 for TID 1CD8
Trace Size: 134217728 [Ring Buffer Offset: 7424]
Timing Mode: MTC Packets [MTC Frequency: 3, ClockTsc Ratio: 83]
[+] Trace for PID 2736 written to EQNEDT32.pt
进程内存转储
你可以使用ProcDump或Process Explorer甚至Windbg来获取方程编辑器(EQNEDT32.exe)的内存转储,IPTAnalyzer可以使用进程内存转储来自动检索指令字节,而不是将单独的image文件提供给libipt。
https://docs.microsoft.com/en-us/sysinternals/downloads/procdump https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
运行iptanalyzer
为了方便起见,在以下示例中,将%IPTANALYZERTOOL%设置为IPTAnalyzer文件夹的根目录。通过使用decode_blocks.py,可以生成块缓存文件。你需要提供带有IPT跟踪文件名的-p选项和带有进程内存转储文件的-d选项。
python %IPTANALYZER%\pyipttool\decode_blocks.py -p PT\EQNEDT32.pt -d ProcessMemory\EQNEDT32.dmp -c block.cache
下面显示了并行的Python进程,它们对解码文件进行解码。
转储EQNEDT32模块数据
0:011> lmvm EQNEDT32
Browse full module list
start end module name
00000000`00400000 00000000`0048e000 EQNEDT32 (deferred)
...
python %IPTANALYZER%\pyipttool\dump_blocks.py -p PT\EQNEDT32.pt -d ProcessMemory\EQNEDT32.dmp -C 0 -c blocks.cache -s 0x00400000 -e 0x0048e000
...
> 00000000004117d3 () (sync_offset=2d236c, offset=2d26f4)
EQNEDT32!EqnFrameWinProc+0x2cf3:
00000000`004117d3 0fbf45c8 movsx eax,word ptr [rbp-38h]
> 000000000041181e () (sync_offset=2d236c, offset=2d26f4)
EQNEDT32!EqnFrameWinProc+0x2d3e:
00000000`0041181e 0fbf45fc movsx eax,word ptr [rbp-4]
> 0000000000411869 () (sync_offset=2d236c, offset=2d26f4)
EQNEDT32!EqnFrameWinProc+0x2d89:
00000000`00411869 33c0 xor eax,eax
> 000000000042fad6 () (sync_offset=2d236c, offset=2d26fc)
EQNEDT32!MFEnumFunc+0x12d9:
00000000`0042fad6 c3 ret
转储EQNEDT32模块指令
现在,我们知道EQNEDT32模块的最后一个基本块是在“ sync_offset = 2d236c” PSB块内执行的。dump_instructions.py脚本可用于转储完整指令。-S(开始sync_offset)和-E(结束sync_offset)之类的选项可用于指定sync_offset范围。
python %IPTANALYZER%\pyipttool\dump_instructions.py -p ..\PT\EQNEDT32.pt -d ..\ProcessMemory\EQNEDT32.dmp -S 0x2d236c -E 0x2d307c
查找ret代码
使用dump_instructions.py的输出,你可以轻松确定从EQNEDT32到Shellcode的代码的位置。
...
Instruction: EQNEDT32!EqnFrameWinProc+0x2d8b:
00000000`0041186b e900000000 jmp EQNEDT32!EqnFrameWinProc+0x2d90 (00000000`00411870)
Instruction: EQNEDT32!EqnFrameWinProc+0x2d90:
00000000`00411870 5f pop rdi
Instruction: EQNEDT32!EqnFrameWinProc+0x2d91:
00000000`00411871 5e pop rsi
Instruction: EQNEDT32!EqnFrameWinProc+0x2d92:
00000000`00411872 5b pop rbx
Instruction: EQNEDT32!EqnFrameWinProc+0x2d93:
00000000`00411873 c9 leave
Instruction: EQNEDT32!EqnFrameWinProc+0x2d94:
00000000`00411874 c3 ret
Instruction: EQNEDT32!MFEnumFunc+0x12d9:
00000000`0042fad6 c3 ret
Instruction: 00000000`0019ee9c bac342baff mov edx,0FFBA42C3h
Instruction: 00000000`0019eea1 f7d2 not edx
Instruction: 00000000`0019eea3 8b0a mov ecx,dword ptr [rdx]
Instruction: 00000000`0019eea5 8b29 mov ebp,dword ptr [rcx]
Instruction: 00000000`0019eea7 bb3a7057f4 mov ebx,0F457703Ah
Instruction: 00000000`0019eeac 81eb8a0811f4 sub ebx,0F411088Ah
Instruction: 00000000`0019eeb2 8b1b mov ebx,dword ptr [rbx]
Instruction: 00000000`0019eeb4 55 push rbp
Instruction: 00000000`0019eeb5 ffd3 call rbx
...
从上面的指令清单中,你可以注意到00411874和0042fad6有两个“ ret”指令。
Instruction: EQNEDT32!EqnFrameWinProc+0x2d94:
00000000`00411874 c3 ret
Instruction: EQNEDT32!MFEnumFunc+0x12d9:
00000000`0042fad6 c3 ret
Instruction: 00000000`0019ee9c bac342baff mov edx,0FFBA42C3h
Instruction: 00000000`0019eea1 f7d2 not edx
Instruction: 00000000`0019eea3 8b0a mov ecx,dword ptr [rdx]
Instruction: 00000000`0019eea5 8b29 mov ebp,dword ptr [rcx]
注意,在00000000`0019ee9c处的指令没有检索到任何匹配的模块名称,这意味着它很有可能被shellcode加载到动态内存中。
执行下一阶段的Shellcode
在shellcode之后,我们可以使用“ jmp rax”指令在0019eec1处定位执行下一级shellcode的位置,我们在Intel PT日志中有完整的Shellcode执行列表。
Instruction: 00000000`0019eeb7 0567946d03 add eax,36D9467h
Instruction: 00000000`0019eebc 2d7e936d03 sub eax,36D937Eh
Instruction: 00000000`0019eec1 ffe0 jmp rax
这些是dump_instructions.py脚本转储的下一阶段shellcode。
Instruction: 00000000`00618111 9c pushfq
Instruction: 00000000`00618112 56 push rsi
Instruction: 00000000`00618113 57 push rdi
Instruction: 00000000`00618114 eb07 jmp 00000000`0061811d
Instruction: 00000000`0061811d 9c pushfq
Instruction: 00000000`0061811e 57 push rdi
Instruction: 00000000`0061811f 57 push rdi
Instruction: 00000000`00618120 81ef40460000 sub edi,4640h
Instruction: 00000000`00618126 81ef574b0000 sub edi,4B57h
Instruction: 00000000`0061812c 8dbfbc610000 lea edi,[rdi+61BCh]
Instruction: 00000000`00618132 81c73b080000 add edi,83Bh
Instruction: 00000000`00618138 5f pop rdi
Instruction: 00000000`00618139 5f pop rdi
分析总结
英特尔PT是一项非常有用的技术,可用于防御性和攻击性安全性研究。IPTAnalyzer是一个使用libipt库来使用IPT跟踪日志加快分析速度的工具。这里的漏洞利用示例显示了使用IPTAnalyzer工具生成块缓存文件并将其用于基本漏洞利用调查的好处。没有英特尔PT的帮助,此过程可能很繁琐,可能更多地取决于研究人员的直觉。使用Intel PT,可以自动执行此过程并自动检测恶意代码活动。
参考及来源:https://darungrim.com/research/2020-05-07-UsingIntelPTForVulnerabilityTriagingWithIPTAnalyzer.html
以上是关于使用Intel PT与IPTAnalyzer进行漏洞利用的主要内容,如果未能解决你的问题,请参考以下文章