오늘은 어제 작성했던 패킷을 덤프하는 프로그램작성을 완성시켰다.

TCP의 데이터까지 출력할 수 있게 만들었다.



(패킷 덤프 프로그램 코드)




(실행결과.(왼쪽-패킷내용, 오른쪽-TCP 통신프로그램))



이 때 Data를 보내는데 TCP에서 많은 패킷이 왔다갔다 한 것을 볼 수 있었다.

TCP헤더의 flag 필드를 보면 패킷의 용도를 확인 할 수 있다.

* TCP는 통신하기 앞서 동기화과정이 먼저 들어간다.


(SYN 패킷)


위 캡쳐한 패킷을 보면 Flag가 SYN으로 나와있다.
캡쳐한 패킷내용을 보면 IP주소 165가 client고  239가 server여서 server로 동기화 요청하였다.



(SYN-ACK 패킷)



그 다음으로 서버측에서 SYN-ACK 패킷을 보내오는 것을 확인할 수 있다.
ACK 패킷은 응답을 주는 것이다. 또 서버측도 내게 동기화를 맞춰야해서 SYN패킷을 보낸다.



(ACK 패킷)



마지막으로 클라이언트쪽에서 서버로 응답 ACK 패킷을 보내는 것을 확인할 수 있다.
여기서 데이터도 같이 보냈는데,
지금 상황에서는 데이터보내는 겸 같이 ACK 패킷을 전송한 것이다.
바로 이런식으로 보내는 것을 Piggyback이라고 한다.

바로 위에서 본 것이 3 Hand Shaking 과정을 본것이다.
3 Hand shaking은 데이터를 주고 받기 전에세션을 맺는 과정이다.

전에 확인했던 걸 생각해보면
TCP에는 상태라는 게 있었다. (Listen, Established...)
그래서 Listen 상태일 때 SYN패킷이 오면 응답을 해주고 쓰리핸드쉐이킹과정을 할 수 있다.
Listen 상태가 아니면 응답을 못해주게 된다. (이점이용하면 SYN Flooding 공격을 할 수 있다.)

3 Hand shaking이 진행됨에 따라 서버측의 상태변화
Listen -> Syn receive -> sysn sent -> established

* 세션을 끝낼때는 4 Hand 쉐이킹 과정이 있다.
  이건 나중에 확인해 보겠다.

* Syn 패킷에 들어있는 시퀀스 넘버를 ISN (Initial Sequence Number) 초기 시퀀스번호라고 한다.
-> 서버에게 나를 식별할 수 있는 번호를 보내준다. 서버와 클라이언트는 이 시퀀스 번호를 서로를 알아본다.
-> SYN 패킷의 목적은 이 ISN을 서버에 전달하는 목적이다.

3 Hand shaking 동작 내용.
1. 클라이언트는 SYN 패킷에 ISN을 넣어서 보낸다.
2. 서버도 SYN-ACK 패킷으로 응답을 한다. 이 때 서버의 ISN을 생성해서 클라이언트에 보내면서 응답을 한다.
(서버의 ACK 필드에는 클라이언트의 시퀀스넘버에 1을 더한 값이 들어간다.)
그래서 이 시퀀스 넘버가 틀어지지 않는 이상 이 연결은 유효하다.
3. 클라이언트는 ACK 패킷을 전송한다.


* 세션 하이재킹 -> 남이 로그인한 세션이 인증된 패킷 시퀀스 넘버를 예측해서 그 값을 데이터로 만들어서 보내면 서버에 로그인할수있다.

-> 시퀀스 넘버는 서로 주고받는 크기만큼 늘어난다.
* ACK -> 잘 받았다는 응답이다.
만약 이 패킷을 못받으면 잘 안간줄 간주하고 다시 보낸다.
이게 TCP가 가지고있는 에러정정(Error Control)이다.

이걸 응용하여 다음 ACK응답으로 올 번호를 예상하여 출력해보았다.



(추가한 코드)


(예상 다음 ACK 번호와 일치)



확인해보면 다음 받을 ACK 번호랑 예측한 값과 같음을 확인할 수 있다.

* IP에 관해 이야기를 시작하겠다.

Layer 3
 - IP - 경로 설정
       - 네트워크 상에서 호스트를 식별하는 식별자(IP주소)로도 사용한다.
       - 라우팅 프로토콜이 들어간다.
 -> ( 라우팅 프로토콜을 이용하여 취약점을 공략해 공격할 수 있다.)

 PDU : Packet (IP 패킷)
 - 라우팅 장비가 IP주소를 보고 어디로 보낼지 결정한다.

IP address
 -> IANA에서 IP주소 관리, 할당, 표준 제정등을 한다.
     - IPv4, IPv6

- 주소의 분류 (체계적으로 관리하기 위해서)
: IPv4의 주소 체계이다.
 - 4자리 자연수를 '.' 으로 구분해서 표기한다.
 - 1자리 수는 0~255까지 표현이 가능하다.
    전체 사용가능한 ip주소 범위 -> 0.0.0.0 ~ 255.255.255.255
   -> 실제 사용 불가능한 주소가 있다.
   ex)  0.0.0.0    ( 모든 ip를 의미한다. ) 
        255.255.255.255  (브로트캐스팅 주소)
: A class, B class, C class, D class, E class

IP 주소 클래스

A Class
 -> 앞에 한자리가 구역을 나타낸다. 이것을 network id라고 표현한다.
 -> 나머지 세자리는 host id이다.
 -> 네트워크 id : 첫번째 자리
 -> host id : 나머지 세 자리. (host를 구별하기위해 사용)
 -> 맨 앞 1비트가 0으로 공통이다.
ex) 1.xxx.xxx.xxx
    10.xxx.xxx.xxx
-> 2진수로 표현하면 0000 0000.hhhh hhhh.hhhh hhhh.hhhh hhhh
-> 맨 앞비트가 0이어야한다. 즉, 0000 0000 ~ 0111 1111 까지 표현 가능하다.
 -> 10진수로 따지면 1.h.h.h(10) ~ 126.h.h.h 까지 가능한 A클래스 주소 범위다. (0도 안된다.) (127도 가상ip주소이므로 사용못한다.)
 -> 또 10.h.h.h 도 사용하지 못한다. -> 사설 IP주소이다.
 -> 127로 시작하는건 loop back 주소로 자기자신을 표현하는 IP주소이다.
 ex) 1.0.0.0 ~ 1.255.255.255 ( 1.h.h.h 주소를 가지고 있다면, 이만큼 쓸수 있는 것이다.)
  -> 1.0.0.0 (x)
  -> 1.255.255.255  (x)  
  -> 이 두개는 사용하지 못한다. 이유는 1.0.0.0 은 1.h.h.h를 대표하는 IP주소이고
      1.255.255.255는 1.h.h.h 네트워크에 있는 전체에 보내는 브로드캐스트주소이다.
      실제 사용 가능한 주소는 1.0.0.1 ~ 1.255.255.254 이다.






+ Recent posts