# IP header와 Ethernet header 패킷 분석


IP header


1. IP(Internet Protocol) header

- 20byte 고정 크기

- 옵셔널 필드가 존재하기 때문에 사실은 가변 크기 

- 최근에는 거의 사용되지 않기 때문에 20byte로 고정되어 있다.

- E\x00\x00!\x00\x00@\x00@\x11\xa2i\xc0\xa8\x0b\xdf\xc0\xa8\x0b3


- 1: E

- 2: \x00 

- 3: \x00 ! 

- 4,5: \x00\x00 @ \x00 

- 6: @ 

- 7: \x11

- 8: \xa2 i 

- 9: \xc0 \xa8 \x0b \xdf 

- 10: \xc0 \xa8 \x0b 3


1) ip 버전과 헤더의 길이 (1byte) - 첫번째 필드

- E -> 0x45 -> 상위4비트(버전) / 하위4비트(길이)

- 0x4 : 0100 -> 4bit -> 4는 ip버전(ipv4)

- 5 : 0101 -> 좌로 2번 이동 -> 10100 -> 20bit -> 20은 헤더의 길이


2) service(1byte) - 두번째 필드

- 0x00(default)

- 서비스별로 통신을 제어하기 위한 용도

- 지금은 사용되지 않는다.


3) Total Length(2byte) - 세번째 필드

- IP Packet의 전체 크기 (ip헤더 -> E부터 보낼 데이터까지 길이)

- ip header(20) + udpheader(13)

- \x00 ! -> 0x00 0x21 -> 33byte


4) identfication(2byte) - 네번쨰 필드

5) flag & fragment offset(2byte) - 다섯번째 필드

- 4,5필드는 ip fragment(분할) 와 관련된 헤더필드 (ip 패킷을 여러개로 분할 할 수 있다)


6) TTL(Time To Live) (1byte) - 여섯번째 필드

- packet이 지나갈 수 있는 라우터(홉/hop)의 최대 갯수

- @ -> 0x40 -> 64

- 최대 64개의 라우터를 지나갈 수 있다.

- 리눅스64, 윈도우128, 유닉스253

- 30개정도면 전세계 통신가능


7) 프로토콜의 타입(1byte) - 일곱번째 필드

- ip packet의 올수 있는 타입

- \x11 -> 17

- icmp:1, tcp:6, udp:17

8) 체크섬(2byte) - 여덜번째 필드

9) 출발지 아이피(4byte) - 아홉번째 필드

10) 도착지 아이피(4byte) - 열번째 필드



#Layer 2 데이터 링크 계층 (Data-Link Layer)

- 대표적인 프로토콜: Ethernet, ARP, VPN(터널링)

- 주소 체계: MAC(Media Access Control) Address

- PDU (프로토콜 데이터 단위) : Frame


- 물리적으로 같은 네트워크(라우팅이 필요하지 않음)

- 물리적인 이상이 없다면 반드시 통신이 되어야 한다.


MAC Address의 주소 체계

- 16진수 6자리 숫자로 구성

- 각 자리를 ':' 혹은 '-' 로 구별

- 앞의 3자리 숫자를 벤터 아이디로 사용(네트워크 회사 아이디)


2. Ethernet header

- \x00 \x0c ) \xcc \xcc \x01 \x00 \x0c ) \xcc \xcc \x02 \x08 \x00

- 14바이트 고정크기

1) 도착지의 물리 주소(6byte)

2) 출발지의 물리 주소(6byte)

3) 이더넷의 타입(2byte)

- 대표적인 타입

IPv4: 0x0800

IPv6: 0x86DD

ARP : 0x0806



1. 헤더 패킷의 ASCII를 10진수로변환해주기 위해 파이썬 모듈 struct를 이용. 

- struct (https://ko.wikipedia.org/wiki/Struct


 - 각 타입별 포멧 정보


2. 파이썬에서 확인

- byte = b'V\xce\x97W\x00\r5\xebhello'

- struct.unpack('!HHHH', byte[:8])

  (22222, 38743, 13, 13803)

- struct.pack('!HHHH', 22222, 38743, 13, 13803 )

  b'V\xce\x97W\x00\r5\xeb'


struct를 통해서 2바이트씩 숫자를 확인할 수 있다.

! 바이트 오더

- 0x12 34 56 78

1) little endian -> 0x78 56 34 12 (순서가 바뀜)

2) big endian -> 0x12 34 56 78 (그대로)


3. Layer 3: 네트워크 계층 (Network Layer)

https://en.wikipedia.org/wiki/Network_layer

- 대표적인 프로토콜: IP, ICMP, 라우팅 프로토콜(RIP, OSPF, ...), IPSEC

- 주소 체계: IP Address

- PDU( Protocol Data Unit/프로토콜 데이터 단위): Packet

- 서로 다른 네트워크간의 통신 (경로 설정)




4. IPv4

- 네트워크상에서 호스트를 식별할 수 있는 번호 부여

- 4바이트의 숫자로 표현: 0 ~ 42억개 정도

- ip 관리 국제 기관 IANA: 주소 쳬계, 배포, 관리

- 4자리 숫자를 '.'으로 구분하여 표기

! 사용할 수 없는 번호

- 0.0.0.0 -> 네트워크의 대표 아이피

- 255.255.255.255 -> 브로드캐스팅 아이피

- 둘 다 장비에 설정할 수 없음.


A class

- 첫 번째 1자리 숫자를 네트워크 아이디로 사용

- 나머지 3자리 숫자를 호스트의 아이디로 사용

- 첫 번째 비트가 0으로 공통 비트를 갖도록 설정

- 0 000 0000 ~ 0 111 1111: 0 ~ 127

- 126개의 네트워크를 표현

- 호스트는 나머지 3자리를 가지고 표현

- 네트워크별 호스트의 아이디 표현 범위.

0000 0000.0000 0000.0000 0000 ~ 1111 1111.1111 1111.1111 1111

-> 0.0.0 ~ 255.255.255 : 16,581,373개의 호스트를 표현


! 사용할 수 없는 번호

- 네트워크 번호로 0번을 사용할 수 없다.

- 127번은 특별한 용도로 지정: 루프백 주소(가상 인터페이스 주소)

- 호스트의 번호도 0번을 사용할 수 없다. 1.0.0.0

- 호스트의 번호도 255번으로 사용할 수 없다. 1.255.255.255


! 사설 네트워크: private network

- ip고갈문제를 해결하기 위해 등장.

- 공인망 (public network)과는 별도로 분리된 네트워크

- a class의 사설 네트워크 아이디는 10번


! NAT (Network Address Translation)

- 네트워크 주소 변환

- 라우터에서 지원하는 기능

! 넷마스크: 네트워크 아이디를 분리

- 10.10.10.2/255.0.0.0

-> 0000 1010. 0000 1010. 0000 1010. 0000 0010

    1111 1111. 0000 0000. 0000 0000. 0000 0000 and

-> 0000 1010. 0000 0000. 0000 0000. 0000 0000 -> 10.0.0.0


- 10.10.10.2/255.128.0.0


B class

C class

--------------------------------------------

D class

- 공통비트: 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 (멀티캐스팅 구간)

E class

- 공통비트: 1111

- 그냥 안쓴다, 예약된 번호

UDP socket programming

- 주로 단순한 통신에 많이 사용


1. UDP client

1) udp socket 생성

2) sendto, recvfrom()

! connect()를 하지 않기 때문에 정확히 에코가 되었다고 말할 수 없다.



2. UDP Server

server.sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )

1) udp socket 생성

2) 생성된 소켓을 통해 bind()

3) sendto(), recvfrom()

- udp server는 다른 클라이언트용 소켓을 필요로 하지 않는다.



* RAW 소켓 프로그래밍  (특정 프로그램에 영향을 받지 않는다)


- 네트워크 인터페이스(eth0)를 지나다니는 내용들을 직접 덤프(로그,캡쳐,모니터링).

- 프로토콜 헤더를 직접 작성할 수 있음

- (통신에 필요한 내용을 직접 작성)

예) connect()..등등



##UDP 샘플 (프로토콜 헤더)

받음

b'\x00\x0c)\xcc\xcc\x01\x00\x0c)\xcc\xcc\x02\x08\x00E\x00\x00!\x00\x00@\x00@\x11\xa2i\xc0\xa8\x0b\xdf\xc0\xa8\x0b3V\xce\xd3\x12\x00\r\xfe\xbakorea

보냄

b'\x00\x0c)\xcc\xcc\x02\x00\x0c)\xcc\xcc\x01\x08\x00E\x00\x00!\x00\x00@\x00@\x11\xa2i\xc0\xa8\x0b3\xc0\xa8\x0b\xdf\xd3\x12V\xce\x00\r\xfe\xbakorea'


UDP 헤더의 구조

- 헤더의 길이 8바이트 고정 크기를 갖는다.

- UDP 헤더의 실제 길이는 데이터를 포함한 길이.(가변적)

- header (8byte) + data(5byte)

- V \xce \xd3 \x12 \x00 \r \xfe \xba korea = 13byte


- 규칙 순서 (아스키코드 참고)

1) 출발지 포트번호 (2byte)

2) 도착지 포트번호 (2byte)

3) 헤더의 전체크기 (2byte)

4) 체크섬 (2byte)

5) 데이터 (가변)

1. OSI 7 계층 (https://ko.wikipedia.org/wiki/OSI_%EB%AA%A8%ED%98%95)

 

 

 

 

OSI 7 계층의 탄생 배경

- 여러 정보 통신 업체 장비들간 호환성 필요

- 1984년 OSI 참조 모델 발표

 

 

 상위 3계층(5~7)
 7 Layer (Application Layer/응용 계층)
  - 온라인 게임, 채팅 앱, 웹, ...
  - DNS, DHCP, FTP, HTTP, ..
 6 Layer (Presentation Layer/표현 계층)
 5 Layer (Session Layer/세션 계층)
  - 암호화, 인코딩, ...
  - 추상적인 계층
  - SSL, ...
--------------------------------------------------------------
 하위 4계층(1~4) : 통신을 담당
 4 Layer (Transport Layer/전송 계층)
  - TCP, UDP
  - 전송 방식
 3 Layer (Network Layer/네트워크 계층)
  - IP, ICMP,
  - 전달 방식(경로 설정)
 2 Layer (Data-link Layer/ 데이터 링크 계층)
  - ARP, Ethernet
  - 가장 신뢰할 수 있는 구간.
  - 통신의 가장 기본인 계층
 1 Layer (Physical Layer/물리 계층)
  - 모든 물리적인 내용

 

 ! TCP/IP protocol Suite (인터넷 5계층)
  - 표준안을 만들기 전 계층 
  - osi 5,6 계층을 제외한 거임

 

 

2. 파이썬을 이용한 소켓 프로그래밍

- 소켓(socket)이란? 입/출력

 

1) 표준 입/출력: input / print ...

2) 파일 입출력: File Descroptor(FD), File Object ...

3) 네트워크를 통한 입/출력: Soket Object, Client Socket, Server Socket

 

! 네트워크 구조

- 1:1 방식(P2P/PeerToPeer): 일반적인 전화구조, 토렌트 등..

- 1:n 방식(Clinet/Server): 게임, 웹서비스 등..

 

3. TCP socket(Client) 만들어보기

  1) TCP socket (Client) 만들어보기
    1)) socket.socket(): 전송방식 결정
   
    생성된 소켓 객체를 통해 누구랑 연결할지를 결정
    2)) sock.connect( ('ip', port) )
   ! port: 서버에서 서비스를 식별하는 식별자 (서버에서 정한다)
    현재 서버에서 서비스중인 포트번호 확인
    #> netstat -ant (꼭 익혀두기)
   포트는 1 ~ 65535까지 사용이 가능
   well-known port: 1 ~ 1024(10000) 잘 알려진곳에 쓰이는 곳

   ! ip: 네트워크상에서 호스트를 식별하는 식별자


  import socket
  sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
     ipv4라는뜻 TCP라는뜻

 

 


  2) TCP Socket(Server)
   sock.bind()
  - 생성된 소켓 객체를 통해 사용할 호스트와 포트를 정한다
   sock.listen()
  - 생성된 소켓 객체를 통해 연결할 수 있는 최대 갯수, 서버상태를 listen으로 바꿔주게 된다.
   sock.accept()
  - 클라이언트가 연결되기를 기다린다.
  - 동기화 메소드로 블록킹 된다.
  - 클라이언트 연결요청이 오면 해당 클라이언트에 대한 소켓 객체를 생성해서 돌려준다.

 

 


  3) 데이터 송/수신
  - 규칙에 따라서 전송
  - 문자 데이터 송/수신
  - 누가먼저 데이터를 보내든 상관 없다.
  - 멀티 스레드 프로그래밍을 하지 않는 이상 송/수신은 동기화 되어야한다.

  
  * 파이썬에서 제공하는 문자열 타입
  - str, bytes, bytearray

  - 파이썬의 str 타입은 유니코드(2바이트로 표현)
  - 그래서 파이썬3 이후부터는 한글 사용이 가능

  - 네트워크 통신은 바이트 단위로 이루어진다.
  - bytes 타입은 문자에 대한 바이트 표현
  
  - bytes Vs bytearray = 변경 불가능 Vs 변경 가능한

1. 원활한 실습을 진행하기 위해 리눅스 보안설정 해지


#> rm -rf /etc/sysconfig/iptables


vi /etc/sysconfig/selinux 에서 

SELINUX = enforcing을 disabled로 변경 후 저장


리눅스 reboot 하기

리붓 후 getenforce가 disabled로 되어있는지 확인.

iptables -L 도 위와같이 되어있다면

ok



2. Python 실행기 설치 ( http://www.python.org )

- 리눅스에서 yum 명령어를 사용하기 위해선 인터넷과 연결 되어있어야함.



1) 개발자 환경 구성하기


#> yum install wget 


#> yum groupinstall "Development Tools"


Python 소스코드 다운로드

#> wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz

다운로드 완료 후 

ls로 Python-3.6.2.tgz 파일이 잘 받아졌는지 확인.



2) Python 소스 설치


#> tar xvfz Python-3.6.2.tgz 후

ls로 Python-3.6.2 파일 확인


#> cd Python-3.6.2 로 이동


#> ./configure 를 해준다.


#> make

#> make install

을 해주면 Python 세팅 완료.


실습환경 세팅 (2)


1. 설치된 VMware에 리눅스 CentOS 설치하기


가상머신 setting에 들어가서 CD/DVD에 CentOS iso파일을 선택한다

이후 VMware 실행


VMware에서 실행된 CentOS 설치화면 모습


Skip 선택 (가상머신이기 때문에 ok를 누르면 오류가 생긴다)


설치 첫 화면


한국어로 선택, 영어도 상관없다


기본 설정된 영어로 next


기본 저장 장치 next


어짜피 데이터가 없기때문에 데이터를 삭제 선택


원하는 호스트명 이름 설정


next


호스트 암호 설정 


모든공간 사용 후 next


디스크에 변경사항 기록 next


리눅스 설치 진행!


리눅스 설치 완료. 재부팅을 해주면 리눅스 화면이 나온다.


리눅스 첫화면. 계정 로그인을 해준다.

호스트명 root / 설치 진행하면서 설정한 암호


인터넷 연결을 해주기위해 세팅을 해야한다.

vi /etc/sysconfig/network-scripts/ifcfg-eth0 을 써주면 상단 화면이 나오는데

ONBOOT=yes로 변경을 해준후 :wq 저장 나오기

이후 reboot으로 리눅스 재시작


다시 계정 로그인 후 인터넷이 연결되었는지 확인하기

ping 8.8.8.8

위의 화면처럼 뜬다면 정상적으로 연결이 된것임.


이로써 가상머신 VMware 와

리눅스 CentOS 설치가 완료 되었다.



네트워크 해킹 실습환경 세팅


1. 필요한 프로그램: 가상머신 VMware Workstation12 PRO, 리눅스( CentOS-6.9-i386-minimal )

- 가상 머신 VMware를 이용하여 리눅스 CentOS를 설치




따로 큰 설정이 필요 하지 않음으로 Typical 타입으로 설치


centos를 미리 받아놨다면 iso를 체크하고 next


CentOS-6.9-i386-minimal 은 64비트가 아닌 32비트

CentOS로 선택


가상머신 이름과 저장경로 설정






정상적으로 설치된 가상머신 모습


네트워크 설정에서 Bridged로 변경하자 


+ Recent posts