OceanLotus小组(又名APT32和APT-C-00)以其在东亚的袭击而闻名。 去年,发表了有关该小组工作的许多研究报告,包括
CyberReason文件,
FireEye评论以及对
Volexity的水坑攻击的
描述 。 我们可以看到,该小组更新了后门,基础设施和感染媒介。
OceanLotus继续瞄准东亚的公司和政府机构。 根据ESET遥测技术,OceanLotus的优先目标是越南,老挝,柬埔寨和菲律宾。
几个月前,我们发现并分析了他们的最新后门之一。 它实现了一些难以分析和避免检测的工具-我们将在帖子中进行讨论。

经销
攻击者使用不同的方法说服受害者启动恶意投递器。
双重扩展名和虚假的应用程序图标(Word,PDF等)
滴管很可能通过电子邮件附件传播。 我们观察到以下文件名:
Mi17 Technical issues - Phonesack Grp.exe
(Mi-17-俄罗斯直升机模型)
Chi tiet don khieu nai gui saigontel.exe
(越南语翻译-“索赔细节发送给Saigontel”,Saigontel-越南电信公司)
-
Updated AF MOD contract - Jan 2018.exe
remove_pw_Reschedule of CISD Regular Meeting.exe
Sorchornor_with_PM_-_Sep_2017.exe
20170905-Evaluation Table.xls.exe
CV_LeHoangThing.doc.exe
(加拿大也有假简历)
所有这些文件都有一个共同点-启动受密码保护的诱饵文档。 目前尚不清楚密码是否包含在已发送信件的数据中,或者是否应该打开文档。
假安装程序
在水坑运动中发现了一些冒充安装程序或软件更新的假安装程序。 一个例子是
Freebuf上360 Labs描述的重新包装的Firefox安装程序。
我们看到的另一个示例称为
RobototFontUpdate.exe
。 它可能通过受感染的站点传播,但是我们没有足够的证据。
所有描述的文件,无论是通过邮件分发还是在访问受感染站点时下载,都传递了相同的后门组件。 在一篇
RobototFontUpdate.exe
,我们将分析
RobototFontUpdate.exe
的示例,并展示其如何在系统上执行恶意负载。
技术分析
安装和执行过程取决于多层混淆,即组件加密,PE文件的重构,shellcode加载和侧加载技术。 后者在ESET
先前的Korplug研究中有所描述。
进度审查
攻击由两部分组成:滴管和运载火箭。 过程的每个部分的每个步骤将在相应的部分中详细说明。 下面的两个图表简要介绍了恶意软件的总体进度。
图1.滴管的进度
图2.后门进度几乎所有这些组件都被混淆了。 模糊处理基于互补条件对转换命令。 对于每种形式:JZ / JNZ,JP / JNP,JO / JNO等,每对都执行向同一目标的过渡。 该序列中插入了使用堆栈指针但不更改条件标志值的垃圾代码。 事实证明,过渡发生在同一分支内。 由于使用正堆栈指针值,这会在反编译过程中导致问题。
图3.互补条件转换此外,程序的某些基本元素向堆栈添加一个地址,之后它们以JMP / CALL结尾,而其他基本元素添加两个地址并以RET命令结尾。 第二项添加是被调用的函数,第一项是将进行转换的下一个基本程序元素的地址。 因此,程序的基本元素是在没有父对象的情况下创建的。
图4. PUSH / JMP技术通过两种混淆技术的组合,获得了“美丽”的图形:
图5.混淆运行顺序注意垃圾代码非常简单。 如果您知道应用方案,可以在样本分析中将其忽略。
滴管
步骤1.诱饵文件
最近几个月,OceanLotus使用了几种诱饵。 其中之一是用于更新
Roboto Slab regular
TrueType字体的伪造软件。 选择字体似乎有些奇怪,因为它不支持许多东亚语言。
图6. RobototFontUpdate字体更新图标当执行时,二进制文件解密其资源(XOR,128字节,硬编码密钥)并恢复解密的数据(LZMA)。 合法的RobotoSlab-Regular.ttf文件
(SHA1:
912895e6bb9e05af3a1e58a1da417e992a71a324
)写入
%temp%
文件夹,并使用Win32 API
ShellExecute
函数启动。
执行从资源解密的外壳代码。 执行后,伪造的字体更新将实现另一个应用程序,该应用程序的唯一目的是删除滴管。 此擦除应用程序
%temp%\[0-9].tmp.exe
为
%temp%\[0-9].tmp.exe
。
阶段2. Shell代码
在每个阶段,使用相同的shellcode。
Shellcode是自定义的PE加载程序。 它将可执行文件还原到内存中-解密所有部分并计算必要的移动和其他缩进。
RtlMoveMemory
使用Windows API的三个功能:
VirtualAlloc
,
RtlMoveMemory
和
RtlZeroMemory
。
RtlZeroMemory
函数用于
RtlZeroMemory
PE标头中的字段
RtlZeroMemory
。 依靠自动内存转储将失败,因为MZ / PE标头已损坏。
外壳程序代码调用解密的PE登录函数,然后
DLLEntry
导出
DLLEntry
。
第三阶段。真正的滴管
{103004A5-829C-418E-ACE9-A7615D30E125}.dll
此可执行文件通过Windows API在CBC模式下使用AES算法解密资源。 硬编码密钥的大小为256位。 解密后,将压缩的数据解压缩(LZMA算法)。
如果以管理员权限启动该过程,则恶意软件会通过创建服务来提供持久性。 否则,将使用经典的“运行”注册表项(
HKCU\SOFTWARE\Microsoft\ Windows\CurrentVersion\Run;DeviceAssociationService;rastlsc.exe
)。
如果使用管理员权限执行了删除程序代码,它将尝试将以下列出的文件写入文件夹
C:\Program Files\Symantec\Symantec Endpoint Protection\12.1.671.4971.104a\DeviceAssociationService\
,如果没有,则将它们写入
%APPDATA%\Symantec\Symantec Endpoint Protection\12.1.671.4971.104a\DeviceAssociationService\
文件夹
%APPDATA%\Symantec\Symantec Endpoint Protection\12.1.671.4971.104a\DeviceAssociationService\
:
rastlsc.exe
(SHA1:
2616da1697f7c764ee7fb558887a6a3279861fac
,合法应用程序Symantec Network Access Control的
dot1xtra.exe
)
SyLog.bin
(SHA1:
5689448b4b6260ec9c35f129df8b8f2622c66a45
,加密后门)
rastls.dll
(SHA1:
82e579bd49d69845133c9aa8585f8bd26736437b
,
rastlsc.exe
的恶意DLL)
路径因样本而异,但布局相似。 根据权限,恶意软件会将文件转储到
%ProgramFiles%
或
%appdata%
。 我们还观察到:
-
\Symantec\CNG Key Isolation\
-
\Symantec\Connected User Experiences and Telemetry\
-
\Symantec\DevQuery Background Discovery Broker Tasks\
这些路径由各种Symantec产品使用。
在实现持久性并将可执行文件实现为合法文件之后,
rastlsc.exe
是使用
CreateProcessW
执行的。
我们还观察到了使用
krv
参数执行
rastlsc.exe
的版本(
{BB7BDEC9-B59D-492E-A4AF-4C7B1C9E646B}.dll
)。 我们将在下面更详细地讨论。
后门组件:rastlsc.exe填充
OceanLotus团队在Symantec产品可执行文件之一中使用了一种古老而著名的技术。 最重要的是使用通过将恶意库写入同一文件夹来加载合法和签名的.exe文件的库的过程。 这将使恶意行为看起来合法,因为在受信任的可执行文件运行时执行了这些操作。
如上所述,将重置并执行合法的
rastlsc.exe
文件。
它导入
rastls.dll
文件,在这种情况下,该文件包含恶意内容。
图7.来自Symantec的经过数字签名的rastlsc.exe我们还看到使用其他合法且经过签名的可执行文件进行填充,其中包括McAfee的
mcoemcpy.exe
,该文件加载了
McUtil.dll
。 PlugX以前使用了此技术,引起了
越南CERT (越南语)的注意。
阶段1.填充库rastls.dll
dll文件的内部名称是
{7032F494-0562-4422-9C39-14230E095C52}.dll
,但是我们看到了其他版本,例如
{5248F13C-85F0-42DF-860D-1723EEAA4F90}.dll
。 所有导出的函数导致执行相同的函数。
图8.所有rasltls.dll导出都导致一个函数导出尝试读取位于同一文件夹中的
SyLog.bin
文件。 其他版本试图打开
OUTLFLTR.DAT
文件。 如果文件存在,则将使用CBC模式下的AES算法使用硬编码的256位密钥对其进行解密,然后将接收到的压缩数据解压缩(LZMA压缩)。
McUtil.dll
变体使用另一种技术。 乍看之下,main函数没有任何恶意作用,但实际上它替代了合法文件
mcoemcpy.exe
(二进制文件)的
.text
部分。 它生成一个shellcode,其任务是调用一个函数以从
mcscentr.adf
文件中读取第二阶段的加密shellcode。
以下伪代码用于创建外壳代码:
x = False i = 0
buff = genRandom()
opc1 = [0x58,0x59,0x5a,0x5b]
opc2 = [0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57]
opc3 = [0x90,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,
0x49,0x4a,0x4b]
while i < len(buff):
currentChar = buff[i] if currentChar < 0xc8:
buff[i] = opc1[currentChar % len(opc1)]
else:
if x:
buff[i] = opc2[currentChar % len(opc2)]
else:
buff[i] = opc3[currentChar % len(opc3)] x = x == False
i+=1
在该图的下面,您可以看到汇编器结果的列表:
图9.生成的shellcode步骤2-4。 再次使用Shellcode,启动器和Shellcode
{E1E4CBED-5690-4749-819D-24FB660DF55F}.dll
解密并下载
{E1E4CBED-5690-4749-819D-24FB660DF55F}.dll
库。 该库将加载资源并尝试启动DeviceAssociationService服务。 解密的信息还包含一个shellcode。 后者解密最后阶段:后门。
变体
{92BA1818-0119-4F79-874E-E3BF79C355B8}.dll
检查
rastlsc.exe
以
krv
作为第一个参数执行。 如果是这样,将创建一个任务,并再次执行
rastlsc.exe
,但不带此参数。
阶段5。后门
{A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll
首先,恶意软件尝试下载其资源并使用RC4算法对其进行解密。 产生的资源包含用于配置后门的数据。 配置格式并不难找到。 使用Kaitai结构及其结构阻尼器,我们得到以下信息:
图10.配置结构注意 :除了domain_encoding_str行和httpprov库之外,数据在示例之间有所不同。 注册表项几乎相同,但是它们具有类似的方案:
\HKCU\SOFTWARE\Classes\AppX[a-f0-9]{32}
,没什么特别的。
恶意程序会接收用户名(UTF-16)的前10个字节,并使用UTF-16中的三个字母的字符串
mutex_encoding_str
进行编码,并以十六进制对其进行编码。 结果用作互斥锁的名称。 例如,对于一个名称以
abc
开头且密钥为
vwx
,该互斥锁将为
\Sessions\1\BaseNamedObjects\170015001b
。
后门包括一个PE加载器,该加载器将
HTTPProv.dll
库加载到内存中,调用入口点,然后调用
CreateInstance
导出函数。
沟通交流
后门通过端口
25123
使用标准TCP通信协议。 要获取服务器IP地址,后门首先创建一个特定的DNS查询。
恶意程序从配置中选择三个域之一,并添加一个使用两个值生成的特殊子域。 第一个值是长度为16个字节的计算机名称。 第二个是四字节的版本ID。 以下Python 2代码是一种编码算法:
letters=domain_encoding_str # “ghijklmnop” hex_pc_name=pc_name.encode(“UTF-16LE”).encode(“hex”) s=''
for c in hex_pc_name:
if 0x2f < ord(c) < 0x3a:
s+=letters[ord(c) - 0x30]
else:
s+=c
例如,如果计算机名称为
random-pc
,并且版本ID为0x0a841523,则将生成以下域:
niggmhggmeggmkggmfggmdggidggngggmjgg.ijhlokga.dwarduong[.]com
以下正则表达式可用于标记此后门的C&C服务器:
[ghijklmnopabcdef]{4-60}\.[ghijklmnopabcdef]{8}\.[az]+\.[az]+
如果IP地址属于特定域,则恶意软件尝试通过端口
25123
建立TCP连接。 每个样本都有三个用于查找C&C服务器的不同域名。
通信过程通过RC4加密,并使用LZMA压缩。 由于密钥已添加到数据包的开头,因此可以解密流量。 格式如下:
[ RC4 (4 )][ ]
每个密钥字节由
rand
函数生成。 解密和解包数据包后,数据具有以下格式:
[dw:][dw:][dw: ][dw: ][dw:] [dw:]
客户端第一次连接到服务器时,将传输UUID,用作会话标识符。 后者作为二进制数据存储在注册表项中:
HKCU\SOFTWARE\Classes\ AppXc52346ec40fb4061ad96be0e6cb7d16a\DefaultIcon
如前所述,后门还包含一个名为
HTTPprov
的库。 它用作与服务器通信的替代方法。 DLL文件通过HTTP发送POST请求。 它还使用SOCKS5,SOCKS4a和SOCKS4支持HTTPS和代理。 该库与
libcurl
静态链接。
初始化之后,将创建一个注册表项-后门命令,以进一步使用HTTP与命令服务器进行通信:
HKCU\SOFTWARE\Classes\ CLSID{E3517E26-8E93-458D-A6DF-8030BC80528B}
。
使用标准的客户端应用程序:
Mozilla/4.0 ( ; MSIE 8.0; Windows NT 6.0; Trident/4.0)
。
该库的主要特征是针对通用资源标识符的特殊加密算法。 URI的资源部分是使用以下伪代码创建的:
buffEnd = ((DWORD)genRand(4) % 20) + 10 + buff; while (buff < buffEnd){
b=genRand(16);
if (b[0] - 0x50 > 0x50)
t=0;
else
*buf++= UPPER(vowels[b[1] % 5]);
v=consonants[b[1]%21]); if (!t)
v=UPPER(v);
*buff++= v;
if (v!='h' && b[2] - 0x50 < 0x50)
*buff++= 'h';
*buff++= vowels[b[4] % 5];
if (b[5] < 0x60)
*buff++= vowels[b[6] % 5];
*buff++= consonants[b[7] % 21];
if (b[8] < 0x50)
*buff++= vowels[b[9] % 5];
*buff++= '-';
};
*buff='\0';
注意 :为清楚起见,负责检查字符串长度的部分已从代码中删除。
为了从生成的字符串中获取标识符,使用特殊的总和验证算法将两个数字相加:
checksum=crc32(buff)
num2=(checksum >> 16) + (checksum & 0xffff) * 2
num1=(num2 ^ 1) & 0xf
URL=GENERATED_DOMAIN+ “/” + num1 + “/” + num2 + “-” + buff
添加
HTTPprov
库URI生成器,我们得到以下URL:
hXXp://niggmhggmeggmkggmfggmdggidggngggmjgg.ijhlokga.aisicoin[.]com/ 13/139756-Ses-Ufali-L
队伍
收到SESSIONID会话标识符后,后门将制作系统指纹。 该程序包的构造如下(在程序包中缩进-说明):
0x000-字节:每个版本中的值都会更改
0x001-0x01 :硬编码字节
0x002-布尔值:特权提升
0x003 -dword:版本ID
0x007-字符串(UTF-16),计算机名称(最大0x20)
0x027-字符串(UTF-16),用户名
0x079 -
HKLM\SOFTWARE\Microsoft\Windows NT\ CurrentVersion
值中的注册表查询的结果:
ProductName
,
CSDVersion
,
CurrentVersion
,
ReleaseId
,
CurrentBuildNumber
和调用
IsWow64Process (x86|x64)
的结果
IsWow64Process (x86|x64)
0x179-字符串%s(%s)的后续格式; 替换为(
GetVolumeInformationW:VolumeNameBuffer
),
VolumePathNames
0x279-物理磁盘,PhysicalDrive设备的I / O控制IOControl 0x2D1400(IOCTL_STORAGE_QUERY_ PROPERTY)(VolSerialNumber)
0x379 -
SELECT SerialNumber FROM Win32_BaseBoard
0x3f9-获取当前日期和时间GetSystemTimeAsFileTime
0x400-布尔值:未知
0x401 -dword:解密资源后收到
这是系统指纹的示例:
图11.系统指纹这是一个功能齐全的后门,它为操作员提供了许多功能:操纵文件,注册表和进程,下载其他组件,获取系统的数字指纹。 以下是受支持的命令的编号和说明:
0-数字指纹
1-设置会话ID
2-创建过程并获得结果(使用程序通道)
3-设置连接尝试次数
4-推迟轮询时间
5-读取文件或注册表项并考虑MD5
6-创建流程
7-在内存中创建文件,注册表项或流
8-写入注册表
9-轮询注册表
10-在系统中搜索文件
11-将文件传输到另一个目录
12-从磁盘删除文件
13-使用功能获取系统中标记的磁盘的列表
GetLogicalDriveStringW
14-创建目录
15-删除目录
16-从偏移量读取文件
17-调用PE加载程序(切换为通过
HTTPprov
进行通信)
18-[未知]
19-0:轮询注册表中的值; 1:方案实施与实施
20-设置环境变量
21-在新线程中启动shellcode
22-返回环境变量
新版本中的23-如果APPL环境变量不存在,则会自行重启
结论
OceanLotus保持高度活跃,并继续更新工具包。
该组织试图隐瞒其活动,为此,攻击者会仔细选择受害者,限制恶意软件的传播,使用多台服务器,以免引起对同一域或IP地址的注意。 尽管实现了组件的解密以及侧加载技术的广泛普及,但由于在这种情况下攻击者的工作被伪装成合法的应用程序,因此可以避免检测。
危害指标(IoC)
样品
表1:滴管

表2:库

联播网
IP地址
46.183.220.81
46.183.220.82
46.183.222.82
46.183.222.83
46.183.222.84
46.183.223.106
46.183.223.107
74.121.190.130
74.121.190.150
79.143.87.230