* TCP SYN Flooding 공격
 - 고전적인 DDOS, DOS 공격 기법
 - 아주 잘 알려진 공격기법이다.
 - 대량의 TCP SYN packet을 이용해서 타겟 서버의 서비스를 더이상 사용할 수 없도록
    만드는 공격 기법이다.

TCP SYN Flooding 공격툴 작성

1) TCP SYN Packet을 작성
 - SYN,ACK 패킷을 수신한 이후에 ACK를 보내지 않고,
    서버와 연결을 맺지 않는게 핵심이다.
2) 반복해서 서버에 요청
3) IP Spoofing까지 해주어야한다.

먼저 우리가 만든 ftp 서버를 열어준다.
우리가 이 서버로 공격을 할 것이다.

명령어 service vsftpd start

그 후 netstat -ant
21번 포트가 열려있는 것을 확인 할 수 있다.



(서버 오픈)



SYN 패킷 전송하는 프로그램은
우리가 전에 TCP Half Scan에서 만들었던 것을 이용할 것이다.

아래 코드는
조금 수정한 코드다.
목적지 포트번호를 21번으로 맞춘다. 



(코드)



이렇게 만든후 패킷을 보내보았다.
와이어샤크에서 패킷을 확인해보았다.



(패킷 캡쳐)





(SYN_RECV)



서버 입장에서
SYN_RECV 상태로 바뀌었다. 패킷이 접수되고 Established로 넘어가지 않은 것은
내가 ACK 응답을 안보냈기 때문에
이 상태가 유지되는 것이다.
이 상태를 더 만들어주기위해
다른 패킷들을 보내는 것이다.

패킷을 반복적으로 보내주었다.
와이어샤크로 그 상황을 캡쳐했다.



(캡쳐 상황)




(결과 화면)



-> 이러한 여러 상태들이 만들어지지 않았다.
??
이유는 IP 하나에 하나씩 연결된다.
그렇기 때문에
IP 스푸핑을 해주어서 여러 IP주소로 보내줄 것이다.

IP를 랜덤으로 보내주기 위해서
random모듈을 이용할 것이다.

random.randrange를 이용해서
랜덤수를 이용할 것이다.



(random.range() 테스트)



랜덤모듈을 이용해서
난수를 뽑는 모습이다.



(IP스푸핑 코드)



IP스푸핑을 위해 a,b,c,d 에 랜덤수를 생성해서
출발지 IP주소에 넣어주었다.
그리고 체크섬을 다시 계산해야해서
반복문 안에 빼서 넣어주었다.

실행한 결과
서버의 모습이다.



(피해모습)




(피해모습)



피해모습을 보면 수많은 SYN_RECV 상태로 여러 수많이 남아있는 모습이다.

Dos 로는 여기까지지만
DDos를 이용하면 서버를 다운시킬 수 있다.
:)



* 트래픽 분석 툴로 유명한게 WireShark이다.

이제 패킷덤프 코드 작성한것 말고 WireShark를 이용해서 패킷을 확인해보겠다.

(와이어샤크 홈페이지)



와이어샤크는 홈페이지에서 무료로 다운받을 수 있다.
자기 집 OS에 맞추어 설치하면 된다.



(첫 화면)



첫 화면에서 인터페이스를 설정 할 수 있다. 원하는 랜카드를 설정하고
캡쳐 시작을 누르면



(캡쳐 화면)



위와 같이 패킷들을 확인 할 수 있다.

우리가 패킷덤프 프로그램으로 보던 것과 비스하게 나온다.

우리가 저번에 만들었던 ICMP 패킷 만들어 전송하는 코드로
ICMP패킷을 하나 보내서 이 패킷을 확인해 보겠다.




(우리가 보낸 ICMP 패킷)



우리가 보낸 패킷에는 Checksum을 그냥 0으로 지정해서 보냈다.

그러니 응답이 없었다.
위에서 보는 것 처럼
만약 입력값이 잘못되면
패킷 내용에서 와이어샤크에서 노란색으로 표시된다.

IP 헤더는 체크섬을 0으로 하곤했다.
UDP 또한 checksum을 넣을 필요가 없다.
하지만
ICMP는 checksum을 계산해야한다.

* Checksum 구하는 법

(16진수 기준이다.)
1) 두 자리씩 더해준다.
ex) 08 00 + 00 00 + 11 11 + 00 01 + ....
    = 08 00 + 00 00 + 11 11 + 00 01 + ....
    = 19 12 + (41 41 *10)
    = 19 12 + 41 41 0
    = 4 2D 22 

2. 올림수가 발생하면 올림수를 더해준다. 위의 경우에서는
 = 2D 22 + 4
 = 2D 26

3. 그 결과에 1의보수를 해준다.(반전)
 -> 2진수로 바꾸어준다.
 - 2D 26  => 10110100100110
 -> 1의보수 => 01001011011001  => 12D9 가 나온다.16비트가 나와야하는데 14비트다
      앞에 00이 빠져있던것이다. 그렇기 때문에 00이 존재한다.
바로 이게 체크섬 값이다.
실제 체크섬 값 1110110100100110
앞에 11을 빼면 일치하다.  ( 자리수 16개에 맞추어 보수를 취해줘야한다. 그렇게 되면 11이 들어간다.)

수신측에서 체크하는 법
1. 같은방식으로 전부다 더해준다.
 = 08 00 + D2 D9 + 11 11 + 00 01 + (41 41 * 10)
 = EB EB + 41 41 0
 = 4 FF FB
 = (올림수 발생)
 = FF FB + 4
 = FF FF
FF FF 값이 나오면 올바른 값으로 인식한다.

이제 Checksum을 계산하는 법을 알았으니 프로그램 함수로 만들어 볼것이다.




(함수 코드)



위에서 비트연산을 사용했다.

* 만약 2개씩 안맞으면 뒤에 00 을 채워서 2개씩 맞춰서 더해준다.




(두번 pack해준 모습)



(정상적으로 ICMP 패킷이 전송되고 응답을 받은 모습)



IP 헤더를 이용한 공격기법
 - 테스트 가능한 공격기법이 현재는 거의 막혀있는 상태이다.
Dos( Denial Of Service )
 - 서비스 거부 공격
1) ICMP 헤더를 이용한 Dos
 - Ping of Death : 대량의 ICMP Echo Request 패킷을 발생시켜 타켓 시스템에 과부하를 일으키는 방법
 - 그래서 요즘에는 아이에 ICMP를 차단시킨다. (네이버도 그렇다.)
2) ICMP를 이용한 스니핑
 - ICMP redirect를 이용한다.
3) IP 헤더를 이용한 공격 기법
 - TearDrop : fragment offset필드의 값을 조작하는 방법(아주작은 값 혹은 큰값)
  -> 현재 패치가 다 되서 가능하진 않다.
 - Land Attack : 출발지 ip와 도착지 ip를 동일하게 조작하는 방법
  -> 이것 또한 패치가 다 되어있다.
 - Smurf Attack : 출발지 ip를 타켓으로 조작해서 브로드캐스팅한다.

Dos 는 많은 패킷을 보낼 수 있으면 더 효과적이다.
그래서 DDos가 나왔다.
Distribute (분산) Dos -> 엄청난 수의 컴퓨터가 공격하는 것이다.
        -> 공격자가 쉽게 노출될 수 있다.
DRDos -> SMURF Attack 공격과 비슷하다.
       -> DRDos는 잘 알려진 서버들이 공격에 이용된다.
      -> 공격자가 뒤로 숨을 수 있다. (공격자를 찾기 힘들다.)



+ Recent posts