協議分析工具學習TCP/IP
作者:擔子 發文時間:2004.08.10 转自資安論壇

一、 前言
  曾在賽迪網發過一篇《用協議分析工具學習TCP/IP》(以下簡稱"學習"),看到"希望能夠再次提供其他的補充"的留言就一直考慮補充些什麼,要補充的東西很多,畢竟TCP/TP協議簇是Internet的根基,不管在網上跑什麼服務,歸根結底都是建立在TCP/TP協議的基礎上,要學的東西很多,"學習"一文概述了資料的傳送過程,講到了TCP標誌位元的變化,本文重點闡述TCP的狀態變遷的情況,如果對TCP協定還不熟悉請參閱"學習"一文,前文講過的本文不再贅述。

二、為什麼要學習TCP的狀態變遷
  要說清楚為什麼,先說說狀態,打個簡單的比方,一般來說一個人"笑"是"高興"的狀態,"哭"是"悲傷"的狀態,"怒吼"是"發怒"的狀態等等,也就是說一個人在做某個動作時就處於一定的狀態,其實,網路中的電腦在相互通訊時,在不同的階段就處於不同的狀態,"學習"一文中講到的資料的幾個傳送過程(建立連接、資料傳送、結束連接),在各個過程中,TCP分別處於不同的狀態,由此可以看出,只有非常熟悉TCP的狀態,才能知道目前你的電腦在網路中處於什麼狀態,是正在連接別人的電腦?還是不懷好意的人偷偷連入你的機器竊取你的東西?是否受到了攻擊?哪些埠處於開放狀態?中木馬了嗎?等等諸如此類的問題都與TCP的狀態有關,這就是學習TCP狀態的原因。

三、學習要點
  1、要有"動"的概念
  狀態是隨著不同的情況而發生變化的,還用上面的比方,一個人"笑"是處於"高興"的狀態,他笑著笑著不笑了也就從"高興"的狀態變為別的狀態了。狀態是隨著條件的不同而變化的,是動的,從下面的學習可以看出,在不同的階段,TCP協定的標誌位元各不相同,反映出來的現象就是狀態的變化。
  2、要分清楚哪些是用戶端的狀態,哪些是伺服器端的狀態
  何謂用戶端和伺服器端,你正在上網時,你的電腦就是用戶端,而你訪問的網站的伺服器就是伺服器端。如果你在你的機器中提供了一個www服務,那此時你的機器就是伺服器端,訪問你的電腦是用戶端。可見一台電腦即可作為用戶端也可作為伺服器端。
  有些狀態是用戶端獨有的,有些是伺服器端獨有的,有些是都有的,在下面的學習中一定要注意區別。
  3、TCP的狀態實際上就是某個埠的狀態
  "學習"一文提到TCP協定在通訊時用到源埠和目的埠,源埠是本機打開的,目的埠是正在和本機通信的另一台電腦的埠,源埠分主動打開的用戶端口和被動連接的服務埠兩種。本機提供一個服務就打開一個埠,例如:提供www服務默認打開80埠,提供E_mail服務默認打開25埠,提供FTP服務默認打開21埠,服務埠號一般是固定的,當有其他的電腦訪問你的www服務時,那台電腦要隨機開個埠(1024以上)與你的80埠進行通訊,此時你的80埠的TCP狀態將會隨著不同的階段而發生變化,而此時21、25等服務埠在沒有被訪問的情況下是不會發生變化的。
  學習時一定要清楚TCP的狀態實際上就是某個埠的狀態這句話的含義。

四、測試環境
  測試環境請參見用協議分析工具學習TCP/IP一文。
  測試工具:協議分析工具IRIS、Sniffer pro
  協議分析工具有很多,也有免費的,只要能把包抓下來就行了。Windows 系統自帶的網路監視器和Linux自帶的TCPDUMP也是不錯的工具。
  TCP狀態觀察工具TCPview,該軟體很小只有93KB,而且是個綠色軟體,不用安裝。下載地很多,到華軍down一個吧http://www.onlinedown.net/soft/3483.htm。

五、概述
  圖1和圖2都是在《TCP/IP祥解》一書中截取的非常經典的TCP的狀態變遷圖,這兩張圖非常清晰地顯示了TCP狀態變遷的詳細過程。希望能在看完此文後在懂得TCP狀態的基礎上將這兩張圖燒到你的腦子裏。
  圖1中,虛線是伺服器端的正常狀態變化:
  從CLOSED->LISTIN->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED->LISTIN
  粗實線是用戶端的正常狀態變化:
  從CLOSED->SEND_SENT->ESTABLISHED->FIN_WAIT_1-> FIN_WAIT_2->TIME_WAIT->CLOSED
  其中CLOSED狀態是個開始狀態,在實際觀察中是看不到的(本人觀點)
  細實線是資料傳輸過程中可能出現的一些情況的狀態。
  圖2是將用戶端和伺服器端分開的狀態顯示。
  這兩張圖在下面的學習中要常常用到。


圖1 TCP的狀態變遷圖


圖2 TCP正常連接建立和終止所對應的狀態

六、如何查看TCP的狀態
  1、命令方式
  下面以Windows XP為例看看新安裝的系統都開了那些埠,也就是說都預留了那些門,不借助任何工具來查看埠的命令是netstat,方法如下:
  a、在"開始"的"運行"處鍵入cmd,回車
  b、如圖3在dos命令介面,鍵入netstat -na,圖3顯示的就是打開的服務埠,其中Proto代表協議,該圖中可以看出有TCP和UDP兩種協議。Local Address代表本機地址,該位址冒號後的數字就是開放的埠號。Foreign Address代表遠端地址,如果和其他機器正在通信,顯示的就是對方的位址,State代表狀態,顯示的LISTENING表示處於偵聽狀態,就是說該埠是開放的,等待連接,但還沒有被連接。就像你房子的門已經敞開了,但此時還沒有人進來。以第一行為例看看它的意思。
  TCP 0.0.0.0:135 0.0.0.0:0 LISTENING
  這一行的意思是本機的135埠正在等待連接。注意:只有TCP協定的服務埠才能處於LISTENING狀態。其他狀態稍後講。


圖3

  2、用TCPView工具
  為了更好的分析埠,最好用TCPView這個軟體,它是動態的。
  圖4是TCPView的運行介面。第一次顯示時字體有些小,在"Options"->"Font"中將字型大小調大即可。TCPView顯示的資料是動態的。圖3中Local Address顯示的就是本機開放的哪個埠(:號後面的數位),TCPView可以看出哪個埠是由哪個程式發起的。從圖3可以看出445、139、1025、135、5000等埠是開放的,445、139等埠都是system發起的,135等都是SVCHOST發起的。


圖4

七、正常變遷過程
  1、抓包
  抓包過程請參見"學習"一文中的"三、測試過程",不同的是不用下載檔,在流覽器中輸入FTP位址後關閉流覽器既是一個完整的資料傳輸過程。另為208號機改為207號。下圖5中是截取的過程,其中10-28行省略了。


圖5

  2、分析
  1)三次握手的狀態
  圖5中3-5行是建立連接的三次握手過程,結合圖2看其狀態變化如下:
  (1)圖5第3行和圖6顯示,207號機向1號機發出連接請求, 207號機標誌位元SYN置1,隨即產生一個初始序號(SEQ)3748168237發送給1號機,此時207號機處於SYN_SEND狀態。
  (2) 圖5第4行和圖6中No.4顯示, 1號機收到這個序號後,將此序號加1值為3748168238作為應答信號(ACK),同時隨機產生一個初始序號(SEQ)4265983929,此時1號機將標誌位元SYN和ACK置1,發回到請求端207號機,此時1號機由LISTEN狀態變為SYN_RCVD狀態。
  (3)圖5第5行和圖6中No.5顯示,207號機收到後將確認序號設置為1號機的初始序號(SEQ)4265983929加1為4265983930作為應答信號並且將標誌為ACK置1發送給1號機。這樣在完成了三次握手後207號機處於ESTABLISHED狀態。
  圖6 是三次握手的標誌位元變化情況。


圖6 三次握手的標誌位元變化

  2)資料傳輸的狀態
  圖5中6-30行是資料傳送的過程,資料在傳送的過程中一直處於ESTABLISHED狀態。ESTABLISHED的意思是建立連接。表示兩台機器正在通信。處於ESTABLISHED狀態的連接一定要格外注意,因為它也許是正常傳輸資料,也許是木馬之類在盜取你的資料。
  圖7 是資料傳輸時的標誌位元變化。


圖7 資料傳輸時的標誌位元變化

  3)終止連接的狀態
  圖5中32-35行是終止連接的過程,結合圖2看其狀態變化如下:
  (1)32行數據和圖8中No.32顯示的是207號機關閉流覽器後,207號機將FIN置1連同序號(SEQ)     3748168337發給1號機請求終止連接。此時207號機處於FIN_WAIT_1狀態。
  (2)33行數據和圖8中No.33顯示1號機收到FIN關閉請求後處於CLOSE_WAIT狀態,1號機將標誌位元ACK置1,並將應答信號設置為收到序號加1(ACK=3748168338)發回給207號機,這樣就終止了這個方向的傳輸。
  (3)34行數據和圖8中No.34顯示1號機將FIN置1連同序號(SEQ) 4265984517發給207號機請求終止連接。此時1號機處於LAST_ACK狀態
  (4)35行數據和圖8中No.35顯示207號機收到FIN關閉請求後,發回一個確認,並將應答信號設置為收到序號加1(ACK=4265984518),至此TCP連接徹底關閉。此時207號機處於TIME_WAIT狀態。1號機處於CLOSED狀態,此次連接徹底結束。
  圖7是終止連接的標誌位元變化。


圖8 終止連接的標誌位元變化

  4)正常狀態下的TCP狀態顯示
  下圖9、10、11是1號機在不同階段用TCPview捕獲的TCP狀態,由於有些狀態非常短暫,難以捕獲,只要能理解其中的意思即可。在上網是注意用TCPview觀察,圖3中的狀態基本都能看到,TCPview顯示的狀態既有用戶端的也有伺服器端的。圖11就是在1號機顯示的207號機的狀態。
  圖9是1號機FTP服務沒有被訪問時處於LISTENING狀態的情況。
  圖10是207號機正在訪問1號機伺服器的情況。此時1號機的21埠處於ESTABLISHED狀態,這裏需要注意的是1號機在和207號機建立連接時,還有一個21埠處於LISTENING狀態,這是因為它允許多用戶訪問,就像一個網站,它的80埠可以同時與許許多多的用戶建立連接。
  圖11是結束連接的情況。其中TIME_WAIT應該是207號機的狀態。


圖9


圖10


圖11

八、 詳解幾個狀態
  1、伺服器端LISTENING狀態
  LISTENING表示處於偵聽狀態,只有提供某種服務才會處於LISTENING狀態,前面提到過TCP狀態變化就是某個埠的狀態變化,提供一個服務就打開一個埠,例如:提供www服務默認開的是80埠,提供ftp服務默認的埠為21,當提供的服務沒有被連接時就處於LISTENING狀態。FTP服務啟動後首先處於偵聽(LISTENING)狀態。處於偵聽LISTENING狀態時,該埠是開放的,等待連接,但還沒有被連接。就像你房子的門已經敞開的,但還沒有人進來。
  看LISTENING狀態最主要的是看本機開了哪些埠,這些埠都是哪個程式開的,關閉不必要的埠是保證安全的一個非常重要的方面,服務埠都對應一個服務(應用程式),停止該服務就關閉了該埠,例如要關閉21埠只要停止IIS服務中的FTP服務即可。關於這方面的知識請參閱其他文章。
  如果你不幸中了服務埠的木馬,木馬也開個埠處於LISTENING狀態。
  2、ESTABLISHED狀態
  ESTABLISHED狀態是表示兩台機器正在傳輸資料,觀察這個狀態最主要的就是看哪個程式正在處於ESTABLISHED狀態,圖12是IEXPLORE.EXE(IE)在正常的訪問一個網站,而圖13是EXPLORER.EXE(木馬程式)在和駭客交換資料。


圖12


圖13

  3、用戶端SYN_SENT狀態
  從上面的分析可以看出,當請求連接時用戶端首先要發送同步信號給要訪問的機器,此時狀態為SYN_SENT,如果連接成功了就變為ESTABLISHED,正常情況下SYN_SENT狀態非常短暫。例如要訪問網站http://www.ccidnet.com,如果是正常連接的話,用TCPView觀察IEXPLORE.EXE(IE)建立的連接會發現很快從SYN_SENT變為ESTABLISHED,表示連接成功。SYN_SENT狀態快的也許看不到。
  如果發現有很多SYN_SENT出現,那一般有這麼幾種情況,一是你要訪問的網站不存在或線路不好,二是用掃描軟體掃描一個網段的機器,如下圖14所示:在用xscan掃描軟體掃描192.168.113.0這個網段時用TCPView捕捉到的,另外就是可能中了病毒了,例如中了"衝擊波",病毒發作時會掃描其他機器,這樣會有很多SYN_SENT出現。


圖14

  4、伺服器端狀態SYN_RCVD
  從上面的分析可以看出,當伺服器收到用戶端發送的同步信號時,將標誌位元ACK和SYN置1發送給用戶端,此時伺服器端處於SYN_RCVD狀態,如果連接成功了就變為ESTABLISHED,正常情況下SYN_RCVD狀態非常短暫。
  如果發現有很多SYN_RCVD狀態,那你的機器有可能被SYN Flood的DoS(拒絕服務攻擊)攻擊了。下圖15就是在其他機器上模擬對本機進行SYN Flood攻擊時用TCPView捕捉到的。SYN Flood的攻擊原理是:在進行三次握手時,攻擊軟體向被攻擊的伺服器(本例是192.168.113.207)發送SYN連接請求(握手的第一步),但是這個位址是偽造的,如圖攻擊軟體隨機偽造了51.133.163.104、65.158.99.152等等位址,207號機在收到連接請求時將標誌位元ACK和SYN置1發送給用戶端(握手的第二步),但是這些用戶端的IP位址都是偽造的,伺服器根本找不到客戶機,也就是說握手的第三步不可能完成。這種情況下伺服器端一般會重試(再次發送SYN+ACK給用戶端)並等待一段時間後丟棄這個未完成的連接,這段時間的長度我們稱為SYN Timeout,一般來說這個時間是分鐘的數量級(大約為30秒-2分鐘);一個用戶出現異常導致伺服器的一個線程等待1分鐘並不是什麼很大的問題,但如果有一個惡意的攻擊者大量類比這種情況,伺服器端將為了維護一個非常大的半連接列表而消耗非常多的資源----數以萬計的半連接,即使是簡單的保存並遍曆也會消耗非常多的CPU時間和記憶體,何況還要不斷對這個列表中的IP進行SYN+ACK的重試。此時從正常客戶的角度看來,伺服器失去響應,這種情況我們稱做:伺服器端受到了SYN Flood攻擊(SYN洪水攻擊)。


圖15

  下圖是用sniffer pro抓的SYN Flood攻擊資料包,從圖上可以清楚地看出,120行是第一次握手,121是207號機對51.133.163.104這個位址的回復,但這個位址不通的,第三次握手沒法進行下去。


圖16

  因為涉及到攻擊,具體攻擊過程不做演示,只把結果貼出來。
  5、其他
  在TCP的標誌位元中有一位元是Reset,如果包重發該標誌位置為1,重發包很多時網路一定有問題,圖17是我上網時打不開用網頁用IRIS抓得包,8-13行的Reset位都為1且SEQ號都相同,這種情況網肯定是有問題了,後查明是ADSL貓有問題了。


圖17

九、 後記
  在學習的過程中不要刻意去抓某個狀態,有些狀態非常短暫,應該多瞭解原理性的東西,等碰上時知道怎麼回事。本文我是從我的實驗資料和自己的理解的角度來寫的,如果和你學的教材的說法不一樣請以你的教材為准。  其實TCP的狀態變化就是把TCP的標誌位元變化的不同階段起個名字,關於TCP標誌的變化又牽扯到一個話題____TCP掃描,關於這個話題以後再聊。

(責任編輯:張元)