ssh 端口轉發#
在橫向移動的內網代理的過程中,如果控制的目標機器是 linux 伺服器,那麼就可以通過 ssh 實現內網代理操作,用的比較多的是動態轉發。
ssh 的三種端口轉發模式:
-
本地轉發(-L 參數)
-
遠程轉發(-R 參數)
-
動態轉發(-D 參數)
-
攻擊機器:攻擊者的機器
-
待登錄機器:已被控制的 linux 伺服器
-
目標機器:攻擊機器需要訪問的目標主機,無法直接訪問
本地轉發#
本地轉發,顧名思義就是把本地主機端口通過待登錄主機端口轉發到遠程主機端口上去。
本地轉發通過參數 - L 指定,格式:ssh -L [攻擊機器ip]
:<攻擊機器端口號>:< 目標機器 ip>:< 目標機器端口號 > < 待登錄機器的用戶名 >@< 待登錄主機的 ip>
假設如下場景:
攻擊者通過攻擊機器
控制了一台linux伺服器(待登錄機器)
並獲取了帳號密碼,然後還有一台目標機器,這台機器位於內網,攻擊機器
無法訪問,但待登錄機器
可以訪問,類似如下拓撲圖。
此時,host1
如果要訪問host3
該怎麼辦呢?
只能通過host2
進行轉發,host2
充當中間人的作用,傳輸host1
和host3
之間的加密數據。
假如 host3 有一個 web 服務端口為 80,host1 需要訪問這個 web 服務,那麼可以如下操作,在 host1 上通過 ssh 連接登錄到 host2 上即可實現本地端口轉發。
host1 上操作
ssh -L 0.0.0.0:8888:10.10.10.129:80 [email protected]
- 攻擊機器 ip 可選,也可以寫成如下
ssh -L 8888:10.10.10.129:80 [email protected]
這條命令將目標機器的 80 端口映射到攻擊機器的 8888 端口,此時攻擊者只要訪問本地的 8888 端口就是訪問目標機器的 80 端口。
遠程端口轉發#
假設如下場景,這種場景在滲透測試中不常見,host1 不允許直接訪問 host3,host2 可以訪問 host3,但是 host1 無法訪問 host2,host2 可以訪問 host1。此時就用到遠程端口轉發。
host2 上操作
ssh -R 0.0.0.0:8888:10.10.10.129:80 [email protected]
也可以寫成
ssh -R 8888:10.10.10.129:80 [email protected]
這條命令將目標機器(host3)的 80 端口映射到待登錄機器(host2)機器的 8888 端口,此時攻擊者只要訪問本地的 8888 端口就是訪問目標機器(host3)的 80 端口。
動態端口轉發#
動態轉發通過參數 - D 指定
格式:-D [本地主機:]
本地主機端口
相對於前兩個來說,動態轉發無需再指定遠程主機及其端口且通過 SOCKS 協議進行數據傳輸。
假設如下場景:
攻擊者通過攻擊機器
控制了一台linux伺服器(待登錄機器)
並獲取了帳號密碼,然後還有一台目標機器,這台機器位於內網,攻擊機器
無法訪問,但待登錄機器
可以訪問,類似如下拓撲圖。
攻擊機器(host1)上操作
ssh -D 127.0.0.1:8888 [email protected]
也可以寫成
ssh -D 8888 [email protected]
這條命令創建了一個 SOCKS 代理,所有通過該 SOCKS 代理發出的數據包將經過 host2 轉發出去。
怎麼使用?
- 用 firefox 瀏覽器,在瀏覽器裡設置使用 socks5 代理 127.0.0.1:8888,然後瀏覽器就可以訪問 host2 所在網絡內的任何 IP 了。
- 如果是普通命令行應用,使用proxychains-ng,參考命令如下:
brew install proxychains-ng
編輯配置文件
vim /usr/local/etc/proxychains.conf # 在ProxyList配置段下添加配置 "socks5 127.0.0.1 8888"
訪問目標網絡
proxychains-ng wget http://10.10.10.129 # 在其它命令行前添加proxychains-ng即可
構建 ssh 隧道的常用參數:
-C 壓縮傳輸,提高傳輸速度
-f 後台執行數據傳輸
-N 建立靜默連接
-g 允許遠程主機連接本地用於轉發的端口
-L 本地端口轉發
-R 遠程端口轉發
-D 動態轉發,即 SOCKS 代理
-p 指定 ssh 連接端口
實驗環境搭建#
環境配置#
1、攻擊機器
- 17.1.26.131
2、待登錄主機
- 17.1.26.133
- 10.10.10.130
3、目標主機
- 10.10.10.129
本地端口轉發#
在攻擊機器(host1)執行如下命令:
ssh -L 8888:10.10.10.129:80 [email protected]
在攻擊機器(host1)查看端口情況,可以看到正在監聽 8888 端口。
在本地主機打開瀏覽器,訪問 8888 端口,查看是否能訪問成功。訪問http://127.0.0.1:8888/123.asp。
遠程轉發#
環境如上一致,命令參數如下,在待登錄主機(host2)上輸入如下命令:
ssh -R 8888:10.10.10.129:80 [email protected]
回到本地主機,查看端口是否打開,netstat -tnlp ,顯示 8888 端口已打開。
同時打開瀏覽器訪問http://127.0.0.1:8888/123.asp,訪問成功。
動態轉發#
環境和本地轉發一致,命令參數如下,在攻擊機器(host1)的命令行窗口執行並輸入 ssh 登錄密碼:
ssh [email protected] -D 55555
攻擊機器(host1)上查看端口情況
攻擊機器(host1)設置瀏覽器 socks 代理
攻擊機器(host1)瀏覽器直接訪問http://10.10.10.129/123.asp
參考#
https://jeremyxu2010.github.io/2018/12/ssh 的三種端口轉發 /
https://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html
https://reznok.com/ssh-tunneling-magic/
圖片來自