Post

PHP Xdebug RCE 취약점

PHP Xdebug



xdebug란 php extension으로 php debugging tool로 보면 된다.

공식 document 주소
xdebug.org/docs/


Debugging Step
xdebug.org/docs/step_debug#manual-init

디버깅 과정은 아래와 같다.

  1. 서버로 GET이나 POST로 XDEBUG_SESSION_START=session_name를 파라미터로 보낸다.

  2. 서버로 요청을 보내면 Cookie: XDEBUG_SESSION=start 쿠키가 생성이 되는데, XDEBUG 3.1 버전 이전에는 time-out이 1시간, 이후에는 time-out이 없다.

  3. 서버와 디버깅 연결을 시작할 때, 서버에서 xdebug.remote_hostxdebug.remote_port을 확인하여 연결을 시도한다.

  4. 연결이 되면 client에 instruction을 보낸다.


기본 remote_port는 XDEBUG 2.x 버전에서는 9000, 3.x 버전에서는 9001이다.

더 자세한 내용은 paper.seebug.org/397/






중요 명령어



  • source
    • source -i transaction_id -f fileURI
      • ex) source -i 1 -f file:///etc/passwd
      • php://filter도 사용 가능하다.
    • transaction_id는 1로 고정
    • open_basedir이 적용되어 있다.


  • eval
    • eval -i transaction_id -- {DATA}
    • {DATA}는 base64로 인코딩된 php 코드를 입력한다.
      • ex) eval -i 1 -- c3lzdGVtKCJpZCIpOw==


  • property_set
    • property_set -n property_long_name -d {NUM} -i transaction_id -l data_length -- {DATA}
      • -n : property long name (required)






Vuln



취약점은 xdebug .ini에서 아래와 같은 설정일 때 발생한다.

1
2
xdebug.remote_connect_back = 1 # 
xdebug.remote_enable = 1 # 원격 디버깅 허용


xdebug.remote_connect_back = 1이 설정이 되면 xdebug.remote_host의 값이 127.0.0.1이 었으나 이 값이 무시가 되고, 원격 클라이언트와 연결을 시도한다.

원격 클라이언트는 $_SERVER['HTTP_X_FORWARDED_FOR']$_SERVER['REMOTE_ADDR']의 값을 통해 확인한다.


공격자는 포트 9000번을 열어둔 채 요청을 지속적으로 보내고 대기를 하다보면 연결이 되면서 dbgp 명령어를 통해 공격을 진행할 수 있을 것이다.

포트포워딩도 했는데 난 왜 안되는지는 모르겠다..






참고자료



Link
paper.seebug.org/397/
ironhackers.es/writeups/writeup-olympus-hackthebox/
github.com/vulhub/vulhub/blob/master/php/xdebug-rce/exp.py – > RCE Code
acunetix.com/vulnerabilities/web/xdebug-remote-code-execution-via-xdebug-remote_connect_back/






This post is licensed under CC BY 4.0 by the author.