0x00. 前言
相信各位关注我们的小伙伴们,之前肯定已经阅读过了我们的一篇叫DIR600绝对路径遍历的文章,那么今天我们来了解另外一种漏洞类型:命令执行。
0x01.固件模拟
型号:Netgear DGN1000
版本:DGN1000WW_V1.1.00.45
官网:https://www.netgear.com/
测试环境:Ubuntu 18.04
使用FirmAE对固件进行模拟,执行的命令如下
sudo ./run.sh -r 1000dng ./firmwares/DGN1000WW_V1.1.00.45.img
[for iot: ] password
[.1.00.45.img emulation start!!! ] ./firmwares/DGN1000WW_V1
[ ] extract done!!!
[get architecture done!!! ]
[.1.00.45.img already succeed emulation!!! ] ./firmwares/DGN1000WW_V1
[2 ]
[ ] run
[on 192.168.0.1! ] Network reachable
[on 192.168.0.1 ] Web service
Creating TAP device tap2_0...
Set 'tap2_0' persistent and owned by uid 0
Bringing up TAP device...
Starting emulation of firmware... 192.168.0.1 true true .040925734 .040925734
当看到两个true的时候,可以证明固件的Network和Web都已经起来了,使用默认的admin:password登录即可
0x02. 命令执行漏洞
对固件使用binwalk进行解压
binwalk -Me ./DGN1000WW_V1.1.00.45.img
对固件进行解压,进入到系统目录下面
先对各个目录的文件进行检查,查看web端相关代码,可以看到很多请求都与setup.cgi有关
那我们先去看看与setup.cgi相关的的文件
grep -r 'setup.cgi'
可以看到好多前端的页面都引用了这个文件,都是通过GET,POST请求到这个文件,最后找到这个文件的源文件是在/usr/bin目录下面,接下来打开IDA对这个文件进行一下分析
可以看到setup.cgi对应的Action表,查看左侧的函数表,可以发现一个syscmd的函数
syscmd函数将cmd获取的值通过snprintf格式化到变量v7中,并且对传入的数据没有进行任何过滤,存在命令执行漏洞
通过grep检索与syscmd相关的文件
好家伙还有一个syscmd.htm页面,我们直接访问一下看看
是一个需要授权的命令执行页面,可以看到发送命令访问的目标url为/setup.cgi?todo=syscmd&cmd="+$("#cmdbox").val()+"&curpath="+$("#curpath").val()
,传递的键值是todo,cmd和curpath,逆向分析setup.cgi如下:
看到在主函数中使用todo去指定要执行的函数,既然发现了有可以执行命令的函数,那么咱们可以构建一下setug.cgi?todo=syscmd 是不是就可以去执行命令了
接下来直接浏览器访问http://192.168.0.1/setup.cgi?todo=syscmd
发现需要授权,咱们先不管,刚刚在IDA中发现使用cmd去接受的参数,我们去给它赋值再看看
一样还是需要授权,那我们就输入一下账号密码看看能不能执行
0x03.未授权漏洞
上面已经讲解了授权下访问http://192.168.0.1/setup.cgi?to=syscmd&cmd=cat+/www/.htpasswd,成功读取用户名和密码存储的文件,那么如果存在未授权漏洞,则可以未授权执行任意命令
搜索和http相关的服务,可以看到耳熟能详的的mini_httpd,mini_httpd是一个小型 HTTP 服务器。它的性能不是很好,但对于小型的路由器已经足够使用了
使用IDA打开可以得到如下反汇编内容
根据mini_httpd,去github搜索,在如下链接:https://github.com/peter-leonov/mini_httpd,即可获得mini_httpd的相关源代码,只要找到厂商自己添加的模块即可
在main函数的第609行,对应mini_httpd的handle_request的函数
这里是处理http请求的函数
通过和mini_httpd的源码进行对比可以发现,从240行以后是厂商自己添加的处理函数,在这里我们可以看到比较请求的路径是否含有currentsetting.htm,有则将对应的变量设置为对应的值,继续往下跟踪
536行,对应mini_httpd的do_file函数,里面包含权限验证,跟进查看
通过逆向分析可以知道,携带的请求含有currentsetting.htm,则会授权响应,那么针对上面的命令执行漏洞,只要在请求中添加上currentsetting.html触发授权响应即可,payload如下:
http://192.168.0.1/setup.cgi?todo=syscmd&cmd=cat+/www/.htpasswd¤tsetting.htm
可以看到可以在未授权的情况下,成功读取了htpasswd密码文件,那么同理可以在未授权的情况下执行任意系统命令
0x04.总结
以上内容就是针对Netgear DGN1000未授权命令执行的全部分析过程,通过分析可以看到结合github开源项目对逆向分析事半功倍,常见的嵌入式设备web服务端,如goahead,lighttpd等,在市面上的使用量很高,并且也进行了开源 ,相信结合开源代码,能帮助大家快速恢复相关结构体并快速定位到厂商自己的代码,提高漏洞分析和挖掘的效率。
原文始发于微信公众号(IOTsec Zone):Netgear DGN1000 命令执行