CVE-2023-25690 — CVE-2023-25690 Apache mod_proxy의 HTTP 요청 스머글링에 대한 PoC 익스플로잇입니다. Docker를 이용한 실습 환경, BurpSuite 워크스루, 프록시 접근 제어 우회를 통해 내부 관리자 엔드포인트에 접근하는 방법을 포함합니다. | Kitploit
Apache HTTP Server 2.4.0부터 2.4.55까지의 일부 mod_proxy 구성에서 HTTP Request Smuggling 공격(하나 이상의 사용자로부터 수신된 HTTP 요청 시퀀스를 웹 사이트가 처리하는 과정에 간섭하는 공격 기술)을 허용합니다.
이러한 구성은 mod_proxy가 특정 형태의 RewriteRule 또는 ProxyPassMatch와 함께 활성화된 경우 영향을 받으며, 원격 공격자가 이 취약점을 악용하여 프록시 서버의 접근 제어 조치를 우회하고, 결과적으로 원치 않는 URL을 원본 서버에 위임할 수 있습니다.
이 취약점은 공격자가 프록시에 의해 숨겨진 내부 애플리케이션을 대상으로 접근할 수 있게 하여, 무단 액세스, 데이터 유출 또는 시스템 내 추가 악용으로 이어질 가능성이 있습니다.
CVE-2023-25690 실험
공격자 머신으로 Windows 사용
백엔드 서버 및 프록시 서버는 Kali Linux 머신에서 Docker를 통해 배포됨
실습 파일 구조:
실험 모델
Windows 10 IP 주소: 192.168.1.177
Kali Linux IP 주소: 192.168.27.139
백엔드 서버 IP 주소: 172.18.0.2
프록시 서버 IP 주소: 172.18.0.3
Windows 10이 Kali 머신 port 80에 호스팅된 Apache HTTP Server에 접근하면 트래픽이 Proxy-Server의 port 80으로 전달되고, port 8080을 통해 Backend-Server로 전달됩니다.
시스템 요구 사항
공격자 머신:
운영 체제 Windows 10
도구 설치: Pycharm, BurpSuite, VScode
FireFox 브라우저 사용 및 프록시 설정을 위한 FoxyProxy 확장 프로그램 설치
피해자 머신:
도구 및 서비스 설치: Docker, Tcpdump
Docker File 구성 (부록 참조)
공격 목표: HTTP Request Smuggling 취약점을 이용하여 프록시 서버의 제한을 우회하고 admin.php 페이지의 숨겨진 함수에 접근
실험 배포:
BurpSuite Community를 프록시로 설정하여 요청을 가로채고 수정
브라우저에서 FoxyProxy 확장 프로그램을 다운로드하고 프록시 정보 추가:
FoxyProxy를 도구 모음(브라우저 확장 프로그램 섹션)에서 Turn Off에서 BurpSuite Commu로 전환:
BurpSuite에서 intercept를 on으로 설정하여 패킷 가로채기 실행:
Kali 머신에서 cd 명령어로 docker-composer.yml 파일이 있는 lab 디렉토리로 이동하고, docker composer 실행: docker-composer up --build
CRLF 주입 확인:
먼저, 다음과 같이 제어 문자(CRLF)를 포함한 요청을 시스템에 전송: HTTP/1.1\r\nFoo:
baarr\r\r\n\n 그리고 URL 인코딩: %20HTTP/1.1%0d%0aFoo:%20baarr
=> CRLF 문자(%0d%0a)를 삽입했을 때 서버가 오류나 제한 없이 요청을 처리하므로, CRLF 문자를 완전히 삽입할 수 있음을 알 수 있습니다.
HTTP Request Smuggling 확인:
다음으로, 다음과 같은 URI가 있습니다:
/categories/1 HTTP/1.1\r\nHost: Localhost\r\n\r\nGET /SMUGGLED, URL 인코딩 결과: /categories/1%20HTTP/1.1%0d%0aHost:%20localhost%0d%0a%0d%0aGET%20/SMUGGLED/
RewriteRule 적용 후, URL이 구문 분석되어 프록시를 통과한 요청이 다음과 같은 형식으로 변환됨을 확인 가능:
하나의 요청을 보냈지만 서버가 GET /categories와 GET /SMUGGLED라는 두 개의 응답을 수신하여 반환하는 것을 알 수 있습니다.
HTTP Request Smuggling 악용:
httpd.conf 파일에서 Proxy-Server가 /admin/ 페이지 접근을 차단하도록 구성했다고 가정:
HTTP Request Smuggling을 이용하여 apache-proxy의 검사 메커니즘을 우회할 수 있습니다. 요청:
로그 확인 결과, apache-proxy를 성공적으로 우회하여 /admin에 요청을 보냈고, 백엔드도 GET /admin에 대해 상태 코드 200을 반환했습니다.
admin.php 파일에 임의의 도메인에 쿼리하는 nslookup 시스템 명령어를 실행하는 함수가 있다고 가정합니다. 목표는 프록시 메커니즘을 우회하고 이 숨겨진 함수에 접근하여 DNS 쿼리를 보내는 것입니다. 여기서는 우리의 Kali 머신 자체에 쿼리합니다.
악용 코드 (CVE-2023-25690.py 파일)와 pre.txt 파일 (프록시 서버를 우회하여 시스템에 요청을 보내기 위해 원하는 smuggled 요청 포함, 여기서는 /admin.php)이 있습니다. 이 코드는 pre.txt 파일에 포함된 요청으로 smuggling 요청을 생성하여 서버로 전송합니다. 동시에 요청 및 응답 결과를 각각 req.txt와 res.txt 파일에 기록합니다.
동시에 Kali 머신에서 TCPDUMP를 사용하여 port 53의 DNS 패킷을 캡처합니다.
우리가 보낸 요청이 프록시를 성공적으로 통과했음을 알 수 있습니다. 프록시는 이를 유효한 요청으로 간주합니다. 그러나 백엔드 서버에서는 제어 문자를 구문 분석하여 하나의 요청을 세 개의 요청으로 분할합니다: 첫 번째는 GET /categories.php?id=1, 두 번째는 GET /admin.php?secret=192.168.1.194, 마지막은 GET /abc입니다.
따라서 프록시가 요청을 허용하지 않는 /admin.php에 성공적으로 요청을 보냈습니다.
=> TCPDUMP 확인 결과, 전송된 DNS 패킷이 캡처되었습니다. -> /admin.php의 숨겨진 함수가 성공적으로 실행되었습니다.
부록
Backend 폴더 내 DockerFile 구성
이 구성 파일은 백엔드 서버가 PHP 7.4-apache 이미지를 사용하도록 지정합니다. 이 이미지는 PHP 7.4와 Apache 웹 서버를 포함합니다.
두 번째 명령은 src/ 디렉토리의 모든 내용을 /var/www/html 디렉토리로 복사합니다. 이 디렉토리는 Apache가 웹 콘텐츠를 구축하는 기본 디렉토리(웹 루트)입니다.
세 번째 명령은 sed를 사용하여 모든 80을 8080으로 대체합니다. 이를 통해 백엔드 서버의 Apache 기본 포트를 80에서 8080으로 변경할 수 있습니다.
마지막 명령은 컨테이너가 실행될 때 실행되며, apache 명령어를 사용하여 Apache 웹 서버를 시작합니다.
Frontend 폴더 내 DockerFile 구성
이 파일은 Frontend 폴더의 httpd.conf 파일을 /tmp/httd.conf에 복사하고, 마지막으로 해당 httpd.conf 파일의 내용을 /usr/local/apache2/conf/httpd.conf 파일에 넣습니다.
httpd.conf 파일은 Apache HTTP 서버의 주요 구성 파일로, 서버 구성 설정 또는 작업을 정의합니다. 여기서는 Proxy-Server를 뜻합니다.
httpd.conf 파일은 일반적으로 /usr/local/apache2/conf/httpd.conf 경로에 설치되므로, 해당 경로에 내용을 넣어야 합니다. Frontend 폴더에 httpd.conf 파일을 생성하여 Apache를 더 유연하게 구성할 수 있습니다(위 경로까지 cd로 이동하여 httpd.conf 파일을 다시 작성할 필요 없음).
docker-compose.yml 파일 구성:
여기서 애플리케이션 실행에 필요한 서비스, 네트워크 등을 정의합니다.
여기서는 두 가지 주요 서비스인 apache-proxy와 backend-server를 선언합니다:
Apache-Proxy: ./frontend/DockerFile을 기반으로 구축되며, 네트워크는 backend-network(bridge)입니다. 또한 depends_on: backend-server를 구성하여 Apache-Proxy가 Backend-Server가 시작된 후에만 실행되도록 지정합니다. 마지막으로 ports: "80:80"을 지정하여 포트 포워딩을 설정합니다. 호스트 머신의 port 80으로 들어오는 트래픽은 컨테이너의 port 80으로 전달됩니다.
Backend-Server: ./backend/DockerFile을 기반으로 구축되며, 네트워크는 backend-network로 Proxy와 함께 사용되어 통신이 가능하도록 합니다. expose 구성으로 port 8080을 열어 Apache-Proxy가 이 포트를 통해 Backend-Server로 트래픽을 전달할 수 있게 합니다. 마지막으로 사용자가 새로운 권한을 생성하지 못하도록(파일 추가/수정/삭제, 프로세스 또는 네트워크에 대한 권한 추가 등) 하고, 프로그램이 수행하는 시스템 호출을 필터링하는 등의 보안 기능이 포함됩니다.
httpd.conf 파일 구성
먼저 로그 저장 구성을 두 경로(/use/local/apache2/logs/error.log 및 /use/local/apache2/logs/access.log)에 설정합니다.
다음으로 Rewrite Rule(재작성 규칙)을 적용하는 데 필요한 모듈을 로드합니다.
그 다음 DocumentRoot를 지정합니다. 이 파일은 Apache 구성 파일에서 서버 데이터 파일이 위치한 곳을 결정하는 매개변수를 지정합니다.
다음으로 /categories/ 및 /admin/ 경로에 대한 재작성 규칙을 적용합니다.
마지막으로 /admin/에 대한 요청 전송을 차단합니다. -> 프록시를 우회하고 이 페이지에 접근하는 실습을 수행하기 위한 목적입니다.