2015年12月18日Juniper网络发布声明(advisory)示,他们已经发现了ScreenOS中的未经授权的代码,ScreenOS软件管理Netscreen防火墙。此声明涉及两个不同的问题;一个通过VPN实现的后门使恶意窃听者破解流量,以及另一个后门在SSH和Telnet防护进程中允许攻击者绕过身份验证。不久后,Juniper网络发布了这个声明,FoxIT的一名员工表示,他们能够在6小时之内破解后门密码。一个快速Shodan检索发现约26,000个
面向Internet的NetScreen设备使用公开的SSH 。鉴于这一问题的严重性,我们决定进行调查。
Juniper网络公司的顾问提到,版本6.2.0r15到6.2.0r18和6.3.0r12到6.3.0r20受到影响。Juniper网络提供了新的6.2.0和6.3.0版本,还重建了省略了后门代码的旧包。重建后的旧包版本有“b”后缀,并有一组很小的变化,这使它们成为分析的最佳选择。为了分析此固件,它必须被打包然后解压缩。该固件包含一个二进制的ZIP文件。这个二进制是一个解压缩的存根,有一个gzip压缩的内核。x86图像可以很容易地用binwalk提取,但获取XScale图像需要做更多的工作。ScreenOS不是基于Linux或BSD的,而是作为一个单一的整体的内核运行。该SSG500固件使用x86架构,而SSG5和SSG20固件使用的是XScale(ARMB)架构。解压缩的内核可加载到IDA Pro以便分析。作为分析工作的一部分,我们已经取得了解压缩二进制文件,可以从GitHub仓库获取。
与ARM相比虽然大多数人都更为熟悉x86,但是由于编译器输出最小的变化,ARM的二进制文件更容易进行比较。为了加载SSG5(ssg5ssg20.6.3.0r19.0.bin)固件到国际开发协会(IDA),
应该选择ARMB CPU,使用0x80000负载地址和文件偏移量0x20。一旦二进制被加载,它有助于识别和标记常见功能。在搜索文本“STRCMP”来找到一个sub_ED7D94函数引用的静态字符串。观察串输出,我们可以看到一些有趣的字符串引用,包括auth_admin_ssh_special和auth_admin_internal。搜索“auth_admin_internal”找到sub_13DBEC功能。这个函数有一个6.3.0r19b固件中不存在的“STRCMP”调用:
该STRCMP调用的参数是<<<%S(UN ='%s'的)=%U,也就是后门密码,推测选择它是因为会被误认为是在代码之中其他许多调试格式字符串中的一个。此密码允许攻击者绕过SSH和Telnet认证,只要他们知道一个有效的用户名。如果你想手工测试一下这个问题,Telnet或SSH 一个NetScreen设备,指定一个有效的用户名和后门密码。如果该设备是脆弱的,你应该得到一个具有最高权限的交互式shell。
这个后门有趣的不是它很简单,而是出现的时机。 Juniper网络公司的顾问称,版本6.2.0r15到6.2.0r18和6.3.0r12到6.3.0r20受到影响,但是实际上认证后门并不存在于旧版本的ScreenOS。我们无法确定6.2.0r15,6.2.0r16,6.2.0r18版本的后门,可能说整个6.2.0系列并没有受到这个问题的影响会比较中肯(虽然VPN问题确实存在)。我们也无法识别的版本6.3.0r12或6.3.0r14的认证后门。我们可以证实,版本6.3.0r17和6.3.0r19受到影响,但未能检查6.3.0r15或6.3.0r16。这很有趣,因为虽然第一个受影响的版本是在2012年发布,认证后门似乎直到2013年底都没有得到修复(6.3.0r15,6.3.0r16,或6.3.0r17也没有)。
检测这个问题不容易,但也有一些事情可以做。Juniper网络提供了一个成功的入侵日志是什么样子:
2015-12-17 09:00:00 system warn 00515 Admin user system has logged on via SSH from …..
2015-12-17 09:00:00 system warn 00528 SSH: Password authentication successful for admin user ‘username2’ at host …
虽然攻击者一旦获取权限也可以删除该日志,但是任何发送到集中记录服务器(或SIEM)的日志都将被捕获并且可以用来触发警报。
FoxIT形成了一整套Snort规则可以使用后门密码通过Telnet来检测权限并且建立到ScreenOS Telnet或SSH服务的任何连接访问:
# Signatures to detect successful abuse of the Juniper backdoor password over telnet.
# Additionally a signature for detecting world reachable ScreenOS devices over SSH.
tcp $HOME_NET 23 -> any any (msg:"FOX-SRT - Flowbit - Juniper ScreenOS telnet (no)"; flow:established,to_client; content:"Remote Management Console|0d0a|"; offset:0; depth:27; flowbits:set,fox.juniper.screenos; flowbits:no; reference:cve,2015-7755; reference:url,http://kb.juniper.net/JSA10713; classtype:policy-violation; sid:21001729; rev:2;)
tcp any any -> $HOME_NET 23 (msg:"FOX-SRT - Backdoor - Juniper ScreenOS telnet backdoor password attempt"; flow:established,to_server; flowbits:isset,fox.juniper.screenos; flowbits:set,fox.juniper.screenos.password; content:"|3c3c3c20257328756e3d2725732729203d202575|"; offset:0; fast_pattern; classtype:attempted-admin; reference:cve,2015-7755; reference:url,http://kb.juniper.net/JSA10713; sid:21001730; rev:2;)
tcp $HOME_NET 23 -> any any (msg:"FOX-SRT - Backdoor - Juniper ScreenOS successful logon"; flow:established,to_client; flowbits:isset,fox.juniper.screenos.password; content:"-> "; isdataat:!1,relative; reference:cve,2015-7755; reference:url,http://kb.juniper.net/JSA10713; classtype:successful-admin; sid:21001731; rev:1;)
tcp $HOME_NET 22 -> $EXTERNAL_NET any (msg:"FOX-SRT - Policy - Juniper ScreenOS SSH world reachable"; flow:to_client,established; content:"SSH-2.0-NetScreen"; offset:0; depth:17; reference:cve,2015-7755; reference:url,http://kb.juniper.net/JSA10713; classtype:policy-violation; priority:1; sid:21001728; rev:1;)
如果你正在尝试更新一个ScreenOS系统,或遇到任何和权限密码有关的问题,请参考Steve Puluka的博客文章。
我们要感谢Comsecuris的Ralf-Philipp Weinmann,他帮助拆包和分析固件,还要感谢Fox-IT 的Maarten Boone确认我们的调查结果,并提供上述的Snort规则。
发表评论
您还未登录,请先登录。
登录