浅议SSH协议
什么是SSH?
SSH 為 Secure Shell 的縮寫,由 IETF 的網絡工作小組(Network Working Group)所制定;SSH 為建立在應用層和傳輸層基礎上的安全協議。SSH 是目前較可靠,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。S S H最初是U N I X系統上的一個程序,后來又迅速擴展到其他操作平臺。S S H在正確使用時可彌補網絡中的漏洞。S S H客戶端適用于多種平臺。幾乎所有U N I X平臺—包括H P - U X、L i n u x、A I X、S o l a r i s、Digital UNIX、I r i x,以及其他平臺—都可運行S S H。
為什么要引入SSH?
一言以蔽之,就是因為網絡的不安全性,傳統的網絡通信方式,如telnet,rlogin,FTP,http 都是以明文方式傳送用戶名和密碼進行身份驗證的,這是十分危險的。在共享網絡環境下,只要用一些嗅探工具(如大名頂頂的sniffer portable 和wireshark)就很容易捕獲到登錄者的用戶名和密碼,進而控制遠程的主機,而合法用戶卻毫無察覺。有人會說之所以能夠捕獲到用戶名和密碼,是因為共享式(典型的代表就是集線器)網絡工作原理帶來的不安全性(集線器的工作原理就是機械的將收到的數據包向每一哥集線器端口發送),才使得嗅探工具有用武之地,如果使用交換式網絡(交換式網絡工作原理是以目的MAC地址進行轉發,而不是進行泛洪發送到每一個端口),就能夠避免明文密碼被嗅探到。其實對于交換網絡也是可以進行密碼嗅探的,只不過手段要稍顯復雜一點,我們知道每一個交換機都有一張MAC地址表,記錄著相應端口和MAC地址的對應,交換機就是依據這個MAC地址表將數據包發送到正確的端口對應的機器。交換機的MAC地址表是交換機動態學習得到的,而且容量是一定的,當MAC地址表容量滿了,就是溢出了,對于新收到的數據包就無法進行動態學習并加入到MAC地址表中。這是因為這樣,給了***者可乘之機,MacFlooding就是利用這個原理進行***,***者持續不斷發送大量源地址偽造的數據包,交換機傻傻的不斷學習(心學習道德會替換舊的數據),不一會MAC地址表就被假的數據撐爆了,當合法的數據包發送至交換機時候,交換機是無法進行學習并從MAC地址表中找到相應正確端口,這時交換機就啟用共享工作模式,變成了一個集線器,向每一個端口發送收到的數據包,于是嗅探工具又可以工作了。當然這只是針對交換式網絡***的一種,還有如MAC地址欺騙***(就是聲稱自己的MAC地址就是被***主機,數據包便會發送至***者啦,sniffer就樂了,哈哈又來啦)、ARP欺騙***(這樣說吧,有A B C三臺主機,C是***者,C向A發送ARP應答,說B的ip對應的MAC地址是我的MAC地址,然后C再向B發送ARP應答,說A的IP地址對應的MAC地址是我的MAC地址,這樣A B都被C騙了,修改了自己的ARP表,將數據發送給了C,C充當了A B 中間傳遞著,這種***也可稱作中間人***,值得注意的是這種存在缺陷就是ARP不能跨網段),由此我們知道交換式網絡也是不安全的,雖然我們還是可以做點什么以加強交換網絡的安全性,如端口安全(事先將合法MAC地址與相應端口綁定,這樣MacFloding ,MAC地址欺騙就不太管用啦)、arp靜態綁定(抵制arp欺騙***)。但是讓明文數據在網絡上傳播終究讓人不太放心,于是就有必要引入SSH啦,SSH會加密傳輸的數據,通過使用SSH,你可以把所有傳輸的數據進行加密,這樣"中間人"這種***方式就不可能實現了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸的數據是經過壓縮的,所以可以加快傳輸的速度。SSH有很多功能,它既可以代替Telnet,又可以為FTP、PoP、甚至為PPP提供一個安全的"通道"。
SSH協議的主要構成
SSH 主要有三部分組成: 傳輸層協議 [SSH-TRANS]
提供了服務器認證,保密性及完整性。此外它有時還提供壓縮功能。 SSH-TRANS 通常運行在 TCP/IP連接上,也可能用于其它可靠數據流上。 SSH-TRANS 提供了強力的加密技術、密碼主機認證及完整性保護。該協議中的認證基于主機,并且該協議不執行用戶認證。更高層的用戶認證協議可以設計為在此協議之上。
用戶認證協議 [SSH-USERAUTH]
用于向服務器提供客戶端用戶鑒別功能。它運行在傳輸層協議 SSH-TRANS 上面。當SSH-USERAUTH 開始后,它從低層協議那里接收會話標識符(從第一次密鑰交換中的交換哈希H )。會話標識符唯一標識此會話并且適用于標記以證明私鑰的所有權。 SSH-USERAUTH 也需要知道低層協議是否提供保密性保護。
連接協議 [SSH-CONNECT]
將多個加密隧道分成邏輯通道。它運行在用戶認證協議上。它提供了交互式登錄話路、遠程命令執行、轉發 TCP/IP 連接和轉發 X11 連接。
SSH的結構
SSH是由客戶端和服務端的軟件組成的,有兩個不兼容的版本分別是:1.x和2.x。 用SSH 2.x的客戶程序是不能連接到SSH 1.x的服務程序上去的。OpenSSH 2.x同時支持SSH 1.x和2.x。
服務端是一個守護進程(demon),他在后臺運行并響應來自客戶端的連接請求。服務端一般是sshd進程,提供了對遠程連接的處理,一般包括公共密鑰認證、密鑰交換、對稱密鑰加密和非安全連接。
客戶端包含ssh程序以及像scp(遠程拷貝)、slogin(遠程登陸)、sftp(安全文件傳輸)等其他的應用程序。
他們的工作機制大致是本地的客戶端發送一個連接請求到遠程的服務端,服務端檢查申請的包和IP地址再發送密鑰給SSH的客戶端,本地再將密鑰發回給服務端,自此連接建立。SSH 1.x和SSH 2.x在連接協議上有一些差異。
一旦建立一個安全傳輸層連接,客戶機就發送一個服務請求。當用戶認證完成之后,會發送第二個服務請求。這樣就允許新定義的協議可以與上述協議共存。連接協議提供了用途廣泛的各種通道,有標準的方法用于建立安全交互式會話外殼和轉發(“隧道技術”)專有 TCP/IP 端口和 X11 連接。
SSH被設計成為工作于自己的基礎之上而不利用超級服務器(inetd),雖然可以通過inetd上的tcpd來運行SSH進程,但是這完全沒有必要。啟動SSH服務器后,sshd運行起來并在默認的22端口進行監聽(你可以用 # ps -waux | grep sshd 來查看sshd是否已經被正確的運行了)如果不是通過inetd啟動的SSH,那么SSH就將一直等待連接請求。當請求到來的時候SSH守護進程會產生一個子進程,該子進程進行這次的連接處理。
SSH兩個主要版本特點與區別
上面已經提到,SSH協議主要存在兩個版本SSH1和SSH2,而且這兩個版本是不兼容的,這就是說,使用SSH1協議的客戶端是不能登錄SSH2協議的服務器。
SSH1又分為1.3和1.5兩個版本。SSH1采用DES、3DES、Blowfish和RC4等對稱加密算法保護數據安全傳輸,而對稱加密算法的密鑰是通過非對稱加密算法(RSA)來完成交換的。SSH1使用循環冗余校驗碼(CRC)來保證數據的完整性,但是后來發現這種方法有缺陷。
SSH2避免了RSA的專利問題,并修補了CRC的缺陷。SSH2用數字簽名算法(DSA)和Diffie-Hellman(DH)算法代替RSA來完成對稱密鑰的交換,用消息證實代碼(HMAC)來代替CRC。同時SSH2增加了AES和Twofish等對稱加密算法。
SSH兩種認證方式的特點
從客戶端來看,SSH提供兩種級別的安全驗證。
第一種級別(基于口令的安全驗證)
只要你知道自己帳號和口令,就可以登錄到遠程主機。所有傳輸的數據都會被加密, 但是不能保證你正在連接的服務器就是你想連接的服務器。可能會有別的服務器在冒充真正的服務器, 也就是受到“中間人”這種方式的***。
? 例子: 如何以中間人***的方式***SSH1
簡單地說,SSH1的通信過程是這樣的:
??????????????? 服務器???????????????????????????? 客戶
握手階段
???????????????????????????????? SYN
????????????????????? <---------------------------
????????????????????????????? SYN ACK
????????????????????? --------------------------->
???????????????????????????????? ACK
????????????????????? <---------------------------
協議協商階段
????????????????????????????? 版本信息
????????????????????? --------------------------->
????????????????????????????? 版本信息
????????????????????? <---------------------------
交換密鑰階段
?????????????????????????? 明碼傳輸的服務器公鑰
????????????????????? --------------------------->
????????????????????????? 服務器公鑰加密的會話密鑰
????????????????????? <---------------------------
認證階段
?????????????????????????????? 確認信息
????????????????????? <---------------------------
????????????????????????? 會話密鑰加密的用戶名
????????????????????? <---------------------------
?????????????????????????????? 應答信息
????????????????????? --------------------------->
????????????????????????? 會話密鑰加密的口令信息
????????????????????? <---------------------------
?????????????????????????????? 應答信息
????????????????????? --------------------------->
數據通信階段
????????????????????? ............................
這個過程中,由于監聽者處于中間人的地位,它可以在交換密鑰的階段從截獲的數據流中取出服務器的公鑰,保存起來,然后用自己生成的一對密鑰中的公鑰替換數據包中的公鑰,發送給客戶。這樣,當客戶生成會話密鑰的時候就會用我們的公鑰加密。當我們收到客戶發送的會話密鑰的時候,可以用我們所掌握的私鑰解密,得到會話密鑰,然后再用保存下來的服務器公鑰加密,發送給服務器。此時,服務器、客戶和監聽者都有了同一個會話密鑰,以后的通信對于監聽者來說就如同明文了。
第二種級別(基于密匙的安全驗證)
需要依靠密匙,也就是你必須為自己創建一對密匙,并把公用密匙放在需要訪問的服務器上。 如果你要連接到SSH服務器上,客戶端軟件就會向服務器發出請求,請求用你的密匙進行安全驗證。服務器收到請求之后, 先在該服務器上你的主目錄下尋找你的公用密匙,然后把它和你發送過來的公用密匙進行比較。如果兩個密匙一致, 服務器就用公用密匙加密“質詢”(challenge)并把它發送給客戶端軟件。 客戶端軟件收到“質詢”之后就可以用你的私人密匙解密再把它發送給服務器。
用這種方式,你必須知道自己密匙的口令。但是,與第一種級別相比,第二種級別不需要在網絡上傳送口令。
第二種級別不僅加密所有傳送的數據,而且“中間人”這種***方式也是不可能的(因為他沒有你的私人密匙)。 但是整個登錄的過程可能需要10秒。
SSH另類應用:用ssh做socks5代理
1. 下載MyEntunnel
2.下載PuTTY,解壓到MyEntunnel程序的目錄下。
3.運行MyEntunnel.exe,設置:SSH Server里頭填上ssh ftp的地址或IP,填好用戶名和密碼,點Connect,系統欄里面的小鎖變成綠色就連接成功了。
4.設置瀏覽器。IE是不支持socks代理的,用firefox好了,打開firefox的代理設置頁,在socks主機處填上127.0.0.1端口填原先設置的,默認7070。
SSH相關實驗。
一、抓包觀察ssh協議流程:
由上圖可知ssh協議主要經歷握手->協商->密鑰交換->加密數據傳輸這么幾個階段
?
二、ssh公鑰驗證登錄實驗
使用ssh公鑰驗證登陸不僅可以省去每一登錄時輸入密碼的煩擾,而且更為安全,下面就開始實驗吧:
1、使用putty產生密鑰對并進行登錄
使用puttygen制作密鑰
啟動puttygen工具,為兼容OpenSSH密鑰,選擇“SSH2 RSA”:
?
單擊 Generate 按鈕,并使用鼠標在“key”框內移動,以獲得足夠的隨機數據供生成密鑰使用:
?
期間,你會看到進度條上面有個提示“Please generate some radomness by moving the mouse over the blank area.”,意思就是讓你用鼠標在空白區域隨機移動。隨著鼠標在空白區域的移動,進度條會一直走下去。停止移動鼠標,進度條也就停止了。所以,那我們要移動鼠標,直到進度條走滿為止。
完成后的窗口如下:
其中:
Key comment:是注釋,不會影響密鑰的有效性,但可作為自己用于區別其他密鑰的參考;Key passphrase 和 Confirm passphrase :用于保護私鑰,如果不輸入該信息,那么任何人只要拿到該私鑰,即可無密碼登陸系統,非常危險;通常情況下,我是建議大家輸入的,但這里為了方便說明,暫時留空.
隨后,點擊“Save private key”保留私鑰。
如果沒有輸入Key passphrase信息,會有警告,這里點擊yes保存私鑰
輸入私鑰的文件名:
公鑰信息可以不用保留在本地的,puttygen可以從私鑰得到它,驗證時也不會用到。
修改openssh配置
修改/etc/ssh/sshd_config:
UsePAM no??#不使用PAM認證
PubkeyAuthentication yes
AuthorizedKeysFile????? %h/.ssh/authorized_keys
?
然后重啟sshd服務
拷貝公鑰信息
上面密鑰信息窗口的“Key”框最后生成的就是公鑰信息(最好直接復制框中的公鑰信息然后粘貼到目標的authroized_keys文件中,因為這樣不會導致refuse key等錯誤信息):
需要把該信息拷貝到Linux服務器的特定文件中:~/.ssh/authroized_keys
其中,“~”表示對應用戶的主目錄,以root為例。
若.ssh目錄不存在,請創建它,并把公鑰信息寫入文件中:
# mkdir ~/.ssh
# chmod 700 ~/.ssh
# vi ~/.ssh/authorized_keys
# chmod 644 ~/.ssh/authorized_keys
請務必留意:文件和目錄的權限問題,用戶必須是將要進行認證的用戶,而權限必須是0644,也就是禁止其他人對該文件寫入信息。(否則,某些有心人把自己的公鑰寫入這里,他也可以無密碼進來了)
因為,通常umask是0022或0002的,所以請使用chown和chmod修改為對應的權限咯。
?
使用putty使用密鑰登陸
對putty進行一些簡單配置,即可使用密鑰登陸Linux服務器。
打開putty 輸入目標ssh 服務器的ip地址,并選擇端口號:
選擇Connection-SSH-Auth,在“Private key file for authentication”輸入密鑰的路徑:
然后在Connection->data ->Auth-login username”(不同版本的putty會有所不同)輸入登陸的用戶名,例如root:
然后點擊Open即可:
2、linux作為客戶端產生密鑰對并進行登錄
打開終端輸入以下命令
ssh-genkey -t rsa
-t表示公鑰算法為rsa
# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):??<-密鑰路徑
Enter passphrase (empty for no passphrase): <-密鑰保護密碼
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa. <-私鑰
Your public key has been saved in /root/.ssh/id_rsa.pub. <-公鑰
將產生的密鑰傳輸到遠程ssh server
root@bt #scp /root/.ssh/id_rsa.pub root@192.168.88.29:/root/.ssh/authorized_keys
公鑰無密碼登錄
root@bt #ssh 192.168.88.29
ok
?
PS:
由于SSH的標準中,并沒有固定密鑰文件的格式。而Putty使用的私鑰格式和OpenSSH生成的有點不同,使用時需要轉換一下。
a)把id_rsa傳到Windows機器上
b)使用puttygen的“Load”讀取id_rsa文件
這里也可以從圖中的公鑰信息,與id_rsa.pub對比一下,應該是一致的。
c)點擊“Save private key”保留私鑰。
d)putty使用該新的私鑰登陸服務器即可。
三、ftp telnet http 明文傳輸驗證實驗
FTP 明文傳輸驗證實驗
實驗環境:
BT5充當FTP登錄客戶端并進行抓包,win7充當ftp服務器
抓包工具wireshark
實驗過程如下:
打開wireshark,依次執行capture->options->Filter
在Filter右邊的輸入框中輸入捕獲過濾表達式(詳見 《簡明使用wireshark教程》一文),這里為簡單期間,輸入TCP即可,點擊start進行捕獲:
?
?
停止捕獲,在Filter右邊的輸入框中輸入顯示過濾表達式(詳見 《簡明使用wireshark教程》一文)FTP,點擊apply,捕獲結果如下:
?
?
由上圖可見ftp明文密碼被輕松捕獲到,用戶名為ajian密碼為123
?
?
telnet明文傳輸驗證實驗:
實驗環境大體與上面ftp一樣,只不過有ftp server 換成了telnet server
開始實驗:
打開wireshark,依次執行capture->options->Filter
在Filter右邊的輸入框中輸入捕獲過濾表達式(詳見 《簡明使用wireshark教程》一文),這里為簡單期間,輸入TCP port 23即可,點擊start進行捕獲:
?
停止捕獲,在Filter右邊的輸入框中輸入顯示過濾表達式(詳見 《簡明使用wireshark教程》一文)telnet,點擊apply,捕獲結果如下:
?
選擇第一個條目,右鍵選擇 Follow Tcp Stream :
?
由上圖清晰可見用戶名和密碼
?
Http明文傳輸驗證實驗:
實驗環境:
BT5進行http server 登錄并抓包,GNS3+cisco3725模擬要求驗證的http server
抓包工具dsniffer (該工具據說善于抓取敏感數據包,拭目以待啦)
開始監聽:
dsniffer -i eth1
?
由上圖可見 cisco路由器的名字叫R1 enable密碼是123
?
?
轉載于:https://blog.51cto.com/ajianhappy/772610
總結
- 上一篇: gcc中常用的选项
- 下一篇: 北京点击科技有限公司董事长兼总裁——王志