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,一旦A連接了B主機,立即使用telnet連接C主機,此過程可以突破防火牆的限制

四: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

客戶機上的程序,將對youtube.com:80的請求告知7001埠的SSH,SSH將此請求通過SSH加密連接發送到牆外伺服器的SSH上

由於建立的動態綁定,伺服器會將youtube.com:80的請求發送給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/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) | 滲透測試 |