由於 TCP 協議並沒有對 TCP 的傳輸包進行身份驗證,所以在我們知道一個 TCP 連接中的 seq 和 ack 的信息后就可以很容易的偽造傳輸包,假裝任意一方與另一方進行通信,我們將這一過程稱為 TCP 會話劫持(TCP Session Hijacking)
既然有了被攻擊的風險,那隨之而來的就有解決方案,所以為解決這個問題,通常會在網絡層采用 IPSec 協議,在傳輸層采用 TLS 協議,對應的詳細協議可以百度里了解一下。
簡單的理解下TCP三次握手,詳細的過程可以百度了解下。
所以對應沒有加密的TCP協議,我們是很容易劫持的,下面就讓我們來演示一下。
演示說明:這里我用的是telnet協議測試。
虛擬機ip:
- 攻擊機:192.168.42.162
- 客戶端:192.168.42.58
- 服務端:192.168.42.171
實現條件:
攻擊機工具: wireshark,netwox,shijack
服務器 需要配置 telnet 服務器(這里就不詳細說明了,有興趣的同學可以自行百度)
過程:
首先,我們讓 客戶機 連接 服務器 。
終端命令:
telnet 192.168.42.171
此時,客戶端連接到服務器后輸入ls命令,在同一網段的 攻擊機 使用 wireshark 嗅探共用網卡,等待 客戶機 和 服務器 通信,捕捉 telnet 包。
這里我們看到數據包的內容是 l ,因為我們輸入的命令是 ls 他會吧我們發生的內容拆分開發生,我們看一下下一個數據包就會發現內容是 s
直接找到最后的一個包,點擊 TransmissionControl Protocol 查看其中的源端口,目的端口,next seq 和 ack 信息。(其中 服務器 的端口固定為 23 ,因為 telnet 端口是 23 )
因為我們要偽造發下一個包,所以直接采用 next seq 作為下一個包的 ack ,采用 ack 作為下一個包的 seq
獲取到信息之后,攻擊機 使用 netwox 工具偽造 客戶端 給 服務器 發一個 tcp 包。發送成功后,原來的 客戶端 就會失去連接,同時 服務器 會把 攻擊機 當作 客戶端 ,這樣 攻擊機 就實現了會話劫持。
攻擊機 終端輸入:
netwox 40 --ip4-dontfrag --ip4-offsetfrag 0 --ip4-ttl 64 --ip4-protocol 6 --ip4-src 192.168.42.58 --ip4-dst 192.168.42.171 --tcp-src 38048 --tcp-dst 23 --tcp-seqnum 5 --tcp-acknum 102 --tcp-ack --tcp-psh --tcp-window 128 --tcp-data "6c"
說明:
因為我們要偽造 客戶端 給 服務的 發生TCP包,所以源ip:客戶端(192.168.42.58)目的 ip:服務器(192.168.42.171) ,seq 和 ack 按剛才所說填寫,末尾的 6c 是字母 l 的十六進制數,這里的l是我們要發生的內容,其余參數默認就可以了。
現在我們已經了解了tcp劫持的原理了,然后我們推薦一款專業工具來測試TCP回話劫持漏洞。
同樣,我們先讓 客戶機 連接 服務器 。此時 攻擊機 打開 wireshark 抓包,獲取到源,目的 ip 以及端口號。
根據上面的信息,使用 shijack 工具輸入以下命令:
./shijack-lnx eth0 192.168.42.58 35396 192.168.42.171 23
參數依次為網卡名,源地址,源端口,目的地址,telnet 端口
顯示等待客戶端和服務器通信以便工具自動獲取 seq,ack進行劫持。
在通信之后顯示劫持成功,這個時候客戶端 就無法和 服務端 的進行通信了。此時我們在供給端輸入 ls 並回車,用 wireshark 查看是不是真的成功發出偽造包。
現在我們已經完成了TCP回話劫持了。
總結:
我們在會話劫持成功后,攻擊端是沒有回顯信息的,但是我們還是可以成功執行命令並執行的。如果我們必須要它有回顯的話,我們可以利用反向 shell 的方法讓攻擊機獲取服務器的權限。同時我們要注意的是在滲透的時候可以使用 nmap 這類工具對攻擊點進行掃描,如果發現有類似 telnet 這種不安全的協議的端口開放的話就可以采用相應手段進行攻擊了。