D-Link DIR505路由器溢出漏洞复现

一.基本IOT试验环境准备

本试验需要基于一些常用二进制以及模拟器工具,实践之前请提前安装和准备:

binwalk及sasquatch 插件安装:
binwalk用于IOT固件解包以及文件系统、二进制文件提取。

buildroot交叉编译环境安装
用户在X86 环境下编译其他CPU架构的二进制程序。

qemu模拟器安装
虚机程序,可使用它在X86环境下模拟运行其他CPU架构的二进制程序。

wine模拟器安装
Linux环境下的windows程序运行模拟器。本实践采用在Linux环境下运行IDA 逆向工具。

二.漏洞复现及利用过程

2.1淘硬件:

在咸鱼平台上淘这类IOT小设备作为试验用途还是挺实惠的,如下图40元包邮搞定DIR505路由器硬件:

2.2固件包获取及二进制提取:

如果是从二进制着手去挖掘漏洞固件获取是第一步。在能够通过互联网手段下载到固件包的情况下优先直接下载;否者需要采用编程器这类设备进行固件提取,本次实践直接在网上找到了固件包,版本为:DIR505A1_FW105CNB01.bin

预先安装好binwalk工具,并安装sasquatch 文件系统补丁,进行文件系统提取,拿到my_cgi.cgi二进制文件,供后续分析。采用binwalk -Me 命令进行解包、提取后,拿到sasquatch文件系统如下图所示:

my_cgi.cgi文件在 /usr/bin路径之下:

2.3伪代码溢出点分析:

经过相关资料的查阅,得知该漏洞发生的位在my_cgi.cgi的get_input_entries函数。由于该文件的访问没有权限控制,所以一旦它的溢出漏洞被发现并且没利用成功,威胁程度非常高。

IDA工具逆向my_cgi.cgi二进制文件,得到C语言伪代码, 如下图所示:

如上图所示,get_input_entries的入参content_length 控制while循环次数,每次循环给buf赋值写入数据。而数据来源用户POST报文的数据字段,当数据的长度content_length 超过buf的大小即会产生溢出。由于没有异常保护,这个溢出点完全是攻击者可控的

2.4二进制模拟调试确认溢出漏洞:

通过逆向分析伪代码找到漏洞位置之后,需要进行模拟调试进行漏洞确认。

在IDA 通过 jump to xref 找到 my_cgi.cgi 中main函数调用 get_input_entries 函数的位置,如下图所示:

如上图所示,get_input_entries 入参 my_entries buf长度 为477456,故当POST数据长度content_length > 477456时有机会触发溢出。

使用file命令得知my_cgi.cgi二进制程序是一个mips 32位大端ELF:

所以需要使用 qemu 的 qemu-mips 的模拟程序。

故构造如下shell脚本,调用qemu-mips 调试 my_cgi.cgi 二进制程序:

如上图所示,qemu-mips 通过 -E参数设置HTTP头的参数。qemu构造的是一个HTTP POST报文其数据内容为‘storage_path=’+ 490000个‘Q’(需要明显大于 my_entries buf的长度,确保能够溢出) HTTP 头 CONTENT_LENGTH字段值即POST数据的长度。脚本运行结果如下:

如上图所示my_cgi.cgi跑出了段错误。出现段错误,可能是由于RA寄存器的被改写,程序访问了程序段地址空间之外的地址所导致。

为了证明这个段错误是由于溢出引起的,我们重新构造脚本,让POST数据小于 my_entries buf的长度,并运行:



如上图所示,当POST数据填充长度为490 远小于 my_entries buf 长度时,my_cgi.cgi运行时不会出现段错误的。正常返回了Web页面数据。

至此,我们确认了my_cgi.cgi二进制程序中 get_input_entries 溢出漏洞的存在。

2.5EXP编写及漏洞利用:

上一节我们通过QEMU的模拟运行确认了溢出漏洞的存在,现在我们需要精确控制溢出,实现对IOT设备的控制。

2.5.1MIPS溢出漏洞利用原理:

RA通用寄存器:

MIPS 有$0-$31 32通用寄存器。其中$31 也称为$RA (返回地址Return Address)寄存器**。也就是说当一个函数执行完成后可以通过$RA寄存器的函数地址决定后续程序执行走向。

MIPS架构下非叶子子函数程序执行流程:

当函数A调用函数B时,函数调用步骤:

01 当函数A调用B时,函数调用指令复制$PC寄存器(指令寄存器)的值到$RA。

02 当程序跳转到B执行,由于B不是叶子函数,函数指令会将函数返回地址即A的地址存入堆栈。

03 B函数执行完成准备返回时,指令会将堆栈内存储的A函数地址反写会$RA寄存器,然后通过jr $RA 的指令,将执行流程重新转向A

终上所述,若我们能够精确的控制溢出,改写堆栈上保存函数的返回地址,那么攻击者就能够控制程序执行走向造成系统被完全控制等严重后果(本次实践,拿到路由器shell)。

2.5.2精确控制$RA寄存器的值:

在2.4节,我们通过调试脚本(run_script.sh),确认了溢出漏洞的存在,现在需要反复调试run_script.sh脚本中 storage_path= Padding 数据的长度,直到正好能够覆盖$RA寄存器中的值。


如上图所示,脚本中 增加 -g $PORT 参数,使得my_cgi.cgi 运行之后,能够被IDA 进行远程调试。由于my_entries buf 长度为477456,所以从该长度开始尝试,反复试验后,发现填充 4777464个字符Q后,再写入4个字节A正好可实现对$RA寄存器数据的覆盖。

如上图所示,在get_input_entries函数的return 处增加断点。采用IDA 连接4444端口反复进行远程调试。每次修改Pading字符(Q)字符后,观看RA寄存器的值,直到$RA寄存器的值正好被4个A覆盖之后,则说明Pading字符(Q)的个数调试OK了。测试脚本数据应该为:

**‘storage_path=’+'Q’477464+'A’4

2.5.3寻找可以利用的函数:

能够精确控制$RA寄存器的值之后,现在我们现在需要找到可利用的函数。通常拿到shell,我们可以使用系统函数system 开启telnet服务的方式实现。所以通过搜索system的调用者,来寻找可利用的函数:

如上图所示,通过system函数的引用关系,选定了get_remote_mac 函数,其中地址为405234的地方调用了system

如上图所示,get_remote_mac函数,通过sprintf函数,将cmd入参拼接至v11,然后调用system函数进行系统命令执行。

为了给cmd入参传入有效数据,需要找到cmd参数相对get_remodte_mac函数地址的偏移量。

如上图所示,cmd参数相对于get_remote_mac函数地址的偏移量为0x64-0x3c=0x28

2.5.4构造EXP:

根据2.5.2和2.5.3的分析结果,为了调用system函数,实现对溢出漏洞的利用拿到shell,我们需要构造如下ROP Chain(Return-Oriented Programming)

将上述ROP Chain转换为Python3 EXP脚本如下图所示:

如上图所示,利用上述EXP可以实现命令注入,开启路由器的telnet服务。

2.6 采用EXP攻击路由器:

如下图所示,运行EXP Python3脚本,然后直接尝试采用默认IP 192.168.0.1 telnet登录:

如上图所示,执行EXP脚本之后,telnet服务被打开.telnet登录之后,直接获取root权限,至此路由器完全被控制。

D-Link DIR505路由器溢出漏洞实战相关推荐

  1. kali渗透学习-windos缓存区缓冲区溢出漏洞实战

    程序漏洞从哪里来 罪恶的根源:变量 编写代码的时候变量限制不严格导致 数据与代码边界不清 例子:最简漏洞原理-- shell脚本漏洞 echo $1 >> a.sh a.sh :pwd执行 ...

  2. Linksys WRT54G 路由器溢出漏洞分析—— 运行环境修复

    博文视点安全技术大系 · 2015/08/04 15:40 本文节选自<揭秘家用路由器0day漏洞挖掘技术>,吴少华主编,王炜.赵旭编著,电子工业出版社 2015年8月出版. 本章实验测试 ...

  3. 一步到位的 UPnP 远程溢出漏洞实战

    远程溢出***漏洞 (Remote Buffer Overflow Vulnerability) 是远程直接***被黑 电脑或服务器最典型.最常见的漏洞,原因无它,只要溢出成功并运行 ShellCod ...

  4. 操作系统权限提升(三)之Windows系统内核溢出漏洞提权

    系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 注:阅读本编文章前,请先阅读系列文章,以免造成看不懂的情况!!! Windows系统内核溢出漏洞提权介绍 ...

  5. 利用MS08067远程溢出漏洞抓肉鸡

    利用MS08067远程溢出漏洞抓肉鸡 陈小兵 [antian365.com] 微软的正版验证机会出来以后没有多久,就爆出针对台湾和简体中文版本的MS08067漏洞,这个时候微软主动爆出这个号称比冲击波 ...

  6. kali+php+缓冲区溢出,CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析

    CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析 摘要:本文通过对一个ARM路由器缓冲区溢出漏洞的分析,实践逆向数据流跟踪的思路与方法. 假设读者:了解ARM指令集基础知识.了解栈溢出 ...

  7. 全网最详细的渗透测试靶机实操步骤——vulnhub靶机实战(七)IMF【包含了sql注入,文件上传,gif图片木马制作,缓冲区溢出漏洞sploit等诸多知识点的靶机,超多干货】

    靶机地址:https://www.vulnhub.com/entry/imf-1,162/ 靶机难度:中级(CTF) 靶机发布日期:2016年10月30日 靶机描述:欢迎使用" IMF&qu ...

  8. 浅析缓冲区溢出漏洞的利用与Shellcode编写

    文章目录 前言 汇编语言 寄存器 内存堆栈 CPU指令 函数调用 缓冲区溢出 栈溢出原理 栈溢出攻击 ShellCode 总结 前言 缓冲区溢出(Buffer Overflow)是计算机安全领域内既经 ...

  9. 第59天-权限提升-Win 溢出漏洞及 ATSCPS 提权

    思维导图 知识点 #明确权限提升基础知识:权限划分 #明确权限提升环境问题: WEB 及本地 #明确权限提升方法针对:针对方法适应问题 #明确权限提升针对版本:个人及服务器版本;针对方法; 知识点必备 ...

  10. 利用CCPROXY溢出漏洞实现shellcode攻击

    寻找溢出点 打开CCPROXY后利用CMD控制台使用telnet命令连接主机127.0.0.1:使用ping命令寻找溢出点,观察到当ping后字符串长度达到1011时不产生溢出,而在长度达到1012时 ...

最新文章

  1. 70美元桌面电脑,树莓派400:键盘式集成开发板
  2. Windows Forms高级界面组件-使用状态栏控件
  3. ASP.NET网页中RAR、DOC、PDF等文件下载功能实例源代码
  4. spring框架学习(三)
  5. zxing开源库工作流程源码详解
  6. UVa 242 邮票和信封(完全背包)
  7. 系统分析师零散知识点
  8. Go语言web框架beego:目录说明
  9. 设计模式——Iterator模式实现研究
  10. Eclipse和IDEA 简单对比说明
  11. 奇怪的问题:Windows 11 22H2任务管理器颠倒显示GPU使用率
  12. RuntimeError: Expected 4-dimensional input for 4-dimensional weight [32, 1, 5, 5]
  13. SAP《MM学习指南》操作记录----仓库盘点
  14. 难得一读的古老的俗话
  15. 2020年度个人总结--一个前端技术LD的年终盘点
  16. #软件设计模式#桥接模式#小黑的学习笔记
  17. abaqus Tie python脚本报错 原因令人震惊
  18. 告别电子小白,8个优选DS1302数字时钟方案大合辑
  19. vue3 + element plus 使用el-button焦点问题 失焦操作
  20. 被mysql虐待的一天

热门文章

  1. nginx使用limit_req_zone限制ip访问频率
  2. 董明珠“跳槽不用” VS雷军“复仇者联盟”,人才在内还是在外?
  3. 程序员必学的职场人际关系22原则
  4. vue解决mintui中使用MessageBox弹窗拦截,移动端多次点击手机的物理返回键,选择确定后页面返回不正确问题
  5. SEO不能不知道的首页关键词策略
  6. 服务器装虚拟声卡,虚拟声卡,教您怎么安装虚拟声卡
  7. 开放PLM——Aras Innovator编程学习(一)简介
  8. 支付宝APP支付-Android+springboot搭建后端
  9. 智库说 | 杨宁:从城市管理走向城市治理 大数据将发挥更大作用
  10. 中科院计算机所博士何飞,2017年中科院计算所博士生招生考试说明