利用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