这个主要是作为我个人成长经历的见证(也就是给日后的自己看的),以及和志同道合的人一起交流。
我目前已经经历了我给我自己定下的第一个计划,也就是挖到二进制漏洞并且取得cnvd证书和cve编号,算是第一个小目标,如果我有一些写错的也可以直接在下面指出。
迄今为止,在IOT方面的攻击一般分为云,管,端三个方向,云主要是关注物联网云平台的安全,管主要是通信协议的安全,而本篇文章所讨论的是在端这个方向,也就是终端设备上路由器固件的二进制漏洞挖掘经验,其中又包括堆和栈两个方面。在利用上堆比栈难了很多个数量级,但是如果仅仅只是想打出拒绝服务去cnvd拿个证书或者去拿个cve编号,其实栈和堆的难度以及手法都差不多。
本篇文章纯属技术分享和自己成长经历的证明(n年后发现自己居然还发过这种水文(乐)),由于本人只是一名大二的学生,所以目前水平还是比较浅薄,希望大家多给一点意见,目前作者自己已经挖到了一些堆和栈的漏洞,在这里做个分享。本文主要讲漏洞,对于别的加密解密和固件提取之类的模块不过多叙述。
首先,不要把计算机想得太聪明,“CPU只是一个无情的状态机,它只会无情地执行指令”--南京大学蒋炎岩,所以我们在分析的过程中不能给程序加戏,比如我们分析并发的漏洞的时候,不能随意地认为计算机会保证原子性(毕竟如果原子性遭到破坏,那么并发编程就可能出问题)。但是很多时候人类就是很擅长去化简和修复一些问题,我们不知不觉就会把一些漏洞在我们大脑中修复,对于这个事情,我的解决方法是,多去怀疑,怀疑哪些地方存在漏洞,然后验证。
其次,一旦想出了什么办法,立马就去实践,很多时候复现所用成本比你去推导这个办法是否正确要来的快,在挖的过程中也可以多去看看别的类型的漏洞,然后看看能不能在自己的设备上成功复现,
最后,最重要的,我们在分析漏洞的时候,其实和武侠小说里的与高手过招一样,一般和高手打架,大家看到最多的就是去找这个高手的练门,也就是他的薄弱点所在。在实际应用中,我们的程序往往非常复杂,动不动就是上万行代码,我们只需要关注程序中的一些重点的代码片段,或者说程序的薄弱点,也就是对程序进行化简,去除那些无关紧要的东西,这个其实也就是和逆向是一个思想,关注分析重点,比如我们可以从危险函数入手,去分析危险函数的上下文,但是当我们决定分析一个部分的上下文时,就要仔细分析。
分析危险函数是一个非常重要的步骤,因为整个路由器固件的代码量是非常大的,而且IDA分析的伪代码也比较难读,我们不可能把路由器固件的代码全部审一遍,我们就只能按照前面分析思路时说的,化繁为简,只分析整个文件最重要的部分,分析弱点,我们这里就以最常见的strcpy举例子。
strcpy这个函数是我目前统计出现最多的危险函数,而且别的危险函数很多也都和strcpy差不多(比如strcat),但是并不是所有的strcpy都可以成为漏洞点,下面我将会介绍如何筛选漏洞点的方法。
然后就会看到这个界面

证明你的路由器已经开始运行了,访问这个网址可以看到路由器网关页面

然后当我们运行脚本后,如果路由器挂掉了

那么就说明成功了,刷新网页也会发现网页无法访问

strcat,sprintf之类的可以向一个缓冲区拷贝数据的函数。
除了分析strcpy这种危险函数之外,成为漏洞的条件一定是我们可以去控制它里面的数据,那我们控制一个程序里面数据的最好方法就是通过这个程序的输入函数来进行控制。我可以去找一些不对长度进行检验的输入函数,比如gets,scanf,以及路由器中一些名字比较像输入函数的比如websgetvar之类的函数,看看能不能去往这个函数里面输入一些东西,然后通过调试技术或者静态分析去看看这些输入都到了哪里,分析程序执行流,看看有没有什么输入可以让程序运行到奇怪的地方(等等,这好像是fuzz的原理吧,但是其实我们自己手工挖掘的时候也需要去关注),尤其是看看这个输入进入程序后有没有经过一些拷贝赋值的操作或者有没有经过一些危险函数
如果你的目标只是拒绝服务,其实没啥区别。
下面给大家看看拒绝服务的条件下,栈溢出和堆溢出的反馈
这个是栈的

这个是堆的

可以发现,都差不多。
包括payload其实也都长的一样。
对于利用的话,堆会难很多,堆的利用条件比栈苛刻很多,但是如果只是想去交漏洞,那么其实拒绝服务已经可以满足需求了。
当栈和堆利用成功后,其实也可以造成rce,比如,但这里我要介绍的是输入即天然的rce
给大家个例子

就比如这个地方,在下面很明显是把输入的内容直接作为终端的输入,这个时候你只需要直接输入命令即可。但是这里要注意,就是在这种情况下,拒绝服务是打不通的,而且可能程序会对你的输入进行一些限制,比如不许输入rm之类的。
但是这种很少了
之前在打路由器的时候,遇到这种情况,就是在qemu页面出现很多aaaa
就是把你的输入直接显示出来了,在路由器的终端,这种情况下拒绝服务是打不通的,但是确实非常天然的RCE。
比如这样,虽然看下面的代码可以很明显看出来这个是rce,但是当时我第一眼看下来就给给当拒绝服务打了(当时刚刚开始挖看到长得像拒绝服务的就直接开打,然后没有打通,后来往后面看才发现是ice,大大的输入重定向到cmdTmp.txt)

所以挖洞时要多看。
比如如果分析后里面没有一个操作系统的架构,而是一些类似于这种的文件

一堆xml文件,其实这就说明这个固件是加密后的,或者binwalk根本就无法分析,也有可能是因为固件加密。

那就尝试去调试一下看看是不是有一些检查机制,一般都是死循环,只需要patch 掉那个死循环就行就行了
下面有俩文章大家可以读读,里面会写到关于patch的
Tenda-FH1201多处命令注入漏洞分析和复现
Tenda漏洞环境搭建与复现


--这个图从小火炬哔站上的的公开课上面截图的
import
requests
url
=
"http://你的ip/漏洞路由"
payload
=
{
‘mmmm’:b’a’
*
100000
}
res
=
requests.post(url
=
url,data
=
payload)
import
requests
url
=
"http://你的ip/漏洞路由"
payload
=
{
‘mmmm’:b’a’
*
100000
}
res
=
requests.post(url
=
url,data
=
payload)
qemu
-
mipsel
-
static
-
L . .
/
bin
/
httpd
qemu
-
mipsel
-
static
-
L . .
/
bin
/
httpd
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
1 2 3 4 5 6 7 | import requests
url = "http://你的ip/漏洞路由"
payload = {
‘mmmm’:b’a’ * 100000
}
res = requests.post(url = url,data = payload)
|
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2025-3-21 19:23
被xubeining编辑
,原因: 修改错别字,就在栈与堆漏洞的区别那里