- 악의적인 사용을 금합니다. 법적 책임은 본인에게 있습니다.
- 무단 도용/복제를 급합니다. 본 글의 저작권은 huti에게 있습니다.
Drupal 6 버전 부터 Form API를 사용해서 Form 데이터를 전송(Render)할 수 있게 되었고, Drupal 7 버전에서 Renderable Arrays라는 Form API가 일반화되었다.
Renderable Arrays는 Drupal의 UI 요소들(pages, blockes, nodes 등)의 구조를 나타내는데 사용하는 확장 API이다.
이 API(Arrays)에는 데이터를 처리하기 위해 필요한 메타(속성) 데이터들이 포함되어 있다.
데이터는 키와 키 값 형식으로 구성되어 있으며, 키는 #으로 시작한다.
예) '#type' => 'markup'
'#markup' => 'some text'
'#prefix' => '
'#suffix' => '
Drupal에서 악용될 수 있는 속성 데이터는 다음과 같다.
#access_callback : 현재 사용자의 요소 접근 가능 여부를 결정한다.
#pre_render : rendering하기 전에 render array를 조합한다.
#lazy_builder : rendering 프로세스가 끝나기 직전에 요소들을 추가한다.
#post_render : rendering 프로세스의 결과를 포장하여 받는다.
이 속성을 이용해서 악의적인 명령어를 실행하기 위해서는 rendering process가 진행되어야 한다.
rendering process가 이뤄지는 경로를 찾아서 공격을 진행해야 하는데,
AJAX API를 이용해서 File Upload를 할 수 있는 곳에서 rendering process가 이뤄진다.
위의 그림에서 form_parents 변수를 보면, element_parents 인자가 /으로 구분되어 배열로 정리된다.
drupal에서 user/register 경로는 계정 정보를 수정하는 경로이다.
이 경로로 접근하면, 이메일 주소를 입력하는 폼이 나온다.
그 폼은 취약한 8.X버전에서 가장 잘 알려진 공격 경로이다.
취약한 8.X버전은 8.3점대, 8.4점대, 8.5점대가 있다.
8.3점대는 8.3.9 이전 버전,
8.4점대는 8.4.6 이전 버전,
8.5점대는 8.5.1 이전 버전이 취약하다.
8.X 버전의 공격 경로는 아래와 같다.
drupal_IP:port/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax
공격자는 이 경로에 #post_render 속성 데이터를 이용해서 공격할 수 있다.
위 그림은 #post_render를 이용해서 PHP의 exec 함수로 id라는 명령어를 실행한 화면이다.
Response로 ip 명령어 실행 데이터가 노출된 것을 확인할 수 있다.
다음은 시간대를 설정하는 timezone이라는 폼을 대상으로 공격을 시도해 봤다.
이번에는 #lazy_builder를 이용했다.
이 공격은 에러 메시지를 유발하기 때문에 Response에 명령어 결과값이 노출되지 않는다.
그렇기 때문에 touch 명령어를 이용해서 파일을 만드는 테스트를 진행했다.
위 그림에서 touch 명령어가 실행되어 /tmp/2 파일이 생성된 것을 확인할 수 있다.
7.X 버전 취약점도 확인해 봤다.
7.X버전은 password를 reset하여 email로 보내는 user/password 경로에서 취약점이 발견되었다.
이번에는 php에서 exec 함수와 비슷한 역할을 하는 passthru 함수를 사용했다.
취약점 테스트는 간단했다.
우선, form_build_id를 알아내서 form_build_id 변수에 값을 넣어주었다.
form_build_id 변수로 uname -a 명령어를 실행하자 시스템 정보가 출력되었다.
이 원격 명령 취약점들은 모두 패치되었다.
하지만, 취약 버전에서는 여전히 RCE가 가능하므로
반드시 취약하지 않은 버전으로 업데이트를 해야 한다.
참고
https://research.checkpoint.com/uncovering-drupalgeddon-2/
https://gist.github.com/g0tmi1k/7476eec3f32278adc07039c3e5473708