출처
: http://webs.co.kr/?document_srl=433
● DoS (Denial of Service) 공격이란?
서비스 거부 공격 (Denial of Service attack)은 해커들이 특정 컴퓨터에 침투해 자료를 삭제하거나 훔쳐가는 것이 아니라 대량의 접속을 유발해
해당 컴퓨터를 마비시키는 수법을 말한다. 이 수법은 목표 서버가 다른 정당한 신호를 받지 못하게 방해하는 작용만 한다.
해커들이 가짜 접속을 통해서 여러 곳에서 동시에 피해 회사의 컴퓨터 시스템이 처리할 수 없는 엄청난 분량의 정보를 한꺼번에 쏟아부으면
과부하가 걸리게 되고 정상고객들이 접속을 할 수 없는 상태가 된다. 이용자의 정상 접속이 불가능해지는 것은 물론 심하면 주 컴퓨터 기능에 치명타를
입힐 수도 있다. 통상적으로 DoS는 유명한 사이트를 상대로 이루어진다.
야후의 해킹 경우를 보면 해킹이 절정에 달했을 때 들어온 데이터량이 1기가바이트에 이르렀는데 이 분량은 보통 인터넷 사이트의 1년치 분량보다
많은 것이라고 한다.
(1) 파괴 공격 : 디스크나 데이터, 시스템의 공격
(2) 시스템 자원의 고갈 : CPU, 메모리, 디스크의 사용에 과다한 부하를 가중시킴.
(3) 네트워크 자원의 고갈 : 쓰레기 데이터로 네트워크의 대역폭을 고갈시킴.
● DoS 공격 유형과 대응 방법
1. Ping of Death
Ping 공격은 상대방 서버를 다운시키는 명령어이다.
Ping을 이용하여 ICMP 패킷을 정상적인 크기보다 아주 크게 만든 다음 네트워크를 통해 라우팅(Routing)되어 공격 네트워크에 도달하는 동안
이 패킷은 아주 작은 조각(Fragment)이 된다. 공격 대상 시스템은 이렇게 작게 조각화된 패킷을 모두 처리해야 하므로 정상적인 Ping의 경우보다
훨씬 많은 부하가 걸린다.
[실행명령]
C:\>ping -n 100 -l 65500 172.16.0.3
C:\>ping -n 20000 -l 50000 -a 211.211.211.211
● -n : ICMP 패킷을 보내는 횟수
● -l : 패킷의 크기
● -a : 목표지 주소
2. Syn Flooding Attack
Syn Flooding Attack는 서버별 한정되어 있는 동시 사용자 수를 존재하지 않는 클라이언트가 접속한 것처럼 속여
다른 사용자가 서버에서 제공하는 서비스를 받지 못하게 하는 공격 기법이다.
● TCP 3Way Handshaking
기본적으로 TCP/IP는 3-Way Handshaking을 통해 송수신하기 위한 연결을 설정한다.
3-way handshaking이란 처음에 호스트 A가 서버 B에 연결하기 위해 SYN 패킷을 보내면 호스트서버 B는 SYN을 받았다는 뜻으로
SYN-ACK 패킷을 되돌려 보낸다. SYN-ACK를 받은 호스트 A는 이에 응답, 즉 ACK 패킷을 보내고 마지막으로 ACK 패킷을 호스트서버 B가 받으면
TCP 접속이 이루어지게 된다. 따라서 호스트 B서버가 SYN 패킷을 받으면 여기에 대한 자원을 할당하고 SYN-ACK를 보내 ACK를 기다리는데
만약 ACK 패킷이 오지 않으면 일정 시간 간격으로 SYN-ACK 패킷을 다시 보내게 된다.
SYN-ACK를 다시 보내게 되는 시간은 운영체제마다 다르며 윈도우NT/2000은 일반적으로 5번의 SYN-ACK 패킷을 서버에서 클라이언트로 보내는데
각각 3, 6, 12, 24, 48초에 보낸다. 그리고 마지막 재전송 이후에 ACK 패킷을 기다리는걸 포기하기까지 96초의 시간을 더 기다린다.
결국 총 189초 동안 윈도우 서버는 하나의 SYN 패킷에 자원을 할당해 놓는 셈이다. 공격자는 이점을 악용해 SYN Flooding 공격을 한다.
공격자가 데이터의 송신지 IP주소를 존재하지 않는 IP주소나 다른 시스템의 IP주소로 위장해 목적지 시스템으로 SYN 패킷을 연속해서 보낸다고
가정하면 윈도우 시스템은 많은 SYN을 동시에 처리하게 됨으로 정상적인 다른 사용자의 연결에 응답할 수 없게 되는 것이다.
이것이 SYN Flooding 공격이다.
● 정상적인 3Way Handshaking
(1) 클라이언트는 일련번호와 패킷크기를 포함한 정보를 서버에 전송하여 연결을 시작한다.
(2) 서버는 클라이언트가 보낸 세션 정보로 응답한다.
(3) 클라이언트는 서버로부터 수신한 정보에 동의하고 승인한다.
● Syn Flooding 공격시 3Way Handshaking
서버에 수천 개의 TCP 접속(SYN) 요청 메시지를 보낸다.
이 때 이 패킷 내부의 소스 IP 주소를 속이거나, 인터넷 상에서 사용하지 않는 IP 주소값으로 변형한다.
그러면 서버는 새로운 접속을 맺기 위해 실제로는 존재하지 않거나 동작하지 않는 IP 주소값으로 SYN/ACK 응답을 한다.
서버는 SYN/ACK 응답을 보낸 클라이언트로부터 ACK가 올 때까지 기다리게 되는데, 서버는 ACK 메시지를 받지 못하게 된다.
이렇게 되면 서버는 ACK 메시지를 받을 때까지 버퍼와 같은 자원을 계속 종료하지 않고 열어두게 되는데,
계속 누적될 경우 결국은 시스템이 다운되거나 서비스를 중단하는 사태가 발생하는 것이다.
[컴파일]
# gcc -o syn syn.c
[공격 실행]
root# ./syn 소스주소 목적지주소 low high
예) # ./syn 211.211.210.210 211.211.211.211 100 100
● Syn Flooding 공격의 탐지 방법
(1) netstat 명령어
netstat 는 시스템의 각종 네트워크 정보를 알려주는 명령어로 네트워크 연결, 라우팅 현황, 인터페이스 통계 등의 정보를 확인할 수 있게 해 준다.
netstat -na 로 확인해 보면 Local Address, Foreign Address, State 등의 정보가 출력되는데 이 중 State 부분에 보이는 메시지를 주목하면 된다.
각각의 연결 상태는 통신 상황에 따라 매우 복잡하게 순간적으로 변화하는데, 이 중 주로 주목하여야 할 상태는 SYN_RECEIVED 이다.
설명에 나온 대로 이 상태는 클라이언트의 확인 메시지를 기다리는 상태이지만 특별히 전용 회선에 장애가 없는 한 이 과정은 순간적으로 일어나므로
실제 netstat 로 확인되는 경우는 거의 없다. 따라서 netstat -na | grep SYN_RECV 로 확인해 보아 많은 메시지가 보인다면
Syn Flooding 공격을 당하고 있는 것으로 판단하면 된다.
[State 부분에 가능한 연결 상태]
● LISTEN : 서버의 데몬이 떠서 접속 요청을 기다리는 상태
● SYS-SENT : 로컬의 클라이언트 어플리케이션이 원격 호스트에 연결을 요청한 상태
● SYN_RECEIVED : 서버가 원격 클라이언트로부터 접속 요구를 받아 클라이언트에게 응답을 하였지만
아직 클라이언트에게 확인 메시지는 받지 않은 상태
● ESTABLISHED : 3 Way-Handshaking 이 완료된 후 서로 연결된 상태
● FIN-WAIT1, CLOSE-WAIT, FIN-WAIT2 : 서버에서 연결을 종료하기 위해 클라이언트에게 종결을 요청하고 회신을 받아 종료하는 과정의 상태
● CLOSING : 흔하지 않지만 주로 확인 메시지가 전송 도중 분실된 상태
● TIME-WAIT : 연결은 종료되었지만 분실되었을지 모를 느린 세그먼트를 위해 당분간 소켓을 열어놓은 상태
● CLOSED : 완전히 종료
(2) snort를 이용한 IDS (Intrusion Detection System) 구축
윈도우용 IDS(침입탐지시스템)인 Snort를 활용하는 방법도 있다.
IDS는 각종 해킹수법을 이미 자체적으로 내장, 침입행동을 실시간으로 감지, 제어할 수 있는 기능을 제공한다.
● Snort : http://www.snort.org
● 사용법 : http://www.krcert.or.kr
http://www.securitymap.net/sdm/sdm_ids.html
● Syn Flooding 공격의 대응 방법
(1) 백로그 큐 사이즈 늘리기
백로그 큐 (Backlog Queue)란 통신간의 연결 설정이 저장된 메모리 공간을 말하는데, 이 공간을 적절히 늘려준다.
(2) Syncookies 기능 설정
Syncookie 기능이 설정된 서버로 SYN 패킷이 들어온 경우, SYN 패킷의 일련번호에 1을 더하는게 아니라
출발지에 대한 정보와 비밀숫자를 만들어 해쉬함수를 이용해 쿠키를 생성한 놓은 후 SYN/ACK 패킷을 전송한다.
이 때 돌아온 ACK 패킷의 정보를 바탕으로 한 계산 결과가 맞다면 쿠키는 유용하나 그렇지 않다면 위조된 패킷으로 간주하여 즉각 버리게 된다.
이 기능은 정상적인 상황에서는 작동하지 않으며 백로그 큐가 가득찼거나, SYN Flooding 공격이 들어올 때만 반응하게 된다.
이 기능은 SYN Flooding 대응책으로 가장 확실한 방법이며, sysctl을 이용한 커널 설정을 통해 변경할 수 있다.
(3) 시스템 튜닝
● 리눅스 & 유닉스 : sysctl 을 이용하면 DoS 공격에 효과적으로 방어할 수 있다.
● 윈도우즈 : 레지스트리 값을 수정한다.
(4) TCP Intercept
이 부분은 라우터나 방화벽등의 장비에서 적용하는 방법으로, 두가지 모드로 나누어진다.
TCP Intercept 기능을 사용하면 존재하지 않은 IP에서의 SYN 패킷 요청은 도달하지 못하게 된다는 것인데,
이 경우 라우터를 통과하는 전 패킷의 상태를 체크해야 하므로 실제로 적용시키기에는 무리가 있다.
① Intercept Mode
라우터로 들어오는 SYNn 패킷 요청을 서버로 바로 포워딩 하지 않고 라우터에서 일단 가로채어 서버를 대신하여 요청한 클라이언트와 연결을 맺는다.
만약 연결이 성립되지 않으면 위조된 패킷으로 간주하며, 정상적으로 연결이 될 경우 요청한 클라이언트를 대신해 서버로 연결을 맺은 후
클라이언트와 서버를 투명하게 연결시켜 준다.
② Watch Mode
일단 SYN 패킷을 서버로 보내되, 지정한 시간동안 연결이 성립되지 않으면 중간에 SYN 패킷을 차단한다.
(5) 라우터의 egress 필터링
나가는 패킷의 주소가 해당 대역의 IP주소인지 확인한다.
DoS 공격은 주로 소스 아이피를 변조하기 때문에 허용할 대역 이외의 다른 대역은 모두 Deny 시키도록 한다.
3. Tear Drop Attack
Teardrop Attack는 IP 패킷의 전송이 잘게 나누어졌다가 다시 재 조합하는 과정의 약점을 악용한 공격이다.
보통 IP 패킷은 하나의 큰 자료를 잘게 나누어서 보내게 되는데 이 때 offset을 이용하여 나누었다 도착지에서 offset을 이용하여 재 조합하게 된다.
이 때 동일한 offset을 겹치게 만들면 시스템은 교착되거나, 충동을 일으키거나, 재시동되기도 한다.
이 공격은 윈도우NT 뿐만아니라 Linux 시스템에도 효과가 있다.
이 수법으로 공격당한 시스템은 네트워크 연결이 끊어지거나 일명 죽음의 푸른 화면(Blue Screen of Death)이라 불리우는 오류 화면을 표시하면서
중단된다. 시스템이 정지될 경우, 사용자는 시스템을 재부팅해야 하며 이 경우 시스템에 직접적인 피해는 없으나 시스템이 정지될 때 저장하지 못한
데이터를 잃게 된다. 이 공격이 성공할 수 있는 원인은 윈도우 및 Linux 시스템의 IP 패킷 재조합 코드의 버그에 있다.
문제는 Ping of Death나 Tear Drop은 IDS(침입탐지시스템)의 패킷 필터링 정책이나 방화벽을 우회할 수 있고,
TearDrop은 Opentear, NewTear, Boink, Nestea, SynDrop 등과 같은 변종들을 가지고 있기 때문에 방화벽을 사용한다고 해서
해결이 되지 않으며 근본적인 해결책을 위해서는 해당 운영체제가 가진 취약점을 패치하는 것이 가장 좋은 방법이다.
※ offset
단편화 되어 분할된 패킷을 재구성할 때 사용하는 원본 패킷의 위치 정보를 포함하고 있는 TCP 헤더 부분.
[컴파일]
# gcc -o newtear newtear.c
[공격 실행]
root# ./teardrop 소스주소 목적지주소 -s 출발지포트 -t 목적지포트 -n 횟수
예) # ./newtear 222.222.222.222 172.16.0.3 -t 80 -n 180
# ./teardrop 211.211.210.210 211.211.211.211 -s 22 -t 139 -n 1000
4. Smurf Attack / Fraggle Attack
Smurfing 공격은 그 광범위한 효과로 인하여 가장 무서운 DoS 방법 중의 하나이며, IP와 ICMP의 특징을 이용한다.
브로드캐스트 핑 요구는 네트워크 주소나 네트워크 브로드캐스트 주소에 직접 보내질 수 있다.
만약 192.168.0.0/24 범위를 가진 네트워크가 있다면, 네트워크 ID는 192.168.0.0 이 될 것이고,
브로드캐스트용 주소는 192.168.0.255가 될 것이다.
브로드캐스트는 전형적으로 지정된 범위 내에서 조정된 각각의 주소 없이 무엇이 활동하는지 진단할 목적으로 사용된다.
Smurfing 공격은 직접적인 브로드캐스트와 세 가지 구성요소인 공격자, 증폭 네트워크와 표적을 최대한 이용한다.
공격자는 증폭 네트워크의 브로드캐스트 주소로 공격 서버가 요구하는 것처럼 패킷들의 원본 주소를 위조하여 ICMP ECHO 패킷을 전송하고,
ICMP ECHO 패킷을 수신한 증폭 네트워크 내의 모든 시스템은 공격 서버에 응답을 하게 된다.
만일 공격자가 브로드캐스트 핑에 응답할 100개의 시스템을 가진 증폭 네트워크에 하나의 ICMP 패킷을 보내게 되면,
공격자는 100만큼의 효과로 DoS 공격을 할 수 있다.
스머프 공격을 무력화시키는 방법은 각 네트워크 라우터에서 IP 브로드캐스트 주소를 사용할 수 없게 미리 설정해 놓는 것이다.
Fraggle 공격 방식은 Smurfing 공격과 비슷하지만 ICMP 대신 UDP를 사용한다는 것이 다른 점이다.
공격자들은 증폭 네트워크 내의 브로드캐스트 주소로 전형적인 포트 7(Echo)을 이용해 가짜 UDP 패킷을 전송한다.
에코가 가능한 네트워크 내의 각각의 시스템은 엄청난 트래픽을 생성하고, 공격 서버로 응답을 보내게 된다.
만약 증폭된 네트워크 내의 시스템에서 에코가 가능하지 않더라도 ICMP 도달 불능 메시지가 여전히 대역폭을 소모하게 될 것이다.
[컴파일]
root# gcc -o smurf smurf.c
[공격 실행]
# ./smurf 목표IP 브로드캐스트파일 보낼패킷수 패킷릴레이속도 패킷크기
예) # ./smurf 211.211.211.211 broad 1000 1000 1024
# ./smurf 172.16.0.3 bcast 0 5 512
5. LAND Attack
LAND 공격은 패킷을 전송할 때 출발지 IP 주소와 목적지 IP 주소 값을 공격자의 IP 주소 값으로 똑같이 만들어서 공격 대상에게 보낸다.
시스템은 처음 시도된 SYN에 대한 Reply 패킷을 출발지 IP 주소 값을 참조하여 그 값을 목적지 IP 주소 값으로 설정하여 패킷을 보낸다.
하지만 이 값은 자기자신의 IP 주소 값이므로 네트워크 밖으로 나가지 않고 자기 자신에게 다시 돌아온다.
이 공격법은 SYN Flooding처럼 동시 사용자 수를 점유해버리며, CPU 부하까지 올리게 된다.
[컴파일]
root# gcc -o land land.c
[공격 실행]
root# ./land 172.16.0.3 172.16.0.3 80 80
'IT_Server > 네트워크 · 보안' 카테고리의 다른 글
[펌] DDoS 공격과 방어 메카니즘 (0) | 2014.12.08 |
---|---|
블록 암호화에서의 운영 모드 (0) | 2013.01.16 |
대칭키 AES256 = C# + Objective C(ios) + PHP + JAVA(Android) + Perl + Javascript + Python (0) | 2012.06.07 |
[펌_안철수연구소] 기초 보안 체크리스트 - 이동식 디스크 관리 편 (0) | 2009.07.23 |
PC에서 나의 흔적 없애는 방법 (0) | 2007.09.06 |