OceanLotus:新后门,旧方案

OceanLotus小组(又名APT32和APT-C-00)以其在东亚的袭击而闻名。 去年,发表了有关该小组工作的许多研究报告,包括Cyber​​Reason文件, 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的三个功能: VirtualAllocRtlMoveMemoryRtlZeroMemory

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: 82e579bd49d69845133c9aa8585f8bd26736437brastlsc.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.exekrv作为第一个参数执行。 如果是这样,将创建一个任务,并再次执行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值中的注册表查询的结果: ProductNameCSDVersionCurrentVersionReleaseIdCurrentBuildNumber和调用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

Source: https://habr.com/ru/post/zh-CN421779/


All Articles