什麼是IP欺騙?IP欺騙是不是用某種軟件把自己的IP隱藏起來?回答當然是NO!!!。這裡我要說的IP欺
騙是一種攻擊方法,即使主機系統本身沒有任何漏洞,但仍然可以使用各種手段來達到攻擊目的,這種欺
騙純屬技術性的,一般都是利用TCP/IP協議本身存在的一些缺陷。當然,這也是有一定難度的。下面我們
看一下IP欺騙攻擊是如何實現的?
建立信任關系。
IP欺騙是利用了主機之間的正常信任關系來發動的,所以在介紹IP欺騙攻擊之前,先說明一下什麼是信任
關系,信任關系是如何建立的。
在UNIX主機中,存在著一種特殊的信任關系。假設有兩台主機hosta和hostb,上面各有一個帳戶Tomy,在
使用中會發現,在hosta上使時要輸入在hosta上的相應帳戶Tomy,在hostb上使用時必須輸入用hostb的帳
戶Tomy,主機hosta和hostb把Tomy當做兩個互不相關的用戶,這顯然有些不便。為了減少這種不便,可以
在主機hosta和hostb中建立起兩個帳戶的相互信任關系。在hosta和hostb上Tomy的home目錄中創建.rhosts
文件。從主機hosta上,在你的home目錄中用命令echo “hostb Tomy”>~/.hosts實現hosta&hostb的信任關
系,這時,你從主機hostb上,你就能毫無阻礙的使用任何以r開頭的遠程調用命令,如:rlogin、rsh、
rcp等,而無需輸入口令驗證就可以直接登錄到hosta上。這些命令將充許以地址為基礎的驗證,允許或者
拒絕以IP地址為基礎的存取服務。這裡的信任關系是基於IP的地址的。
當/etc/hosts.equiv中出現一個 “+”或者$HOME/.rhosts中出現 “++”時,表明任意地址的主機可以無須口
令驗證而直接使用r命令登陸此主機,這是十分危險的,而這偏偏又是某些管理員不重視的地方。下面我們
看一下rlogin的用法。
rlogin是一個簡單的/服務器程序,它的作用和telnet差不多,不同的是telnet完全依賴口令驗證,而
rlogin是基於信任關系的驗證,其次到才進行口令驗證的,它使用了TCP協議進行傳輸。當用戶從一台主機
登陸到另一台主機上,並且,如果目錄主機信任它,rlogin將允許在不應答口令的性況下使用目標主機上
的資源,安全驗證完便基於源主機的IP地址。因此,根據以上所舉的例子,我們能利用rlogin來從hostb遠
程登陸到hosta,而且不會被提示出入口令!
IP欺騙的理論根據
看到上面的說明,每一個黑客都會想到:既然hosta和hostb之間的信任關系是基於IP址而建立起來的,那
麼假如能夠冒充hostb的IP,就可以使用rlogin登錄到hosta,而不需任何口令驗證。這,就是IP欺騙的最
根本的理論依據。
但是,事情遠沒有想像中那麼簡單!雖然,可以通過編程的方法隨意改變發出的包的IP地址,但TCP協議對
IP進行了進一步的封裝,它是一種相對可靠的協議,不會讓黑客輕易得逞。不信?好,先來看一下一次正
常的TCP/IP會話的過程。
由於TCP是面向連接的協議,所以在雙方正式傳輸數據之前,需要用“三次握手”來建立一個穩重的連接。假
設還是hosta和hostb兩台主機進行通信,hostb首先發送帶有SYN標志的數據段通知hosta建立TCP連接,TCP
的可靠性就是由數據包中的多位控制字來提供的,其中最重要的是數據序列SYN和數據確認標志ACK。B將
TCP報頭中的SYN設為自己本次連接中的初始值(ISN)。
當hosta收到hostb的SYN包之後,會發送給hostb一個帶有SYN+ACK標志的數據段,告之自己的ISN,並確認
hostb發送來的第一個數據段,將ACK設置成hostb的SYN+1。
當hostb確認收到hosta的SYN+ACK數據包後,將ACK設置成hosta的SYN+1。Hosta收到hostb的ACK後,連接成
功建立,雙方可以正式偉輸數據了,整個過程如圖所示:
(黑色為hostb紅色為hosta)
(大家也就將就將就著看吧……本人的繪畫水平也說是這樣了……能看明白就行了哦J )
看了這個過程,我們就很容易想到,假如想冒充hostb對hosta進行攻擊,就要先使用hostb的IP地址發送
SYN標志給hosta,但是當hosta收到後,並不會把SYN+ACK發送到我們的主機上,而是發送到真正的hostb上
去,這時……嘿嘿……露陷了吧?因為hostb根本沒發送發SYN請請。所以如果要冒充hostb,首先要讓hostb失
去工作能力。也就是所謂的拒絕服務攻擊,讓hostb癱瘓。
可是……這樣還是遠遠不夠的……,最難的就是要對hosta進行攻擊,必須知道hosta使用的ISN。TCP使用的ISN
是一個32位的計數器,從0到4 294 967 295。TCP為每一個連接選擇一個初始序列號ISN,為了防止因為延
遲、重傳等擾亂三次握手,ISN不能隨便選取,不同的系統有著不同的算法。理解TCP如何分配ISN以及ISN
隨時間的變化規律,對於成功的進行IP欺騙攻擊是很重要的!ISN約每秒增加128 000,如果有連接出現,
每次連接將把計數器的數值增加64 000。很顯然,這使得用於表示ISN的32位計數器在沒有連接的情況下每
9.32小時復位一次。這所以這樣,是因為它有利於最大於度地減少“舊有”連接的信息干擾當前連接的機會
。如果初始序例號是隨意選擇的,那麼不能保證現有序例號是不同於先前的。假設有這樣一種情況,在一
個路由回路中的數據包最終跳出循環,回到了“舊有”的連接,顯然這會對現有連接產生干擾。預測出攻擊
目標的序例號非常困難,而且各個系統也不想同,在Berkeley系統,最初的序列號變量由一個常數每秒加1
產生,等加到這個常數的一半時,就開始一次連接。這樣,如果開始啊一個合法連接,並觀察到一個ISN正
在使用,便可以進行預測,而且這樣做有很高的可信度。現在我們假設黑客已經使用某種方法,能預測出
ISN。在這種情況下,他就可以將ACK序便號送給hosta,這時連接就建立了。
“嗯,先喝口水(哇噻,3:30了耶)……說了這麼多,明白了點嗎?”
“不明白……兄弟,你在干啥呢?上數學課啊?”
!@#$^^%&*&$^%^%@$^% 又眼一翻……口吐白沫……兩腿一蹬……站了起來……叫了聲:“接著看……”
IP欺騙攻擊過程解析
IP欺騙由若干步驟組成,下面是它的詳細步驟,(嘿嘿……小心點看哦……不明白的請舉手……,不再重復……我
夠陰的吧……嗯嗯……沒煙了……不說了……大家自學吧……)晃铛……一只“意大利真皮”飛過來……正中腦瓜……唉……俺“
眾”不敵“寡”,先忍著算了……真可憐……怎麼沒人用“中華”丟過來……
接著…首先假定信任關系已經被發現(至於如何發現,不是本章內容)。黑客為了進行IP欺騙,要進行以下
工作:使被信任關系的主機失去工作能力,同時采樣目標主機發出的TCP序例號,猜測出它的數據序例號。
然後,偽裝成被信任的主機,同時建立起與目標主機基於地址驗證的應用連接。連接成功後,黑客就可以
入置backdoor以便後日使用J 。
使被信任主機失去工作能力
為了偽裝成被信任主機而不露陷,需要使其完全失去工作能力。由於攻擊者將要代替真正的被信任主機,
他必須確保真正的被信任主機不能收到任何有效的網絡數據,否則將會被揭穿。有許多方法可以達到這個
目的(如SYN洪水攻擊、TTN、Land等攻擊)。現假設你已經使用某種方法使得被信任的主機完全失去了工
作能力。
序例號取樣和猜測
前面講到了,對目標主機進行攻擊,必須知道目標主機的數據包序例號。通常如何進行預測呢?往往先與
被攻擊主機的一個端口(如:25)建立起正常連接。通常,這個過程被重復N次,並將目標主機最後所發送
的ISN存儲起來。然後還需要進行估計他的主機與被信任主機之間的往返時間,這個時間是通過多次統計平
均計算出來的。往返連接增加64 000.現在就可以估計出ISN的大小是128 000乘以往返時間的一半,如果此
時目標主機剛剛建立過一個連接,那麼再加上64 000。(我靠……怎麼像在上數學課啊?)
一旦估計出ISN的大小,就開始著手進行攻擊,當然你的虛假TCP數據包進入目標主機時,如果剛才估計的
序例號是准確的,進入的數據將被放置在目標機的緩沖區中。但是在實際攻擊過程中往往沒這麼幸運,如
果估計序例號的小於正確值,那麼將被放棄。而如果估計的序例號大於正確值,並且在緩沖區的大小之內
,那麼該數據被認為是一個未來的數據,TCP模塊將等待其他缺少的數據。如果估計序例號大於期待的數字
且不在緩沖區之內,TCP將會放棄它並返回一個期望獲得的數據序例號。
你偽裝成被信任的主機IP,此時,該主機仍然處在癱瘓狀態,然後向目標主機的513端口(rlogin)發送連
接請求。目標主機立刻對連接請求作出反應,發更新SYN+ACK確認包給被信任主機,因為此時被信任主機仍
然處於癱瘓狀態,它當然無法收到這個包,緊接關攻擊者向目標主機發送ACK數據包,該包使用前面估計的
序例號加1。如果攻擊者估計正確的話,目標主機將會接收該ACK。連接就正式建立起了,可以開始數據傳
輸了。這是,你就可以將cat ‘++'>>~/.rhosts命令發送過去,這樣完成本次攻擊後就可以不用口令直接登
錄到目標主機上了。如果達到這一步,一次完整的IP欺騙就算完成了。你已經在目標機上得到了一個Shell
貼,接下就就是利用系統的溢出或錯誤配置擴大權限,當然如何搞到root已經不是本章的內容了。
總結一下IP攻擊的整個步驟:
首先使被信任主機的網絡暫時癱瘓,以免對攻擊造成干擾。
然後連接到目標機的某個端口來猜測ISN基值和增加規律!!!(重點!難點!)
接下來把源址址偽裝成被信任主機,發送帶有SYN標志的數據段請求連接。
然後等待目標機發送SYN+ACK包給已經癱瘓的主機,因為你現在看不到這個包。
最後再次偽裝成被信任主機向目標機發送的ACK,此時發送的數據段帶有預測的目標機的ISN+1。
連接建立,發送命令請求。
擦屁股、開後門、下網、關機、睡覺。~~~zzzZZZzzz~~~
“Game Over”
“~~~zzzZZZzzz~~~”
“哎呀呀……你爺爺的(韋小寶),我在上面口水都說干了,你們在下面夢周公(英語老師),走!到政教處
去……”
“下課!”
“唰……老師再見!”
“嘿……睡醒了啊?每人照抄一百遍……下許檢查!”
俺今天要當足老師的瘾……被他們訓了這麼久,多少也學會點了,嘿嘿……夠奸了吧?
看例子:
對於以上的理論,好多人都是將信將疑:一句話就是:這種攻擊方法是不是只停留在一個理論階段???
成功好像只是做夢而已吧?
不信?我也不信,但事實總是勝於雄辨!看下面這個被記錄的入侵實例,看你還有什麼;話說!TNND,老
師的話都不信?吃米田共去……
下面是tcpdump------一個sniffer完全全記錄下來的一次入侵全過程。也正是IP欺騙的創始人米特尼客的
作品,被一個名叫TsutomuShimomura的工作師記錄下來的。
說明:
Server:一台運行Solaris的Sparc工作站;
x-terminal:被攻擊的服務器
這顯然是他事先攻破的一台系統,用來做跳板的。
這些命令的的作用顯然是在探測攻擊目標之間潛在的信任關系,因為只有在發現了信任關系才能進行IP欺
大約在六分鐘之後,tcpdump檢測到一陣急風暴雨般的TCP SYN包從130.92.6.7猛烈的湧向Server 的513(
rlogin)端口。很顯然,這是在使用SYN洪水拒絕服務攻擊server,目的當然是讓他失去工作能力了。這也
就是前面提到的第一步。因為513端口是以root權限運行的,所以現在server.login可以被用來作為進行IP
欺騙的偽造源了。當然,這個的謂的攻擊方IP130.92.6.97 也是一個偽造的IP,這樣它才不會接收到
server的回應包。
看記錄:
14:18:22:516699 130.92.6.97.600 > server.login: S 1382726960:1382726960(0) win 4096
14:18:22:566069 130.92.6.97.600 > server.login: S 1382726961:1382726961(0) win 4096
14:18:22:744477 130.92.6.97.600 > server.login: S 1382726962:1382726962(0) win 4096
14:18:22:830111 130.92.6.97.600 > server.login: S 1382726963:1382726963(0) win 4096
14:18:22:886128 130.92.6.97.600 > server.login: S 1382726964:1382726964(0) win 4096
14:18:22:943514 130.92.6.97.600 > server.login: S 1382726965:1382726965(0) win 4096
14:18:23:002715 130.92.6.97.600 > server.login: S 1382726966:1382726966(0) win 4096
14:18:23:103275 130.92.6.97.600 > server.login: S 1382726967:1382726967(0) win 4096
14:18:23:162781 130.92.6.97.600 > server.login: S 1382726968:1382726968(0) win 4096
14:18:23:225384 130.92.6.97.600 > server.login: S 1382726969:1382726969(0) win 4096
14:18:23:282625 130.92.6.97.600 > server.login: S 1382726970:1382726960(0) win 4096
14:18:23:342657 130.92.6.97.600 > server.login: S 1382726971:1382726961(0) win 4096
14:18:23:403083 130.92.6.97.600 > server.login: S 1382726972:1382726962(0) win 4096
14:18:23:903700 130.92.6.97.600 > server.login: S 1382726973:1382726963(0) win 4096
14:18:24:003252 130.92.6.97.600 > server.login: S 1382726974:1382726964(0) win 4096
14:18:24:084827 130.92.6.97.600 > server.login: S 1382726975:1382726965(0) win 4096
14:18:24:142774 130.92.6.97.600 > server.login: S 1382726976:1382726966(0) win 4096
14:18:24:203195 130.92.6.97.600 > server.login: S 1382726977:1382726967(0) win 4096
14:18:24:294773 130.92.6.97.600 > server.login: S 1382726978:1382726968(0) win 4096
14:18:24:382841 130.92.6.97.600 > server.login: S 1382726979:1382726969(0) win 4096
14:18:24:443309 130.92.6.97.600 > server.login: S 1382726980:1382726960(0) win 4096
14:18:24:643249 130.92.6.97.600 > server.login: S 1382726981:1382726961(0) win 4096
14:18:24:906546 130.92.6.97.600 > server.login: S 1382726982:1382726962(0) win 4096
14:18:24:963786 130.92.6.97.600 > server.login: S 1382726983:1382726963(0) win 4096
14:18:25:022853 130.92.6.97.600 > server.login: S 1382726984:1382726964(0) win 4096
14:18:25:153536 130.92.6.97.600 > server.login: S 1382726985:1382726965(0) win 4096
14:18:25:400869 130.92.6.97.600 > server.login: S 1382726986:1382726966(0) win 4096
14:18:25:483127 130.92.6.97.600 > server.login: S 1382726987:1382726967(0) win 4096
14:18:25:599582 130.92.6.97.600 > server.login: S 1382726988:1382726968(0) win 4096
14:18:25:653131 130.92.6.97.600 > server.login: S 1382726989:1382726969(0) win 4096
server 在連接序例被塞滿之前對前八個SYN請求做出了SYN+ACK回應,一旦沒有ACK包來回應它,server將
周期性地重發SYN+ACK包。
接下來我們看到20個從apollo.it.luc.edu發出的連接請求被送住x-terminal.shell。這些連接請求的目的
是預測server的TCP序例號生成器的行為。可以注意到每一個連接的初始序例號的增量提示了SYN包不是通
過系統的TCP執行產生的。攻擊者立刻用RST包來斷 開x-terminal發來的SYN+ACK包,以使x-terminal的連
接序例不至於被塞滿,因為畢竟x-terminal是黑客所要攻擊的目標。
下面是這個過程:
14:18:25.906002 apollo.it.luc.edu.1000 > x-terminal.shell:S 1382726990:1382726990(0) win 4906
14:18:26.094731 x-terminal.shell > appollo.it.luc.edu.1000:S 2021824000:20218240000(0) ack
1382826991 win 4906
………………………………………………………………………………………………………
現在已經是5:33了,好累……大家體諒一下……。
x-terminal 發出的每一個SYN+ACK包的初始序例號都比前一個增加了128 000字節。
Server.lgoin的偽造SYN請求發往了x-terminal.shell。推斷x-terminal可信任server,所所以會響應來自
server 或者偽裝成server的主機的所有請求。
然後就是,x-terminal用SYN+ACK包回應了server的連接請求,這時因為server仍然處於癱瘓狀態,所以它
當然不會響應任何來自於x-terminal的包。
正常情況下SYN+ACK包是用來期待正確的ACK確認包的。但是攻擊者能夠預測出x-terminal的TCP序例號生成
器的包含SYN+ACK的序例號,所以他不用看到SYN+ACK就可以發出回應的ACK包,如下:
14:18:36.245045 server.login > x-terminal.shell: S 1382727010(0) win 4906
14:18:36.755522 server.login >x-terminal.shell .ack 2024384001 win 4096
到目前為止,偽裝成server的主機已經通過 IP欺騙與x-terminal.shell建立了一次正常的rsh連接,這時
一旦x-terminal做出任何應答,攻擊者就可以維持連接並且發送出數據,下面他發送了如下數據:
14:18:37.265404 server.login > x-terminal.shell: P 0:2(2)ack 1 win 4906
14:18:37.775872 server.login > x-terminal.shell: P 2:7(5)ack 1 win 4906
14:18:37.287404 server.login > x-terminal.shell: P 7:32(25)ack 1 win 4906
這些數據是由tcpdump記錄下來的,對應的命令其實就是:
server#rsh x-terminal “echo ++ >>/.rhosts”
即在x-terminal上建立起使得任何主機都可以無須口令而行訪問的/.rhosts文件。然後,其實連接斷開了
。
怎麼樣?看得心驚膽跳吧?看上去好像花了好長的時間,其實不然……從發送第一個數據包,到發送最後一
個數據包僅僅用了16秒!!!這一過程,只不過是運行了事先寫好的程序而已。
注:文章多處用了比較搞笑的字眼為的是讓讀者看起來不那麼緊張、放松點能更容易理解。