Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 33 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
33
Dung lượng
591,42 KB
Nội dung
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG - Bài tập lớn Giám sát an tồn mạng Lập trình bắt phân tích gói tin Python Hà nội, ngày tháng năm 2017 Mục lục DANH MỤC CÁC CHỮ VIẾT TẮT .3 DANH SÁCH CÁC BẢNG .4 DANH SÁCH HÌNH VẼ Chương – Tổng quan lí thuyết giao thức .6 1.1 Dẫn chương: .6 1.2 UDP Header 1.3 TCP Header 1.4 IP Header 12 1.5 Ethernet Header 15 Chương – Tổng quan kĩ thuật 16 2.1 Dẫn chương: .16 2.2 Giới thiệu Python 16 2.3 Lập trình bắt phân tích gói tin 17 2.3.1 Hàm phân tích gói tin giao thức UDP: 18 2.3.2 Hàm phân tích gói tin giao thức TCP: 18 2.3.3 Hàm phân tích gói tin giao thức IP: 18 2.3.4 Hàm phân tích gói tin giao thức Ethernet: 19 Chương – Lập trình việc phân tích bắt gói tin Python .20 3.1 Dẫn chương: .20 3.2 Chương trình đầy đủ: 20 3.3 Ứng dụng thực tế .26 Danh mục tài liệu tham khảo .31 DANH MỤC CÁC CHỮ VIẾT TẮT Viết tắt UDP TCP IP URG ACK PSH RST SYN DANH SÁCH CÁC BẢNG Bảng 1.1: Phân tích thành phần header giao thức UDP Bảng 1.2: Phân tích thành phần header giao thức TCP Bảng 1.3: Phân tích thành phần header giao thức IP Bảng 2.1: Các thư viện sử dụng chương trình Python Bảng 2.2: Quy đổi giá trị thư viện Struct ngôn ngữ Python DANH SÁCH HÌNH VẼ Hình 1.1: Các thành phần header gói tin giao thức UDP Hình 1.2: Các thành phần header gói tin giao thức TCP Hình 1.3: Minh họa thành phần header giao thức IP Hình 1.4: Minh họa thành phần header giao thức IP Hình 2.1: Số thứ tự định hai thức UDP TCP Hình 2.2: Hàm phân tích giao thức UDP Hình 2.3: Hàm phân tích giao thức TCP Hình 2.4: Hàm phân tích giao thức IP Hình 2.5: Hàm phân tích giao thức Ethernet Hình 3.1: Chương trình PacketSniffer.py bắt gói tin UDP Hình 3.2: Chương trình PacketSniffer.py bắt gói tin TCP Hình 3.3: Chương trình PacketSniffer.py bắt gói tin UDP Hình 3.4: Chương trình PacketSniffer.py bắt gói tin TCP Hình 3.5: Chương trình PacketSniffer.py bắt gói tin UDP Chương – Tổng quan lí thuyết giao thức 1.1 Dẫn chương: Trong chương đầu tiên, tìm hiểu, sơ lược lí thuyết header gói tin giao thức UDP, TCP, IP Ethernet Các kiến thức súc tích, gói gọn, nhằm đặt tảng vững cho chương hai phân tích cách lập trình bắt nội dung gói tin 1.2 UDP Header Giao thức User Datagram Protocol (UDP) giao thức cung cấp gói tin datagram cho việc giao tiếp máy tính chuyển mạch mơi trường tập hợp mạng máy tính kết nối Giao thức giả định Internet Protocol (IP) sử dụng làm giao thức Giao thức cung cấp thủ tục cho chương trình ứng dụng để gửi tin nhắn đến chương trình khác với chế giao thức tối thiểu Giao thức có hướng giao dịch, truyền tin bảo vệ khơng đảm bảo Các ứng dụng địi hỏi yêu cầu phân phối luồng liệu đáng tin cậy theo yêu cầu nên sử dụng TCP Control Protocol Hình 1.1: Các thành phần header gói tin giao thức UDP Dựa hình minh họa 1.1, header gói tin giao thức UDP phân tích sau: STT Bảng 1.1: Phân tích thành phần header giao thức UDP 1.3 TCP Header TCP giao thức tin cậy định hướng kết nối, đầu cuối thiết kế để phù hợp với hệ thống phân cấp giao thức có hỗ trợ ứng dụng đa mạng TCP cung cấp giao tiếp trình đáng tin cậy cặp quy trình máy chủ lưu trữ gắn với mạng truyền thơng máy tính riêng biệt kết nối với Rất giả định thực độ tin cậy giao thức truyền thông lớp TCP TCP giả sử có dịch vụ datagram đơn giản, không đáng tin cậy từ giao thức cấp thấp Về nguyên tắc, TCP nên có khả hoạt động nhiều hệ thống truyền thông khác nhau, từ kết nối cứng đến mạng chuyển mạch gói mạng chuyển mạch Các phân đoạn TCP gửi dạng gói tin internet Tiêu đề Giao thức Internet chứa nhiều trường thông tin, bao gồm địa nguồn đích Một tiêu đề TCP theo tiêu đề internet, cung cấp thông tin cụ thể cho giao thức TCP Bộ phận cho phép tồn giao thức mức lưu trữ khác với TCP Hình 1.2: Các thành phần header gói tin giao thức TCP Dựa hình minh họa, header gói tin giao thức TCP phân tích sau: Bảng 1.2: Phân tích thành phần header giao thức TCP STT 9 2.3 Lập trình bắt phân tích gói tin Hình 2.1: Số thứ tự định hai thức UDP TCP Bảng 2.2: Quy đổi giá trị thư viện Struct ngôn ngữ Python Format x c b B ? h H i I l L q Q f d s p P 17 Lưu ý: Header field sử dụng hàm giá trị unsign có giá trị dương 2.3.1 Hàm phân tích gói tin giao thức UDP: Hình 2.2: Hàm phân tích gói tin UDP 2.3.2 Hàm phân tích gói tin giao thức TCP: Hình 2.3: Hàm phân tích giao thức TCP 2.3.3 Hàm phân tích gói tin giao thức IP: 18 Hình 2.4: Hàm phân tích giao thức IP 2.3.4 Hàm phân tích gói tin giao thức Ethernet: Hình 2.5: Hàm phân tích giao thức Ethernet 19 Chương – Lập trình việc phân tích bắt gói tin Python 3.1 Dẫn chương: Trong chương số ba tiểu luận, ứng dụng thực tế script Python PacketSniffer.py vào thực tế 3.2 Chương trình đầy đủ: PacketSniffer.py # Lap trinh phan tich va bat goi tin tren Python import struct import socket import binascii import os, sys import time def analyze_udp_header(data): udp_hdr = struct.unpack("!4H", data[:8]) src_port = udp_hdr[0] dst_port = udp_hdr[1] length = udp_hdr[2] chk_sum = udp_hdr[3] data = data[8:] print "! _UDP HEADER !" print "|\t\tSource:\t\t%hu" % src_port print "|\t\tDest:\t\t%hu" % dst_port print "|\t\tLength:\t\t%hu" % length print "|\t\tChecksum:\t%hu" % chk_sum return data 20 def analyze_tcp_header(data): tcp_hdr = struct.unpack("!2H2I4H", data[:20]) src_port = tcp_hdr[0] dst_port = tcp_hdr[1] seq_num = tcp_hdr[2] ack_num = tcp_hdr[3] data_offset = tcp_hdr[4] >> 12 reserved = (tcp_hdr[4] >> 6) & 0x03ff flags = tcp_hdr[4] & 0x003f urg = flags & 0x0020 ack = flags & 0x0010 psh = flags & 0x0008 rst = flags & 0x0004 syn = flags & 0x0002 fin = flags & 0x0001 window = tcp_hdr[5] checksum = tcp_hdr[6] urg_ptr = tcp_hdr[7] data = data[20:] print "! _TCP HEADER !" print "|\t\tSource: \t%hu" % src_port print "|\t\tDest: \t\t%hu" % dst_port print "|\t\tSeq: \t\t%u" % seq_num print "|\t\tAck: \t\t%u" % ack_num print "|\t\tFlags: " 21 print "|\t\t\t URG:%d" % urg print "|\t\t\t ACK:%d" % ack print "|\t\t\t PSH:%d" % psh print "|\t\t\t RST:%d" % rst print "|\t\t\t SYN:%d" % syn print "|\t\t\t FIN:%d" % fin print "|\t\t Window:\t%hu" % window print "|\t\t Checksum:\t%hu" % checksum return data def analyze_ip_header(data): ip_hdr = struct.unpack("!6H4s4s", data[:20]) ver = ip_hdr[0] >> 12 ihl = (ip_hdr[0] >> 8) & 0x0f tos = ip_hdr[0] & 0x00ff tot_len = ip_hdr[1] ip_id = ip_hdr[2] flags = ip_hdr[3] >> 13 frag_offset = ip_hdr[3] & 0x1fff ip_ttl = ip_hdr[4] >> ip_proto = ip_hdr[4] & 0x00ff chk_sum = ip_hdr[5] src_addr = socket.inet_ntoa(ip_hdr[6]) #first 4s dst_addr = socket.inet_ntoa(ip_hdr[7]) #second 4s no_frag = flags >> more_frag = flags & 0x1 22 print "! _IP HEADER !" print "|\t\tVersion:\t%hu" % ver print "|\t\tIHL:\t\t%hu" % ihl print "|\t\tTOS:\t\t%hu" % tos print "|\t\tLength:\t\t%hu" % tot_len print "|\t\tID:\t\t%hu" % ip_id print "|\t\tFlags:\t\t%hu" % flags print "|\t\tOffset:\t\t%hu" % frag_offset print "|\t\tTTL:\t\t%hu" % ip_ttl print "|\t\tNext Proto:\t%hu" % ip_proto print "|\t\tChecksum:\t%hu" % chk_sum print "|\t\tSource IP:\t%s" % src_addr print "|\t\tDest IP:\t%s" % dst_addr if ip_proto == 6: next_proto = "TCP" elif ip_proto == 17: next_proto = "UDP" else: next_proto = "Other" data = data[20:] return data, next_proto def analyze_ether_header(data): ip_bool = False eth_hdr = struct.unpack("!6s6sH", data[:14]) #IPv4 = 0x0800 dest_mac = binascii.hexlify(eth_hdr[0]) #Destination Address 23 src_mac = binascii.hexlify(eth_hdr[1]) #Source Address proto = eth_hdr[2] >> #NextProtocol print "! _ETH HEADER !" print "|\tDestination MAC: \t%s:%s:%s:%s:%s:%s " % (dest_mac[0:2], dest_mac[2:4], dest_mac[4:6], dest_mac[6:8], dest_mac[8:10], dest_mac[10:12]) print "|\tSource MAC: \t\t%s:%s:%s:%s:%s:%s" % (src_mac[0:2],src_mac[2:4],src_mac[4:6], src_mac[6:8], src_mac[8:10], src_mac[10:12]) print "|\tProto:\t\t\t\t%hu" % proto if proto == 0x08: ip_bool = True data = data[14:] return data, ip_bool def main(): sniffer_socket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003)) recv_data = sniffer_socket.recv(2048) time.sleep(1) os.system("clear") data, ip_bool = analyze_ether_header(recv_data) if ip_bool: data, next_proto = analyze_ip_header(data) else: return if next_proto == "TCP": data = analyze_tcp_header(data) 24 elif next_proto == "UDP": data = analyze_udp_header(data) else: return while True: main() 25 3.3 Ứng dụng thực tế Thử chạy script PacketSniffer.py máy ảo Linux, ta kết sau: Hình 3.1: Chương trình PacketSniffer.py bắt gói tin UDP 26 Hình 3.2: Chương trình PacketSniffer.py bắt gói tin TCP 27 Hình 3.3: Chương trình PacketSniffer.py bắt gói tin UDP Hình 3.4: Chương trình PacketSniffer.py bắt gói tin TCP 28 Hình 3.5: Chương trình PacketSniffer.py bắt gói tin TCP 29 Hình 3.6: Chương trình PacketSniffer.py bắt gói tin TCP 30 Danh mục tài liệu tham khảo [1] https://docs.python.org/2/library/os.html [2] https://tools.ietf.org/html/rfc793#page-15 [3] https://www.ietf.org/rfc/rfc768.txt [4] https://en.wikipedia.org/wiki/Ethernet_frame [5] https://www.cybrary.it/video/packet-analyzer-part-2/ 31 ... Hàm phân tích gói tin giao thức TCP: 18 2.3.3 Hàm phân tích gói tin giao thức IP: 18 2.3.4 Hàm phân tích gói tin giao thức Ethernet: 19 Chương – Lập trình việc phân tích bắt gói. .. 2.3.2 Hàm phân tích gói tin giao thức TCP: Hình 2.3: Hàm phân tích giao thức TCP 2.3.3 Hàm phân tích gói tin giao thức IP: 18 Hình 2.4: Hàm phân tích giao thức IP 2.3.4 Hàm phân tích gói tin giao... vào việc bắt phân tích gói tin 2.2 Giới thiệu Python Phiên Python: Python 2.7.12+ [GCC 6.2.0 20160822] on linux2 Bảng 2.1: Các thư viện sử dụng tro STT 16 2.3 Lập trình bắt phân tích gói tin Hình