VC++分析数据包实现Telnet协议分析
Telnet協議是TCP/IP協議族中的一員,是Internet遠程登陸服務的標準協議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端使用者的電腦上使用telnet程序,用它連接到服務器。終端使用者可以在telnet程序中輸入命令,這些命令會在服務器上運行,就像直接在服務器的控制臺上輸入一樣??梢栽诒镜鼐湍芸刂品掌鳌R_始一個telnet會話,必須輸入用戶名和密碼來登錄服務器。Telnet是常用的遠程控制Web服務器的方法。
簡介
它最初是由ARPANET開發的,但是現在它主要用于Internet會話。它的基本功能是,允許用戶登錄進入遠程主機系統。起初,它只是讓用戶的本地計算機與遠程計算機連接,從而成為遠程主機的一個終端。它的一些較新的版本在本地執行更多的處理,于是可以提供更好的響應,并且減少了通過鏈路發送到遠程主機的信息數量。
Telnet的應用不僅方便了我們進行遠程登錄,也給黑客們提供了又一種入侵手段和后門,但無論如何,在你盡情享受Telnet所帶給你的便捷的同時,你是否真正的了解Telnet呢?
遠程登錄
Telnet服務雖然也屬于客戶機/服務器模型的服務,但它更大的意義在于實現了基于Telnet協議的遠程登錄(遠程交互式計算),那么就讓我們來認識一下遠程登錄。
基本概念
先來看看什么叫登錄:分時系統允許多個用戶同時使用一臺計算機,為了保證系統的安全和記賬方便,系統要求每個用戶有單獨的帳號作為登錄標識,系統還為每個用戶指定了一個口令。用戶在使用該系統之前要輸入標識和口令,這個過程被稱為'登錄'。 遠程登錄是指用戶使用Telnet命令,使自己的計算機暫時成為遠程主機的一個仿真終端的過程。仿真終端等效于一個非智能的機器,它只負責把用戶輸入的每個字符傳遞給主機,再將主機輸出的每個信息回顯在屏幕上。
產生和發展
我們可以先構想一個提供遠程文字編輯的服務,這個服務的實現需要一個接受編輯文件請求和數據的服務器以及一個發送此請求的客戶機??蛻魴C將建立一個從本地機到服務器的TCP連接,當然這需要服務器的應答,然后向服務器發送鍵入的信息(文件編輯信息),并讀取從服務器返回的輸出。以上便是一個標準而普通的客戶機/服務器模型的服務。
似乎有了客戶機/服務器模型的服務,一切遠程問題都可以解決了。然而實際并非你想象的那樣簡單,如果我們僅需要遠程編輯文件,那么剛才所構想的服務完全可以勝任,但假如我們的要求并不是這么簡單,我們還想實現遠程用戶管理,遠程數據錄入,遠程系統維護,想實現一切可以在遠程主機上實現的操作,那么我們將需要大量專用的服務器程序并為每一個可計算服務都使用一個服務器進程,隨之而來的問題是:遠程機器會很快對服務器進程應接不暇,并淹沒在進程的海洋里(我們在這里排除最專業化的遠程機器)。
那么有沒有辦法解決呢?當然有,我們可以用遠程登錄來解決這一切。我們允許用戶在遠地機器上建立一個登錄會話,然后通過執行命令來實現更一般的服務,就像在本地操作一樣。這樣,我們便可以訪問遠地系統上所有可用的命令,并且系統設計員不需提供多個專用地服務器程序。
問題發展到這里好像前途一片光明了,用遠程登錄總應該解決問題了吧,但要實現遠程登錄并不簡單。不考慮網絡設計的計算機系統期望用戶只從直接相連的鍵盤和顯示器上登錄,在這種機器上增加遠程登錄功能需要修改機器的操作系統,這是極其艱巨也是我們盡量避免的。因此我們應該集中力量構造遠程登錄服務器軟件,雖然這樣也是比較困難的。為什么說這樣做也比較困難呢?
舉個例子來說:一般,操作系統會為一些特殊按鍵分配特殊的含義,比如本地系統將'Ctrl+C'解釋為:'終止當前運行的命令進程'。但假設我們已經運行了遠程登錄服務器軟件,'Ctrl+C'也有可能無法被傳送到遠地機器,如果客戶機真的將'Ctrl+C'傳到了遠地機器,那么'Ctrl+C'這個命令有可能不能終止本地的進程,也就是說在這里很可能會產生混亂。而且這僅僅是遇到的難題之一。
但盡管有技術上的困難,系統編程人員還是設法構造了能夠應用于大多數操作系統的遠程登錄服務器軟件,并構造了充當客戶機的應用軟件。通常,客戶機軟件取消了除一個鍵以外的所有鍵的本地解釋,并將這些本地解釋相應的轉換成遠地解釋,這就使得客戶機軟件與遠地機器的交互,就如同坐在遠程主機面前一樣,從而避免了上述所提到的混亂。而那個唯一例外的鍵,可以使用戶回到本地環境。
將遠程登錄服務器設計為應用級軟件,還有另一個要求,那就是需要操作系統提供對偽終端(pseudo terminal)的支持。我們用偽終端描述操作系統的入口點,它允許像Telnet服務器一樣的程序向操作系統傳送字符,并且使得字符像是來自本地鍵盤一樣。只有使用這樣的操作系統,才能將遠程登錄服務器設計為應用級軟件(比如Telnet服務器軟件),否則,本地操作系統和遠地系統傳送將不能識別從對方傳送過來的信息(因為它們僅能識別從本地鍵盤所鍵入的信息),遠程登錄將宣告失敗。
將遠程登陸服務器設計為應用級軟件雖然有其顯著的優點:比將代碼嵌入操作系統更易修改和控制服務器。但其也有效率不高的缺點(后面的內容將會給予解釋),好在用戶鍵入信息的速率不高,這種設計還是可以接受的。
工作過程
使用Telnet協議進行遠程登錄時需要滿足以下條件:在本地計算機上必須裝有包含Telnet協議的客戶程序;必須知道遠程主機的Ip地址或域名;必須知道登錄標識與口令。
Telnet遠程登錄服務分為以下4個過程:
1)本地與遠程主機建立連接。該過程實際上是建立一個TCP連接,用戶必須知道遠程主機的Ip地址或域名;
2)將本地終端上輸入的用戶名和口令及以后輸入的任何命令或字符以NVT(Net Virtual Terminal)格式傳送到遠程主機。該過程實際上是從本地主機向遠程主機發送一個IP數據包;
3)將遠程主機輸出的NVT格式的數據轉化為本地所接受的格式送回本地終端,包括輸入命令回顯和命令執行結果;
4)最后,本地終端對遠程主機進行撤消連接。該過程是撤銷一個TCP連接。
上面的內容只是討論了遠程登陸最基本的東西,其中的復雜和編程人員的艱辛是我們難以想象的,不知道你在舒服的使用Telnet的同時,是否想到了這些!
TeInet協議
我們知道Telnet服務器軟件是我們最常用的遠程登錄服務器軟件,是一種典型的客戶機/服務器模型的服務,它應用Telnet協議來工作。那么,什么是Telnet協議?它都具備哪些特點呢?
1、 基本內容
Telnet是位于OSI模型的第7層---應用層上的一種協議,是一個通過創建虛擬終端提供連接到遠程主機終端仿真的TCP/IP協議。這一協議需要通過用戶名和口令進行認證,是Internet遠程登陸服務的標準協議。應用Telnet協議能夠把本地用戶所使用的計算機變成遠程主機系統的一個終端。它提供了三種基本服務:
1)Telnet定義一個網絡虛擬終端為遠程系統提供一個標準接口。客戶機程序不必詳細了解遠程系統,他們只需構造使用標準接口的程序;
2)Telnet包括一個允許客戶機和服務器協商選項的機制,而且它還提供一組標準選項; .
3)Telnet對稱處理連接的兩端,即Telnet不強迫客戶機從鍵盤輸入,也不強迫客戶機在屏幕上顯示輸出。
2 、適應異構
為了使多個操作系統間的Telnet交互操作成為可能,就必須詳細了解異構計算機和操作系統。比如,一些操作系統需要每行文本用ASCⅡ回車控制符(CR)結束,另一些系統則需要使用ASCⅡ換行符(LF),還有一些系統需要用兩個字符的序列回車-換行(CR-LF);再比如,大多數操作系統為用戶提供了一個中斷程序運行的快捷鍵,但這個快捷鍵在各個系統中有可能不同(一些系統使用CTRL+C,而另一些系統使用ESCAPE)。如果不考慮系統間的異構性,那么在本地發出的字符或命令,傳送到遠地并被遠程系統解釋后很可能會不準確或者出現錯誤。因此,Telnet協議必須解決這個問題。 為了適應異構環境,Telnet協議定義了數據和命令在Internet上的傳輸方式,此定義被稱作網絡虛擬終端NVT(Net Virtual Terminal)。它的應用過程如下: 對于發送的數據:客戶機軟件把來自用戶終端的按鍵和命令序列轉換為NVT格式,并發送到服務器,服務器軟件將收到的數據和命令,從NVT格式轉換為遠地系統需要的格式; 對于返回的數據:遠地服務器將數據從遠地機器的格式轉換為NVT格式,而本地客戶機將接收到的NVT格式數據再轉換為本地的格式?!τ贜VT格式的詳細定義,有興趣的朋友可以去查找相關資料。
3 、傳送遠程命令
我們知道絕大多數操作系統都提供各種快捷鍵來實現相應的控制命令,當用戶在本地終端鍵入這些快捷鍵的時候,本地系統將執行相應的控制命令,而不把這些快捷鍵作為輸入。那么對于Telnet來說,它是用什么來實現控制命令的遠程傳送呢? Telnet同樣使用NVT來定義如何從客戶機將控制功能傳送到服務器。我們知道ASCⅡ字符集包括95個可打印字符和33個控制碼。當用戶從本地鍵入普通字符時,NVT將按照其原始含義傳送;當用戶鍵入快捷鍵(組合鍵)時,NVT將把它轉化為特殊的ASCⅡ字符在網絡上傳送,并在其到達遠地機器后轉化為相應的控制命令。
將正常ASCⅡ字符集與控制命令區分的原因:
1)這種區分意味著Telnet具有更大的靈活性:它可在客戶機與服務器間傳送所有可能的ASCⅡ字符以及所有控制功能;
2)這種區分使得客戶機可以無二義性的指定信令,而不會產生控制功能與普通字符的混亂。 .
4 、數據流向
上面我們提到過將Telnet設計為應用級軟件有一個缺點,那就是:效率不高。這是為什么呢?下面給出Telnet中的數據流向:
數據信息被用戶從本地鍵盤鍵入并通過操作系統傳到客戶機程序,客戶機程序將其處理后返回操作系統,并由操作系統經過網絡傳送到遠程機器,遠程操作系統將所接收數據傳給服務器程序,并經服務器程序再次處理后返回到操作系統上的偽終端入口點,最后,遠程操作系統將數據傳送到用戶正在運行的應用程序,這便是一次完整的輸入過程;輸出將按照同一通路從服務器傳送到客戶機?!∫驗槊恳淮蔚妮斎牒洼敵?#xff0c;計算機將切換進程環境好幾次,這個開銷是很昂貴的。還好用戶的鍵入速率并不算高,這個缺點我們仍然能夠接受?!?
5、 強制命令
我們應該考慮到這樣一種情況:假設本地用戶運行了遠地機器的一個無休止循環的錯誤命令或程序,且此命令或程序已經停止讀取輸入,那么操作系統的緩沖區可能因此而被占滿,如果這樣,遠程服務器也無法再將數據寫入偽終端,并且最終導致停止從TCP連接讀取數據,TCP連接的緩沖區最終也會被占滿,從而導致阻止數據流流入此連接。如果以上事情真的發生了,那么本地用戶將失去對遠程機器的控制。
為了解決此問題,Telnet協議必須使用外帶信令以便強制服務器讀取一個控制命令。我們知道TCP用緊急數據機制實現外帶數據信令,那么Telnet只要再附加一個被稱為數據標記(date mark)的保留八位組,并通過讓TCP發送已設置緊急數據比特的報文段通知服務器便可以了,攜帶緊急數據的報文段將繞過流量控制直接到達服務器。作為對緊急信令的相應,服務器將讀取并拋棄所有數據,直到找到了一個數據標記。服務器在遇到了數據標記后將返回正常的處理過程。
由于Telnet兩端的機器和操作系統的異構性,使得Telnet不可能也不應該嚴格規定每一個telnet連接的詳細配置,否則將大大影響Telnet的適應異構性。因此,Telnet采用選項協商機制來解決這一問題。
Telnet選項的范圍很廣:一些選項擴充了大方向的功能,而一些選項制涉及一些微小細節。例如:有一個選項可以控制Telnet是在半雙工還是全雙工模式下工作(大方向);還有一個選項允許遠地機器上的服務器決定用戶終端類型(小細節)。
Telnet選項的協商方式也很有意思,它對于每個選項的處理都是對稱的,即任何一端都可以發出協商申請;任何一端都可以接受或拒絕這個申請。另外,如果一端試圖協商另一端不了解的選項,接受請求的一端可簡單的拒絕協商。因此,有可能將更新,更復雜的Telnet客戶機服務器版本與較老的,不太復雜的版本進行交互操作。如果客戶機和服務器都理解新的選項,可能會對交互有所改善。否則,它們將一起轉到效率較低但可工作的方式下運行。所有的這些設計,都是為了增強適應異構性,可見Telnet的適應異構性對其的應用和發展是多么重要。
上面討論了一些原理方面的東西,雖然我們在Telnet的使用過程中很難接觸到這一層面,但我認為了解這些是有意義的,它會給我們帶來許多啟示。下面讓我們來看看Win2000的Telnet服務。
6 、子選項協商
有些選項不是僅僅用“激活”或“禁止”就能夠表達的。指定終端類型就是一個例子,客戶進程必須發送用一個A S C I I字符串來表示終端類型。為了處理這種選項,我們必須定義子選項協商機制。
在R F C 1 0 9 1 [ VanBokkelen 1989]中定義了如何表示終端類型這樣的子選項協商機制。首先連接的某一方(通常是客戶進程)發送3個字節的字符序列來請求激活該選項。
<IAC,WILL,24>
這里的2 4(十進制)是終端類型選項的I D號。如果收端(通常是服務器進程)同意,那么響應數據是:
<IAC,DO,24>
然后服務器進程再發送如下的字符串:
<IAC,SB,24,1,IAC,SE>
該字符串詢問客戶進程的終端類型。其中S B是子選項協商的起始命令標志。下一個字節的“2 4”代表這是終端類型選項的子選項(通常S B后面的選項值就是子選項所要提交的內容)。下一個字節的“ 1”表示“發送你的終端類型”。子選項協商的結束命令標志也是I A C,就像S B是起始命令標志一樣。如果終端類型是i b m p c,客戶進程的響應命令將是:
第4個字節“0”代表“我的終端類型是”(在Assigned Numbers RFC文檔中有正式的關于終端類型的數值定義,但是最起碼在U n i x系統之間,終端類型可以用任何對方可理解的數據進行表示。只要這些數據在t e r m c a p或t e r m i n f o數據庫中有定義)。在Te l n e t子選項協商過程中,終端類型用大寫表示,當服務器收到該字符串后會自動轉換為小寫字符。
TeInet服務基本配置
其實從應用層面上,Win2000的Telnet服務并沒有什么可說的,絕大部分內容你都可以從HELP文件中得到,我在此只是把它稍微整理一下而已。 Win2000為我們提供了Telnet客戶機和服務器程序:Telnet.exe是客戶機程序(Client),tlntsvr.exe是服務器程序(server),同時它還為我們提供了Telnet服務器管理程序tlntadmn.exe。
Windows 2000 默認安裝了 Telnet 服務,但是并沒有默認啟動。下面給出HELP文件中 Telnet 服務的一部分默認設置:
AllowTrustedDomain:是否允許域用戶訪問。默認值是1,允許信任域用戶訪問。可以改為0: 不允許域用戶訪問(只允許本地用戶)。
DefaultDomain:可以對與該計算機具有信任關系的任何域設置。默認值是"."。
DefaultShell:顯示 shell 安裝的路徑位置。默認值是:%systemroot%\System32\Cmd.exe /q /k
MaxFailedLogins:在連接終止之前顯示嘗試登錄失敗的最大次數。默認是3。
LoginScript:顯示 Telnet 服務器登錄腳本的路徑位置。默認的位置就是“%systemroot%\System32\login.cmd”,你可以更改腳本內容,這樣登錄進Telnet的歡迎屏幕就不一樣了。
NTLM:NTLM身份驗證選項。默認是2。可以有下面這些值:
0: 不使用 NTLM 身份驗證。
1: 先嘗試 NTLM 身份驗證,如果失敗,再使用用戶名和密碼。
2: 只使用 NTLM 身份驗證。
TelnetPort:顯示 telnet 服務器偵聽 telnet 請求的端口。默認是:23。你也可以更改為其他端口。
以上各項設置你可以使用tlntadmn.exe(Telnet服務器管理程序)來進行非常方便的配置,配置后需要重新啟動Telnet服務。如圖1
NTLM
提到了telnet就不能不提NTLM,我想這也是讓入侵者最為頭痛的一件事,哪怕你獲得了管理員帳號和密碼,想簡單通過NTLM也并非易事,況且win2000中的telnet默認僅以NTLM方式驗證身份,這就讓我們不得不關注NTLM這個東東,那么什么是NTLM呢?
早期的SMB協議在網絡上明文傳輸口令,后來出現了"LAN Manager Challenge/Response"驗證機制,簡稱LM,它十分簡單以至很容易被破解,微軟隨后提出了WindowsNT挑戰/響應驗證機制,即NTLM?,F在已經有了更新的NTLMv2以及Kerberos驗證體系。
NTLM工作流程是這樣的
1.客戶端首先在本地加密當前用戶的密碼成為密碼散列
2.客戶端向服務器發送自己的帳號,這個帳號是沒有經過加密的,明文直接傳輸
3.服務器產生一個16位的隨機數字發送給客戶端,作為一個 challenge(挑戰)
4.客戶端再用加密后的密碼散列來加密這個 challenge ,然后把這個返回給服務器。作為 response(響應)
5.服務器把用戶名、給客戶端的challenge 、客戶端返回的 response 這三個東西,發送域控制器
6.域控制器用這個用戶名在 SAM密碼管理庫中找到這個用戶的密碼散列,然后使用這個密碼散列來加密 challenge。
7.域控制器比較兩次加密的 challenge ,如果一樣,那么認證成功。
從上面的過程我們可以看出,NTLM是以當前用戶的身份向Telnet服務器發送登錄請求的,而不是用你掃到的對方管理員的帳戶和密碼登錄,顯然,你的登錄將會失敗。舉個例子來說,你家的機器名為A(本地機器),你入侵的機器名為B(遠地機器),你在A上的帳戶是xinxin,密碼是1234,你掃到B的管理員帳號是Administrator,密碼是5678,當你想Telnet到B時,NTLM將自動以當前用戶的帳號和密碼作為登錄的憑據來進行上面的7項操作,即用xinxin和1234,而并非用你掃到的Administrator和5678,且這些都是自動完成的,根本不給你插手的機會,因此你的登錄操作將失敗。
轉載于:https://www.cnblogs.com/new0801/archive/2012/11/07/6177686.html
總結
以上是生活随笔為你收集整理的VC++分析数据包实现Telnet协议分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP FORM 提交
- 下一篇: hdu 4460 friend chai