PHP Xdebug RCE 취약점
PHP Xdebug
xdebug란 php extension으로 php debugging tool로 보면 된다.
- 공식 document 주소
- xdebug.org/docs/
- Debugging Step
- xdebug.org/docs/step_debug#manual-init
디버깅 과정은 아래와 같다.
서버로 GET이나 POST로
XDEBUG_SESSION_START=session_name
를 파라미터로 보낸다.서버로 요청을 보내면
Cookie: XDEBUG_SESSION=start
쿠키가 생성이 되는데, XDEBUG 3.1 버전 이전에는 time-out이 1시간, 이후에는 time-out이 없다.서버와 디버깅 연결을 시작할 때, 서버에서
xdebug.remote_host
와xdebug.remote_port
을 확인하여 연결을 시도한다.연결이 되면 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/
- ironhackers.es/writeups/writeup-olympus-hackthebox/