DoS Attack (Scapy, Slowloris attack)

Casper·2023년 8월 9일
0
post-thumbnail

(간단한 개념 숙지를 위한 과거 포스팅 내용입니다.)

  • DoS(Denial Of Service) Attack?
    시스템을 악의적으로 공격해 해당 시스템의 리소스를 부족하게 하여 원래 의도된 용도로 사용하지 못하게 하는 공격.
    대량의 데이터 패킷을 통신망으로 보내고 특정 서버에 수많은 접속 시도를 하는 등 다른 이용자가 정상적으로 서비스 이용을 하지 못하게 하거나, 서버의 TCP 연결을 바닥내는 등의 공격이 이 범위에 포함된다.

  • Scapy? : 파이썬으로 작성된 패킷 조작 도구로서, 패킷 디코딩, 패킷전송, 패킷 캡쳐, 패킷 수정 등의 다양한 기능이 있다

  • 실습 환경

    • 공격자 : 192.168.1.129
    • 희생자 : 192.168.1.130

위와 같이 scapy를 실행하면 파이썬 언어를 인식하는 인터프리터가 다음과 같이 나오며
필요에 따라 라이브러리를 추가로 설치해야 스크립트가 정상적으로 작동하는 경우가 있습니다.

ls()와 같이 입력한다면 scapy에서 지원하는 프로토콜들을 보여줍니다.

lrs()를 입력한다면 scapy에서 사용가능한 기능들을 보여줍니다.

공격을 위해 공격자 PC에서 iptables를 사용하여 TCP 플래그가 RST인 패킷을 DROP시킵니다.

#iptables -A OUTPUT -p tcp --tcp-flags RST RST -J DROP
#iptables -L

scapy를 실행하여 IP헤더를 확인하는 IP()를 입력하여 아직 아무 것도 없는 것을 확인할 수 있으며
display() 함수를 사용하여 좀 더 자세히 봄으로써 src,dst모두 루프백주소로 되어 있는 것을 확인할 수 있습니다.

IP(dst="192.168.1.130").display

를 입력한다면 위와 같이 헤더 내용이 바뀌는 것을 확인할 수 있지만 아직까지는 실제로 변경된 것은 아닙니다.
IP 주소 대신 도메인 주소를 넣어도 무관합니다.

위와 같이 TCP 또한 같은 방법으로 헤더 내용 확인 및 헤더의 값 변경이 가능합니다.

위의 값들을 실제 변수에 넣기위해

>>>ip=IP(dst="192.168.1.130")
>>>tcp=TCP(sport=RandNum(1024,65535), dport=80, flags='S')
>>>syn=ip/tcp
>>>syn.display()

를 사용하여 변수 값 변경 및 내용을 확인합니다.
TCP의 sport는 RandNum함수를 사용하여 Well-Known 포트를 제외한
1024-65535포트 중 하나를 선택하며
syn이라는 변수에 /로 구분을 하여 ip,tcp 값을 넣어줍니다.

실제로 tcp의 three-way-handshaking 과정을 확인하기 위해
three-way-handshake를 맺는 파이썬 스크립트를 위와 같이 작성합니다.
sy1()함수를 사용하여 syn변수에 정의된 패킷을 보내고 그 응답(syn+ack)를 syn_ack에 저장한 후
ack변수에 응답 값을 설정하여 보냅니다.

희생자 PC에서 apache서버를 구동합니다.

공격자 PC에서 작성한 스크립트를 실행하여 패킷을 보냅니다.

공격자 pc에서 wireshark를 사용하여 패킷을 분석해보면 정상적인 three-way-handshake 과정을 확인할 수 있습니다.

  • TCP SYN Flooding?
    3-way-handshake를 맺을 때, 공격자가 희생자의 listen 포트로 연결을 요청하는 SYN패킷을 보낸 후 SYN+ACK를 받게 된다.
    하지만 이 후 최종적으로 ACK패킷을 보내지 않게 된다면 서버는 Half-open상태로 변하며 일정 기간(약 75초) ACK를 기다리며 Backlog Queue 메모리 공간에 SYN정보를 계속 쌓아두게 된다.
    이러한 공격이 계속된다면 희생자 서버는 더 이상 SYN을 받을 수 없는 상태가 되며 이를 TCP SYN Flooding공격이라 한다.

TCP SYN Flooding을 실습하기 위해 공격자 PC에서 위와 같은 파이썬 스크립트를 작성합니다.

희생자 PC에서

#sysctl -a | grep syncookies

를 사용하여 syncookies가 설정되어 있는지 확인합니다.

  • Syncookies?
    syncookies가 설정되어 있다면 syn+ack 패킷을 보낼 때 seq num을 쿠키 값으로 설정한다.
    상대방 ack패킷이 쿠키 값+1로 설정되어 있지 않으면 비정상 패킷으로 받아들여 연결을 맺지 않게 된다.

#sysctl -w net.ipv4.tcp_syncookies=0

을 사용하여 해당 값을 초기화 시킵니다.

공격자 PC에서 위에서 작성한 스크립트를 
스크립트명, 희생자 IP, 희생자 PORT와 함께 실행한다면
위와 같이 실행되게 됩니다.

브라우저를 열어 희생자 PC IP로 정상적인 접근을 한다고 하더라도 무한루프가 돌게 되어 접근이 불가능 합니다.

또한 wireshark를 사용하여 syn+ack만을 주고 받는 것을 확인할 수 있습니다.

희생자 pc에서 half-open 상태의 소켓을 확인하는

#netstat -an | grep -i syn_recv

를 사용하여 공격자의 random포트에게 syn를 받은 채 대기중인 상태임을 알 수 있습니다.
이번에는 응용 계층의 http 프로토콜의 취약점을 사용한 slowloris attack를 실습해봅니다.

  • Slowloris attack?
    http 헤더가 끝날 때, 개행(carriage return line feed)을 두 번 하게되어 헤더와 데이터를 구분하는데
    slowloris attack은 헤더 마지막 부분에 \r\n\r\n대신 \r\n 한 번만 보내
    아직 헤더가 더 남은 것처럼 서버를 속여 해당 연결을 계속 유지하게 한다.

공격자 pc에서 위와 같이 script를 입력합니다.

해당 스크립트를 공격자 pc에서 희생자 ip, 연결 횟수와 함께 실행을 시킨 후 희생자 pc의 브라우저에서 
http://localhost/server-status를 입력하여 현재 apache의 상태를 확인하면 연결 상태들이 모두 R(읽고 있는 상태)임을 알 수 있습니다.

wireshark를 사용하여 해당 패킷을 hex dump모드로 확인하면 개행문자 0d 0a가 한 개 밖에 없는 것을 확인할 수 있습니다.

또한 ascii모드로 확인한다면 개행으로 인한 헤더와 데이터 구분 없이 확인을 위한 메세지가 헤더에 이어 작성된 것을 알 수 있습니다.

profile
Emotional Developer

0개의 댓글