totolink lr350 cgi栈溢出漏洞分析和利用

admin 2024年2月15日14:00:46评论14 views字数 3849阅读12分49秒阅读模式

星期五实验室

阅读须知

星期五实验室的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息造成的直接或间接后果和损失,均由使用者本人负责。

星期五实验室拥有对此文章的修改、删除和解释权限,如转载或传播此文章,需保证文章的完整性,未经授权,不得用于其他。

1. 环境准备

架构:mipsel32
系统:linux
保护:全没开

totolink lr350 cgi栈溢出漏洞分析和利用

2. 漏洞分析

2.1 漏洞点1

cgi中的一个接口函数中调用了replace_string函数,然后查找到该cgi接口名称为setSmsCfg

totolink lr350 cgi栈溢出漏洞分析和利用

replace_string函数实际上是把源地址的字符复制到目的地址上,并且将源字符串中的+替换为%20

它先查找源地址上的+首次出现的位置,然后将该位置之前的数据复制到目的缓冲区中,但是复制的长度由+首次出现的位置确定,而这是我们可控的,源数据是从post请求中获取的text变量。

所以,我们可以可以发送包含恶意数据的text变量,将+出现的位置靠后从而导致复制超长字符串,制造缓冲区溢出(也可以发送大量含有+的数据,因为它将转换为%20,长度扩大了三倍,也可以造成栈上缓冲区溢出)

totolink lr350 cgi栈溢出漏洞分析和利用

3.2 调试cgi程序

方法一(失败):使用qemu启动lighttpd,然后进行追踪,设置 set follow-fork-mode child以及set detach-on-fork off,尝试进入fork cgi启动的子程序,但是无论如何设置,都无法进入子程序,fork之后仍然是在调试父程序。

方法二(成功):通过设置env环境变量,以及控制标准输入,单独调试cgi

具体步骤:

  1. 编写一个程序,使用交叉编译为mipsel32,然后重新命名为cstecgi.cgi,替换原有/squashfs-root/www/cgi-bin/cstecgi.cgi,这样lighttpd在启动cgi程序时,就会启动这个fake cgi然后打印出相关的环境变量(cgilighttpd是通过环境变量和标准输入输出通信的)
totolink lr350 cgi栈溢出漏洞分析和利用
  1. 启动lighttpd,在浏览器输入以下url,这会触发一个漏洞绕过登录,直接进入控制后台(此时使用的real cgi程序)
totolink lr350 cgi栈溢出漏洞分析和利用
  1. 使用bp抓取绕过登录认证后的post数据包。
totolink lr350 cgi栈溢出漏洞分析和利用
  1. 修改数据包,然后使用bprepeater功能重新发送获取返回的数据包,由于我们修改了cgi,此时返回的数据包中会包含lighttpd调用cgi时的环境变量(此时使用的fake cgi程序),而且此时也能证实lighttpdcgi的通信的数据部分是通过标准输入输出进行的。

totolink lr350 cgi栈溢出漏洞分析和利用totolink lr350 cgi栈溢出漏洞分析和利用

  1. 此时根据获取到的环境变量的值,设置实验空间的环境变量,可以把contentlength的长度设置大一点,方便后面的测试:
totolink lr350 cgi栈溢出漏洞分析和利用
  1. 查看环境变量是否成功,使用env指令,出现以下结果说明成功设置了环境变量:
totolink lr350 cgi栈溢出漏洞分析和利用
  1. 此时我们可以开始调试cgi程序了,首先使用qemu启动cgi并挂起:
totolink lr350 cgi栈溢出漏洞分析和利用
  1. 另起一个客户端,连接,需要设置 set arch mips ,set endian little ,set heuristic-fence-post 10000(这个是设置查找函数起始地址的范围,不设置会报错,说找不到某一个函数),然后连接 target remote :1234
totolink lr350 cgi栈溢出漏洞分析和利用
  1. 此时,就可以开始调试了:
totolink lr350 cgi栈溢出漏洞分析和利用
  1. 注意,cgi从标准输入读取的数据可以通过两种方式传递,在qemu端直接输入,或者启动qemu时使用 <:totolink lr350 cgi栈溢出漏洞分析和利用totolink lr350 cgi栈溢出漏洞分析和利用

3.3 调试分析栈溢出漏洞

  1. repleace_string是叶子函数,他的返回地址只存在ra寄存器中,所以考虑通过栈溢出,控制父函数栈上的返回地址。首先就要计算父函数栈上的返回地址的偏移。我们在repleace_string函数打上断点,然后逐步调试,使用测试数据如下:
{        "text":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+bbb",
        "topicurl":"setSmsCfg"
}
  1. 经过调试可以看到,此时返回地址已近被覆盖为bbb, 所以我们可以通过改写bbb达到跳转到任意地址的目的。(注意,如果跳转的地址是3字节的话,需要使用+bbb的格式,因为高位为x00会发生截断,这样才能保证地址能够被正确的写入):
totolink lr350 cgi栈溢出漏洞分析和利用
  1. 根据调试信息,再栈上选取一个合适的位置,用于存放shellcode,我选择的是0x407fe430,其实执行strncpy的目的地址是0x407fe830,但是后续的操作或导致该地址上的数据被破坏,所以选择了0x407fe430
totolink lr350 cgi栈溢出漏洞分析和利用
  1. 根据checksec的结果,该cgi程序并没有开启任何的保护的措施,所以我们可以把shellcode写入栈上,然后再跳转到栈上执行shellcode。(注意:生成的shellcode要完全避免使用x00,不然会导致拷贝截断,shellcode不完整),使用pwntools来生成以下我们需要的shellcode
totolink lr350 cgi栈溢出漏洞分析和利用

获取生成shellcode的十六进制数据:

totolink lr350 cgi栈溢出漏洞分析和利用
  1. 然后使用010 editorshellcode,以及返回地址0x407fe30写入一个数据包中,并将该数据包命名为exp_to_say_Hello

totolink lr350 cgi栈溢出漏洞分析和利用totolink lr350 cgi栈溢出漏洞分析和利用

  1. 测试exp,成功执行shellcode,输出了Hello!!!!
totolink lr350 cgi栈溢出漏洞分析和利用

3. 漏洞利用时踩过的部分坑

  1. 发送的数据报文使用的utf-8编码,误以为只能发送utf-8编码中的字符,然后由这些字符对应的编码组成shellcode。其实跟使用的什么格式的编码无关,我在bp上看的抓取的数据包上的字符,实际上是对数据包中的二进制数据进行了解码,而我可以控制发送数据包的二进制数据,并不是只能控制字符数据。并且cgi处理时,并没有进行任何编解码操作。

    正常:字符数据  ->二级制数据包

    攻击:直接控制二进制数据包,任何数据都能写上去

  2. 尝试将返回地址写为strncpy的源地址(因为该地址全部为可见字符串,当时基于坑1的错误观点),然后执行布置在头部的shellocde。失败了,vmmap查看地址权限是rwxp,但是会报段错误,跳转后不会再继续执行代码了。

  3. 可见字符串的mipsel32shellcode,使用pwntools生成失败,只是设置生成的shellcode中不含xff都不行。

  4. 收集到了一种mips上的栈溢出的利用方法:

totolink lr350 cgi栈溢出漏洞分析和利用

FRIDAY LAB

星期五实验室成立于2017年,汇集众多技术研究人员,在工业互联网安全前瞻技术研究方向上不断进取。星期五实验室由海内外知名高校的学院精英及来自于顶尖企业的行业专家组成,且大部分人员来自国际领先、国内知名的黑客战队——浙大AAA战队。作为木链科技专业的技术研发团队,星期五实验室凭借精湛的专业技术水平,为产品研发提供新思路、为行业技术革新探索新方向。

totolink lr350 cgi栈溢出漏洞分析和利用
totolink lr350 cgi栈溢出漏洞分析和利用
totolink lr350 cgi栈溢出漏洞分析和利用
totolink lr350 cgi栈溢出漏洞分析和利用
totolink lr350 cgi栈溢出漏洞分析和利用

扫二维码|关注我们

星期五实验室
FRIDAY LAB

原文始发于微信公众号(星期五实验室):totolink lr350 cgi栈溢出漏洞分析和利用

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月15日14:00:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   totolink lr350 cgi栈溢出漏洞分析和利用http://cn-sec.com/archives/2272590.html

发表评论

匿名网友 填写信息