使用python發送icmp報文的簡單介紹

本文目錄一覽:

發送接收icmp包的問題(非誠勿擾)

問題1的回答: icmp回答請求和回答報文的格式為;

數據類型(8或0),代碼,檢驗和,標示符,序號,可選數據。

發送時8,接收時0, 除了此處不同,還有一處不同,那就是校驗和。

8變0了,所以校驗和肯定不同,不過那也是網絡對象自動賦值的,所以也不用你操心。其他的如:代碼,標示符,序號,和可選數據,這些全部是相同的。

(看我多好,還專門做個圖片,+++分)

問題2的回答:

請注意,ICMP頭部只包括數據類型,代碼,檢驗和,標示符,序號,不包括時間戳。

時間戳請求報文的格式:數據類型(13),代碼,檢驗和,標示符,序號,起始時間戳。

時間戳的回答報文格式:數據類型(14),代碼,檢驗和,標示符,序號,起始時間戳,接收時間戳,傳輸時間戳。

回答報文將自動添加接收時間戳和傳輸時間戳,由於這個報文格式是固定的,沒有可選數據,所以他的長度是固定的。

發送和接受的內容其實不是時間戳的改變,而是多了接收時間戳,傳輸時間戳。

回答完畢了,全部自己手工製作,無粘貼。

Python網絡編程8-實現SYN Flood攻擊與圖形化展示

  最基本的DoS攻擊就是攻擊者利用大量合理的服務請求來佔用攻擊目標過多的服務資源,從而使合法用戶無法得到服務的響應。DoS攻擊一般是採用一對一方式的,當攻擊目標各項性能指標不高時(例如CPU速度低、內存小或者網絡帶寬小等等),它的效果是明顯的。

   泛洪攻擊(Flood)

  指攻擊者通過殭屍網絡、代理或直接向攻擊目標發送大量的偽裝的請求服務報文,最終耗盡攻擊目標的資源。發送的大量報文可以是TCP的SYN和ACK報文、UDP報文、ICMP報文、DNS報文HTTP/HTTPS報文等。

  以下Python腳本可實現簡易的SYN Flood攻擊

運行結果如下

使用Wirshark觀察如下,產生大量TCP syn包;由於使用單IP單端口發送時,scapy使用了相同TCP序列號和數據,Wirshark認為是TCP重傳,使用多IP多端口是則正常。

以下Python腳本可對捕獲的SYN Flood包進行分析,並展示出數量大於5的連接。

運行結果如下

首先會打印出數量大於5的連接與其對應的數量。

同時會生成對應圖表,可以直觀的看到攻擊目標主機和端口的源IP排名。

用python篡改icmp報文再發送給接收方

程序處理上有些問題,建議深入研究一下ICMP協議。下面是Python 3的一個ICMP的簡單實現,可以參考一下。

import socket

import struct

def checksum(source_string):

    sum = 0

    countTo = (len(source_string)/2)*2

    count = 0

    while countcountTo:

        thisVal = ord(source_string[count + 1:count + 2])*256 + ord(source_string[count:count + 1])

        sum = sum + thisVal

        sum = sum  0xffffffff 

        count = count + 2

    if countTolen(source_string):

        sum = sum + ord(source_string[len(source_string) – 1])

        sum = sum  0xffffffff 

    sum = (sum  16)  +  (sum  0xffff)

    sum = sum + (sum  16)

    answer = ~sum

    answer = answer  0xffff

    answer = answer  8 | (answer  8  0xff00)

    return answer

def ping(ip):

    rawsocket1=socket.socket(socket.AF_INET,socket.SOCK_RAW, socket.getprotobyname(‘icmp’))

    packet = struct.pack(‘!BBHHH8s’, 8, 0, 0, 0, 0, b’abcdefgh’)

    chksum=checksum(packet)

    packet = struct.pack(‘!BBHHH8s’, 8, 0, chksum, 0, 0, b’abcdefgh’)

    rawsocket1.sendto(packet, (ip, 1))

ping(‘10.172.23.254’)

網絡編程中~ping程序發送的ICMP報文,對方的端口號要怎麼寫啊?

ICMP 的socket用的應該是 原始套接字socket(AF_INET, SOCK_RAW,…..);SOCK_RAW的raw_prot用來表示網絡層的附屬協議,不是傳輸層的tcp_prot、udp_prot

如何使用發包工具構造icmp報文

如何使用發包工具構造icmp報文

使用的是類型8和0,其過程如下:

ICMP ECHO(Type 8) 和ECHO Reply (Type 0)

我們使用一個ICMP ECHO數據包來探測主機地址是否存活(當然在主機沒

有被配置為過濾ICMP形式),通過簡單的發送一個ICMP ECHO(Type 8)數據包到目標

主機,如果ICMP ECHO Reply(ICMP type 0)數據包接受到,說明主機是存活狀態。

如果沒有就可以初步判斷主機沒有在線或者使用了某些過濾設備過濾了ICMP的REPLY。

|————————————————————-

| |

| —— ICMP ECHO request —— |

| |HOST| ——————————— |HOST| |

| | A | ———————– | B | |

| | | 如果存活或者沒有過濾 | | |

| —— 將返回ICMP RCHO REPLY —— |

| |

————————————————————–

這種機制就是我們通常所用的ping命令來檢測目標主機是否可以ping到。

python socketserver和socket的區別

區別:

1.首先介紹下socket

socket的英文原義是“孔”或“插座”。作為BSD UNIX的進程通信機制,取後一種意思。通常也

稱作”套接字”,用於描述IP地址和端口,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一 般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不同的端口對應於不同的服務。Socket正如其英文原 意那樣,像一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務

2、連接原理

根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監聽,客戶端請求,連接確認。

(1)服務器監聽:是服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態。

(2)客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然後就向服務器端套接字提出連接請求。

(3)連接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接 字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。

案例

1、最簡單的web服務器

2、簡單的聊天工具

(1)service端

(2)client端

3、更多功能

更多功能

sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)

參數一:地址簇

socket.AF_INET IPv4(默認)

socket.AF_INET6 IPv6

socket.AF_UNIX 只能夠用於單一的Unix系統進程間通信

參數二:類型

socket.SOCK_STREAM流式socket , for TCP (默認)

socket.SOCK_DGRAM 數據報式socket , for UDP

socket.SOCK_RAW 原始套接字,普通的套接字無法處理ICMP、IGMP等網絡報文,而

SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報文;此外,利用原始套接字,可以

通過IP_HDRINCL套接字選項由用戶構造IP頭。

socket.SOCK_RDM 是一種可靠的UDP形式,即保證交付數據報但不保證順序。

SOCK_RAM用來提供對原始協議的低級訪問,在需要執行某些特殊操作時使用,

如發送ICMP報文。SOCK_RAM通常僅限於高級用戶或管理員運行的程序使用。

socket.SOCK_SEQPACKET 可靠的連續數據包服務

參數三:協議

0(默認)與特定的地址家族相關的協議,如果是 0 ,

則系統就會根據地址格式和套接類別,自動選擇一個合適的協議

sk.bind(address)

s.bind(address) 將套接字綁定到地址。address地址的格式取決於地址族。

在AF_INET下,以元組(host,port)的形式表示地址。

sk.listen(backlog)

開始監聽傳入連接。backlog指定在拒絕連接之前,可以掛起的最大連接數量。

backlog等於5,表示內核已經接到了連接請求,但服務器還沒有調用accept進行處理的

連接個數最大為5,這個值不能無限大,因為要在內核中維護連接隊列

sk.setblocking(bool)

是否阻塞(默認True),如果設置False,那麼accept和recv時一旦無數據,則報錯。

sk.accept()

接受連接並返回(conn,address),其中conn是新的套接字對象,可以用來接收

和發送數據。address是連接客戶端的地址。接收TCP 客戶的連接(阻塞式)等待連接的到來

sk.connect(address)

連接到address處的套接字。一般,address的格式為元組(hostname,port),

如果連接出錯,返回socket.error錯誤。

sk.connect_ex(address)

同上,只不過會有返回值,連接成功時返回 0 ,連接失敗時候返回編碼,例如:10061

sk.close()

關閉套接字

sk.recv(bufsize[,flag])

接受套接字的數據。數據以字符串形式返回,bufsize指定最多可以接收的數量。

flag提供有關消息的其他信息,通常可以忽略。

sk.recvfrom(bufsize[.flag])

與recv()類似,但返回值是(data,address)。其中data是包含接收數據的字符串,

address是發送數據的套接字地址。

sk.send(string[,flag])

將string中的數據發送到連接的套接字。返回值是要發送的字節數量,

該數量可能小於string的字節大小。即:可能未將指定內容全部發送。

sk.sendall(string[,flag])

將string中的數據發送到連接的套接字,但在返回之前會嘗試發送所有數據。

成功返回None,失敗則拋出異常。

內部通過遞歸調用send,將所有內容發送出去。

sk.sendto(string[,flag],address)

將數據發送到套接字,address是形式為(ipaddr,port)的元組,指定遠程地址。

返回值是發送的字節數。該函數主要用於UDP協議。

sk.settimeout(timeout)

設置套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時期。

一般,超時期應該在剛創建套接字時設置,因為它們可能用於連接的操作

(如 client 連接最多等待5s )

sk.getpeername()

返回連接套接字的遠程地址。返回值通常是元組(ipaddr,port)。

sk.getsockname()

返回套接字自己的地址。通常是一個元組(ipaddr,port)

sk.fileno()

套接字的文件描述符

二、socket server

SocketServer內部使用 IO多路復用 以及 “多線程” 和 “多進程” ,從而實現並發處理多個客戶端請求的Socket服務端。即:每個客戶端請求連接到服務器時,Socket服務端都會在服務器是創建一個“線程”或者“進 程” 專門負責處理當前客戶端的所有請求。

註:導入模塊的時候 3.x版本是socketserver 2.x版本是SocketServer

1.ThreadingTCPServer

ThreadingTCPServer實現的Soket服務器內部會為每個client創建一個 “線程”,該線程用來和客戶端進行交互。

ThreadingTCPServer基礎

使用ThreadingTCPServer:

創建一個繼承自 SocketServer.BaseRequestHandler 的類

類中必須定義一個名稱為 handle 的方法

啟動ThreadingTCPServer

服務端

客戶端

內部調用流程為:

啟動服務端程序

執行 TCPServer.init 方法,創建服務端Socket對象並綁定 IP 和 端口

執行 BaseServer.init 方法,將自定義的繼承自SocketServer.BaseRequestHandler 的類 – MyRequestHandle賦值給 self.RequestHandlerClass

執行 BaseServer.server_forever 方法,While 循環一直監聽是否有客戶端請求到達 …

當客戶端連接到達服務器

執行 ThreadingMixIn.process_request 方法,創建一個 “線程” 用來處理請求

執行 ThreadingMixIn.process_request_thread 方法

執行 BaseServer.finish_request 方法,執行 self.RequestHandlerClass() 即:執行 自定義 MyRequestHandler 的構造方法(自動調用基類BaseRequestHandler的構造方法,在該構造方法中又會調用 MyRequestHandler的handle方法)

ForkingTCPServer

ForkingTCPServer和ThreadingTCPServer的使用和執行流程基本一致,只不過在內部分別為請求者建立 “線程” 和 “進程”。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/190971.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-30 09:08
下一篇 2024-11-30 09:08

相關推薦

  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29

發表回復

登錄後才能評論