SSH Tunnel繞過防火牆穿透內網
SSH Tunnle(Local,Remote and Dynamic proxy)
一:什麼是埠轉發?
SSH 會自動加密和解密所有SSH 客戶端與服務端之間的網路數據。但是,SSH 還能夠將其他TCP 埠的網路數據通過SSH 鏈接來轉發,並且自動提供了相應的加密及解密服務。這一過程也被叫做「隧道」(tunneling),這是因為SSH 為其他TCP 鏈接提供了一個安全的通道來進行傳輸而得名。例如,Telnet,SMTP,LDAP 這些TCP 應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果工作環境中的防火牆限制了一些網路埠的使用,但是允許SSH 的連接,也能夠通過將TCP 埠轉發來使用SSH 進行通訊。
二:SSH 埠轉發能夠提供兩大功能:
1.加密SSH Client 端至SSH Server 端之間的通訊數據
2.突破防火牆的限制完成一些之前無法建立的TCP 連接
三:SSH 本地埠轉發:
#!/usr/bin/python3.6
# -*- coding=utf-8 -*-
from sshtunnel import SSHTunnelForwarder
server = SSHTunnelForwarder(
(10.1.5.254, 22),#Step 2連接遠端伺服器SSH埠
ssh_username="root",
ssh_password="Cisc0123",
local_bind_address=(10.1.5.205,2323),#Step 1連接本地地址10.1.5.205,2323
remote_bind_address=(127.0.0.1, 23)#Step 3跳轉到本地伺服器127.0.0.1, 22)
server.start()
print(server.local_bind_port)#如果不配置local_bind_address,將會隨機綁定本地埠,並且列印
流程解釋:
數據一旦TELNET以後,數據會發送到本機2323埠,再在本機開一個隨機埠,充當ssh客戶端,再把數據流量發送到22埠的SSH服務端,SSH伺服器收到數據以後,解密數據,臨時開一個隨機埠充當客戶端,再把流量發送到自己的23埠TELNET服務端。

四:SSH 遠程埠轉發
流程解釋:
數據一旦TELNET以後,數據會發送到本機2323埠,再在本機開一個隨機埠,充當SSH客戶端,再把數據流量發送到22埠的SSH服務端,SSH伺服器收到數據以後,解密數據,本地臨時開一個隨機埠充當客戶端,再把流量發送到R8的23埠TELNET服務端。
#!/usr/bin/python3.6
# -*- coding=utf-8 -*-
from sshtunnel import SSHTunnelForwarder
server = SSHTunnelForwarder(
(10.1.5.254, 22),#Step 2連接遠端伺服器SSH埠
ssh_username="root",
ssh_password="Cisc0123",
local_bind_address=(10.1.5.205,2323),#Step 1連接本地地址10.1.5.205,2323
remote_bind_address=(192.168.10.254, 23)#Step 3跳轉到遠端伺服器192.168.10.254, 23)
server.start()
print(server.local_bind_port)#如果不配置local_bind_address,將會隨機綁定本地埠,並且列印

防火牆安全策略禁止訪問TELNET,運行其他所有協議和地址(真實環境中安全策略會做的很精確)

Kali上啟動SSH Tunnel腳本

查看Kali的路由是可以達到R8的路由(192.168.10.0/24),本文檔為了對比效果,手動添加了達到R8的靜態路由,真實環境中公網無法直接使用內網地址訪問到目標內網伺服器

測試可以ping同目標telnet伺服器

但是無法telnet到目標伺服器

此時直接telnet本機的10.1.5.205 2323埠

ssh協議裡面封裝了telnet,一旦A連接了B主機,立即使用telnet連接C主機,此過程可以突破防火牆的限制。
此方式前提需要拿到邊界防火牆的SSH用戶名密碼,或者前提控制了內網一台主機後,使用隧道技術或者埠轉發技術繞過防火牆安全策略。
五:SSH 動態代理
VPN vs SSH
VPN和SSH隧道翻牆有如下區別:
VPN的設置是全局的,即電腦一旦掛上VPN,所有的聯網程序都將自動使用VPN;而建立好SSH隧道後,需要程序設定使用隧道才會使用隧道聯網
如果使用商用的VPN一般要花錢,如果自己搭,VPN的搭建難度大於SSH隧道。因為SSH隧道只要一台可以SSH的伺服器即可,根本不需要在伺服器上配置任何東西
SSH動態綁定
首先,牆內的客戶機跟牆外的代理伺服器,建立好SSH連接,並設定動態綁定
此時牆內客戶機上的SSH會監聽本地的一個埠7001
客戶機上的程序,將對http://www.youtube.com:80的請求告知7001埠的SSH,SSH將此請求通過SSH加密連接發送到牆外伺服器的SSH上
由於建立的動態綁定,伺服器會將http://www.youtube.com:80的請求發送給http://www.youtube.com上的80埠,並在收到回復後,通過原路返回給客戶機的SSH,客戶機的SSH返回給應用程序
實操
1.在本地執行
ssh -fND localhost:8888 root@remote_ip # 透過 ssh 建立一個 socks5 通過代理上網
2.配置fiewfox
firefox -> ... -> 手動設定 proxy 將 socks 主機 設成 localhost, port 設定成 8888
3.驗證
使用firefox,訪問whatisip,查看現在的ip已經是remote_ip,就說明已經成功
$ man ssh
-N 不執行任何指令 (只連接主機 不打開 shell)
-f 在後台執行
-D 建 socks5 的 proxy
Firefox 設置代理

使用百度或者whatismyip/http://ifconfig.me查看公網IP地址

命令也可以使用curl查看自身公網IP地址

命令行設置代理訪問
vim /etc/proxychains.conf
將socks4 127.0.0.1 9095改為socks5 127.0.0.1 xxxx //xxxx改為你自己的埠
設置 ProxyChains
1.打開ProxyChains配置文件
vim /etc/proxychains.conf
#順便補充一下Vim編輯器簡單使用方法
執行上面命令之後摁一下鍵盤的i鍵,就可以對文本進行修改
修改完成後摁esc 然後摁住shift+; 左下角會出現一個冒號
輸入wq摁下回車保存並退出
2.去掉dynamic_chain前面的注釋符

3.添加代理伺服器列表
在最下方這個地方,默認是socks4 xxxx xxx
改成sock5 127.0.0.1 xxxx // xxxx是你自己的埠,也就是上邊在配置ss時輸入的local_port:xxxx
我這裡用的是1080

4. 測試代理服務是否正常
執行
proxyresolv www.target.com
此時執行會出現命令未找到
終端輸入
cp /usr/lib/proxychains3/proxyresolv /usr/bin/
然後再次執行
proxyresolv www.google.com

//這時候ss的命令界面應該是正在運行的,就是在執行過sslocal -c /etc/shadowsocks.json之後
返回ok,說明配置正確,可以愉快的跨欄了。
5.使用ProxyChains 啟動firefox
終端輸入:proxychains firefox啟動火狐瀏覽器
測試一下:

使用ProxyChains代理其他程序和啟動Firefox同理
proxychains msfconsole //啟動msf
proxychains sqlmap //通過代理啟動sqlmap
Proxychains maltego //啟動maltego

The end!
推薦閱讀:
TAG:防火牆 | SSH(SecureShell) | 滲透測試 |
