路由器常见漏洞总结

前言,基本也是《0day路由器漏洞挖掘》这本书的读书笔记

路由器web漏洞

XSS漏洞

针对路由器的web管理页面,例如:攻击者发现路由器管理页面包含一个反射型XSS,就可以构建一个利用这个XSS漏洞的URL,并且将其通过邮件或QQ发送给受害者,引诱受害者点击这个URL,从而访问路由器网页。受害者点击URL,恶意代码就会在浏览器中执行,它可以将路由器网页会话Cookie发送给攻击者攻击者在受害者不知情的情况下通过Cookie盗取更敏感的消息。

## CSRF漏洞 攻击者针对一个针对路由器CSRF链接,欺骗受害者点击该链接,其功能是修改路由器DNS为一个伪造的DNS服务器。之后受害者访问正常网页时,因为DNS劫持而将所有网络访问数据发送给攻击者。攻击者监控受害者所有行为,受害者却毫不知情。
## 基础认证漏洞

路由器后门漏洞

为了调试方便、信息获取方便或者是人为故意等情况留下的后门,该后门可以令几乎所有的保护措施全部失效。

路由器溢出漏洞

MIPS32架构堆栈

栈操作:MIPS32没有EBP,进入一个函数时需要将当前栈指针向下移动n个比特,这个大小为n比特的存储空间就是Stack Frame的存储区域,寄存器压栈和出栈都必须指定偏移量。

函数调用栈布局

叶子函数和非叶子函数,一个函数不在调用其它任何函数,那么当前的函数就是一个叶子函数,否则就是非叶子函数。

函数调用过程

函数调用参数传递

例:

main函数会将more_arg()函数的前四个参数传到a0~a3中,第五个参数保留在main函数栈顶预留的空间。但是看到main函数还是为前四个参数预留了空间:

在执行more_arg()函数前,将5个参数分别保存到堆栈中。more_arg()分配栈空间后,more_arg()函数将a0~a4复制到main()函数栈帧预留的调用参数空间中。当指令执行到sprintf函数时,sprintf函数的调用需要七个参数,通过需要借助堆栈进行参数传递。此时more_arg()函数将4个参数存入a0~a3,剩余三个保存到more_arg()函数自己的调用参数空间中。

缓冲区溢出利用的可行性

非叶子函数

has_stack函数调用了strcpy函数,因此,has_stack是非叶子函数,返回main()函数的地址会首先保存到寄存器$ra中,进入has_stack()函数以后,has_stack会把返回main()函数的返回地址保存在has_stack的堆栈中,在has_stack()函数返回main()函数继续执行时,将保存在堆栈中的返回main()函数的返回地址写入$ra并返回main()函数继续执行。

#include<stdio.h>
void has_stack(char *src){
    char dst[20] = {0};
    strcpy(dst,src);
}

void main(int argc,char *argv[]){
    has_stack(argv[1]);
}

汇编代码:

调试看到has_stack中有个lw $ra 0x34($sp)的指令,后面有jr $ra指令。也就是将main函数地址写道ra,然后再跳转过去。那么如果has_stack出现栈溢出漏洞,控制sp+0x34内存的内容,那么就可以跳转任意地址了。

叶子函数

源码

#include<stdio.h>
void no_stack(char *src,int count){
    char dst[20] = {0};
    int i=0;
    for(i=0;i<count;i++){
        dst[i] = src[i];
    }
}

void main(int argc,char *argv[]){
    int count = strlen(argv[1]);
    no_stack(argv[1],count);
}
发现子函数no_stack中没有对ra进行操作,由于返回main函数的地址不是存储在stack中,而是直接存在寄存器中的,但并不意味着叶子函数无法覆盖返回地址,如果溢出长度足够大同样可能修改main函数(父函数)的栈帧,从而覆盖掉上层函数的返回地址。

综上所述:非页函数可以通过溢出覆盖掉上层函数的返回地址,叶函数无法直接覆盖上层函数的返回地址,但可以覆盖掉上层函数的栈帧,从而覆盖掉上层函数的上层函数的返回地址。


  Reprint policy: xiaoxin 路由器常见漏洞总结

 Previous
2020 第五空间安全大赛 2020 第五空间安全大赛
twice查看文件 PIE没开、RELRO没开. 栈迁移 IDA分析 程序很简单,就是循环两次来进行输入,再打印出来。输入的地方有栈溢出,第一次只能溢出1个byte,第二次可以溢出0x18个byte。 思路第一步:利用溢出一个字节来泄露
2020-09-09
Next 
C++ PWN初探(一) C++ PWN初探(一)
EasyCpp查看文件 首先看到不能hijacking GOT。 IDA分析查看源码得知这是一个C++程序。由于之前没做过,有很多机制并没有很清楚。 问题一:在edit中析构函数会free(栈上的一个地址),而这个地址是可以更改的。我们
2020-09-07
  TOC