1. 程式人生 > >Python黑帽子學習筆記-----第三章

Python黑帽子學習筆記-----第三章

#-*- coding:utf8 -*-  
  
import socket  
import os  
import struct  
import threading  
import time  
import sys  
from netaddr import IPNetwork,IPAddress  
from ctypes import *  
  
# 監聽主機,即監聽那個網路介面,下面的ip為我的ip  
#host = "172.xx.xx.xx" 
# 實訓ip
host = "10.0.2.10"
  
# 掃描的目標子網  
# subnet = "192.168.1.0/24"  
# 沒有命令列引數,預設192.168.1.0/24  
if len(sys.argv) == 1:# 掃描當前IP網段存在的主機
    #subnet = "172.19.65.0/24" 
     subnet = "10.0.2.0/24"
else:  
    subnet = sys.argv[1]  
  
# 自定義的字串,我們將在ICMP響應中進行核對  
magic_message = "PYTHONRULES!"  
  
# 批量傳送UDP資料包  
def udp_sender(subnet, magic_message):  
    time.sleep(5)   #可以說程式暫停5秒吧  
    # 建立一個socket物件(SOCK_DGRAM:UDP客戶端)  
    sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  
  
    for ip in IPNetwork(subnet):  
        try:  
            # 嘗試傳送magic_message這個訊息到子網的每個ip,還用了個不怎麼可能用的65212埠  
            sender.sendto(magic_message, ("%s" % ip, 65212))  
        except:  
            pass    #代表什麼也不做  
  
# ip頭定義  
class IP(Structure):  
    _fields_ = [  
        ("ihl",             c_ubyte, 4),    #ip head length:頭長度  
        ("version",         c_ubyte, 4),    #版本  
        ("tos",             c_ubyte),       #服務型別  
        ("len",             c_ushort),      #ip資料包總長度  
        ("id",              c_ushort),       #識別符號  
        ("offset",          c_ushort),      #片偏移  
        ("ttl",             c_ubyte),       #生存時間  
        ("protocol_num",    c_ubyte),       #協議數字,應該是協議型別,這裡用數字來代表時哪個協議,下面建構函式有設定對映表  
        ("sum",             c_ushort),      #頭部校驗和  
        ("src",             c_uint32),       #源ip地址  
        ("dst",             c_uint32)        #目的ip地址  
    ]  
  
    # __new__(cls, *args, **kwargs)  建立物件時呼叫,返回當前物件的一個例項;注意:這裡的第一個引數是cls即class本身  
    def __new__(self, socket_buffer=None):  
        return  self.from_buffer_copy(socket_buffer)  
  
    # __init__(self, *args, **kwargs) 建立完物件後呼叫,對當前物件的例項的一些初始化,無返回值,即在呼叫__new__之後,根據返回的例項初始化;注意,這裡的第一個引數是self即物件本身【注意和new的區別】  
    def __init__(self, socket_buffer=None):  
        # 協議欄位與協議名稱的對應  
        self.protocol_map = {1:"ICMP", 6:"TCP", 17:"UDP"}  
  
        # 可讀性更強的ip地址(轉換32位打包的IPV4地址為IP地址的標準點號分隔字串表示。)  
        self.src_address = socket.inet_ntoa(struct.pack("<L", self.src))  
        self.dst_address = socket.inet_ntoa(struct.pack("<L", self.dst))  
  
        # 協議型別  
        try:  
            self.protocol = self.protocol_map[self.protocol_num]  
        except:  
            self.protocol = str(self.protocol_num)  
  
  
class ICMP(Structure):  
    #  
    _fields_ = [  
        ("type",            c_ubyte),       #型別  
        ("code",            c_ubyte),       #程式碼值  
        ("checksum",        c_ubyte),       #頭部校驗和  
        ("unused",          c_ubyte),       #未使用  
        ("next_hop_mtu",    c_ubyte)        #下一跳的MTU  
    ]  
  
    def __new__(self, socket_buffer):  
        return self.from_buffer_copy(socket_buffer)  
  
    def __init__(self, socket_buffer):  
        pass  
  
  
if  os.name == "nt":  
    socket_protocol = socket.IPPROTO_IP  
else:  
    socket_protocol = socket.IPPROTO_ICMP  
  
sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)   #raw的中文是生的意思,大概就是原始套接字的意思吧  
  
sniffer.bind((host, 0)) #這裡埠為0,監聽所有埠吧~  
  
# 設定在捕獲的資料包中包含IP頭  
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)  
  
# 在Windows平臺上,我們需要設定IOCTL以啟用混雜模式  
if os.name == "nt":  
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)  
  
# 開啟多執行緒傳送udp資料包  
t = threading.Thread(target=udp_sender, args=(subnet, magic_message))  
t.start()  
  
try:  
    while True:  
        # 讀取資料包  
        raw_buffer =  sniffer.recvfrom(65565)[0]  
  
        # 將緩衝區的前20個位元組按IP頭進行解析  
        ip_header = IP(raw_buffer[0:20])  
  
        # 輸出協議和通訊雙方IP地址  
        #print  "Protocol: %s %s ->  %s" % (ip_header.protocol, ip_header.src_address, ip_header.dst_address)  
  
        # 如果為ICMP,進行處理  
        if ip_header.protocol == "ICMP":  
  
            # 計算ICMP包的起始位置,並獲取ICMP包的資料  
            offset = ip_header.ihl * 4      #ihl是頭部長度,代表32位(即4位元組)長的分片的個數 [我的理解是因為一個位元組表示一個符號,所以這裡的offset要搞成以位元組為單位的,為的是下一句的提取資料]  
            buf = raw_buffer[offset:offset+sizeof(ICMP)]  
  
            # 解析ICMP資料  
            icmp_header = ICMP(buf)  
  
            #print "ICMP -> Type: %d Code: %d" % (icmp_header.type, icmp_header.code)  
  
            # 檢查型別和程式碼值是否都為3  
            if icmp_header.type == 3 and icmp_header.code == 3:  
                # 確認響應的主機再我們的目標子網之內  
                if IPAddress(ip_header.src_address) in IPNetwork(subnet):  
                    # 確認ICMP包中包含我們傳送的自定義的字串  
                    if raw_buffer[len(raw_buffer) - len(magic_message):] == magic_message:  
                        print "Host Up: %s" % ip_header.src_address  
  
  
  
# 處理CTRL-C  
except  KeyboardInterrupt:  
  
    # 如果執行再Windows上,關閉混雜模式  
    if os.name == "nt":  
        sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)


由於我的網段只有本機所以只能掃描自己的ip

相關推薦

Python帽子學習筆記-----

#-*- coding:utf8 -*- import socket import os import struct import threading import time import sys from netaddr import IPNetwork,IPAddress

《機器學習》 周志華學習筆記 線性模型(課後習題)python 實現

線性模型 一、內容 1.基本形式 2.線性迴歸:均方誤差是迴歸任務中最常用的效能度量 3.對數機率迴歸:對數機率函式(logistic function)對率函式是任意階可導的凸函式,這是非常重要的性質。 4.線性判別分析(LDA 是一種降維的方法) 5.多分類學習:

python cookbook 學習筆記 數字日期和時間(9) 大型資料運算

大型資料運算 -問題: 需要在大資料集(比如陣列或網路)上面執行計算。 解決方案: 涉及到陣列的重量級運算,可以使用 Numpy 庫。Numpy 的一個主要特徵是他會給 Python 提 供一個數組物件,相比標準的 Python 列表更適合用來做數學運

Python』Numpy學習指南__常用函數

第一個 indices first 填充 del lib ida like otl 感覺心情漸漸變好了,加油!np.eye(2)np.savetxt(‘eye.txt‘,i2)c,v = np.loadtxt(‘data.csv‘, delimiter=‘,‘, useco

網路是怎樣連線的學習筆記--交換機的包轉發操作

3.2.1 交換機根據地址表進行轉發 交換機的設計是將網路包原樣轉發到目的地,圖 3.7 就是它的內部結構。 交換機的PHY接收到達網線介面的訊號 首先,訊號到達網線介面,並由 PHY 模組進行接收,這一部分和集線器是相同的。 也就是說,它的介面和 PHY 模組也是以MDI-X 模式進行連線的,當

C++ Primer Plus 六版學習筆記

  1、檢視系統中各資料型別所佔的位元組數(sizeof),所能表示的最大和最小取值,標頭檔案climite中包含了關於整型限制的資訊,定義了所使用的各種符號常量 例:檢視各種整型資料型別所佔的位元組數以及所能表示的最大數值 #include "stdafx.h" #inclu

網絡是怎樣連接的學習筆記--路由器的包轉發操作

相同 col 數字 spc 技術 ima 這一 同時 個數 3.3 路由器的包轉發操作 3.3.1 路由器的基本知識 路由器通過查表判斷轉發目標 網絡包經過集線器和交換機之後到達了路由器,並在此被轉發到下一個路由器。 這一步轉發的工作原理和交換機類似,不過在具體的操作過程上

網路是怎樣連線的學習筆記--路由器的附加功能

3.4 路由器的附加功能   3.4.1 通過地址轉換有效利用 IP 地址 地址轉換功能出現的背景 地址就是用來識別每一臺裝置的標誌,因此每臺裝置都應該有一個唯一不重複的地址。 進入 20 世紀 90 年代之後,接入網際網路的裝置數量也快速增長,過不了多久,可分配的地址就用光了。 如

網路是怎樣連線的學習筆記--路由器的包轉發操作(下)

3.3.5 找不到匹配路由時選擇預設路由 不是所有的轉發目標都需要配置在路由表中 如果是公司或者家庭網路,這樣的做法也沒什麼問題,但網際網路中的轉發目標可能超過 20 萬個,如果全部要配置在路由表中實在是不太現實。 其中有一行子網掩碼為 0.0.0.0,意思是網路包接收方 IP 地址和路由表目標地址的匹

網路是怎樣連線的學習筆記--路由器的包轉發操作

3.3 路由器的包轉發操作 3.3.1 路由器的基本知識 路由器通過查表判斷轉發目標 網路包經過集線器和交換機之後到達了路由器,並在此被轉發到下一個路由器。 這一步轉發的工作原理和交換機類似,不過在具體的操作過程上,路由器和交換機是有區別的,因為路由器是基於 IP 設計的,而交換機是基於乙太網設計的。

計算機網路學習筆記——課後題答案詳解

1、假定站點A和B在同一個10Mb/s乙太網網段上。這兩個站點之間的傳播時延為225位元時間。現假定A開始傳送一幀,並且在A傳送結束之前B也傳送一幀。如果A傳送的是乙太網所容許的最短的幀,那麼A在檢測到和B發生碰撞之前能否把自己的資料傳送完畢?換言之,如果A在傳送完畢之前並沒有檢測到碰撞,那麼能否肯定A所傳送

作業系統概念學習筆記 程序

3.1 程序概念 1. 程序 程序是一種執行中的程式 執行什麼程式 執行什麼資料 處在什麼狀態 程序包括 程式程式碼/文字段 當前活動,程式計數器和CPU暫存器 記憶體中的

第二行程式碼學習筆記——:軟體也要拼臉蛋——UI開發的點點滴滴

本章要點 使用Android提供的UI來編寫程式介面。本章的內容就是學習UI方面的知識。 3.1 如何編寫程式介面 Android種編寫程式介面的方式: 1. 視覺化編輯器(不推薦) 2. 編寫XML程式碼(推薦) 3.2 常用控制元

C++學習筆記 函式

1.斐波那契數列   #include<stdio.h> int Fib(int x) { if (x <3) { printf("return 1!\n"); return(1); } else { printf("Fib(%d) and Fi

《C++ primer plus》學習筆記——

面向物件程式設計的本質是設計並擴充套件自己的資料型別。 設計自己的資料型別就是讓型別與資料匹配。 一、簡單變數 1變數名 2.整型 3.整型short、int、long和long long sizeof運算子可以用來檢查型別的長度,sizeof運算子返回型別或

python帽子學習筆記(二)——反向ssh

1.反向ssh。 通常情況下,在使用SSH的時候,你可以使用SSH客戶端連線SSH伺服器,但是由於Windows本身不一定裝有SSH服務端,所以我們需要反向將命令從SSH服務端傳送給SSH客戶端。 2.程式碼。 #!/usr/bin/python # -*- c

C++ Primer學習筆記- :標準庫型別之四

四、標準庫bitset型別 標準庫中bitset型別用來處理二進位制位的有序集,bitset型別簡化了位集的處理,使用bitset時需要包含標頭檔案#include<bitset>     bitset物件的定義和初始化 bitset也是類模板,不過bits

c++ primer 五版學習筆記- 字串、向量和陣列

本文為轉載,出處:https://blog.csdn.net/libin1105/article/details/48210261                               https://blog.csdn.net/fnoi2014xtx/article/

《資料結構與演算法分析》學習筆記--表、棧和佇列

[toc] *** ## Fork me on Github 我自己實現了一個雙向迴圈連結串列,釋出在Github上。 叫**QuickList**,包含完整的連結串列模組原始碼和測試用例。==遵循GPL V2.0協議==。 大家可以去github上獲取,如果覺得好用請幫我點個star,謝謝啦嘿嘿~ [Qu

&lt;&lt;Python基礎教程&gt;&gt;學習筆記 | 12 | 圖形用戶界面

lena text 平臺 post ack 由於 contents exp 一個 Python支持的工具包非常多。但沒有一個被覺得標準的工具包。用戶選擇的自由度大些.本章主要介紹最成熟的跨平臺工具包wxPython.官方文檔: http://wxpython.org/