导语:本文描述了一个在我们的SSH蜜罐中发现的后门,它生成了一个完全加密和完整性检查的反向shell,并在蒙特利尔的GoSec 2017上展示过。
本文描述了一个在我们的SSH蜜罐中发现的后门,它生成了一个完全加密和完整性检查的反向shell,并在蒙特利尔的GoSec 2017上展示过。我们将该后门命名为Chaos,与攻击者在系统中给出的名称一致。经过进一步研究,我们发现该后门是2013年左右活跃的sebd rootkit的一部分。
因为无法找到任何关于此后门技术细节的文档,我们决定自己来!
一、导语
今年夏天,我们有一个项目是在FreeBSD系统中寻找恶意软件,或者至少评估是否存在。为此,我们使用了FreeBSD jails,它被描述为“chroot on steroids”。我们的想法是仅使用jails来模拟Intranet结构,这是可行的,因为jails可以在主机上自己分配IP地址。然后,攻击者会攻击暴露于互联网的jails,并从那里通往其他jails。不幸的是,没有人能做得这么多,因为典型的攻击者在意识到他们遇见FreeBSD系统时会立即离开。脚本化的机器人设法上传了payload,但如果没有Linux,ELF文件将无法运行,这样就发挥不了作用。在这一点上,我们可以说FreeBSD是一种减少攻击面非常好的方法,因为没有攻击者想要面对FreeBSD。当然,如果你已经被黑了的话,此建议无效。
当我们放弃寻找BSD恶意软件时,我们决定寻找Linux恶意软件。在蜜罐运行几分钟后,我们获取到了一些。之后,又获取了一些不同于Gafgyt(LizardSquad)和Mirai的东西。
二、首次通联和侦察
2017年6月21日,攻击者使用两个已知属于TOR网络的IP暴力穷尽SSH凭证攻破了我们的一个受监控系统:89.234.157.254 与192.42.116.16。
像往常一样,攻击者首先禁用了日志记录,然后检查SSHD二进制文件以及某些特定文件,例如/usr/include/gpm2.h。这样做的目的是确保被攻陷的机器尚未被其他人感染。攻击者检查的文件通常用于给SSHD漏洞(记录盗取的SSH凭证)打补丁。之后,攻击者通过下载并安装payload来感染。
三、安装Chaos
在第二阶段,攻击者从http://xxx.xxx.xxx.29/cs/default2.jpg下载了一个伪装成jpg的文件。 事实上,该文件是一个.tar文件,.jpg扩展名是为了使它在可能的日志文件或抓取的数据包中看起来更合理。tar包含:
1、Chaos (ELF 可执行文件) 2、Client (ELF 可执行文件) 3、initrunlevels (Shell脚本) 4、install (Shell脚本)
tar中的Chaos是安装在受害者系统上的实际后门,Client文件是连接到后门的客户端。 有关这两个ELF文件的更多细节将在下面讨论,我们先来看看两个shell脚本initrunlevels与install。install脚本将initrunlevels脚本复制到/etc/init.d,以确保该文件在系统每次启动时都被执行。
initrunlevels: 持久性脚本
如上所示,initrunlevels脚本打开8338号端口并检查是否存在某些特定文件。如果不存在,则脚本将这些不显眼的文件复制到它检查的路径中。接下来,该脚本将client复制到/usr/include/cli.h中,并复制Chaos到/usr/include/stabd.h和/usr/sbin/smdb中。 这是为系统上的client和Chaos创建备份。攻击者还释放并执行了其他文件,以使该系统成为IRC僵尸网络的一部分,在本文中我们仅调查后门。
如上所述,攻击者释放了两个文件:Chaos和Client。Chaos是启用反向shell的后门,Client启动Chaos的连接。
口令检查后连接返回
后门的工作原理如下:首先Chaos打开一个原始的TCP套接字,检查传入的数据包是否包含特定的字符串。由于这是一个原始套接字,任何传入打开端口的数据包都将被读取和检查。如果Chaos检测到字符串,则它将连接TCP端口8338上监听的Client。在连接Client后,Client和Chaos交换密钥材料,从中派生出两个AES密钥。他们继续使用挑战—应答身份验证检查密钥协商是否成功,如下所示。
Chaos的身份验证和密钥交换
有趣的是,双方都有相同的两个密钥,用于发送和接收。加密后的口令竟然是硬编码的,我们设法破解并以纯文本形式获取口令。口令在不同的感染系统中重复使用。后门可以规避防火墙。事实上,任何正常的防火墙都会阻止传入的数据包进入任何没有明确目的而打开的端口。但是,对于使用原始套接字的Chaos,可以在运行现有合法服务的端口上触发后门。 作为一个例子,只暴露SSH(22),HTTP(80)和HTTPS(443)的Web服务器由于服务占用而无法通过传统的后门进入,但是随着Chaos的出现,这变得可能。此外,除非显式指定-w标志,否则通过netstat不能显示原始套接字。
五、密钥派生
Client从Chaos建立连接后,它会向Chaos发送一个40长的字符串。该字符串作为预共享密钥并按照以下方式生成:
如图所示,预共享密钥由两个块组成,每块用于生成两个密钥中的一个。密钥从块中派生,如下所示:
请注意,这些密钥用于长度为128的CBC模式下的AES,这意味着SHA1的一部分将被丢弃。为确保加密数据包的完整性,生成两个Hash在HMAC中使用。
在 IDA中, 我们可以清晰地看到AES的CBC 模式:
加密循环
注意到它没有犯重复使用IV的常见错误。密钥派生过程与Chaos二进制的工作方式相同,除了块交换。
六、包结构
交换过程中的数据包格式如下:
正如我们所看到的,前两个字节决定payload的长度。size字段和payload均已加密。为标记payload的结束,使用了三个连续的空字节。在分隔符之后,seq字段用于计数并保持数据包的顺序。最后一个字段是确保数据包完整性的HMAC。
每个通信数据包不仅被加密,而且使用HMAC检查完整性。HMAC如下生成:
内部值是Constant1上的Hash,与size字段,加密的payload,分隔符和序列号连接。 外部Hash通过Constant2和内部Hash生成。
八、窃取的后门复燃
如前所述,这个后门在2013年首次出现,是sebd rootkit的一部分。我们在hackforums.net上发现了一个帖子,用户声称知道后门是如何公开发布的。据说后门的源代码已经被另一个蜜罐捕获,“研究人员”不合常理的在这个论坛上发布了源代码,使其可被脚本小子使用。
攻击者只是简单地改变了后门的名字,让人们认为这是一种新的,而实际上是窃取的。
九、受害者
为评估感染数量,我们使用从客户端提取的握手进行了全网扫描。受害系统的数量非常少,低于150个。以下是受害者的地理分布:
我们联系了CCIRC,列出了受害系统的IP地址,由他们继续通知CERT合作伙伴和受害者。
十、结论
Chaos后门非常有趣,因为它使用隐形原始套接字来产生具有完整网络加密和完整性检查的反向Shell。 但是,如果预共享密钥已知,后门的加密算法很容易破解,因为它是以明文形式传输的。
有趣的是:由于攻击者为传入的数据包打开了8338端口,所以攻击人员显然希望在受感染的计算机上使用Client文件。他们会使用受感染的机器作为进一步犯罪的代理,这样就可能可以跨越网络边界。
据Virustotal称,尽管后门已经存在好几年了,但没有防病毒软件检测到这个后门。
在下一篇博客中,我们将描述使受害系统成为IRC僵尸网络的其他恶意软件。
附录:IoC
有关此威胁的最新IoC信息,请参阅我们的malware-ioc github repository.
文件hashes
Chaos: 0a27b0579702888c3399c6b853acf986beae2a4e
Client: 7f5d3bb5079f9bf077832301615fa6e2e072c4e8
文件系统
警告:下面记录的文件系统组件也是合法的系统文件。在做出结论之前,你需要仔细调查一下。
该组织在/usr/sbin/smdb中安装后门,并将其备份为/usr/include/stabd.h。
/usr/sbin/smdb 是合法的,Samba套件的一部分。为兼容Windows(如文件共享或集成Active Directory)安装Samba。/usr/include/stabd.h是合法的,glibc头文件的一部分,一个纯文本文件,当恶意时它是一个二进制文件。
可以手动检查文件或运行我们的Yara规则:
yara sedb_chaos.yar /usr/sbin/smdb yara sedb_chaos.yar /usr/include/stabd.h
系统调查/etc/init.d/runlevels是一个恶意脚本,它将打开防火墙上的端口并执行后门程序。 这是恶意软件的持久性机制。
在普通的Linux服务器上监听原始套接字是非常罕见的事情。以root身份运行以下命令来检查系统:
netstat -lwp
它会列出打开监听原始套接字的进程。然后,可以调查进程以评估它是否合法。 如果不知道它是什么,那么可能是不合法的,因为监听原始套接字很少见。