
Drupalgeddon2 (CVE-2018-7600) PoC의 CLI 재작성 — 승인된 테스트/교육용
Drupalgeddon2(CVE-2018-7600) 개념 증명(PoC)을 명령줄 도구로 다시 작성한 것입니다. Hack The Box Academy의 Attacking Common Applications 모듈을 공부하면서 학습 목적으로 만들었습니다.
[!WARNING] 공인된 보안 테스트 및 교육 전용입니다. 소유하지 않았거나 명시적인 서면 허가를 받지 않은 시스템에 대해 실행하는 것은 대부분의 국가에서 불법입니다. 법적 고지 및 책임 있는 사용을 참조하세요.
[!NOTE] 이 구현물은 AI 지원으로 작성되었습니다. 저자에 관한 참고를 참조하세요.
Drupal은 HTB Academy의 Attacking Common Applications 모듈에서 다루는 "일반적인 애플리케이션" 중 하나이며, CVE-2018-7600("Drupalgeddon2")은 그 대표적인 비인증 원격 코드 실행(RCE) 사례입니다. 일회성 스크립트를 복사해서 붙여넣고 넘어가는 대신, 이 버그가 동작하게 만드는 Form API 인젝션을 실제로 이해하고 싶었습니다. 그래서 공개 PoC를 학습 목적으로 처음부터 다시 작성했습니다.
널리 참조되는 원본인 Vitalii Rudnykh의 a2u/CVE-2018-7600은 버그를 시연하기에는 훌륭하지만, 실행할 때마다 페이로드를 직접 편집해야 합니다. 랩/CTF 워크플로우(여러 대상을 반복 공격하고, 재사용 가능한 발판을 원하는 상황)에서는 그 방식이 번거롭습니다. 이 버전은 이를 제대로 된 CLI 도구로 바꿔놓았습니다:
cmd= 문을 남기지 않습니다.이 도구는 의도적으로 알려지고 오래전에 패치된(2018년에 공개된) 취약점만 대상으로 합니다. 목표는 기술을 이해하고 깔끔하고 문서화된 참조 구현을 만드는 것이지, 새로운 공격 기술을 개발하는 것이 아닙니다.
이 저장소의 코드는 HTB 모듈을 공부하는 동안 AI 지원(Anthropic의 Claude) 을 받아 작성되었습니다. CLI 사용성, 웹 셸 자동 배포, 대화형 모드, 무작위 셸 이름과 매개변수 등 설계 목표와 요구 사항을 제가 정했고, 결과물을 검토하고 테스트했습니다. 이것을 공개하는 이유는 정직함을 위해서이며, 이 저장소의 가치는 모든 줄을 직접 작성했다는 데 있는 것이 아니라 기술을 이해하고 설계 결정을 내린 데 있기 때문입니다.
--cmd로 해당 셸을 통해 명령을 실행하거나, --shell로 대화형 유사 셸에 진입할 수 있습니다.CVE-2018-7600은 다음에 영향을 줍니다:
이 구현은 Drupal 8 Form API 벡터(user/register AJAX 엔드포인트)를 대상으로 합니다. Drupal 7은 다른 엔드포인트/페이로드를 통해 공격 가능하지만 여기서는 다루지 않습니다.
패치된 릴리스(7.58 / 8.5.1 이상)는 영향을 받지 않습니다.
requestspip install requests
# 일회성 명령
python3 drupalgeddon2.py -u http://target/ -c id
# 대화형 유사 셸
python3 drupalgeddon2.py -u http://target/ --shell
# 셸만 심고 아무것도 실행하지 않음
python3 drupalgeddon2.py -u http://target/ --deploy-only
# Burp를 경유하고 프록시의 자체 서명 인증서 무시
python3 drupalgeddon2.py -u http://target/ -c id --proxy http://127.0.0.1:8080 -k
CVE-2018-7600은 Drupal Form API의 입력 검증 실패에서 발생하는 취약점입니다. Drupal은 폼을 중첩된 *렌더 배열(renderable array)*로 표현하며, #로 시작하는 배열 키는 사용자 데이터가 아닌 특수 렌더 속성으로 처리됩니다. 패치(SA-CORE-2018-002)는 사용자 입력에서 #로 시작하는 키를 제거하는 검증을 추가했습니다.
패치 전에는 인증되지 않은 공격자가 Drupal의 AJAX 핸들러가 처리하는 폼 요소에 렌더 속성을 주입할 수 있었습니다. 다음과 같은 속성을 제출하면:
#post_render — 렌더링 후 Drupal이 호출하는 콜백 목록, 그리고#markup — 해당 콜백에 전달되는 인자사용자 등록 폼의 mail 요소에 대해 렌더 단계에서 Drupal이 공격자가 제어하는 입력으로 임의의 PHP 함수(여기서는 exec)를 호출하게 됩니다. 즉, 인증 없이 원격 코드 실행이 발생합니다.
이 PoC는 그 프리미티브를 사용하여 한 줄 PHP 셸을 로컬에서 base64로 인코딩하고, 서버가 이를 디코딩해 웹 루트에 파일로 기록하게 한 뒤, 일반 GET 요청으로 해당 파일과 상호작용합니다.
방어 측면에서 이 취약점을 다루는 경우:
조치
탐지 아이디어
#post_render, #markup, #type, #lazy_builder 등)를 검사하세요. 정상적인 폼 제출에는 이런 키가 포함되지 않습니다.…/user/register?element_parents=…&_wrapper_format=drupal_ajax로 전송되는 의심스러운 매개변수가 있는 요청을 플래그 처리하세요..php 파일로의 후속 GET을 연관 지어 분석하세요.system($_GET[...]) 셸)을 감시하세요.이 도구는 교육 및 공인된 보안 테스트를 위해 게시되었습니다. 직접 운영하는 랩 환경, HTB/CTF 대상, 또는 명시적인 서면 허가를 받은 시스템만 대상으로 해야 합니다. 컴퓨터 시스템에 대한 무단 접근은 영국 Computer Misuse Act 1990, 미국 Computer Fraud and Abuse Act, 그 외 국가의 유사 법률에 따라 범죄입니다. 사용 방법에 대한 책임은 전적으로 사용자에게 있습니다. 저자는 오용 또는 발생한 손해에 대해 책임을 지지 않습니다.
MIT
| 플래그 | 설명 |
|---|
-u, --url | (필수) 대상 기본 URL(예: http://target/) |
-c, --cmd | 대상에서 실행할 단일 명령 |
--shell | 대화형 유사 셸 진입 |
--deploy-only | 웹 셸만 심고 아무것도 실행하지 않음 |
--shell-name | 배포할 셸 파일 이름(기본값: 무작위 .php) |
--param | 셸의 GET 매개변수 이름(기본값: 무작위 md5) |
--proxy | 프록시 URL(예: http://127.0.0.1:8080) |
-k, --insecure | TLS 검증 비활성화(자체 서명 프록시 인증서용) |
--timeout | 요청당 시간 초과(초 단위, 기본값: 15) |