분산서비스거부(DDOS) 공격의 원리와 대응방법1편 : DDOS 공격의 실제와 유형
작성자 정보
- 관리자 작성
- 작성일
컨텐츠 정보
- 2,270 조회
- 0 추천
- 목록
본문
분산서비스거부(ddos) 공격의 원리와 대응방법1편 : ddos 공격의 실제와 유형
최근 들어 공격 양상이 시스템 기반의 dos공격에서 네트워크 기반의 ddos 공격으로 바뀌고 있는데, ddos 공격이라 하면 2000년대 초반의 yahoo나 ebay, microsoft등에 대한 공격 등이 생각날 것이다.
그러나 최근 벌어지고 있는 ddos 공격은 이전과는 그 양상이 달라지고 있다.
일단은 대형 사이트보다는 중소규모 사이트가 일차적인 공격 대상이 되고 있으며 목적도 이전의 영웅 심리나 자기 과시용이 아니라 “x월 x일까지 0000원을 입금하지 않으면 공격하겠다.”는 형태의 협박성 공격이 주가 되고 있다는 것이다.
또한 바이러스나 해킹 등을 통해 확보한 zombie들을 서로의 목적에 따라 사고파는 경우도 자주 발생하고 있다.
이는 최근에 진행된 소위 “해킹 상업화”의 한 단면이며 앞으로 이러한 움직임은 더더욱 가속화될 것으로 보인다. 또한 새롭게 보이는 대표적인 양상은 이전과 같이 바이러스 또는 해킹으로 제어권을 확보한 zombie를 관리하기 위해, 별도의 master/agent 프로그램을 이용하지 않고 IRC(Internet Relay Chat)나 웹을 적극적으로 이용하고 있다는 점이다.
즉, 바이러스에 감염된 PC들은 자동으로 미리 지정된 irc에 접속하여 명령을 대기하는 상태로 들어가고, 공격자는 해당 irc에 로그인하여 특정 명령을 실행하면 해당 zombie들에게 스팸발송이나 과다접속 또는 대량의 트래픽을 유발하는 형태의 공격등 공격자가 의도한 행위를 하게 되는 것이다.
공격자는 대부분 상대적으로 해킹 등에 미온적인 중국 등을 이용하기 때문에 역추적이 쉽지 않고, 공격에 사용되는 zombie 역시 서버도 있지만 대부분 보안에 취약한 Windows 기반의 가정용 PC이며 더구나 DHCP를 이용하기 때문에 IP를 알아도 역추적하거나 처리하기가 쉽지 않은 것이 현실이다.
[그림] IRC를 이용한 공격의 형태
그렇다면 ddos 공격의 실체와 실제 어떤 방식으로 진행되는지 살펴보자.
아래 그림은 실제로 공격자가 특정한 관리 프로그램을 이용하여 자신이 확보한 bot을 선택하는 장면을 보여주고 있는데, 공격자는 공격에 사용할 zombie등을 선택한 후 어떤 사이트를 공격할 것인지 공격 대상과 syn flooding이나 udp flooding등 공격방식을 선택하여 공격을 하게 된다.
[그림] 공격에 사용할 zombie를 [그림] 공격방식과 대상을 선택하는 화면 선택하는 화면
이와 같이 간단히 마우스 몇 번으로 ddos 공격을 시작하게 된다.
그럼 이제 공격을 당하는 입장에서 네트워크 트래픽을 살펴보도록 하자.
➀ icmp flooding 공격예
먼저 아래 그림은 17시경에 약 400Mbps의 inbound 공격이 유입된 것을 알 수 있다.
[그림] 17시경 발생한 ddos 공격
해당 시각 대에 flowscan에서 검색해 보면 아래와 같은 flow를 확인할 수 있다.
18:05:39 61.153.254.137 -> 192.168.1.195 ICMP_ECHOREPLY 58 87000 18:05:39 61.187.180.184 -> 192.168.1.195 ICMP_ECHOREPLY 92 138000 18:05:39 210.6.122.174 -> 192.168.1.195 ICMP_ECHOREPLY 54 81000 18:05:39 218.76.83.191 -> 192.168.1.195 ICMP_ECHOREPLY 368 552000 18:05:39 59.49.16.104 -> 192.168.1.195 ICMP_ECHOREPLY 11 16412 18:05:39 210.6.83.118 -> 192.168.1.195 ICMP_ECHOREPLY 34 51000 18:05:43 58.50.27.61 -> 192.168.1.195 ICMP_ECHOREPLY 167 250500 18:05:43 61.153.254.137 -> 192.168.1.195 ICMP_ECHOREPLY 58 87000 18:05:43 61.187.180.184 -> 192.168.1.195 ICMP_ECHOREPLY 150 225000 18:05:43 210.6.122.174 -> 192.168.1.195 ICMP_ECHOREPLY 49 73500 |
ICMP이므로 포트 정보는 보이지 않으며 임의의 IP에서 많은 ICMP_ECHOREPLY 패킷을 전송하는 것을 알 수 있다.
우측에 보이는 “58 87000” 은 각각 “패킷의 개수 바이트 수” 이므로 87000/58=1500 즉 한 패킷 당 1500byte짜리 패킷인 것을 알 수 있으며 나머지도 계산해 보면 모두 동일하게 1500byte인 것을 알 수 있다.
ddos공격의 특징은 이처럼 동일한 패킷 사이즈로 공격을 한다는 특징이 있다.
➁ udp flooding 공격 예
다음은 icmp가 아닌 udp flooding 공격 예를 살펴보도록 하자.
아래 그림은 23시경에 약 1000Mbps의 inbound 공격이 유입된 것을 알 수 있다.
해당 시각 대에 flowscan을 검색하면 아래와 같이 보이게 되는데, 여기에서 17은 udp를 뜻하고 9824/8=1228 즉, 한 패킷 당 1228byte짜리 udp flooding 공격이 유발되었음을 알 수 있다.
이러한 경우 1G 가까이 트래픽이 유입되었기 때문에 같은 네트워크를 공유하여 사용 중인 경우 모든 서버에 접속이 되지 않는 네트워크 장애가 발생하게 된다.
07/12 23:29:49 218.25.44.30.3272 -> 192.168.1.182.80 17 8 9824 07/12 23:29:49 58.145.2.106.1155 -> 192.168.1.182.80 17 11 13508 07/12 23:29:50 221.203.145.17.1504 -> 192.168.1.182.80 17 2 2456 07/12 23:29:49 210.16.255.198.1047 -> 192.168.1.182.80 17 1 1228 07/12 23:29:49 125.77.79.15.1136 -> 192.168.1.182.80 17 1 1228 07/12 23:29:49 218.25.18.71.1253 -> 192.168.1.182.80 17 1 1228 07/12 23:29:49 220.179.169.127.1164 -> 192.168.1.182.80 17 1 1228 |
➂ tcp syn flooding 공격 예
다음은 약 280kpps 즉, 초당 28만개의 패킷을 유발하는 tcp syn flooding 공격의 예를 보여주고 있는데, 아래 그래프는 공격 당시의 pps를 보여주고 있다.
참고로 이 공격은 대량의 pps를 유발하지만 패킷 사이즈가 워낙 작어 bps는 얼마 되지 않는다.
[그림] tcp syn flooding 공격시의 pps 그래프
아래 그래프는 대량의 pps 유발로 인하여 해당 시각 대에 백본 장비의 CPU가 2배 이상 상승한 것을 알 수 있다.
[그림] ddos 공격시 장비의 CPU 그래프
이때의 flowscan에는 아래와 같이 보이게 되는데, 모두 한 패킷 당 48byte짜리 SYN 패킷을 전송하고 있음을 알 수 있다.
22:14:56 206.123.110.239.1073 -> 192.168.1.51.80 6(SYN) 1 48 22:14:56 206.214.101.94.1061 -> 192.168.1.51.80 6(SYN) 1 48 22:14:56 208.40.46.90.1118 -> 192.168.1.51.80 6(SYN) 1 48 22:14:56 198.146.220.240.1096 -> 192.168.1.51.80 6(SYN) 1 48 22:14:56 208.45.105.57.1229 -> 192.168.1.51.80 6(SYN) 1 48 22:14:56 208.104.56.236.1063 -> 192.168.1.51.80 6(SYN) 1 48 22:14:56 193.106.34.21.1198 -> 192.168.1.51.80 6(SYN) 1 48 22:14:56 205.141.6.79.1029 -> 192.168.1.51.80 6(SYN) 1 48 22:14:56 4.184.141.228.1209 -> 192.168.1.51.80 6(SYN) 1 48 22:14:56 129.115.78.137.1079 -> 192.168.1.51.80 6(SYN) 1 48 |
ddos 공격을 받을 때는 아래와 같은 flowdumper 명령어를 이용하면 좀 더 쉽게 찾을 수 있다.
대량 BPS 유발 : UDP(거의 대부분) 또는 ICMP 트래픽일 가능성이 있음 # flowdumper -se '17 == $protocol' flow_filename (UDP) # flowdumper -se '1 == $protocol' flow_filename (ICMP)
대량 PPS 유발 : TCP 트래픽일 가능성이 높음 # flowdumper -se '6 == $protocol' flow_filename (TCP)
그리고 스위치의 각 포트별로 bps와 pps를 모니터링하면 ddos 공격의 대상을 즉각적으로 알 수 있다.
|
➃ httpd conneciton flooding 공격
다음으로는 오래된 공격방식이지만 여전히 사용되고 있는 httpd conneciton flooding 공격으로 3 way handshake를 맺은 후 특정한 도메인으로 과도한 접속을 시도하여 MaxClient에 도달하도록 하는 저수준의 공격이다.
즉, 아래와 같은 동일한 접속을 지속적으로 시도하는 것이다.
T 210.123.48.204:16651 -> 192.168.68.64:80 [AP] GET /main.php HTTP/1.1..Accept: */*..Accept-Language: zh-cn.. Accept-Encoding: gzip, deflate..User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; ).. Host: www.example.com.. |
아래와 같이 확인해 보면 서버에서 지정한 MaxClient에 도달한 것으로 보여주고 있다.
# ps aux | grep http|wc –l
1024
이때 ngrep으로 확인해 보면 아래와 같다.
#ngrep -qip port 80 | grep GET
GET /intro.htm HTTP/1.1..Host: www.example.com....
GET /intro.htm HTTP/1.1..Host: www.example.com....
GET /intro.htm HTTP/1.1..Host: www.example.com....
GET /intro.htm HTTP/1.1..Host: www.example.com....
GET /intro.htm HTTP/1.1..Host: www.example.com....
이러한 형태의 공격은 3 way handshake를 맺어야 하므로 소스IP는 위조되지 않으며 공격의 피해도 다른 공격에 비해 가장 경미한 것이 사실이다.
아마 이 형태의 공격은 주로 국내가 아닌 해외에 botnet(zombie pc)을 확보하여 대규모의 트래픽을 유발할 수 없는 공격자에 의해 발생하는 것으로 보인다. 이러한 경우 iptables를 이용하여 한 IP당 접속량을 제한하거나 국가별 차단 기능을 이용하여 다음과 같이 대응할 수 있다.
-. 한 IP당 동시 접속량 제한, 이후 접속량 제한 초과 시 IP 자동차단.
: 이러한 공격은 많은 IP에서 비정상적인 다량의 접속을 시도하므로 한 IP에서의 동시 접속량을 제한하고, 이후에 접속량이 과다한 해당 IP를 자동차단하도록 할 수 있다.
# iptables -A FORWARD -m recent --name badguy --rcheck --seconds 300 -j DROP
# iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -m recent --name badguy --set -j DROP
# iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j DROP
위의 3 줄을 실행하면 가능한데, 단순히 3번째 룰인
# iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j DROP
만 실행하게 되면, 한 IP에서의 동시접속이 30회만 접속을 허용할 뿐 그 이상 접속을 하지 못하지만, 위의 두 룰을 함께 사용하게 되면 동시접속이 30회 이상 초과하는 IP를 dynamic하게 300초(5분)동안 자동 차단하게 된다.
동시 접속 수(30) 제한이나 차단시간(5분)은 각자의 환경에 따라 적절히 설정하면 된다.
이때 과다접속으로 차단된 IP에 대한 정보는 다음과 같이 실시간으로 확인할 수 있다.
# cat /proc/net/ipt_recent/badguy
src=100.123.65.15 ttl: 63 last_seen: 1174481 oldest_pkt: 2 last_pkts: 1174481, 1174481
- 국가별 차단(한국만 접속 가능) : 좀비들은 국가에 관계없이 특정 바이러스에 감염된 PC나 서버를 이용하므로 공격 시 해외에서의 접속이 많을 수 있다.
정상적인 경우 대부분 국내에서의 접속이 대부분이므로 공격을 당할 경우 해외에서의 접속을 차단한다면 일정정도의 효과를 기대할 수 있다.
# iptables -A FORWARD -p tcp --dport 80 -m geoip ! --src-cc KR -j DROP
위의 간단한 룰은 접속국가가 KR 즉 한국이 아닌 것은 차단하겠다는 의미이다.
만약 “-p tcp --dport 80”을 삭제하면 웹뿐만 아니라 모든 해외에서의 접속을 차단하게 된다.
만약 중국에서의 접속만 차단하고자 한다면 아래와 같이 실행하면 된다.
# iptables –A INPUT –p tcp –dport 80 –m geoip --src-cc CN –j DROP
iptables를 이용한 국가별 차단 방법에 대해서는 잠깐 언급한 바가 있는데, 여기에서는 국가DB를 최신 정보로 업데이트하는 방법에 대해 살펴보도록 하자.
먼저 csv파일을 db파일로 변환해 주는 프로그램을 다운로드하여 설치하도록 하자.
# wget http://people.netfilter.org/peejix/geoip/tools/csv2bin-20041103.tar.gz # tar zxfp csv2bin-20041103.tar.gz # cd csv2bin
이후 국가별IP DB파일을 다운로드하여 unzip으로 압축해제 하도록 한다.
# wget http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip # unzip GeoIPCountryCSV.zip
이제 아래와 같이 실행하면 현재 디렉토리에 geoipdb.bin과 geoipdb.idx파일이 생성되는데 이 파일을 /var/geoip 디렉토리로 옮기기만 하면 된다.
# ./csv2bin GeoIPCountryWhois.csv |
- 웹서버 대신 캐싱으로 변경
일반적인 웹서버에서는 동시에 많은 접속을 처리 하는데에 한계가 있다.
이러한 경우 대용량 트래픽 처리가 가능한 squid와 같은 캐싱(Reverse proxy)으로 IP를 변경하여 서비스하는 것도 대응방법이라 할 수 있다.
➄ 기타 변형된 형태의 공격
앞의 공격이 전형적인 공격 형태였다면 아래와 같이 다소 변형된 공격도 보이고 있다.
아래 flow를 보면 마치 211.192.139.41에서 SYN|ACK로 응답하는 것처럼 보이지만 실제로는 위조된 패킷이며 특이하게도 tcp 패킷임에도 목적지IP가 broadcast 주소인
192.168.60.255 이다.
정상적인 경우 broadcast로 tcp 트래픽이 사용될 일이 없고 트래픽에 사용된 패킷의 모든 사이즈가 2684/61=44 즉 44byte로 동일한 것이 ddos 공격이라 단정할 수 있다.
20:09:48 211.192.139.41.80 -> 192.168.60.255.14292 6(SYN|ACK) 61 2684 20:10:02 211.192.139.41.80 -> 192.168.60.255.29848 6(SYN|ACK) 12 528 20:09:54 211.192.139.41.80 -> 192.168.60.255.30104 6(SYN|ACK) 13 572 20:10:01 211.192.139.41.80 -> 192.168.60.255.27514 6(SYN|ACK) 60 2640 20:10:02 211.192.139.41.80 -> 192.168.60.255.25256 6(SYN|ACK) 54 2376 20:10:03 211.192.139.41.80 -> 192.168.60.255.23456 6(SYN|ACK) 28 1232 20:10:01 211.192.139.41.80 -> 192.168.60.255.54944 6(SYN|ACK) 32 1408 |
이러한 경우 'no ip directed-broadcast' 설정과 관계없이 실제 네트워크에 영향을 주게 되므로 192.168.60.255을 Null 라우팅이나 acl로 차단하여야 한다.
관련자료
-
이전
-
다음