Drupal RCE CVE-2018-7600 수정

in #kr5 years ago
  • 악의적인 사용을 금합니다. 법적 책임은 본인에게 있습니다.
  • 무단 도용/복제를 급합니다. 본 글의 저작권은 huti에게 있습니다.

CVE-2018-7600은 원격에서 명령어 실행이 가능한 취약점으로 심각도가 높다. CVE-2018-7600에 취약한 Drupal 버전은 아래와 같다.

l 7.58 이전 버전

l 8.3점대 버전 중 8.3.9 이전 버전

l 8.4점대 버전 중 8.4.6 이전 버전

l 8.5점대 버전 중 8.5.1 이전 버전

8.X대 공격 경로 :

/user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax

8.X대 Payload :

form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]= 시스템 명령 함수&mail[#type]=markup&mail[#markup]=시스템 명령어

-POC TEST

위 그림은 #post_render를 이용해서 PHP의 exec 함수로 id라는 명령어를 실행한 화면이다.
Response로 ip 명령어 실행 데이터가 노출된 것을 확인할 수 있다.

왜 이런 취약점이 발생하는 것일까?
/user/register는 가입하기 경로이다.

가입하기 화면에서 이메일 주소와 아이디를 입력해서 가입 요청을 하면, 그림 4-9와 같은 데이터가 BODY에 실려 웹서버로 전달된다.

이렇듯 mail 계정과 name 데이터가 있어야 요청 패킷이 전송되며, 요청 패킷이 전달될 때 여러 폼 데이터가 한 번에 전달된다. 페이지의 특성상 굳이 ajax forms로 mail 데이터만 업데이트할 필요가 없어 보인다. 그런데 ajax forms를 사용하게 허용하여 취약점이 발생하는 것이다.

취약 경로와 공격 데이터를 나눠서 이해해 보자.

취약성이 있는 경로,

http://10.0.2.15:3333/user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax는 $form[acount][mail][#value] 하위 폼에 ajax 요청을 보낸다는 뜻이다.

POC를 보면, HTTP Request Method는 POST이며, Http Request Packet Body 값으로 아래와 같은 데이터가 온다.

form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=id

form_id는 user_register_form인데, user_register_form은 가입하기 양식 전체의 form_id이다.

_drupal_ajax 값을 1로 설정한 것은 ajax를 사용하겠다는 의미(TRUE)이다.

공격은 #post_render 배열에서부터 시작된다. 브라우저에 어떤 페이지를 load하는 것을 render라고 하는데, #post_render 배열은 브라우저에 특정 부분(wrapper)을 render하는 역할을 한다.

#post_render 배열은 #markup을 인자로 사용하는데, #post_render 배열에 시스템 명령 함수가 오고, #post_render 배열의 인자인 #markup에 시스템 명령어가 오면, 시스템 명령어가 실행되는 것이다.

다음은 시간대를 설정하는 timezone이라는 폼을 대상으로 공격을 시도해 봤다.
이번에는 #lazy_builder를 이용했다.
이 공격은 에러 메시지를 유발하기 때문에 Response에 명령어 결과값이 노출되지 않는다.
그렇기 때문에 touch 명령어를 이용해서 파일을 만드는 테스트를 진행했다.

위 그림에서 touch 명령어가 실행되어 /tmp/2 파일이 생성된 것을 확인할 수 있다.

아래와 같이 7.X 버전 취약점도 확인해 봤다.

이 원격 명령 취약점들은 모두 패치되었다.

하지만, 취약 버전에서는 여전히 RCE가 가능하므로
반드시 취약하지 않은 버전으로 업데이트를 해야 한다.

참고
https://research.checkpoint.com/uncovering-drupalgeddon-2/