어제 IP 주소의 A class 까지 알아보았다.

B class부터 살펴보면

B Class
 - 네트워크 id : 첫번째와 두번재 수를 사용
 - host id : 나머지 두자리를 사용
 - 공통비트 : 10
 
 ex)  1000 0000.0000 0000.hhhh hhhh.hhhh hhhh(2)
      1011 1111.1111.1111.hhhh hhhh.hhhh hhhh(2)
 -10진수로 바꾸면 앞자리가 128이다. (A 클래스가 127까지였고, B클래스는 128부터이다.)
 -128.0.h.h ~ 191.255.h.h (B 클래스 IP주소의 범위)

 ex) 한 네트워크에서 사용 가능한 호스트의 주소
  
  160.120 (네트워크)라면
  
  160.120.0.0 ~ 160.120.255.255
  
- 이 경우 사용 불가능한 주소
  160.120.0.0    -> 160.120 네트워크의 대표주소
  160.120.255.255  -> 160.120. 네트워크 안으로 브로드캐스트 하는 주소
  172 번으로 시작하는 것은 사설IP로 네트워크 ID로 사용할 수 없다.

C Class
 - 네트워크 id : 첫번째, 두번째. 세번째 수를 사용
 - host id : 나머지 한자리를 사용
 - 공통비트 : 110
 1100 0000.0000 0000.0000 0000.hhhh.hhhh(2)
 1101 1111.1111 1111.1111 1111.hhhh.hhhh(2)
 192.0.0.h ~ 223.255.255.h(10) (C 클래스 IP주소의 범위)

 - 사용불가능한 주소는 위의 규칙과 같다.
 - 192 번은 사설 IP로 사용할 수 없다.

D Class
 - 장비나 인터페이스에 설정이 불가능하다.
 - 즉, 사용할 수 없는 IP주소이다.
 
 - 멀티캐스팅 용도로 사용한다.

 - 공통비트 : 1110
 1110 0000.0000 0000.0000 0000.0000 0000
 1110 1111.1111 1111.1111 1111.1111 1111
 224.0.0.0 ~ 239.255.255.255(10) 

E Class
 - 장비나 인터페이스에 설정이 불가능하다.
 - 즉, 사용할 수 없는 IP주소이다.

 - 공통비트 : 1111
 240.0.0.0 ~ 255.255.255.255(10)
 -> 우리는 못쓴다. 예약된 주소로써 사용되지 않는다.

- 통신 방법
유니캐스팅 -> 1:1로 전달하는것이다.
멀티캐스팅 -> 특정 그룹에만 전체 전달하는 것이다.
브로드캐스팅 -> 연결되있는 모든 host에 전달하는 것이다.

위 주소들의 특징을 살펴보면 어떤 통신 방법으로 통신하는지
주소만 보고 알 수 있다.




(목적지 주소가 224.0.0.252)


주소를 보면 D Class에 해당하는 것을 알 수 있다. 이 주소는 멀티캐스팅을 위한 주소이다.
멀티캐스트하는 패킷이라는 것을 알 수 있다.




(192.169.3.255 주소)



이번엔 목적지 주소 끝이 255 이다. 이 주소는 현재 192.168.3.0 이라는 네트워크 id를 가진 네트워크 안에서 브로드캐스트하는 주소이다.

* 넷마스크
 - ip에서 네트워크 아이디를 확인하기 위한 목적이다.
 - 네트워크를 분리한다.(서브네팅)
- 혹은 네트워크를 통합한다.(슈퍼네팅)
 
ex)  192.168.3.100/24      ( /24 ) 가 넷마스크를 의미한다. 넷마스크의 비트수
    -> 24비트를 넷마스크로 쓰겠다는 말이다.

 - 192.168.3.100 / 255.255.255.0  
 -> 2진수로 바꾸면
 1100 0000.1010 1000.0000 0011.0110 0100  
   / 1111 1111.1111 1111.1111 1111.0000 0000 

 Bit Masking 은 and 연산을 통해 이루어진다.

 1100 0000.1010 1000.0000 0011.0110 0100
 1111 1111.1111 1111.1111 1111.0000 0000
 ------------------------------------------------------------
 1100 0000.1010 1000.0000 0011.0000 0000 
-> 10진수로 바꾸면 192.168.3.0 이 나온다.
-> 네트워크 id를 얻을 수 있게된다.
 -> 서브넷마스크의 역할이다.
 - 그래서 이 서브넷마스크를 조절하면 네트워크망의 크기를 조절할 수 있다.(서브넷팅, 슈퍼넷팅)

 -> 만약 의도적으로 서브넷 마스크를 비트 하나 더 늘려주면
 1111 1111.1111 1111.1111 1111.1000 0000  -> 서브넷마스크 25
 192.168.3.100/255.255.255.128
 1100 0000.1010 1000.0000 0011.0110 0100 
        /  1111 1111.1111 1111.1111 1111.1000 0000
 
 ->그렇게되면 두개의 네트워크로 분할 할 수 있고, host의 수는 절반만큼 줄어든다.
 1100 0000.1010 1000.0000 0011.0110 0100
 1111 1111.1111 1111.1111 1111.1000 0000
 ----------------------------------------
 1100 0000.1010 1000.0000 0011.0000 0000   -> 192.168.3.0

만약 
 192.168.3.200/255.255.255.128
 1100 0000.1010 1000.0000 0011.1100 1000
 1111 1111.1111 1111.1111 1111.1000 0000
 ---------------------------------------
 1100 0000.1010 1000.0000 0011.1000 0000  -> 192.168.3.128 이라는 네트워크 id가 된다.
-> 같은 192.168.3 C class에서 네트워크 id가 2개로 분할이 됬다.
(하지만 요즘은 넷마스크로 서브네팅을 하지 않는다.)
(요즘은 VLAN등 좋은 장비들이 나와서 그 장비를 이용한다.)

* 공인망, 사설망
- 공인망(Public Network)
   : 공인 IP를 사용하는 네트워크

- 사설망(Private Network)
   : 사설 IP를 사용하는 네트워크

 사설 IP ??
 -> 공인망과 분리된 네트워크, 공인망과 격리되었다.
 -> A class (10번)
    B class (172번)
    C class (192번)
 -> NAT  (Network Address Translation) 네트워크 주소 변환
 : 사설망도 외부와 통신이 되게하기 위해서  사설망과 외부망이 연결되는 지점에 공인IP하나를 준다.
 사설망 내에서 밖으로 나갈때 공인 IP로 바꾸어서 내보낸다.


 IP fragment Vs TCP segment  (UDP는 segment가 없다.)

* IP fragment ( IP 단편화/조각,파편... )
 - IP 패킷을 조각내는 것이다.
 - IP 패킷으로 패키징할 대 너무 크니까 적정크기로 잘라서 패키징한다.
 -> 이것이 IP fragment라고 한다.
 - 적정 크기는 MTU로 정한다.
 - MTU (Maximum Transfer Unit) (최대 전송 단위) : 보통 1500바이트




(2005바이트를 보내는 화면)



(2005바이트 수신)



위 결과를 보면 IP패킷이 분할되서 전송된것을 볼 수 있다.

ex)
우리가 2000바이트를 udp로 보내는 경우
 보낼려는 데이터 2000바이트
 
 거기에서 udp헤더가 붙는다.
 -> 2008바이트
 - 앞에 1500만큼 잘라낸다.
 
 그리고 IP패킷으로 패키징,
 -> IP패킷이 2개 나온다.
 - 도착지에서는 이걸 다시 하나로 합쳐야된다.
 - Identification을 보고 같으면 합친다. 
 분할된건지 어떻게 알까? -> Flag를 보면 안다.  
0으로 되있으면 분할되지 않았다. DF면 분할하지 마라. MF는 뒤에 더 있다라는 내용이다.

정리. (Flag비트)
 0010 0000 ->(More Fragment) MF 맨앞이 1이면 32 -> 이거면 뒤에 분할된게 더 있다는 뜻이다.
 0000 0000 -> 아무것도 분할되지 않았다는 뜻이다.
 0100 0000 -> (Dont Fragement) : 분할하지 마라

 offset은 원래 분할되기 전의 위치를 뜻한다.

- UDP는 segment가 없다. 분할된건지 확인할 헤더 필드가 없다.
- TCP단에서 segment가 된다.
TCP segmentation ( TCP 조각, 파편...)
 - TCP segment를 조각내는 것이다.
 - MSU( Maximum Segment Unit ) : 1500 (윈도우에서)
 ->그래서 일반적인 PC에서는 이미 TCP단에서 1500바이트에서 이미 조각 났기때문에
 IP fragment를 보기는 힘들다. -> IP에서는 분할되지 않아도된다. 일반적인 PC에서
 -> TCP 패킷을 의도적으로 작게 조각내서 보내면 방화벽을 통과시킬 수 있다.
 -> TCP에는 시퀀스 넘버가 있어서 재조립도 가능하다.

 * 요새는 offset을 보지않는다. 취약점때문에 사용하지 않는다.
 왜냐하면 이걸 이용해 방화벽우회도 할 수 있기 때문이다. 혹은 offset 설정으로 Tear Drop 공격기법이 있다.

상황
서버가 있다고 가정해보자.

 서버가 있다. 서버에 방화벽을 둔다. 
 방화벽 두개가 같이 있어야한다. ( host기반의 방화벽(윈도우즈방화벽), 네트워크 기반의 방화벽 )
 IP패킷의 최소 8바이트까지 쪼갤수있다. 작게 쪼개진 패킷들을 보낸다.
 방화벽은 첫번째 프레그먼트만 확인 후 이상이 없으면 나머지는 그냥 통과시킨다.
 성능면때문에 첫번째 fragment만 확인한다.
 
 그래서 offset을 조작해서 통과한 패킷들을 서버에 도착해서 조립을 하면 중첩되면서 새로운 데이터가 된다. (요즘은 IP는 안되지만 TCP에서는 된다.)
 
 그리고 뚫고 들어오면 이제 호스트기반의 방화벽이 있다.
호스트기반의 방화벽에서는 천천히 잘 조립해서 확인한다. 그래서 서버에서 막힐 수 있다.
 그래서 호스트 기반의 방화벽에서는 우회할 수 없다.

 이 방법으로 네트워크 방화벽을 우회할 수 있다.
 그러면 네트워크 기반의 방화벽은 필요없는거 아닐까?
 -> 그렇지 않다.  DDos 공격이 있다.

 * DDos 공격
 -> 대량의 패킷을 서버에 보내 서버의 부하를 많게 하여 다운되게 하는 것이 목적이다.
 -> 호스트 기반의 방화벽에서는 막지 못한다. 이미 호스트 기반의 방화벽까지 들어왔다는거 자체가 공격 성공이다.
 --> 그래서 방화벽 두개를 운영하는게 맞다.

 : 현재는 offset을 조절하는 공격은 쉽지 않다.



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

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