[네트워크 해킹]
07. DoS(Denial of Service, 서비스 거부) 공격
서비스 거부 공격(DoS, Denial of Service)란?
1. 정의 : 서비스가 정상적으로 제공하지 못하도록 '가용성'을 떨어뜨리는 공격.
파괴 공격, 시스템 자원 고갈, 네트워크 자원 고갈이 있다.
2. 특징 : 감지 및 방어가 힘들기 때문에 다른 공격보다 피해가 심각.
☞ 실제 사용자인지 공격인지 구분하기 어려움.
3. DoS 공격의 유형 (기준 : 한국과학기술정보연구원 DDoS 공격 유형별 분석보고서)
구분 | 대역폭 소진 공격 | 서비스(어플리케이션) 마비 공격 |
공격 형태 | 1. UDP/ICMP Traffic Flooding - UDP/ ICMP Flooding - DNS Query Flooding 2. TCP Traffic Flooding - SYN Flooding - SYN + ACK Flooding 3. IP Flooding - IP Header Option변조 (Land Attack) - IP Fragment Packet Flooding (Teardrop, HTTP Continuation) |
1. HTTP Traffic Flooding - Get Flooding - Get with CC(Cache-Control) Attack 2. HTTP Header/Option Spoofing - Slowloris( Pyloris ) - Fragmented HTTP Header Attack 등 3. TCP Traffic Flooding - TCP Session - SYN Flooding - TCP Slow Read 4. Other L7 Service Flooding - Hash DoS - Hulk DoS - FTP/ SMTP Attack |
프로토콜 | 3~4계층 : IP, ICMP, IGMP, UDP, TCP |
7계층 : HTTP, SMTP, FTP, DNS, VoIP |
공격 대상 | 네트워크 인프라 | 웹 서버, 정보보호 장비 |
Spoofing 여부 | 사용/미사용 | 미사용 |
증상 | 네트워크 대역폭 고갈 | 공격 대상 시스템만 피해 |
4. DDoS란?
서비스 거부 공격(DoS)이 단일 컴퓨터를 통해서 공격을 하는 경우라면,
분산 서비스 거부 공격(DDoS)은 공격자가 물리적을 분산된 다수의 컴퓨터(좀비 PC)를 이용하여 공격하는 형태이다.
DoS 공격에 사용되는 툴 : hping3
hping은 명령어 라인 네트워크 툴로 TCP/IP 패킷 분석가를 위한 것이다.
ping과 비슷하지만 ICMP뿐만이 아니라 TCP, UDP ICMP 그리고 IP 프로토콜을 지원해주며 traceroute 모드를 가지고 있어서 캡슐화된 파일 전송이 가능하다.
보안 용도 이외에도 다양하게 네트워크를 테스트하는 용도로 사용할 수 있다.
- 방화벽 테스팅
- 향상된 포트 스캐닝
- 서로 다른 프로토콜, TOS, fragmentation을 사용하여서 네트워크 테스트
- 수동으로 MTU 경로 탐색
- 향상된 traceroute
- 원격 OS 핑거프린팅
- 원격 가동시간 추측하기
- TCP/IP 스택 감사
hping이 작동하는 시스템 : Linux, FreeBSD, NetBSD, OpenBSD, Solaris, MacOs X, Windows
DoS 공격
DOS공격을 크게 네트워크 자원 고갈 공격과 시스템 자원 고갈 공격으로 나누어 볼 수 있다.
- 네트워크 자원 고갈 공격 : 네트워크 대역폭을 고갈 시키는 공격
- 시스템 자원 고갈 공격 : CPU, 메모리, 디스크 등을 과다하게 사용하도록 하여 부하를 가중시키는 공격
[대역폭 소진 공격(네트워크 자원 고갈 공격 )]
- UDP/ICMP Traffic Flooding
1. UDP/ICMP Flooding
다량의 UDP/ICMP 패킷을 서버로 전송하여 서버가 보유한 네트워크 대역폭을 가득 채워 다른 정상적인 서비스 및 클라이언트의 접속을 원활하지 못하도록 유발하는 공격
- 대응 방안 :
1) ACL (Access Control List) 설정을 이용한 차단 ; UDP/ICMP DROP 정보를 설정
2) INBOUND 패킷에 대한 임계치 설정을 이요한 차단
2. DNS Query Flooding
다량의 DNS 쿼리 데이터를 서버로 전송하여 DNS의 정상적인 서비스를 방해하는 공격
1) DNS를 통한 대역폭 공격
2) 많은 Query를 발생 시켜 DNS 응답을 하지 못하도록 하는 서버 자원공격
- 대응 방안:
1) DNS 서버 다중활르 통한 DNS 공격 트래픽 분산
2) IPTABLE을 이용한 ACL 기반 차단
예 ) DNS 요청은 512Byte를 넘을 수 없음을 이용
iptables -A INPUT -p udp -dport 53 -m length --length 512:1500 -j DROP
- TCP Traffic Flooding
3. TCP SYN Flooding
존재하지 않는 클라이언트가 서버별로 한정되어 있는 접속 가능 공간에 접속한 것처럼 속여 다른 사용자가 서비스를 제공받지 못하도록 하는 공격
- 공격 방법 :
1) 공격자는 3-way-handshaking 과정에서 짧은 시간 안에 대량의 SYN 패킷을 보낸다.
2) SYN 패킷을 보낼 때 출발지 주소지를 존재하지 않는 시스템의 IP 주소로 위조한 패킷을 보낸다.
3) 시스템은 보통 SYN에 대한 연결을 일정 시간 동안만 시도하도록 설정되어 있기 때문에, syn flooding 공격을 성공하려면 서버에 설정된 대기 시간 안에 서버가 수용할 수 있는 동시 사용자 수의 한계를 넘는 연결을 시도해야 함.
- 공격 명령어
$ hping3 --rand-source 피해자IP -p 23 -S --flood
- 보안 대책 :
1) 보안 솔루션 설치 : 대량의 SYN을 막는다. 그러나, 가끔 정상적인 사용자도 막을 수 있다.
2) Backlog queue를 늘린다.
*Backlog queue : 메모리로, 3-way-handshake를 맺기 위해서 연결을 맺기 위해 syn에 대한 대기하는 메모리 버퍼
3) SYN_RECIVED 시간을 줄인다.(예: 75s → 10s)
4) syn_cookies 기능을 켠다. (리눅스)
* Syn_cookie란?
서버에서 클라이언트로 보내는 syn+ack 패킷에 임의로 생성되는 시퀀스 넘버 대신 서버에서 암호화 기술을 이용해서 인증 정보가 담긴 시퀀스 넘버를 생성하여 클라이언트에 보내는 것
1. 클라이언트로부터 syn 패킷을 받으면, 간단한 인증 정보가 담긴 syn_cookie를 시퀀스 넘버 값에 넣는다.
syn으로 인해 원래는 tcp syn received 상태가 되어야 하지만 세션을 닫는다.
2. 클라이언트가 syn_cookie가 포함된 값으로 ack를 보내면 서버는 그제야 세션을 다시 열고 통신을 시작한다
4. Registry를 수정한다. (윈도우)
5. Firewall이나 router에서 차단 및 시스템을 튜닝한다.
4. TCP Flag Flooding
TCP의 Flag값(Control Bit)을 임의로 조작하면 SYN, ACK, FIN, RST와 같이 여러 형태의 패킷을 생성할 수 있으며, 서버는 이러한 패킷을 수신하는 경우 해당 패킷을 검증하기 때문에 서버의 자원을 소모시키는 공격
※ ACK Flooding : 공격자가 TCP 세션이 없는 상태에서 TCP 헤더의 Flags를 ACK(0x10)으로 Setting 하여 무작위로 보내면 수신 측에서 변조된 발신 IP로 RST 패킷을 무작위로 보내게 되고, 동시에 ICMP host Unreachable 패킷을 보내면서 수신 측 시스템의 과부하를 초래하는 공격임
※ RST Flooding : 공격대상 서버로 전달되는 클라이언트의 TCP 패킷의 Reset 값을 설정하여 클라이언트가 서버로부터 정상적인 서비스를 받지 못하도록TCP 연결을 강제로 종료시키는 공격임
5. TCP Session Flooding (TCP Connect Flooding)
SYN Flooding 공격이 유효하지 않을 때 정상적으로 많은 접속을 맺어 연결 접속 수를 초과하여 다른 연결들을 접속을 맺지 못하도록 하는 공격.
1) TCP 세션 연결을 유지하는 공격
2) TCP 세션 연결/해제를 반복하는 공격
3) TCP 세션 연결 후 정상적인 트렌젝션처럼 보이는 트래픽을 발송하는 공격
- 공격 명령어 :
while(:); do nc kitri.re.kr 80 & sleep 1; done
- 대응방안
1) Connection Timeout / Keep-Alive / TIme-Wait 설정을 통한 차단
2) L7 스위치 임계치 설정 기능을 이용한 차단
- IP Flooding
6. Land Attack (IP Header Option 변조)
패킷을 전송할 때 출발지 IP 주소와 Port와 목적지 IP 주소와 Port를 똑같이 만들어서 공격 대상에게 보내는 공격
- 공격 명령어
$ hping3 192.168.10.135 -a 192.168.10.135 --icmp --flood
7. Ping of Death
- 공격 방법
1) icmp 패킷을 정상 크기 보다 아주 크게 만듦
2) 크게 만들어진 패킷은 네트워크를 통해 라우팅 되어 공격 네트워크에 도달하는 동안 아주 작은 조각으로 쪼개진다.
3) 공격 대상은 조각화된 패킷을 모두 처리해야 하므로 정상적인 ping보다 부하가 훨씬 많이 걸린다.
- 공격 명령어 :
$ hping3 --icmp --rand-source 공격대상ip(192.168.10.135) -d 650000 --flood
- 보안 대책 :
ping of death 공격을 받을 때 반복적으로 들어오는 일정 수 이상의 icmp 패킷을 무시하게 설정
8. bonk, boink, teardrop
TCP의 시퀀스 넘버를 비정상적으로 조작하여 문제를 이르는 공격
→ 비정상적인 시퀀스 넘버에 대하여 프로토콜은 신뢰도를 확보하고자 반복적인 재요구와 수정을 하게 되고, 시스템 자원이 고갈된다.
bonk 1 1 1 1 1 1 // 같은 시퀀스 넘버를 보냄 → 부담이 커진다.
boink 1 101 201 301 401 401 401 401 401 // 처음에는 정상적으로 보내다가 같은 시퀀스 넘버를 보낸다.
teardrop 1 2 3 4 5 - 100 80 81 82 83 84 200 ... // 단순하게 시퀀스 넘버를 일정하게 바꾸는 것을 넘어 중첩과 빈 공간을 만들어, 시퀀스 넘버를 좀 더 복잡하게 섞는다.
- 보안 대책 : 일정 수 들어오는 이상 패킷을 무시함. 현재 os는 조치가 되어 있음.
- 공격 명령어 :
$ hping3 -a 200.200.200.200 목적지IP --id 3200 --seqnum -p 139 -p 139 -d 320 --flood
9. HTTP Continuation
서버로 전달되는 패킷에 HTTP Header 없이 Data만 채워 웹서버가 지속적으로 데이터 수신을 위해 TCP자원을 사용하도록 하는 공격
* 패킷 크기를 최대한 크게 보내기 때문에 네트워크 자원도 같이 고갈될 수 있음.
- 대응방안
1) Request Header없이 Data만 보내기 때문에 해당 패킷 무시하도록 차단
2) 충분한 연결을 유지할 수 있는 캐싱장비 활용
10. Smurf Attack (ICMP Flooding)
- 공격 방법 :
ICMP 프로토콜 + 브로드캐스팅 개념 사용
1) 공격 대상의 네트워크에 다이렉트 브로드캐스트를 하면서 브로드캐스트를 보낸 출발지 주소를 공격 대상의 ip로 한다.
2) 브로드캐스드에 대한 응답이 공격 대상의 ip로 쏟아지면서 공격함.
3) 외부 네트워크에서 내부 네트워크로 Broadcast를 한다. 그리고, 출발지 주소를 희생자 IP로 보낸다. 그러면, 내부 네트워크에서 모든 기기에서 희생자로 응답이 온다. (엄청나게 증폭이 된다.)
- 공격 명령어
$ hping3 192.168.10.255 -a 192.168.10.135 --icmp --flood
- 보안대책
1) Smurf 공격으 특성상 공격이 시작되면 단시간에 많은 ICMP ECHO Request 패킷을 희생자에게 전송하므로 이를 차단한다.
2) 증폭 네트워크로 사용되는 것을 막기 위해, 다른 네트워크로부터 자신의 네트워크로 들어오는 Directed Broadcast 패킷을 허용하지 않도록 라우터 설정 (라우터 명령어 : (config-if)# no ip directed-broadcast)
3) 브로드캐스트 주소로 전송된 ICMP Echo Request 메시지에 대해 응답하지 않도록 한다.
[서비스 마비 공격]
- HTTP Traffic Flooding
HTTP 메시지 : Header(메시지 형식) + Body(실제 보낼 메시지 내용) 구성.
HTTP 메시지는 TCP를 통해 최소 1개 이상의 패킷을 분할되어 전송됨.
1. HTTP GET Flooding 공격
동일한 HTTP GET 요청을 다량으로 방생시켜 공격 대상 서버가 요청을 처리하도록 하는 공격.
서버 자원을 과도하게 사용하도록 하여 정상적인 요청을 처리하지 못하도록 하는 서비스 거부 공격
* 웹서버는 한정된 HTTP 처리 Connection 용량을 가지기 때문에 용량 초과 시 정상적인 서비스가 어려워짐.
- 대응방안
1) 임계치 설정 ; 비정상적으로 많은 트래픽을 발생하는 출발지 IP 대한 선별적인 차단 적용
2) 콘텐츠 요청 횟수에 대한 임계치 설정에 의한 차단
3) 시간별 웹페이지 URL 접속 임계치 설정에 의한 차단
4) 웹스크래핑(Web-Scraping) 기법을 이용한 차단
2. GET Flooding with CC(cache-control) 공격
일반적으로 웹 서버의 부하를 감소시키기 위해 캐싱서버를 운영하는 경우 HTTP user-agent 속성의 cache-control 부분 no-store, must-revalidate로 지정하여 캐싱 장비가 응답하지 않고 웹서버가 직접 응답하도록 웹서버 자원을 소진시킴.
- 대응방안 : TCP 세션 요청과 HTTP요청에 대한 임계치 기법을 방어가 가능
1) 방화벽에 캐싱공격 문자열을 포함한 IP차단
2) L7 스위치를 이용한 캐싱 공격 차단
- HTTP Header/Option Spoofing
3. Slow HTTP POST DoS(RUDY : R-U-Dead-Yet?) - 저 대역폭 공격
POST 방식으로 데이터를 전송하면서 content-length 헤더 필드의 값을 비정상적으로 크게 설정한 후 소량의 데이터를 지속으로 천천히 보내 공격하는 기법.
웹 서버는 정해진 크기만큼 데이터를 모두 수신하기 위해서 대기하게 되고 그에 따라 모든 연결 자원을 소진하게 됨.
- 실습 : rudy 패킷 보기
일정한 간격으로 1바이트씩 분할하여 서버로 전송하여 서버가 해당 데이터를 수신하기 위한 연결상태를 종료하지 못하도록 유지하여 다른 클라이언트와 연결을 못하도록 한다.
4. Slow HTTP Header Dos (Slowris) 공격 - 저 대역폭 공격
웹 서버는 HTTP 메시지의 헤더 부분을 먼저 수신하여 이후 수신할 데이터 종류를 판단하게 되는데, 헤더 부분에서 마지막을 알리는 empty line(0x0d0a)을 보내지 않아 웹서버는 아직 HTTP 헤더가 모두 전달되지 않은 것으로 판단하여 연결을 장시간으로 유지하게 되는 저 대역폭 공격.
CRLF라는 용어는 Carragie Return(ASCII 13, \r), Line Feed(ASCII 10, \n)의 약자로, 라인 끝을 나타내는데 사용이 된다.
HTTP 프로토콜에서 CR-LF 순서로 항상 라인 끝에 사용된다.
- 슬로리스 패킷 확인하기
불완전한 헤더 정보를 가진 HTTP 메시지를 보냄 (
헥사 값을 보게 되면, 0d0a를 2개 줘야 하는데 1개만 줌.)
☞ 웹 서버는 계속 대기를 하게 됨
※ 참고 ) 5. Pyloris 공격 : A Python Implementation of Slowris
Slowloris의 파이썬 포팅 버전.
6. TCP Slow Read DoS 공격 (일부 취약한 서버만 가능) - 저 대역폭 공격
TCP 세그먼트 헤더 중 윈도우 크기 (Windows size) 항목을 최소로 설정해 웹 서버가 데이터를 느리게 응답하도록 함으로써 연결을 계속 유지한다.
이 과정에서 과부하를 유발하는 공격이 바로 HTTP SLOW READ 공격이다. TCP 헤더 항목을 악용한 방식으로 HTTP를 조작한 이전의 저 대역폭 공격과는 차이가 있다.
* 방화벽이 다 막혀있고, 80 포트만 열려있으므로, 주로 HTTP를 공격하게 된다. TCP 헤더의 취약점을 이용한 것이므로 4 계층에 대한 취약점
저 대역폭 공격 대응방법
1. 동일한 IP에서 연결하는 임계치를 제한한다.
2. 타임아웃 시간을 설정한다.
3. 최신 버전의 웹 서버를 설정한다.
- Other L7 Service Flooding
7. Hash Dos 공격
웹 서버는 클라이언트로부터 전달받은 HTTP 메시지의 매개 정보(Parameter) 관리를 위해 해시테이블을 사용한다.
조작된 매개 정보를 포함한 다량의 메시지는 해시테이블 검색을 위한 인덱스로 사용되는 해시값에 충돌을 발생시켜 정확하나 값을 찾기 위해 모든 해시 테이블을 검사하게 되는데 이때 웹 서버의 CPU 자원을 소진하게 되어 정상적인 서비스를 방해한다.
많은 수의 매개정보를 전달하면 해시테이블에서 해시 충돌이 발생하여 정보 조회를 위한 계산 시간이 급속도로 증가(POST 메시지는 전달되는 파라미터의 길이/개수에 제한이 없기 때문)
- 대응방안 : 웹 서버의 설정값을 변경하여 차단
8. Hulk Dos 공격 (HULK : HTTP Unbearable Load King)
공격 대상 웹 사이트 주소(URL)를 지속적으로 변경하여 일반적인 GET Flooding 공격을 우회하여 공격하는 방법
Request URL에는 아이디, 비밀번호와 같은 정보 파라이터를 포함하여 전달되는데 이때의 파라미터 값을 지속적을 변경하여 웹 서버로 전달하는 방식
예) http://tistory.com/test.OOO?type=post&query=123... 일 때 type, query와 같은 파라미터의 값들을 계속 변조
- 대응방안
1) 접속 임계치 설정을 차단
2) HTTP Request의 HOST 필드값에 대한 임계치 설정을 통한 차단
3) 302-Redirect를 이용한 차단