星期五实验室
阅读须知
星期五实验室的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息造成的直接或间接后果和损失,均由使用者本人负责。
星期五实验室拥有对此文章的修改、删除和解释权限,如转载或传播此文章,需保证文章的完整性,未经授权,不得用于其他。
1. 环境准备
架构:mipsel32
系统:linux
保护:全没开
2. 漏洞分析
2.1 漏洞点1
cgi
中的一个接口函数中调用了replace_string
函数,然后查找到该cgi
接口名称为setSmsCfg
。
replace_string
函数实际上是把源地址的字符复制到目的地址上,并且将源字符串中的+
替换为%20
。
它先查找源地址上的+
首次出现的位置,然后将该位置之前的数据复制到目的缓冲区中,但是复制的长度由+
首次出现的位置确定,而这是我们可控的,源数据是从post
请求中获取的text
变量。
所以,我们可以可以发送包含恶意数据的text
变量,将+
出现的位置靠后从而导致复制超长字符串,制造缓冲区溢出(也可以发送大量含有+
的数据,因为它将转换为%20
,长度扩大了三倍,也可以造成栈上缓冲区溢出)
3.2 调试cgi程序
方法一(失败):使用qemu
启动lighttpd
,然后进行追踪,设置 set follow-fork-mode child
以及set detach-on-fork off
,尝试进入fork cgi
启动的子程序,但是无论如何设置,都无法进入子程序,fork
之后仍然是在调试父程序。
方法二(成功):通过设置env
环境变量,以及控制标准输入,单独调试cgi
。
具体步骤:
-
编写一个程序,使用交叉编译为 mipsel32
,然后重新命名为cstecgi.cgi
,替换原有/squashfs-root/www/cgi-bin/cstecgi.cgi
,这样lighttpd
在启动cgi
程序时,就会启动这个fake cgi
然后打印出相关的环境变量(cgi
和lighttpd
是通过环境变量和标准输入输出通信的)
-
启动 lighttpd
,在浏览器输入以下url
,这会触发一个漏洞绕过登录,直接进入控制后台(此时使用的real cgi
程序)
-
使用 bp
抓取绕过登录认证后的post
数据包。
-
修改数据包,然后使用 bp
的repeater
功能重新发送获取返回的数据包,由于我们修改了cgi
,此时返回的数据包中会包含lighttpd
调用cgi
时的环境变量(此时使用的fake cgi
程序),而且此时也能证实lighttpd
和cgi
的通信的数据部分是通过标准输入输出进行的。
-
此时根据获取到的环境变量的值,设置实验空间的环境变量,可以把 contentlength
的长度设置大一点,方便后面的测试:
-
查看环境变量是否成功,使用 env
指令,出现以下结果说明成功设置了环境变量:
-
此时我们可以开始调试 cgi
程序了,首先使用qemu
启动cgi
并挂起:
-
另起一个客户端,连接,需要设置 set arch mips ,set endian little ,set heuristic-fence-post 10000
(这个是设置查找函数起始地址的范围,不设置会报错,说找不到某一个函数),然后连接target remote :1234
:
-
此时,就可以开始调试了:
-
注意, cgi
从标准输入读取的数据可以通过两种方式传递,在qemu
端直接输入,或者启动qemu
时使用<
:
3.3 调试分析栈溢出漏洞
-
repleace_string
是叶子函数,他的返回地址只存在ra
寄存器中,所以考虑通过栈溢出,控制父函数栈上的返回地址。首先就要计算父函数栈上的返回地址的偏移。我们在repleace_string
函数打上断点,然后逐步调试,使用测试数据如下:
{ "text":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+bbb",
"topicurl":"setSmsCfg"
}
-
经过调试可以看到,此时返回地址已近被覆盖为 bbb
, 所以我们可以通过改写bbb
达到跳转到任意地址的目的。(注意,如果跳转的地址是3字节的话,需要使用+bbb
的格式,因为高位为x00
会发生截断,这样才能保证地址能够被正确的写入):
-
根据调试信息,再栈上选取一个合适的位置,用于存放 shellcode
,我选择的是0x407fe430
,其实执行strncpy
的目的地址是0x407fe830
,但是后续的操作或导致该地址上的数据被破坏,所以选择了0x407fe430
。
-
根据 checksec
的结果,该cgi
程序并没有开启任何的保护的措施,所以我们可以把shellcode
写入栈上,然后再跳转到栈上执行shellcode
。(注意:生成的shellcode
要完全避免使用x00
,不然会导致拷贝截断,shellcode
不完整),使用pwntools
来生成以下我们需要的shellcode
。
获取生成shellcode
的十六进制数据:
-
然后使用 010 editor
将shellcode
,以及返回地址0x407fe30
写入一个数据包中,并将该数据包命名为exp_to_say_Hello
:
-
测试 exp
,成功执行shellcode
,输出了Hello!!!!
:
3. 漏洞利用时踩过的部分坑
-
发送的数据报文使用的
utf-8
编码,误以为只能发送utf-8
编码中的字符,然后由这些字符对应的编码组成shellcode
。其实跟使用的什么格式的编码无关,我在bp上看的抓取的数据包上的字符,实际上是对数据包中的二进制数据进行了解码,而我可以控制发送数据包的二进制数据,并不是只能控制字符数据。并且cgi
处理时,并没有进行任何编解码操作。正常:字符数据 ->二级制数据包
攻击:直接控制二进制数据包,任何数据都能写上去
-
尝试将返回地址写为
strncpy
的源地址(因为该地址全部为可见字符串,当时基于坑1的错误观点),然后执行布置在头部的shellocde
。失败了,vmmap
查看地址权限是rwxp
,但是会报段错误,跳转后不会再继续执行代码了。 -
可见字符串的
mipsel32
的shellcode
,使用pwntools
生成失败,只是设置生成的shellcode
中不含xff
都不行。 -
收集到了一种
mips
上的栈溢出的利用方法:
FRIDAY LAB
星期五实验室成立于2017年,汇集众多技术研究人员,在工业互联网安全前瞻技术研究方向上不断进取。星期五实验室由海内外知名高校的学院精英及来自于顶尖企业的行业专家组成,且大部分人员来自国际领先、国内知名的黑客战队——浙大AAA战队。作为木链科技专业的技术研发团队,星期五实验室凭借精湛的专业技术水平,为产品研发提供新思路、为行业技术革新探索新方向。
扫二维码|关注我们
星期五实验室
FRIDAY LAB
原文始发于微信公众号(星期五实验室):totolink lr350 cgi栈溢出漏洞分析和利用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论