参考文章
IOT-CVE-2018-17066(D-Link命令注入漏洞)_firmae路由仿真-CSDN博客
https://www.cnblogs.com/from-zero/p/13300396.html
漏洞环境搭建
旧的环境搭建笔记
固件官网可以进行下载
之后按照之前复现的方式一样 我们丢到kali中执行binwalk解析
解析完成可以获得
之后为了模拟 可以在kali里安装qemu-mipsel
在bin目录下可以尝试将goahead的环境搭配好
启动遇到报错
根据参考文章CVE-2018-17066复现-CSDN博客可知,以上这种qemu的方法启动存在很多bug,且难以修复。所以我们这里也学习博主,采用qemu的远程调试的思路来进行模拟。
参考的另一篇文章如下
原文中采用的是ubuntu的系统,我们这里采用的是kali来进行模拟即可。
我们首先找到ida软件的安装目录 下的dbgsrv目录下的linux_server和linux_server64
我们将这两个文件放到我们的kali中 并且赋予其执行权限
这是我们kali的ip地址
接下来我们启动该linux服务器(32位启动linux_server即可)
之后我们去ida中进行链接操作 从而启动远程调节
(以上内容后续存在了问题,所以以接下来为准)
----------------------------------------------------------
2024.9.10更新
一些相关的引用参考:
IDA工具的快捷键使用等
IDA工具的选用
我们需要注意 有很多版本的IDA工具 但是有的版本是不支持远程调试 或者说调试不能指定端口 有的过高的版本是没有办法通过Fn+F5进入反编译(会提示没有插件) 所以一定要选择一个正确合适的版本
本人尝试了很多版本 最后选择了7.7的版本
给出了具体的下载地址,不能下载的话评论区私我(不是我的链接)
[2023新年快乐] IDA Pro 7.7.220118纯净汉化修正版至上 - 『逆向资源区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
可以考虑的思路如下:
1.本地调试的方案 通过qemu来模拟启动goahead服务器文件 同时指定一个GDB调试的端口监听连接 在IDA中连接到GDB 以GDB作为中间桥梁来一边运行一边又可以借助IDA进行调试
由于远程动态调试的资料更多 所以这里我们先试着学习使用这种方法来模拟调试
2.远程动态调试的方案 在kali中负责启动qemu模拟 远程到本机windows配合IDA进行断点的调试
学习的参考地址:
ida在kali-linux虚拟机上进行远程调试(提供可能的解决无法连接的思路)内含本机与linux虚拟机无法互相ping通的解决方法(见标题四.(七))_ida远程调试linux-CSDN博客
按照两种建议的思路 我们来进行尝试复现
具体的操作流程和之前一样 我们把服务器端文件移动到kali上以后 接下来启动监听
开启监听以后 我们继续在kali上开启goahead文件用qemu模拟 同时指定远程调试端口为1234
指定完毕以后,接下来回到我们的IDA工具 我们接下来会需要一步一步的来解决BUG
首先启动我们的IDA工具
调试方法选择如下
之后我们按住F9启动调试
文件位置选择本机的即可 地址设定为我们的kali的地址 端口为1234
此时也就成功了
接下来我们可以开始尝试运行 根据不同的报错bug 我们通过调试的方式一步一步改BUG
在调试器下选择继续进程 表示其开始运行 也就是F9
出现这个就表示正在运行
此时我们的kali端出现了报错而终止
这是我们需要解决的第一个BUG,我们回到IDA 去搜索这个字符串
找到了相应的目标 我们进入
按住ctrl+x 我们找其函数
进入以后 我们转成伪代码的视图 按住F5即可(笔记本是Fn+F5)
分析可知我们只需要把v1在执行的时候改成1 即可跳出这个while的循环 也就没有报错了
光标放到if(v1)那里 按住tab键回到源代码
这就是那行代码 我们后续给其设置一个断点即可
重新继续在kali监听1234端口 重新启动调试
接下来我们任选一个地址 右键
选择跳转到指定地址 我们输入0045C748即可 然后添加断点
我们把光标定位到断点的前一行 然后运行的时候 选择运行到光标处
之后就可以看到当前所有寄存器的数值了
然后根据代码的原理 我们把v0的数值改成非0即可绕过这个报错(如果修改v1为1的话 可以绕过while的循环 但是fclose可能会出错)
第一个BUG就算解决了 接下来是另一个报错导致的终止
接下来我们继续去搜索字符串定位函数
同样我们继续回溯
找到了报错的位置 只要在运行调试的时候 将v19的数值改成非-1即可绕过这个报错
我们看一下这个函数的地址 便于后续定位 0045CDDC
我们继续重新模拟一遍 依次为这两个地方打上断点绕过bug
我们将v19的数值进行修改即可(此时依然修改的是v0寄存器)
此时就处于一直成功运行的状态 没有出现报错
并且去访问路由器的地址也可以成功访问了(注意不是https 是http)
漏洞复现
刚才已经搭建好了漏洞的环境,启动了路由器的界面 接下来我们直接复现漏洞的利用
接下来首先要做的事是绕过这个路由器的前端登录页面,两篇文章都提供了不错的办法。不论是直接修改前端,还是用IDA进行空绕过都是可以的。我们采取前面的方案 这样最快捷
我们可以按照如下的路径找到之前解析后的web的页面的代码所在的位置
我们找到刚才登录页面的asp文件 dir_login.asp
结合前端知识 点击登录以后 会进入onlogin方法进行处理 我们找到这个js
可以发现 其主要的前端工作就是为了限制用户名不能为空 否则会alert内容
之后信息会以表单的形式传入如下后端进行处理 formLogin
接下来我们尝试去定位 看一下后端的代码是如何处理账号密码的登录的
我们可以尝试去字符串的位置搜索username等 看看是否有结果
定位到以后 通过ctrl+x来找其函数
首先我们进入第一个去看一下
很明显 这是类似于修改密码的部分 我们去看第二个
很明显 这部分符合我们的页面的逻辑 将前端得到的username和password进行decode64之后和bufget的内容进行比对获得结果 使用的是strcmp函数
根据源代码
如果我们登录错误 就会进入else的部分 我们可以自己尝试随便输入以后点击登录看看
如下图所示
那么根据代码可知 正常情况下比较结果为0表示正确 取反就可以进入验证
我们只需要让账号和密码都为空 即可绕过这个后端的验证 这个就有两个办法
我们可以直接把前端的代码给注释掉,使其允许输入空串即可
又或者我们可以通过IDA修改strcmp的数值即可绕过
登录页面绕过
方案1:修改前端
我们理解了后端代码处理的逻辑后 最简单的方法 直接将onlogin的js代码给注释掉 绕过前端对于空输入的限制 即可利用strcmp的逻辑漏洞直接绕过登录 我们可以进行尝试
我们打开dir_login.asp的文件 直接进行注释 保存即可
然后我们重新启动这个模拟 用户名和密码都用空登录即可
此时已经没有前端的限制 也绕过了两个strcmp的限制 也就成功登录了
方案2:IDA修改strcmp的结果
我们继续重复之前的操作 只不过我们需要定位一下strcmp结果的位置
按住Tab键 恢复源代码的样子
不知道在哪里下断点的注意了!!!我们按住空格键即可进入视图的页面
我们可以发现 判断的分支核心就在这一条 所以我们下断点修改数值的核心就是这个位置
也就是断点位置:0045711C 我们接下来先把页面正常打开
在该位置添加一个断点 然后前端随便输入一个内容 网页开始转圈
IDA已经成功到断点的位置了
自行验证方案,如果修改过程出现了问题 就会出现如下页面 被重定向到了dir_login.asp
我们可以尝试用户名随便输 密码输入为空 (用户名不为空就可以绕过前端的限制了) 之后我们运行时,将v0修改为0 即可绕过对于用户名的strcmp的限制 密码为空本身就可以绕过strcmp 这样也就登录成功了
之后我们点击登录 修改v0为0即可
之后我们继续运行进程即可成功登录
方案3:BurpSuite抓包直接绕过
由于kali自带bp 可以直接抓包 输入的时候输入用户名和密码 抓包直接改为空即可绕过前端js的限制 也很简单 这里就不再赘述了 读者可以自己测试 很简单
登陆成功漏洞利用
登录成功绕过以后 我们就可以进入如下这个漏洞存在的页面 进行漏洞的复现了
这是漏洞的页面位置
同样 这里前端页面对于输入的内容也有限制 我们可以通过bp抓包的方式
通过bp抓包 我们将我们的命令可以放入datetime字段
通过 ` ` 这种符合嵌入到命令中 即可导致命令执行 ls的结果已经显示出来了
我们可以在kali中进行验证
很明显通过反引号指出的命令会被优先执行 具有更高的优先级
漏洞原理分析
我们找一下后端的代码,搜索字符串datetime
一步一步回溯找到相应的代码 最终我们找到函数sub_4572A4
可以发现其后续对于输入的datetime数值Var 没有做任何过滤处理 就执行了dosystem函数
这也是为什么我们前面需要将命令拼接到datetime的原因 至此原理分析也完毕