웹상에 존재하는 대부분의 웹 사이트는 오픈소스 CMS(Content Management System)를 기반으로 만들어져 있다고 해도 과언이 아니다. 최근에도 역시 CMS 기반의 웹 사이트를 구축하는 기업 혹은 개인 사용자가 증가하는 추세이다. CMS(Content Management System)는 콘텐츠 관리 시스템으로 개발 지식이 없어도 자유롭게 테마나 레이아웃 등을 설정하여 웹 서비스를 할 수 있도록 사용자에게 편리한 기능들을 제공하는 일종의 플랫폼(Platform)이다.
최근 등장하고 있는 많은 CMS 서비스 중 사용자에게 가장 많은 인기를 받는 서비스는 ‘WordPress, Joomla, Drupal’을 예로 꼽을 수 있다. 이 세 가지 서비스의 공통점은 ‘오픈소스 CMS’라는 점과 사용자가 많아 테마나 플러그인의 수가 급증하고 있다는 점이다.
하지만, 대중적으로 사용량이 증가하게 되면서 보안 이슈 역시 증가하고 있다. 취약점 정보를 확인할 수 있는 대표적인 사이트 ‘익스플로잇-디비(http://exploit-db.com)’에서만 찾아봐도 누구나 수많은 공격 코드를 접할 수 있다. 따라서 취약점 패치가 이루어지지 않은 모든 사이트가 누군가의 표적이 될 수도 있다. 웹 서비스를 제공하는 관리자의 입장에서는 플러그인의 확장성을 높여 서비스하는 만큼, 플러그인의 위협에 대해 스스로 보안에 신경을 써야 하는 시점이다.
이번에 소개할 도구는 이러한 CMS 플랫폼에 대한 취약점을 점검하기 위한 도구 ‘CMSmap’이다. ‘CMSmap’은 파이썬(Python)으로 제작된 오픈소스 기반의 CMS 취약점 점검 도구이며, 오픈소스 CMS 서비스인 ’WordPress, Joomla, Drupal’을 사용하는 PHP 언어 기반 웹 서비스를 대상으로 취약점을 점검할 수 있다.
[그림 1] WordPress – Joomla - Drupal
다운로드 URL (https://github.com/Dionach/CMSmap)
본 테스트는 취약점 점검을 위해 칼리리눅스(Kali-Linux) 가상 환경에서 워드프레스(WordPress)를 구축하여 진행하였다. 이 도구의 다운로드는 리눅스 환경에서 ‘Git’ 명령 한 줄로 쉽게 다운로드 받을 수 있다. 다운로드 시 입력한 명령어는 아래 [그림 2]와 같다.
[그림 2] CMSmap 다운로드 명령어
위 명령어로 파일을 내려 받은 뒤 해당 디렉토리(CMSmap)로 이동하여 ‘cmsmap.py’ 파일을 실행해 스캔을 시작할 수 있다. 옵션을 포함하지 않거나 –h(도움말) 옵션을 포함해 ‘cmsmap.py’ 파일을 실행시킬 경우 스캔 시 사용 가능한 전체 옵션을 확인할 수 있으며, 옵션에 대한 자세한 설명은 아래와 같다.
[그림 3] CMSmap 사용 가능한 전체 옵션
메뉴 |
설명 |
-t, --target |
타겟의 URL (Ex. ‘https://example.com/’) |
-f, --force |
스캔 대상 (W)ordpress, (J)oomla, (D)rupal (괄호 안 문자 적용) |
-F, --fullscan |
전체 플러그인을 대상으로 스캔, 매우 느림 |
-a, --agent |
Header 부분의 User-agent를 임의로 설정 |
-T, --threads |
쓰레드를 임의로 설정 (기본설정: 5) |
-i, --input |
텍스트 파일의 입력된 대상을 다중으로 스캔 |
-o, --output |
스캔 결과를 파일로 저장 |
--noedb |
Exploits 검색 없이 플러그인 스캔 |
-u, --usr |
유저명 브루트포스(Brute-Force) |
-p, --psw |
패스워드 브루트포스(Brute-Force) |
--noxmlrpc |
XML-RPC 사용 없이 브루트포스(Brute-Force) |
-k, --crack |
패스워드 해시 파일 스캔(Hashcat이 설치가 되어 있어야 함, WordPress와 Joomla만 해당) |
-w, --wordlist |
스캔에 사용될 Wordlist 파일을 임의로 설정 |
-v, --verbose |
Verbose 모드 설정(기본설정: false, true 변경 시 스캔 과정 확인 가능) |
-U, --update |
업데이트 기능 (C)MSmap, (W)ordpress 플러그인 테마, (J)oomla 컴포넌트, (D)rupal 모듈, (A)ll (괄호 안 문자 적용) |
-h, --help |
도움말 |
[표 1] CMSmap 메뉴 설명
대상에 대한 정보가 부족할 경우 타겟(-t)만 지정하여도 스캔을 시작할 수 있으며, 이 경우 상세한 정보를 입력한 경우보다 스캔의 속도가 느리다. 본 테스트에서는 대상이 워드프레스를 사용한다는 정보를 수집하였다는 가정하에 진행하였으며, 사용한 명령어는 [그림 4]과 같다.
[그림 4] CMSmap 스캔 동작 모습
해당 명령어로 대상 웹 사이트에 스캔한 결과 워드프레스의 버전과 디폴트 설치 파일, 사용 중인 플러그인, 유저명, 설정 파일 등 여러 취약점을 발견할 수 있었으며, 수집된 정보를 통해 이차적인 공격이 가능하다는 사실을 확인할 수 있다.
스캔 결과에서는 위험도에 따라 기호가 나타나며 [H] High, [M] Mid, [L] Low, [I] Info, [-] Message 총 4가지로 분류된다. 이처럼 나타나는 위험도를 확인하여 관리자는 보안이 시급한 취약점이 무엇인지를 한눈에 파악할 수 있다.
‘CMSmap’의 다른 기능으로는 브루트 포스(Brute-Force) 및 웹셸(WebShell) 업로드 기능이 있다. 스캔이 완료된 뒤 스캔 결과에서 얻어낸 계정을 대상으로 패스워드 사전(Wordlist)을 이용한 브루트 포스(Brute-Force) 공격을 시도할 수 있다. 브루트 포스 공격에 성공하게 되면, Valid Credentials(유효한 인증)라는 문구가 나타나며 대상 웹 서비스에서 사용 중인 유저명과 패스워드가 그대로 출력된다.
[그림 5] Brute Force 공격 시도
브루트 포스 공격에 성공한 다음, 웹셸(WebShell)을 업로드할 것인지에 대한 문구가 나타나게 되는데 여기서 y(Yes)를 입력하면 대상 웹 서버에 웹셸이 자동으로 업로드된다. 업로드되는 경로는 플러그인이 설치되는 경로(C:\APM_Setup\htdocs\wp-content\plugins\wp-shell\shell.php)와 같다.
업로드가 완료되면 웹셸을 이용하여 해당 서버 시스템에 직접적으로 명령을 실행할 수 있다. 웹셸을 실행시키는 URL은 [http://대상 웹 주소/wp-content/plugin/wp-shell/shell.php]이다.
[그림 6] 업로드된 웹셸(WebShell)로 명령 실행
웹셸이 플러그인으로 자동 설치될 경우 관리자는 워드프레스 관리자 페이지를 통해 [설치된 플러그인] 메뉴에서 [그림 6]과 같이 확인할 수 있다. 하지만 관리자의 계정을 얻어낸 다음 수동으로 웹셸을 업로드하게 될 경우 이를 쉽게 확인하기 어려우며, 웹셸을 설정 파일 등으로 위장하여 업로드한 경우는 발견하기가 더욱 힘들 것이다.
[그림 7] 설치된 플러그인 메뉴에서 확인되는 CMSmap
CMSmap 뿐만 아니라 오픈소스 CMS를 겨냥한 공격 도구들은 계속해서 늘어나고 있다. 오픈소스 CMS의 플러그인 또는 모듈이 계속해서 업데이트됨에 따라 공격 도구들 역시 업데이트가 되고 있으며, 이를 이용한 공격 사례들 역시 계속해서 증가하고 있다.
오픈소스 CMS 서비스는 특별한 개발 실력이 없어도 웹 사이트를 운영할 수 있다는 점에서 사용자에게 편리함을 가져다 줄 수 있다. 하지만 기초적인 보안도 이루어지지 않은 상태에서 웹 서비스를 운영할 경우 치명적인 피해를 가져올 수 있다. 웹 서비스를 제공하는 관리자의 입장에서는 서비스를 운영하기 이전에 이와 같은 보안 점검 도구를 이용하여 기초적인 보안을 갖춘 뒤에 안전한 서비스를 사용자에게 제공하는 것이 바람직하다.
'보안 도구' 카테고리의 다른 글
Cuckoo Sandbox 설치 및 구축 (2/2) (1) | 2016.10.13 |
---|---|
Cuckoo Sandbox 설치 및 구축 (1/2) (0) | 2016.10.13 |
[정보 수집 도구] FOCA 란?, FOCA 사용법 (0) | 2016.09.19 |
[웹 프록시 툴] BurpSuite 사용하기 (0) | 2016.09.02 |
[웹 디버깅 툴] HttpWatch 사용법 (1) | 2016.09.01 |