애플리케이션 설정이 취약하면 어떤 일이 발생할까요? 애플리케이션 취약점 점검 시, 여러 기준을 두고 취약점이 존재하는지 확인하는데요. 서비스 내 사용하는 파라미터를 조작하거나 비정상 패킷을 날려보면, 서버가 정상 로직이 아닌 비정상적 방식으로 작동하는 걸 볼 수 있습니다. 이에 대한 필터링이 없을 경우 공격자는 다음 공격을 위한 단서를 얻을 수 있고, 서버 가용성에 문제를 일으키는 등의 악의적인 행위를 할 수 있게 되는데요.
이번 글에서는 취약한 설정으로 인해 발생할 수 있는 공격 중 ‘Directory Traversal(디렉터리 접근 공격)’에 대해 알아보겠습니다. Directory Traversal은 기존 웹 서비스에서 보여줘야 하는 범위 이상의 디렉터리 혹은 파일에 접근을 시도하는 것을 의미합니다. 구체적인 공격 사례들과 함께 조치 방법을 살펴보겠습니다.
Case 1. Apache Directory Traversal (CVE-2021-41773 & CVE-2021-42013)
필터링 취약점 사례입니다. 2021년 Apache 2.4.49와 2.4.50 버전에서 상위 디렉터리 경로의 접근을 시도하는 문자열 필터링이 제대로 이뤄지지 않아, 허용된 웹 루트 내 접근이 아닌 시스템 파일에까지 접근할 수 있는 취약점이 발견된 건인데요.
[예시 페이로드]
http://[취약한 버전의 아파치 서버]/cgi-bin/%2e%2e/%2e%2e/%2e%2e/etc/passwd`%2e%2e(..)에 대한 경로가 제대로된 웹 URL 형태로 인식되지 못한다면 결국 시스템 내 /etc/passwd에 접근이 가능해집니다. 해당 취약점은 httpd.conf에서 디렉터리에 대한 접근 권한 설정 부분이 취약한 경우 발생합니다. Require 권한의 모든 엑세스가 열려있는 상황에서 해당 CVE(Common Vulnerabilities and Exposure) 취약점이 발생합니다.
Case 2. Nginx Alias Traversal
디렉터리에 직접 접근해 디렉터리의 존재 유무를 알아내거나, 서비스의 취약한 설정과 취약점을 통해 서비스 시스템 파일에 접근할 수 있습니다. 이를 막기 위해 대부분의 웹 서비스들은 ../와 같이 상위 경로 디렉터리로 이동하려는 행위를 기본적으로 차단합니다. 예를 들어 [그림 2]와 같이 기본 설정의 Nginx 서버는 URL 위 ../ 입력 시 400 에러 메시지가 나옵니다. 이는 ../를 통한 Directory Traversal 공격이 기본적으로 유효하지 않음을 나타냅니다.
Nginx 기반의 웹 서버에서 기본적인 공격 패턴을 시도해 보겠습니다.
도메인주소/URL 경로/../../../../etc/passwd → 400
URL 상위 디렉터리로 이동하는 것은 기본적으로 차단됩니다. 하지만 간혹 개발자의 Nginx 취약한 설정을 통해 웹 서비스 상위 디렉터리에 접근이 가능한 경우도 있습니다. 먼저 Nginx Location 기능은 특정 URL 경로 또는 패턴에 대해 정의하는 구문입니다. 도메인 주소가 (http://lgcns-sample.com)이고 /static으로 접근한다면 alias 지시문을 통해 서버 내 /static 디렉터리로 접근하는 경로는 /var/www/static으로 매핑돼 처리됩니다.
하지만 location에서 설정한 매핑할 디렉터리 주소가 /(슬래시)로 닫히지 않는 경우 /static이라는 디렉터리 문자열만 매핑하게 되어 ../라고 하는 문자열을 상위 경로로 인식하게 됩니다. 예를 들어 lgcns-sample.com/static../log/nginx/access.log 라는 구문을 날리면 /static../log/nginx/access.log → /var/~~static~~/log/nginx/access.log → /var/log/nginx/access.log와 같이 접근이 될 것입니다. 해당 접근이 가능하다는 것은 원래 접근할 수 없는 디렉터리 및 파일에도 접근이 가능하다는 뜻입니다. [그림 4]와 같이 경로를 가정해 보도록 하겠습니다.
location/static 경로에서 /(슬래시)로 닫히지 않기 때문에 ‘/static’ 글자만 매핑 시켜준다면 /home/ 경로로 접근이 가능해집니다. /home/test라는 가정의 홈 디렉터리로 이동할 수 있다면 ssh 키 혹은 bash_history를 다운받을 수도 있습니다.
취약점 공격, 조치 방법은?
조치 방법은 생각보다 간단합니다. Location alias 구문을 사용할 경우, 매핑 시킬 경로를 항상/(슬래시)로 닫아주면 됩니다.
Nignx 측에서는 해당 공격을 취약점으로 인정하지 않고, 사용자의 취약한 설정으로 인해 발생하는 문제라고 언급했습니다.
지금까지 Apache의 CVE-2021-41773와 Nignx의 CVE-2021-42013 Directory Traversal 취약점에 대해 알아보았는데요. 취약점에 대한 지속적인 관심과 적절한 대응이 중요하다는 사실, 잊지 마세요!
글 ㅣ LG CNS RED팀 김종훈 선임