[Incident Case] APACHE 웹 서버의 autoindex 모듈을 이용한 백도어 사례
아파치(Apache)는 전세계에서 가장 많이 쓰이는 HTTP 서버 중 한가지다. 아파치를 기본 설치하고 해당 시스템의 URL/icons에 접근을 하면 해당 디렉터리에 존재하는 파일 들의 목록을 볼 수 있다. 이것은 아파치에서 기본적으로 실행되는 mod_autoindex 라는 모듈에 의해서 자동으로 생성된 페이지이다.
기본적으로 mod_autoindex 모듈은 유닉스의 ls 명령어나 win32의 dir 쉘 명령어와 유사한 디렉터리 목록을 자동으로 만들어서 웹 페이지로 보여주는 일을 한다. /icons 페이지는 삭제해도 무방하지만, 많은 웹 사이트에서 이 /icons 와 같은 기본 페이지를 제거하지 않고 사용하는 경우를 볼 수 있다. 아파치 웹 서버를 운영 중이라면, “http://hostname.com/icons”를 입력하여 해당 디렉터리의 활성화 여부를 확인할 수 있다.
[그림 1] mod_autoindex 모듈에 의해 자동 생성된 /icons 페이지
1) /icons 디렉터리 백도어
기본 설치된 /icons 디렉터리는 삭제하지 않고 그대로 사용하는 경우, 침해사고가 발생했을 때 공격자가 향후에 쉽게 접근하기 위한 백도어로 악용될 수 있다. 그림 2는 /icons 디렉터리에서 시스템 내부 w 명령어를(어떤 사용자가 로그인 해 있고, 어떤 일을 하는지 여부를 확인할 수 있는 명령어) 실행하여 해당 시스템에 접속 중인 사용자 계정을 확인하는 화면이다.
[그림 2] /icons 디렉터리를 이용한 백도어 화면
이 화면에서 볼 수 있듯이 웹 브라우저에서 “/icons/?xkey=w” 라는 URL을 입력하면 웹 페이지에 명령어 결과가 그대로 실행되는 것을 볼 수 있다. 위 그림에서 xkey라는 파라메터는 기본적으로 존재하지 않는 파라메터이며, 파라메터 값인 “w”는 유닉스(UNIX) 명령어 역할을 하게 된다.
따라서, 이러한 경우, 일반적인 웹 쉘들과 달리 파일명이나 웹쉘 고유의 특성을 나타내는 각종 Method 등이 존재하지 않으므로, 웹 취약점 스캐너와 웹쉘 스캐너와 같은 도구를 이용해서 취약점을 점검해도 본 백도어 형태는 결코 탐지되지 않는다.
2) 분석
/icons 백도어는 mod_autoindex 모듈의 몇 가지 기능을 악용하여 만들어진다. 이 모듈에서 제공하는 옵션 중에는 HeaderName 이라는 지시어가 있다. 이 지시어에 특정 파일명을 설정하게 되면 파일목록을 생성할 때 해당 파일의 내용이 웹 페이지에 같이 보여지는 것이 가능하다.
예를 들어, 침해사고가 발생하지 않은 정상적인 시스템에서는 그림 3과 같이 /icons 절대 경로에 HEADER.html 파일을 생성하고 Hello, World! 라는 내용을 넣은 후에 아파치 설정 파일을 다시 읽어 들이면 [그림 4]와 같이 웹 브라우저 페이지의 상단에 HEADER.html 파일의 내용이 그대로 출력되는 것을 볼 수 있다.
아파치를 설치하고 기본 설정을 변경한 적이 없다면 별도의 설정 없이 이러한 기능은 정상적으로 작동할 것이다.
[그림 3] HEADER.html 파일을 생성하고 아파치 서비스를 재시작하는 화면
[그림 4] HEADER.html 파일의 내용이 웹 페이지에 함께 출력되는 화면
그러나, mod_autoindex 모듈의 HeaderName 지시어는 html 파일 뿐만 아니라 CGI 파일의 실행역시 가능하기 때문에, 사용자로부터 입력된 인자를 처리하여 동적인 웹 페이지를 출력하는 행위도 가능하다. 따라서, 이 글에서 살펴보고 있는 /icons 백도어는 바로 이러한 원리를 이용한 동작 특성을 가지게 된다.
침해사고가 발생한 시스템의 아파치 설정 내용을 꼼꼼히 살펴보면 HeaderName 지시어에 정의된 파일명이 HEADER.html 파일 대신 확장자가 .cgi 인 파일로 등록된 것을 볼 수 있다.
[그림 5] 백도어를 만들기 위해 만들어진 아파치 설정
설정 파일을 보면 DIFFICULTNAME.cgi 라는 파일이 HeaderName에 의해 실행되는 것을 살펴볼 수 있다. 즉, 웹 브라우저에서 /icons 페이지가 열릴 때마다 Apache 에서 내부적으로 백도어 프로그램인 DIFFICULTNAME.cgi를 실행하고 그 결과를 페이지 상단에 출력을 하는 것이다.
설정 파일을 토대로 DIFFICULTNAME.cgi를 찾아 분석해보면, 그림 6과 같이 Perl 로 만들어진 것을 볼 수 있다.
[그림 6] DIFFICULTNAME.cgi의 소스 코드
소스코드 내용을 살펴보면 xkey 인자 값이 없는 경우, mod_autoindex가 자동으로 생성하는 것과 동일한 내용을 출력하고 xkey 인자 값이 존재하는 경우에는 시스템 쉘로 해당 명령어를 실행한 후, 그 결과값을 그대로 출력하는 내용이다. 즉, 백도어를 만든 이가 xkey를 자신만이 아는 고유한 문자열로 설정했다면, 그 고유한 문자열이 사용될 때만 백도어가 시스템 내부 명령어 실행 결과를 출력하는 것이다. 따라서, 이러한 백도어는 숨김 기능(Hidden Logic)을 통한 악의적 시스템 원격 명령어 실행과 같은 악의적 행위의 수행이 가능하게 된다.
[그림 7] 백도어에 의해 시스템 명령어 /bin/id 가 실행된 화면
이상으로 Apache의 mod_autoindex 모듈을 이용한 백도어에 대해서 알아보았다.
이 글에서 사용된 백도어는 Perl을 이용해 만들어졌으므로 소스코드를 바로 보는 것이 가능했다. 그러나 C와 같이 컴파일된 바이너리 파일이 이용된 경우에는 백도어의 기능을 모두 확인하는 것은 매우 어려울 수도 있다.
그러나 백도어의 기능 여부와 상관없이 아파치 설정에서 mod_autoindex 모듈을 제거하는 것만으로도 백도어가 실행되는 것을 미연에 방지하는 것이 가능하다. 따라서 쉽게 지나칠 수 있는 아파치 기본 설정에서 불 필요한 기능을 모두 제거하여 보안을 강화할 것을 적극 권고한다.
팁! CGI 로 만들어진 파일은 실행 권한이 필수적이므로 불필요하게 실행 권한이 부여된 파일을 탐색하면 백도어로 의심되는 파일을 쉽게 탐지해낼 수 있다.
[그림 8] find 명령어를 이용하여 CGI 백도어를 탐지하는 화면
[참고자료]
http://httpd.apache.org/ – Apache 홈페이지.
- 안철수연구소안철수연구소 CERT팀 주임연구원 권혁진, 연구원 서혁남