1. 程式人生 > 其它 >使用python實現TCP SYN埠掃描

使用python實現TCP SYN埠掃描

簡單介紹SYN:

SYN是TCP建立連線時的第一個握手包,傳送SYN,接收埠,如果是埠開放狀態就會返回ACK資料包。

這就是TCP連線的建立過程。可以看出,我傳送SYN包,Identification(seq=x, Identification更形象,因為,這個序列表是IP包的唯一標識,防止資料重複獲取)。如果,伺服器埠開放。則伺服器埠,將返回給我一個SYN ACK包,並且ack=x+1。如果接收到這樣的ack資料包,也就是埠處於開放狀態。
沒有收到自然判斷埠是關閉的,可能是目標主機不可達,被防火牆過濾掉,目標主機確實沒開機等。

簡單介紹SYN攻擊:

是DDos攻擊的一種,也是很古老的一種攻擊手段。SYN攻擊包括了大量的SYN包,這些包來自實際不存在的站點,因此無法有效進行處理。每個機器的欺騙包都要花幾秒鐘進行嘗試方可放棄提供正常響應。它利用TCP協議缺陷,通過傳送大量的半連線請求,耗費CPU和記憶體資源。SYN攻擊除了能影響主機外,還可以危害路由器、防火牆等網路系統,事實上SYN攻擊並不管目標是什麼系統,只要這些系統開啟TCP服務就可以實施。伺服器接收到連線請求(syn= j),將此資訊加入未連線佇列,併發送請求包給客戶(syn=k,ack=j+1),此時進入SYN_RECV狀態。當伺服器未收到客戶端的確認包時,重發請求包,一直到超時,才將此條目從未連線佇列刪除。配合IP欺騙,SYN攻擊能達到很好的效果,通常,客戶端在短時間內偽造大量不存在的IP地址,向伺服器不斷地傳送syn包,伺服器回覆確認包,並等待客戶的確認,由於源地址是不存在的,伺服器需要不斷的重發直至超時,這些偽造的SYN包將長時間佔用未連線佇列,正常的SYN請求被丟棄,目標系統執行緩慢,嚴重者引起網路堵塞甚至系統癱瘓。

SYN攻擊實際上很簡單,網上有大量現成的攻擊工具。

使用python實現SYN埠掃描

我水平還不足以完整的自己寫,所以在網上找了別人的。

這裡多有一個安裝scapy模組,因為在寫指令碼時候需要用到:
scapy是python寫的一個功能強大的互動式資料包處理程式,可以在自己的程式中使用這個模組來實現對網路資料包的傳送、監聽和解析。
在終端用 pip/pip3 install scapy 進行安裝。

from socket import *

def connScan(tgtHost,tgtPort):
try:
connSkt=socket(AF_INET,SOCK_STREAM) #建立TCP連線
connSkt.connect((tgtHost,tgtPort)) #若無連線,則會出錯,進入except
connSkt.send('ViolentPython\r\n'.encode()) #像埠傳送資料
results=connSkt.recv(100) #若埠開放,記錄返回的訊息
print('[+]%d/tcp open' %tgtPort)
print('[+] '+str(results))
connSkt.close()
except:
print('[-]%d/tcp closed' %tgtPort)

def portScan(tgtHost,tgtPorts):
try:
tgtIP=gethostbyname(tgtHost)
except:
print('[-] Cannot resolve %s : Unknown host'%tgtHost)
return
try:
tgtName=gethostbyaddr(tgtIP)
print('\n[+] Scan Results for:'+tgtName[0])
except:
print('\n[+] Scan Results for:' + tgtIP)
setdefaulttimeout(1)
for tgtPort in tgtPorts:
print('Scanning port '+tgtPort)
connScan(tgtHost,int(tgtPort))
if __name__ == '__main__':
tgtHost='192.168.0.13' #目標主機ip
tgtPorts=['20','21','22','80'] #要掃描的埠
portScan(tgtHost,tgtPorts)
我的是python3.x,可以適用

這裡需要一個socket函式,是應用層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面

詳細的介紹參考 https://blog.csdn.net/qq_29350991/article/details/110232175

import socket
import subprocess
import sys
from datetime import datetime

def scan_port_for_ip(remote_ip):
try:
for port in range(1, 65536):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((remote_ip, port))
if result == 0:
print ("Port{%d}: OPEN."%port)
sock.close()
except socket.error:
print ("Couldn't connect to server")
sys.exit()

if __name__ == "__main__":
try:
# Clear the screen
subprocess.call('clear', shell=True)
t1 = datetime.now()

args = sys.argv[1:]
server_ip = "".join(args)
scan_port_for_ip(server_ip)

t2 = datetime.now()
total = t2 - t1
print ('Scanning Completed in: ', total)
except KeyboardInterrupt:
print ("You pressed Ctrl+C")
sys.exit()

這篇同樣是關於埠掃描的python3.x的指令碼