정보보안 - 네트워크 DDoS
DDoS (Distributed Denial of Service) 공격
- 개요
- 분산서비스공격
- 네트워크 자원 소진 : BandWidth 소진
- 시스템 자원 소진 : 서비스/서버 자원 소진
- 분산된 다수의 좀비 PC에 의해 공격대상 시스템의 서비스를 마비시키는 공격
- 분산서비스공격
- 공격 구조
- Attacker(공격자) : C&C 서버에 공격 명령을 전달하는 해커 (Bot Master)
- Botnet(봇넷) : 악의적 의도를 갖는 불법 네트워크
- C&C (명령제어) 서버 : 공격 명령을 전달받고 좀비 PC에 명령을 전달하는 시스템 (Master)
- 중앙집중형 (C&C 서버만 발견되면 전체 무효화)
- IRC 봇넷 (Rbot) (초창기)
- IRC (Internet Replay Chat) : 인터넷에서 채팅을 할 수 있는 프로토콜
- IRC 서버간에 연결 (전 세계 모든 서버)
- IRC 서버를 C&C 서버로 주로 활용
- HTTP 봇넷 (Robax) (탐지, 대응이 어려움)
- IRC 봇넷 (Rbot) (초창기)
- 분산형 (탐지, 차단 어려움)
- P2P 봇넷 (Storm, Peacomm)
- 공격자 (Bot Master) 가 P2P 중 하나에 명령 전송
- 봇넷 내 Host 끼리 명령을 전파시킴l
- P2P 봇넷 (Storm, Peacomm)
- 중앙집중형 (C&C 서버만 발견되면 전체 무효화)
- 좀비 PC (악성 봇) : C&C 서버로부터 전달받은 명령을 수행(실제 공격) 하는 시스템 (Bot, Slave, Agent)
- 봇 프로그램에 감염된 PC
- 봇(Bot)
- 웜/바이러스, 백도어, 스파이웨어, 루트킷
- 원격에서 해당 System을 제어하는 프로그램
- 정보유출, 스팸메일발송, DDoS 공격
- 타 PC 감염
- C&C (명령제어) 서버 : 공격 명령을 전달받고 좀비 PC에 명령을 전달하는 시스템 (Master)
- 공격대상 : 피해 시스템 (Target, Victim)
DNS 싱크홀 서비스
- 개요
- 한국인터넷진흥원 (KISA) 에서 싱크홀 서비스 운영
- DDoS 공격 구조
- Zombie PC : C&C 서버 도메인으로 DNS 서버에 질의 (C&C 서버 IP 필요)
- DNS 서버 : C&C 서버 IP 주소 전송
- Zombie PC : C&C 서버 접속
- C&C 서버 : 명령
- DNS 싱크홀 (Sinkhole) 서비스
- C&C 서버 도메인 목록 제공 서버 : DNS 서버에 목록 제공
- Zombie PC : C&C 서버 도메인으로 DNS 서버에 질의 (C&C 서버 IP 필요)
- DNS 서버 : 싱크홀 서버 IP 주소 전송
- Zombie PC : 싱크홀 서버 접속
DDoS 공격 유형
- 유형별 분류
- 네트워크 대역폭 소진 공격 (네트워크 계층, 전송 계층) -> 네트워크 인프라 장애, 다른 정상 Client 접속 X
- UDP Flooding : SRC IP 위조, 전송 계층
- ICMP Flooding : SRC IP 위조, 네트워크 계층, Echo Request (Ping)
- DNS Query Flooding : DNS Query Data 를 서버에 대량전송, DNS 서버에서 서비스를 받는 호스트에 타격
- IP Flooding
- TCP SYN Flooding : 3-Way Handshake 의 취약점 이용, 대량의 SYN 패킷을 서버에 전송, 대기큐 (Backlog Queue) 를 소진
- 출발지 주소를 위조하여 SYN 전송, SYN + ACK 를 서버에서 보내도 ACK 가 오지 않기 때문에 Incomplete Connection Queue 가 소진됨
- Listen : Backlog Queue 에 메세지를 받는 상태
- Backlog Queue ( Incomplete Connection Queue + Complete Connection Queue )
- Incomplete Connection Queue : 서버에 SYN 요청이 들어오면 쌓이게 됨 (SYN-RECV)
- Complete Connection Queue : 연결요청이 완료 (3Way Handshake) 되면 또 다른 Queue 에 쌓임
- Complete Connection Queue 의 대기 Queue를 System Call (accept()) 하여 Connected Socket이 되고, Queue 에서 삭제
- Backlog Queue ( Incomplete Connection Queue + Complete Connection Queue )
- 현재 소켓 상태를 파악하기 위한 명령어
netstat -antp | grep SYN RECV
: InComplete Connection Queue 의 리스트를 확인
- 해결책
- Syn Cookie 설정
- 리눅스 #
sysctl -w net.ipv4.tcp_syncookies=1
: 1=true - Backlog Queue (Incomplete Connection Queue) 가 소진되지 않도록 설정
- 유효한 클라이언트인지 판단
- 연결 설정 과정에서 서버가 특정값 (쿠키값) 을 설정 - ISN
- SYN+ACK 에 설정
- ACK 에 ISN 이 실리지 않으면 Backlog Queue 에서 제거
- 리눅스 #
- 방화벽 이용
- 연결 요청 (동일 Client IP에서 발생) 에 대한 임계치 값 (SYN 요청 Threshold) 설정
iptables –A INPUT –p tcp —syn —dport 80 –m connlimit —connlimit –above 5 –j DROP
- 첫번째 SYN DROP
- 첫번째 SYN 패킷을 보낸 SRC IP가 존재하는지 확인
- DROP 을 시켜 확인 : 재요청 패킷이 도착하는지 확인(실제 IP 존재)
- 첫번째 SYN 패킷을 보낸 SRC IP가 존재하는지 확인
- Backlog Queue 크기 늘리기 (임시적 조치)
- 리눅스 #
sysctl -w net.ipv4.tcp_max_syn_backlog=1024
- 솔라리스 #
ndd -set /dev/tcp tcp_conn_req_max_q0 1024;
- 리눅스 #
- SYN + ACK 에 대한 대기시간 줄이기
- Syn Cookie 설정
- TCP Flag Flooding : Flag값 (UAPRSF) 을 재멋대로 설정하여 전송, 서버에서 검증에 자원을 소모
- TCP SYN + ACK Flooding
- 서비스(어플리케이션) 마비 공격 -> 공격대상 시스템만 피해
- HTTP Traffic Flooding
- HTTP Get Flooding
- 동일한 HTTP Get 요청을 다량으로 발생시킴 > 웹서버 자원 소모
- Botnet의 ZombiePC 들이 동일 URL 로 GET 요청을 전송
- HTTP Get Flooding with CC Attack : 캐싱 서버 무력화, 웹서버에 부하
- Hulk DoS
- URL 을 변경해가며 (차단-임계치기반 을 피해가며) 공격
- 임계치 우회 : 동일 URL에 대한 접근횟수 제한
- URL 을 변경해가며 (차단-임계치기반 을 피해가며) 공격
- HTTP Get Flooding
- HTTP Header/Option Spoofing
- HTTP Continuation : HTTP Header 없이 Data 만 채워 웹서버에 전송 > 웹서버는 데이터가 더 있다고 생각하고 지속적으로 TCP 자원을 사용
- Slow HTTP POST DoS : HTTP POST 메소드 이용, 대량의 데이터를 장시간에 걸쳐 분할 전송 > 서버는 수신이 다 될때까지 세션을 유지, 자원소모
- RUDY 공격
- Content-Length 헤더 필드의 값을 비정상적으로 크게 설정
- 소량의 데이터를 지속적으로 천처히 보냄
- 웹서버는 정해진 크기만큼 데이터를 모두 수신하기 위해 연결상태 유지
- 웹 서버의 연결자원을 모두 소진
- 대응책
- 동시연결 임계치 설정 (Concurrent Connection Threshold)
iptables
- Connection timeout 설정
- Apache httpd.conf => timeout=120초 (기본값) -> 5초
- Read Timeout 설정 (Apache 2.2 이상)
- Apache httpd.conf => RequestReadTimeout body=10
- body 부가 10초 이내에 수신되지 않으면 오류
- Apache httpd.conf => RequestReadTimeout body=10
- 동시연결 임계치 설정 (Concurrent Connection Threshold)
- Slow HTTP Header DoS : 헤더와 데이터부의 구분 라인을 모호하게 함. > 서버는 아직 헤더정보가 남아있다고 판단, Header 의 나머지 부분 전송 대기, 연결 유지
- Slowloris 공격
- 헤더의 마지막을 알리는 Empty line을 보내지 않아 웹서버를 대기시킴
- 웹서버와의 연결상태를 지속, 저대역폭 공격 (소량의 트래픽을 이용)
- HTTP 헤더의 구조
- Request Line : 요청라인
- Method (GET, POST …) 지정
- URL (/home/aa.php)
- HTTP Version (HTTP/1.1)
- 개행값 (CRLF - Carriage Return ( 행 맨 앞으로 커서 이동) Line Feed (다음 행으로 이동) : 0x0d0a < 0d0a)
- Request Header : 요청헤더
- Host : 호스트명
- 개행값 (CRLF)
- User-Agent : 사용 브라우저 정보
- 개행값 (CRLF)
- …
- 개행값 (CRLF)
- 헤더 필드
- 개행값 (CRLF)
- Empty Line : 공백라인
- 헤더를 구분하기 위해 빈 라인 추가
- 개행값 (CRLF)
- Body (Data) : 데이터
- Request Line : 요청라인
- 대응책
- 동시연결 임계치 설정 (Concurrent Connection Threshold)
iptables
- Connection timeout 설정
- Apache httpd.conf => timeout=120초 (기본값) -> 5초
- Read Timeout 설정 (Apache 2.2 이상)
- Apache httpd.conf => RequestReadTimeout header=5
- header 부가 5초 이내에 수신되지 않으면 오류
- Apache httpd.conf => RequestReadTimeout header=5
- 동시연결 임계치 설정 (Concurrent Connection Threshold)
- Slow HTTP Read DoS : 서버와 연결할 때 TCP 윈도우 크기, 데이터 처리율을 감소 시킨 후 HTTP 송신
- TCP 흐름제어 (Flow Control) 특성을 이용
- HTTP 요청을 보냔 후 Windows 크기를 조작하여 Zero Window Packet을 지속적으로 서버에 전달
- 연결 상태를 지속적으로 유지시키는 공격
- TCP Flow Control (흐름제어)
- 3 Way-handshake 완료 후
- Client : ESTABLISHED
- Server : ESTABLISHED
- Data 전송
- Client 수신버퍼 / Server 송신버퍼
- Flow Control : 수신 측이 받을 수 있는 용량만큼 크기 조절
- Client 수신버퍼가 Full : 필드 window=0 설정, Zero Window Packet 송신
- 일정시간 경과 ( Server : Slow Read )
- Server 에서 ACK, Zero Window Probe Packet 전송 (상태확인용)
- Free 상태일 경우
- Client : 필드 window=200 설정, Window Update Packet 송신
- Server : 송신버퍼에 있는 데이터를 수신 window size에 맞춰 전송
- Full 상태일 경우
- Client : 필드 window=0 설정, Zero Window Packet 송신
- 공격자는 window 크기를 조작, Zero Window Packet 을 지속적으로 전송
- Hash DoS : 웹서버는 파라미터 관리를 위해 해시테이블 사용. 조작된 파라미터 정보를 포함한 다량의 정보를 전송해 해시값의 충돌을 유도 > 웹서버는 해시값 검색에 CPU 자원을 소모하게 됨
- Hash Table (Key:Value 자료구조) > 속도에 유리
- Hash Function : 평문 => Function => 짧은 Msg
- Hashing : Hash Table + Hash Function
- Key (예:aaabbb) 를 Hash Function 으로 짧은 값으로 만든 뒤 (예:00) > 00에 해당하는 Bucket 공간에 값을 저장
- 문제점 : 입력 값은 무한한데, Hash 값은 유한함 > 충돌 발생
- Hash 충돌을 최소화 시키는 Hash 함수를 이용해야 함
- Bucket 에는 주소값이 들어가 있음 (Linked List)
- 해당 주소에 변수명과 값이 저장되며 충돌이 발생했을 경우 또 다른 Linked List 에 연결됨 > 체이닝 기법
- CPU 자원소모
- 파라미터 (매개변수):
GET index.php?aaa=123&bbb=100
> aaa, bbb…- GET 방식은 길이 제한이 있기 때문에 HashDos 공격 어려움
- POST 방식은 많은 매개변수를 한꺼번에 전달 가능
- Hash 충돌 발생
- 대응책
- 최신 패치
- Hash Table (Key:Value 자료구조) > 속도에 유리
- TCP Traffic Flooding (TCP Session, SYN Flooding, TCP Slow Read)
- TCP Session Flooding : 3Way-Handshake 과정을 지나치게 많이 발생시킴
- L7 Service Flooding (Hash DoS, Hulk DoS, FTP/SMTP Attack)
- HTTP Traffic Flooding
- 네트워크 대역폭 소진 공격 (네트워크 계층, 전송 계층) -> 네트워크 인프라 장애, 다른 정상 Client 접속 X
- UDP Flooding 공격
- 다량의 UDP 패킷을 서버로 전송
- 서버가 보유한 네트워크 대역폭을 소진
- 정상적인 클라이언트의 접속을 하지 못하도록 함
- ICMP Flooding 공격
- 다량의 ICMP 패킷을 서버로 전송
- 서버가 보유한 네트워크 대역폭을 소진
- 정상적인 클라이언트의 접속을 하지 못하도록 함
댓글남기기