CVE-2017-7269 样本调试笔记(一)


原文首发:看雪论坛 http://bbs.pediy.com/thread-216967.htm 


0x0 写在前面

———————————

该漏洞可针对 IIS 6.0 的 WebDAV 服务发起攻击,通过缓冲区溢出造成远程代码执行。漏洞提交者已在 GitHub 上公布 Poc 代码以及漏洞描述,我们可以方便得到 Poc 以及漏洞信息进行调试

作为一个初学者,看完别人的分析文章需要做的是上手调试,于是形成了这篇调试笔记。行文略显烦琐,错误含糊之处希望各位指(pao)出(hong)。

本文的分析思路是跟踪执行脚本时大规模拷贝的数据,弄清数据的含义以及拷贝之后的流程走向,因为没有对相关函数进行反汇编阅读,理解上难免狭隘肤浅。

0x1 调试环境

——————————

[操作系统]: Windows Server 2003 R2 Enterprise Edition SP2

[调试器]: WinDbg 6.11.0001.402 X86

[Python]: Python 2.7

0x2 搭建调试环境

————————————

0x2.1 安装IIS 6.0

在 Add or Remove Programs 中选择 Add/Remove Windows Components

CVE-2017-7269 样本调试笔记(一)_第1张图片

对 Application Server 选项的描述中提到了 IIS

点击 Details 全部选中(只选择IIS应该也可以),然后点击 Next

在安装组件的过程中需要插入安装光盘

安装完成之后打开 IIS 服务管理器

CVE-2017-7269 样本调试笔记(一)_第2张图片

鼠标右键将 WebDAV 设置为 Allow

打开服务,查看 WebClient,需要将其开启

目前处于停止状态且无法开启,将该服务设为自启动,然后重启。

此时服务正常开启。

0x2.2 运行样本文件

————————————

将 python 路径设为环境变量,使用控制台窗口运行样本。

CVE-2017-7269 样本调试笔记(一)_第3张图片

查看任务管理器,多出了隐藏窗口的 calc.exe 进程。

CVE-2017-7269 样本调试笔记(一)_第4张图片

使用 Process Explorer 查看进程依赖关系

CVE-2017-7269 样本调试笔记(一)_第5张图片

可以看到 calc.exe 的父进程是 w3wp.exe

查看 calc.exe 进程详细信息

CVE-2017-7269 样本调试笔记(一)_第6张图片

0x3 调试样本

————————

由于 w3wp.exe 并不是开机启动的进程,而样本只是简单启动计算器,干脆先执行一次脚本,然后使用 Windbg 附加调试。

既然会创建新进程,那就对几个关键 API 下断等它来。

0:022> bu CreateProcessA

0:022> bu CreateProcessW

0:022> bu WinExec

0:022> bl

0 e 77e424a9     0001 (0001)  0:**** kernel32!CreateProcessA

1 e 77e42474     0001 (0001)  0:**** kernel32!CreateProcessW

2 e 77ea411e     0001 (0001)  0:**** kernel32!WinExec

执行起来,中断到 kernel32!WinExec 函数中

0:025> g

Breakpoint 2 hit

eax=77ea411e ebx=7ffe0300 ecx=68031614 edx=876f8b31 esi=68031460 edi=680124e3

eip=77ea411e esp=680313f8 ebp=68031581 iopl=0         nv up ei pl nz na pe nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206

kernel32!WinExec:

77ea411e 8bff            mov     edi,edi

查看调用栈

0:006> k

ChildEBP RetAddr

68031581 00000000 kernel32!WinExec

没有调用关系可以参考,好了,老招数,对esp下断

0:022> bu WinExec

0:022> ba w4 680313f8

"kb; r; gc"

0:022> bl

0 e 77ea411e     0001 (0001)  0:**** kernel32!WinExec

1 e 680313f8 w 4 0001 (0001)  0:**** rsaenh!g_pfnFree+0x13c

"kb; r; gc"

凭感觉收获真是太多了

0:022> g

ChildEBP RetAddr  Args to Child

0114f798 67119469 680312c0 0114f800 00000000 httpext!ScStoragePathFromUrl+0x360

0114f7ac 6712544a 020f2878 680312c0 0114f800 httpext!CMethUtil::ScStoragePathFromUrl+0x18

0114fc34 6712561e 020f01e8 01ecee36 0114fc78 httpext!HrCheckIfHeader+0x124

0114fc44 6711f659 020f01e8 01ecee36 00000001 httpext!HrCheckStateHeaders+0x10

0114fc78 6711f7c5 020f0238 0114fcd4 671404e2 httpext!CPropFindRequest::Execute+0xf0

0114fc90 671296f2 020f0238 00000004 011d5b88 httpext!DAVPropFind+0x47

0114fce0 67117bc6 01ecffa0 020f01e8 011d5b88 httpext!CDAVExt::DwMain+0x12e

0114fe04 5a322991 011d5b88 011d48c8 011d5518 httpext!DwDavFSExtensionProc+0x3f

0114fe24 5a3968ff 011d5af8 67117b87 0114fe50 w3isapi!ProcessIsapiRequest+0x214

...(lines have been omitted)...

eax=000005fc ebx=000002fd ecx=00000137 edx=680312c0 esi=020f29b8 edi=68031404

eip=67126fdb esp=0114f330 ebp=0114f798 iopl=0         nv up ei pl nz na po nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010202

httpext!ScStoragePathFromUrl+0x360:

67126fdb f3a5            rep movs dword ptr es:[edi],dword ptr [esi]

...(lines have been omitted)...

ChildEBP RetAddr  Args to Child

68031581 00000000 0c528b30 8b14528b b70f2872 rsaenh!g_pfnFree+0x356

eax=68031633 ebx=7ffe0300 ecx=00000000 edx=6803163e esi=68031460 edi=680124e3

eip=68031612 esp=680313f8 ebp=68031581 iopl=0         nv up ei pl nz ac po cy

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000213

rsaenh!g_pfnFree+0x356:

68031612 ffd5            call    ebp {rsaenh!g_pfnFree+0x2c5 (68031581)}

ChildEBP RetAddr  Args to Child

68031581 00000000 0c528b30 8b14528b b70f2872 rsaenh!g_pfnFree+0x33e

eax=77ea411e ebx=7ffe0300 ecx=68031614 edx=876f8b31 esi=68031460 edi=680124e3

eip=680315fa esp=680313f8 ebp=68031581 iopl=0         nv up ei pl nz na pe nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206

rsaenh!g_pfnFree+0x33e:

680315fa ffe0            jmp     eax {kernel32!WinExec (77ea411e)}

...(lines have been omitted)...

重新加载样本,对如下 rep movsd 指令的地址下断

httpext!ScStoragePathFromUrl+0x360:

67126fdb f3a5            rep movs dword ptr es:[edi],dword ptr [esi]

设置断点

0:022> bu 67126fdb

0:022> bl

0 e 77ea411e     0001 (0001)  0:**** kernel32!WinExec

1 e 67126fdb     0001 (0001)  0:**** httpext!ScStoragePathFromUrl+0x360

抢先剧透,这个漏洞的产生的确来自这里,这里的数据拷贝会来三次

通常俺喜欢从上层函数开始往下看

0:006> k

ChildEBP RetAddr

00fef798 67119469 httpext!ScStoragePathFromUrl+0x360

00fef7ac 67125484 httpext!CMethUtil::ScStoragePathFromUrl+0x18

00fefc34 6712561e httpext!HrCheckIfHeader+0x15e

00fefc44 6711f659 httpext!HrCheckStateHeaders+0x10

00fefc78 6711f7c5 httpext!CPropFindRequest::Execute+0xf0

0:006> ub 67119469

httpext!CMethUtil::ScStoragePathFromUrl+0x2:

67119453 55              push    ebp

67119454 8bec            mov     ebp,esp

67119456 8b4910          mov     ecx,dword ptr [ecx+10h]

67119459 8b5508          mov     edx,dword ptr [ebp+8]

6711945c 6a00            push    0

6711945e ff7510          push    dword ptr [ebp+10h]

67119461 ff750c          push    dword ptr [ebp+0Ch]

67119464 e812d80000      call    httpext!ScStoragePathFromUrl (67126c7b)

好了重新加载样本,新增断点,对地址 0x67119464 下断

0:022> bu 680313f8

0:022> bu 67119464

0:022> bl

0 e 77ea411e     0001 (0001)  0:**** kernel32!WinExec

1 e 67119464     0001 (0001)  0:**** httpext!CMethUtil::ScStoragePathFromUrl+0x13

运行样本,中断在 httpext!ScStoragePathFromUrl 函数调用前

0:022> g

Breakpoint 1 hit

eax=0118f800 ebx=020f01e8 ecx=01ecfa80 edx=020f08f0 esi=00000000 edi=77bd8ef2

eip=67119464 esp=0118f7a0 ebp=0118f7ac iopl=0         nv up ei pl nz na pe nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206

httpext!CMethUtil::ScStoragePathFromUrl+0x13:

67119464 e812d80000      call    httpext!ScStoragePathFromUrl (67126c7b)

当前函数是这样的

httpext!CMethUtil::ScStoragePathFromUrl:

67119451 8bff            mov     edi,edi

67119453 55              push    ebp

67119454 8bec            mov     ebp,esp

67119456 8b4910          mov     ecx,dword ptr [ecx+10h]

67119459 8b5508          mov     edx,dword ptr [ebp+8]

6711945c 6a00            push    0

6711945e ff7510          push    dword ptr [ebp+10h]

67119461 ff750c          push    dword ptr [ebp+0Ch]

67119464 e812d80000      call    httpext!ScStoragePathFromUrl (67126c7b)

67119469 5d              pop     ebp

6711946a c20c00          ret     0Ch

跟进 httpext!ScStoragePathFromUrl,单步几句

httpext!ScStoragePathFromUrl:

67126c7b b8150d1467      mov     eax,offset httpext!swscanf+0x14b5 (67140d15)

67126c80 e803100000      call    httpext!_EH_prolog (67127c88)

67126c85 81ec50040000    sub     esp,450h

67126c8b a1c0701467      mov     eax,dword ptr [httpext!__security_cookie (671470c0)]

67126c90 8945f0          mov     dword ptr [ebp-10h],eax

此时内存布局为

移除

点击此处添加图片说明文字

G一下,到拷贝数据的位置

0:006> g

Breakpoint 2 hit

eax=00000130 ebx=00000097 ecx=0000004c edx=00fef804 esi=020f0910 edi=00fef828

eip=67126fdb esp=00fef330 ebp=00fef798 iopl=0         nv up ei pl nz na po nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202

httpext!ScStoragePathFromUrl+0x360:

67126fdb f3a5            rep movs dword ptr es:[edi],dword ptr [esi]

先不急,观察一下上下文,附近有四句 rep movsd 指令

67126faf f3a5            rep movs dword ptr es:[edi],dword ptr [esi]

//the first instruction of "rep movsd"

67126fb1 8bca            mov     ecx,edx

67126fb3 8b95d4fdffff    mov     edx,dword ptr [ebp-22Ch]

67126fb9 83e103          and     ecx,3

67126fbc f3a4            rep movs byte ptr es:[edi],byte ptr [esi]

//the second

67126fbe 8bb5bcfbffff    mov     esi,dword ptr [ebp-444h]

67126fc4 2bda            sub     ebx,edx

67126fc6 8d3456          lea     esi,[esi+edx*2]

67126fc9 8b95b0fbffff    mov     edx,dword ptr [ebp-450h]

67126fcf 8d3c10          lea     edi,[eax+edx]

67126fd2 8d4c1b02        lea     ecx,[ebx+ebx+2]

67126fd6 8bc1            mov     eax,ecx

67126fd8 c1e902          shr     ecx,2

67126fdb f3a5            rep movs dword ptr es:[edi],dword ptr [esi]

//the third

67126fdd 8bc8            mov     ecx,eax

67126fdf 83e103          and     ecx,3

67126fe2 f3a4            rep movs byte ptr es:[edi],byte ptr [esi]

//the fourth

目前在第三处 rep movsd,重新加载样本,看看前两次都干嘛了

新增断点 0x67126faf

0:006> bu 67126faf

0:006> bl

0 e 77ea411e     0001 (0001)  0:**** kernel32!WinExec

1 e 67119464     0001 (0001)  0:**** httpext!CMethUtil::ScStoragePathFromUrl+0x13

2 e 67126fdb     0001 (0001)  0:**** httpext!ScStoragePathFromUrl+0x360

3 e 67126faf     0001 (0001)  0:**** httpext!ScStoragePathFromUrl+0x334

G一下,断到第一句 rep movsd 指令处

0:006> g

Breakpoint 3 hit

eax=00000024 ebx=00000097 ecx=00000009 edx=00000024 esi=00fef35c edi=00fef804

eip=67126faf esp=00fef330 ebp=00fef798 iopl=0         nv up ei pl nz na pe nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206

httpext!ScStoragePathFromUrl+0x334:

67126faf f3a5            rep movs dword ptr es:[edi],dword ptr [esi]

此时的目的地址edi的值就是上层函数传进来的第一个参数

查看拷贝的内容

0:006> du esi L2 * ecx

00fef35c

"c:\inetpub\wwwroot"

执行过去

0:006> bd *

0:006> p

eax=00000024 ebx=00000097 ecx=00000000 edx=00000024 esi=00fef380 edi=00fef828

eip=67126fb1 esp=00fef330 ebp=00fef798 iopl=0         nv up ei pl nz na pe nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206

来到第二次 rep movsd,拷贝次数为 0,并不关心

0:006> t

eax=00000024 ebx=00000097 ecx=00000000 edx=00000000 esi=00fef380 edi=00fef828

eip=67126fbc esp=00fef330 ebp=00fef798 iopl=0         nv up ei pl zr na pe nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246

httpext!ScStoragePathFromUrl+0x341:

67126fbc f3a4            rep movs byte ptr es:[edi],byte ptr [esi]

本文由看雪论坛 花剌子模 原创

每日学一点,成长快一点。

少食多餐,更健康。

明日更新第二部分,敬请期待!

❤ 往期热门内容推荐

看雪众测及其渗透测试服务介绍

PHP 7 漏洞挖掘系列之一:Stack-based integer overlow

电信又曝漏洞!可随意查看个人通话信息!

VirtualHook—基于 VirtualApp 的 Java 代码 hook 工具

WEB渗透测试中回显的一些技巧

报名 |《走近企业看安全》第10站 知道创宇

......

更多优秀文章,“关注看雪学院公众号”查看!

看雪论坛:看雪安全论坛

微信公众号 ID:ikanxue

微博:看雪安全

投稿、合作:看雪学院

你可能感兴趣的:(CVE-2017-7269 样本调试笔记(一))