python scapy tcp scan script(tcp 掃描器)

利用python scapy 這個強大的類庫寫了個tcp 端口掃描器

原理

向指定端口發送tcp包flags=‘S’,如果該端口開放則回覆tcp包 flags=‘SA’;
yes,就這麼簡單,當然如果有firewall那另當別論了

流程

1.定義數據包捕捉器並送入子線程運行
2.運行發包函數
ps:這種多個端口掃描的腳本如果用sr或srp一個個的發和收,是非常慢的。
建議向我學習定義一個捕捉器子線程運行,將會非常高效的

code[name: tcp_scan.py]

import sys
from scapy.all import *
from threading import Thread

def scan_Fun(args):      //構造tcp數據包flags至"s"標誌位併發送
    ip,ports = args
    pkt = IP(dst=ip)/TCP(dport=ports,flags="S")
    send(pkt,verbose=False)
    #print(a.show())


def port_active():			//捕捉數據包並進行條件匹配
    def print_liver(pkt):
        if TCP in pkt and pkt[TCP].flags == 'SA':		
            retstring = '%IP.src%: '+str(pkt[TCP].sport)+'[%TCP.sport%] is open'
            return pkt.sprintf(retstring)

    sniff(filter='tcp',timeout=3,prn=print_liver)		//定義一個捕捉器,捕捉TCP包並調用回調函數進行處理

def main():			
    args = sys.argv			//接收兩個參數,如參數不足則輸出提示,並退出
    if len(args) != 3:
        print('Usage: python tcp_scan.py ip start_port,end_port')
        print('for example: python tcp_scan.py 192.168.199.3 21,80')
        exit()

    start_port,end_port = args[2].split(',')
    Thread(target=port_active).start()		//定義一個子線程並運行
    scan_Fun([args[1],(int(start_port),int(end_port))])		//傳參並運行發包函數

if __name__ == '__main__':
    main()

如何運行

[root@local]#python tcp_scan.py 192.168.199.3 21,80

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章