DoS
란 Denial of Service
의 약자로 서비스 거부라는 뜻을 가집니다.
즉, DoS 공격을 당한 서버나 기관 등은 보안의 3요소 중 하나인 가용성(availabillity)이 저하되어 정상적인 서비스를 수행하지 못하는 거부상태가 되는것을 의미합니다.
DoS 공격은 이제는 고전적인 공격 방법으로 취급되지만 취약한 환경이나 여전히 그 위험성은 존재합니다.
주요한 DoS 공격 몇 가지를 실습해보겠습니다.
Kali와 제가 구축한 웹 서버로 실습을 해보겠습니다.
웹 서버 우분투 버전이 서버 버전이라 GUI가 없지만 그래도 상태는 확인 할 수 있으니 일단 해보겠습니다.
공격자 : 192.168.6.129
희생자 : 192.168.6.136
이 공격은 공격자가 희생자의 서버로 TCP 3-way handshake
를 이용한 공격입니다. 정상적인 연결이라면 클라이언트 측에서 SYN 신호를 보내고 서버 측에서 SYN+ACK를 보내고 다시 클라이언트 측에서 ACK 신호를 보내야 합니다.
그러나 만약 악의적인 공격자가 랜덤한 값의 IP로 IP스푸핑을 한 뒤 SYN 패킷을 빠른 속도로 보낸다면 서버 입장에서는 SYN+ACK 신호를 보내지만 ACK 값을 받을 수 없게 됩니다. 그렇게 TCP의
Backlog Queue
가 가득 차게 되면 더 이상 서버는 SYN패킷을 받을 수 없는 서비스 거부 상태가 됩니다. 이게 바로 SYN FLOODING 공격입니다.
Backlog Queue
란 TCP가 연결을 하고자 3-way handshake를 요청을 받을 때 요청을 받았다는 사실을 기억하기 위한 공간으로 일시적으로 큐에 SYN을 받은 요청을 넣어 놓고 ACK 패킷을 받으면 ACCEPT상태가 되어 큐를 나온다.
그러면 실습으로 한번 직접 공격을 해보겠습니다.
sudo hping3 [타겟 IP] -p [포트 번호] -S --rand-source --flood
해당 명령을 입력하면 공격자는 수 많은 SYN패킷을 보내 서버를 다운 시킵니다.
이 때 서버 쪽에서 netstat -antp
명령어로 현재 포트 상태를 보면 다음과 같습니다.
이렇게 수 많은 포트들이 SYN_RECV
상태로 머물게 되고 ACK 패킷
을 받지 못하므로 Backlog Queue
는 쌓이게 되고 결국엔 서비스 거부 상태가 됩니다.
이 공격은 공격자가 희생자의 IP로 IP스푸핑
을 하고 수 많은 icmp패킷을 전송하여 희생자가 자기 자신에 대해 응답을 하게하여 서비스 거부 상태를 만드는 공격입니다.
sudo hping3 [타켓 IP] -a [타겟 IP] --icmp --flood
공격자의 환경에서 wireshark로 캡쳐한 패킷들입니다. 보기와 같이 출발지와 목적지가 동일한 패킷이 엄청 많이 나가고 있습니다.
해당 공격은 공격자가 ping, 즉 icmp 패킷
을 보내는데 패킷이 분할되어 전송되어지기 때문에 크기가 매우 큰 패킷을 보내어 희생자가 재조립하는 과정에서 자원을 모두 소진시키는 공격입니다.
sudo hping3 [타겟 IP] --icmp -d [패킷 사이즈]
Ethernet프로토콜의 MTU인 1500Byte씩 분할하여 전송하는 것을 볼 수 있습니다.
이 공격은 공격자가 희생자에게 패킷을 보낼 때 offset
값을 변조해 희생자가 재조합 과정에서 자원을 소모하게 만들어 서비스 거부 상태를 유발하는 공격입니다.
offset이란 패킷이 전송 될 때 프로토콜의 MTU(최대 전송 단위)값에 의해 단편화가 일어난다. 다음 단편과 재조합을 해야하는데 그 재조합을 할 위치를 나타내는 값이다.
sudo hping [타겟 IP] --icmp -M [sequence number] -d [패킷 사이즈] --flood
이 공격은 공격자가 희생자에게 엄청난 양의 UDP 패킷을 전송하여 희생자의 자원을 소모하게 만드는 공격입니다.
sudo hping3 [타겟 IP] --rand-source -2 -d [패킷 사이즈] -p [포트번호] --flood
랜덤한 값의 IP주소에서 출발한 것처럼 보입니다.
SYN FLOODING 같은 경우엔 서버 측에서 SYN 요청을 모두 거부할 수는 없으므로 아예 차단은 불가합니다.
방화벽 정책 설정을 통한 제어가 필요합니다. 또한 syncookies라는 기능이 있습니다.
syncookies란 연결에 필요한 정보를 쿠키에 담아 저장하기 때문에 Backlog Queue기능을 쓰지 않습니다.
sysctl -w net.ipv4.tcp_syncookies=1 을 입력
또한, Backlog Queue를 늘려주는 방법이 있습니다.
cat /proc/sys/net/ipv4/tcp_max_syn_backlog 값 확인 후
sysctl -w net.ipv4.tcp_max_syn_backlog=[변경 값]
icmp에 의한 공격들의 대응 방안은 현재는 보통 주요 서버나 라우터에서 기본적으로 icmp를 받지 않도록 설정을 하고 있습니다. 또한 따라서 icmp를 받지 않는게 가장 좋은 방법이라 할 수 있습니다.
UDP FLOODING는 미사용 udp포트 차단, 라우터 config에서 액세스 리스트를 만들어 차단합니다.