프로젝트

Network basic training

da1seun9 2020. 6. 25. 19:45

OSI 7Layer

Ethernet Header


ethertype은 이후 3계층의 프로토콜을 정의

IP Header


protocol은 이후 4계층을 정의

TCP Header

Training 1 : Network packet extract

import socket # socket same device
import struct

conn = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3)) # AF == Addresss Familly

def IP(ip):
    res = ""
    for i in range(4):
        res += '%d' % ip[i]
        if i != 3:
            res += '.'
    return res

def MAC(mac):
    res = ""
    for i in range(6):
        res += '%02X' % mac[i]
        if i != 5:
            res += ':'
    return res

while True : 
    data, addr = conn.recvfrom(65536)
    dst_mac, src_mac,eth_typ = struct.unpack('! 6s 6s H ', data[:14])
    trash1,pro, trash2, src_ip, dst_ip = struct.unpack('! 9s 1s 2s 4s 4s', data[14:34])
    src_port, dst_port = struct.unpack('! H H', data[34:38])
    if eth_typ == 0x800:
        if pro[0] == 0x6:
            print("source MAC", MAC(src_mac))
            print("destination MAC", MAC(dst_mac))
            print("source IP", IP(src_ip))
            print("destination IP", IP(dst_ip))
            print("source port", src_port)
            print("destination port", dst_port)

함수

htons() : (Host to network short)

         Host 시스템에서 Network로 short 형 데이터를 보낼 때  바이트 오더를 바꾸어주는 함수

htonl() : (Host to network long )

        long 형 데이터의 바이트 오더를 바꾸어주는 함수

ntohs() : (Network to host short)

        Network에서 Host로 short형 데이터의 바이트 오더를 바꾸어주는 함수

ntohl() : (Network to host long)

        long 형 데이터의 바이트 오더를 바꾸어주는 함수

Training 2 : TCP echo Server/Client

# echo server
import socket
HOST = ip주소 #127.0.0.1 same localhost
PORT = 포트번호
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print("binding...")
s.bind((HOST,PORT))
print("success to bind")

s.listen()
print("Listen...")

c, addr = s.accept()
print("Connected by", addr)

while True:
    data = c.recv(65536)
    if not data:
        break
    print('Received from',addr,data.decode())
    c.sendall(data)

c.close()
s.close()
# client
import socket

HOST = ip주소 #127.0.0.1 same localhost
PORT = 포트번호

c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect((HOST, PORT))
while True:
    data = input().encode()
    if data == b'exit':
        c.close()
        break
    c.sendall(data)
    data = c.recv(65536)
    print('Received', repr(data.decode()))

 

집에 있는 Desktop(client)과 노트북(server)간의 통신을 해보았다.

한 가지 주의 할 것은 윈도우에서 통신을 할 때 명령프롬포트를 관리자 권한으로 들어가야한다.

 

htons함수 관련 출처:https://fattarzan.tistory.com/entry/htonl-htons-ntohl-ntohs[뚱보타잔]

'프로젝트' 카테고리의 다른 글

Netteok 팀 프로젝트  (0) 2020.08.31
Network webserver  (0) 2020.06.27
Windows Software Zer0-day hunting  (0) 2020.02.21
1-day Exploit 실습  (1) 2020.02.21
SEH overwrite  (0) 2020.02.17