2022年7月24日星期日下午,Github平台上名为“FuckRedTeam”的账号创建了“360tianqingRCE”项目( https://github[.]com/FuckRedTeam/360tianqingRCE ),经研判分析,该项目为恶意投毒项目,攻击者在Python代码中导入了自定义的恶意库,使得代码在运行后加载库中的恶意代码,具体分析请见下文。
项目主文件为“360tianqing-RCE.py”,在该文件头部加载了一个恶意库“fake_useragant”,其中将“agent”写成“agant”来混淆视听:
该恶意库已经上传至Pypi官方,现在(2022年7月25日星期一)已经删除,但国内的Pypi镜像站点仍未响应,恶意库依然保留(仍然存在风险),例如清华的站点( https://pypi[.]tuna[.]tsinghua[.]edu[.]cn/simple/fake-useragant/ ):
该恶意库加载之后,在代码中调用了一个exit函数:
而在该恶意库内的代码中,exit函数则是如下的逻辑,执行一个taskkill命令,并且使用了urllib2.urlparse函数:
这里看似没问题,但实际上该库的文件中存在一个urllib2.py的文件,所以此处使用的也是投毒者自己自定义的库:
在urllib2.py文件中,则巧妙的使用“import ... as ...”语法,将导入的pickle库命名为json,并且在后续的urlparse函数中,使用了“json.loads”来加载恶意代码,实际上执行的代码是“pickle.loads”:
“pickle.loads”是用于反序列化字符串的,通过构建传递的参数值可以使得其执行恶意代码/命令,所以此处我们将这一段Base64的参数值进行解码看一下它的内容:
我们可以清晰的看见解码后有一段Python代码,它的作用就是获取 http://i[.]miaosu[.]bid/data/f_20133572[.]png 地址文件的内容,然后按偏移去读取,接着进行Base64解码。
当我们解码之后发现里面又套了一层Python代码:
并且我们也可以很清晰的看见它的逻辑,先进行Base64解码,再进行AES解密:
解密之后又是一层AES(套娃操作),但是在代码的最后我们可以看见解密出来的就是Shellcode,它调用了Windows API去加载:
至此我们可以看到攻击者手法很娴熟,特别是投毒的前置阶段:恶意代码中的各种混淆及套娃操作。
另外国内Pypi恶意库投毒事件已经不是一次两次了,大家一定要小心谨慎,国内镜像站也应积极同步Pypi官方动作,防止恶意攻击范围扩大。