某地級市HW攻防演練紅隊滲透總結
申明:文章僅供技術交流,請自覺遵守網絡安全相關法律法規,切勿利用文章內的相關技術從事非法活動,如因此產生的一切不良后果與文章作者無關
前言
上周參加了某地級市為期七天的網絡攻防演練對抗賽,總共14支攻擊隊。大概情況是:第一天多為弱口令和應用層漏洞攻擊且有攻擊隊申請高危漏洞攻擊,之后想必都開始了高危漏洞利用,內網攻擊,第四天就有攻擊隊開始使用0 day,Nday,社工釣魚攻擊,從第五天凌晨起進入混打亂斗模式,所有目標都變為公共目標,第七天18點停止對所有攻擊隊的授權,所有攻擊隊停止攻擊,演練結束。最終評判結果是第三名五萬多分,第二名六萬多分,第一名七萬多分!!!太太太......太卷了!!!
作為一只初次參加HW的菜鳥選手,在驚嘆的同時也在思考和摸索著紅隊滲透該怎么玩?他們是怎么打得那么快的?他們為什么能打穿內網,能單兵APT?陷入了對生命終極回答的思考:我是誰?我在哪?我要如何去往紅隊之路?
總的來說,在此次HW行動中還是學到了不少東西。故才有了本文,意在對此次HW進行復盤,總結在這次HW中學到的東西以及自己的不足與改進方法,也想做一次分享,希望能同安全圈的各位師傅們一同探討紅隊之路怎么走,在攻防演練中作為攻擊方我們應當做些什么才能達到HW演練所要達到的效果。以下是本人的總結與思考:
一、對某目標攻擊的復盤
由于HW中涉及的目標都很敏感,故本文截圖較少,且都已進行脫敏處理。有些內容可能不太完整,望見諒~
就拿得分最高也是最有意思的一個目標來做下復盤吧,整個的攻擊過程和方法是這樣的:
1.Web打點
目標是一個asp.net的網站,能解析asp,aspx代碼,訪問時就只能看到一個登錄框。大佬A的一頓操作發現了未授權訪問(算是0day了吧,采用此程序搭建的其他系統都存在這個問題,且似乎只有我們團隊發現了這個),此程序存在未授權用戶查看、添加、編輯和刪除。通過未授權訪問用戶修改界面(用戶uid=1), 可以看到密碼已填充,以*號顯示,通過前端代碼可以查看到明文,于是獲得后臺管理員賬號密碼并成功登錄,獲得200分。
在未授權用戶編輯界面有一個上傳頭像的功能,此處存在文件上傳漏洞,上傳圖片馬,burp抓包將后綴改為asp即可繞過,返回狀態碼為500,但實際上文件是上傳成功了的。
這是怎么知道文件上傳成功了的呢?通過目錄遍歷漏洞找到文件上傳路徑:

通過時間比對找到我們上傳的木馬文件是哪個,接下來就是常規操作,用蟻劍連接成功。又獲得200分!
不得不說,未授權訪問-->文件上傳-->目錄遍歷-->拿到webshell,大佬A強啊!!!
2.上免殺馬反彈shell(Failed)
拿到的是一個IIS權限,自然是要反彈到Metasploit、CobaltStrike這類集成框架來進行后滲透、提權打內網了(雖然內網也沒啥主機,但就是想打)。執行Systeminfo查看到是一臺winserver 2012 R2的服務器,打了153個補丁,通過執行tasklist /svc查看當前主機上運行的進程,將結果拷貝到在線殺軟識別平臺進行比對,發現目標主機上裝了360。

感覺有戲,于是我之前花了兩天研究的C語言免殺派上用場了,上傳了免殺360的馬,是shellcode分離免殺的,目標上提示命令執行成功但沒反彈回來,但在自己環境中能執行上線。不是被攔截原因,后面有場景會說明(相信有大佬大概知道什么原因了)。反彈失敗,還是我菜的原因啊~
3.信息收集,數據庫提權
通過信息收集,發現了這套程序還搭建在了其他目標上,于是大佬A又用之前的方法拿到了一臺主機的webshell,通過比對,發現裝了火絨。

于是再次用我的免殺馬嘗試CobaltStrike上線,這次成功了!!!

接下來提權,拿到的也是一臺winserver 2012 R2的服務器,打了150個補丁,我加載了taowu和Lodan插件(20211024版,應該是開源的最后一版了吧),試過了里面常用的提權插件都未成功,爛土豆提權失敗,因為條件不滿足;ms14-058反彈回來的是一樣的權限。(這是拿到數據庫服務器,演練快結束時的事了:將會話移交給MSF,使用MSF內置的CVE-2020-0787提權未成功,使用post/windows/gather/enum_patches模塊來收集補丁信息,顯示補丁都是在2021.12.1日打的;使用post/multi/recon/local_exploit_suggester 來查詢哪些EXP可用,并沒有顯示有可用EXP。)
陷入窘境,大佬B通過信息收集翻到了數據庫配置文件,原來這是一臺站庫分離的系統,數據庫在另外一臺外網服務器上(阿里云服務器),配置文件中泄露了數據庫服務器IP,端口,賬號,密碼,為SA權限,使用Navicat嘗試連接,居然成功了!!! 獲得400分
大佬C立馬來個xp_cmdshell提權,成功拿到System權限,再獲得200分!

System權限是在數據庫中,為了方便接下來的滲透,思路是將System權限上線到CobaltStrike上,在此處執行了從自己的VPS上下載免殺木馬并執行的操作,顯示執行成功,但并未上線。猜測這是臺阿里云的ECS,對出站端口進行了限制,所以反彈不回來。
4.拿下數據庫云服務器
Shell反彈不回來,就不能對云服務器做更好的控制,不能算完全拿下,于是在大佬D的指導下,利用System權限創建一個管理員賬戶,然后3389遠程桌面連接(沒錯3389開著,還沒對連接地址做限制),再利用Procdump+mimikatz獲取到Administrator賬戶的明文密碼。(因為是win2008的服務器,所以可以獲取到明文密碼,08之后的服務器獲取到的就是密文的了)。這樣才算是完全控制了這臺云服務器。
為了探究為什么執行木馬的命令提示成功了,但shell卻沒反彈回來的真正原因,在圖形化下的 cmd窗口執行木馬,驚人發現:提示缺少了某140D.dll,這才恍然大悟,這情況去年做python免殺實驗時也遇到過,原來這是生成exe文件時的配置問題,當我們生成Release版本的時候,運行庫選擇MT;當生成Debug版本時,運行庫選擇MTD。不然的話就會造成在自己電腦上執行沒問題,但在其他電腦上執行可能會提示缺少dll文件。于是重新生成了木馬,再次在Navicat里執行,它居然上線了!它上線了!上線了!

真實作戰環境,看到自己的CobaltStrike上線了一臺System權限的主機,就感覺很刺激~

那之前有360防護的那臺,是不是也是這個原因了,于是重新生成了木馬,但傳上去提示500錯誤,怎么肥事?后來在自己的虛擬機里用360查殺了下( 正經人誰會在自己物理機上裝360,狗頭),我的馬已經不免殺了,因為距離上次傳的馬,已經過了一天了。
5.內網橫向(云內漫游?)
接下來自然是橫向移動了,由于這是臺存儲數據的服務器(內網地址10.26.179.186),猜測這應該是個數據庫段,要是把內網整個拿下,那分數不得蹭蹭往上漲,在進行了常規的端口掃描之后(掃描中提示可能有防火墻),發現確實存在好幾臺內網機器,且基本都開放的80,443端口,一兩臺還開放了21,22端口。咦?不對呀,內網橫向常見的135,139,445端口沒了?那只能通過內網的web滲透來拿權限了?于是搭建了個代理,在本機上掛上代理通過瀏覽器去逐個訪問網站,不對呀,與HW完全不搭邊吶,都是別的地方的東西,還有個個人博客,通過admin/123456進入了后臺。我看刑,有判頭。

至此,裁判評分:

打得這么辛苦,就1000分?
6.咋就打進了IOT?
大佬B再次對拿下的云服務器進行信息收集,遠程登錄Administrator賬戶,通過谷歌瀏覽器收集到了訪問某個站點的賬號密碼,是個單點登錄,登錄進去看到了這樣的字眼:登錄成功,您已成功登錄中央認證系統。又通過服務器上的向日葵遠控到另一臺主機,上面還顯示著某些運行情況。
裁判評分:

看到這個IOT整個團隊一開始都有點懵的,后面想明白了,這個數據庫服務器是很多個系統的數據存放地,可以說是個集群數據庫了,有20多個G,而向日葵又遠程著另一臺服務器,上面監控著運行情況。
7.疑似境外攻擊?
當我在復盤此次HW攻擊過程時,在與大佬B交流過程中,他說他當時通過netstat發現了一個與美國的連接,還將連接情況本地保存了一下,我瞬間感覺有點不太妙,查了下這個ip:

通過威脅情報中心查詢到的結果:



立即將情況上報給警官
維護國家網絡安全,人人有責!
二、知識點總結
1.未授權訪問
未授權訪問漏洞,是在攻擊者沒有獲取到登錄權限或未授權的情況下,或者不需要輸入密碼,即可通過直接輸入網站控制臺主頁面地址或者不允許查看的鏈接便可進行訪問,同時進行操作。
一個頁面對用戶身份的判斷基于兩種方式:一種是將身份驗證代碼寫入當前文件;另一種是寫一個身份驗證的代碼文件,然后其他頁面需要調用時,直接包含進來即可。
當寫了身份驗證代碼,但開發者在開發時忘了將身份驗證的代碼文件包含進來,就會造成未授權訪問,asp/aspx的網站通常會有這樣的問題。
2.SQL Server xp_cmdshell提權
xp_cmdshell是一個開放接口,可以讓SQLserver調用cmd命令。此存儲過程在SQLserver2000中默認開啟,2005本身及之后的版本默認禁止,所以想要使用該存儲過程,就需要擁有SA賬號相應權限,使用sp_configure將其開啟。
啟用xp_cmdshell:
EXEC sp_configure 'show advanced options', 1
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
執行命令:
EXEC master.dbo.xp_cmdshell 'whoami'
注:
2005的xp_cmdshell的權限一般是system,而2008多數為nt authorityetwork service。故xp_cmdshell的提權前提為兩個:(1)拿到sa權限的賬戶密碼;(2)sqlserver服務未降權
SQL Server提權詳情請參考:https://blog.csdn.net/u014029795/article/details/116910134
3.Procdump+mimikatz配合抓取密碼
Procdump是微軟官方工具,不會被殺軟查殺,其抓取密碼的原理是獲取內存文件 lsass.exe 進程 (它用于本地安全和登陸策略) 中存儲的明文登錄密碼并存儲到lsass.dmp文件中,之后我們就可以使用mimikatz去讀取lsass.dmp獲取到明文密碼。
win10或2012R2以上操作要麻煩一些,具體請參考:
https://blog.csdn.net/qq_44881113/article/details/120315448
小tip:
在進行遠程桌面時,為了能夠將我們本地的程序或文件拷貝到遠程的主機上,應在本地資源中勾選上驅動器:

4.木馬文件執行時提示缺少某個dll文件
前面說到過當生成C的exe文件時,如果要生成Release版本,運行庫選擇MT;生成Debug版本時,運行庫選擇MTD。那么原理是什么呢?可以參考這篇文章:https://blog.csdn.net/Celestial_empire/article/details/106795200
簡單的理解就是MT,MTD是靜態鏈接,它把程序運行時所需要的dll庫文件都打包好,MT適用Release,MTD適用Debug。MD,MDD是動態鏈接,會在運行的電腦上去動態加載所需的dll庫文件,如果沒有的話,就會提示缺少庫文件。
5.CobaltStrike從內存加載.NET程序集
當我想使用MS16-075爛土豆提權時,最初的想法是將提權的exe腳本傳到目標主機然后執行,但目標主機有火絨,MS16-075早已被殺爛,網上找到的代碼也都是c#的,看不懂,不知咋改。這時請教了木佬,才知道可以不用做免殺。
原來,在CobaltStrike中有一個名為”execute-assembly”的命令,能夠從內存中加載.NET程序集。這個功能不需要向硬盤寫入文件,十分隱蔽,可以用來躲避殺軟。我們用的CobaltStrike提權插件也是基于這個來實現的。具體的原理有待好好研究,這里給出從網上找到的三篇文章,給想研究的師傅們做個參考:
https://3gstudent.github.io/%E4%BB%8E%E5%86%85%E5%AD%98%E5%8A%A0%E8%BD%BD.NET%E7%A8%8B%E5%BA%8F%E9%9B%86(execute-assembly)%E7%9A%84%E5%88%A9%E7%94%A8%E5%88%86%E6%9E%90
https://www.freeaihub.com/post/59039.html
https://www.anquanke.com/post/id/220456
6.CobaltStrike與Metasploit之間的會話傳遞
CobaltStrike與Metasploit作為紅隊評估的兩大常用框架,各有其優缺點:Metasploit模塊眾多,但一次只能接受一個反彈回來的shell,顯得有些笨重,不適合團隊作戰;CobaltStrike一個監聽器可同時接收多個反彈回來的shell,適合團隊作戰,但其后滲透模塊少,即使使用插件也難以彌補這個缺點,所以經常會需要在這兩者之間進行會話傳遞。具體的原理和操作,可以參考這篇文章:
http://blog.leanote.com/post/snowming/43cef4b64cbd
三、兩個待解決的問題
1.只允許本地連接的SQL Server數據庫提權
在我們拿到的WEBServer主機上其實有一個只允許本地連接的SQL Server數據庫,翻閱目錄可以查看到連接的賬號密碼,權限為SA,我在webshell中使用命令行連接工具osql和sqlcmd嘗試去連,都提示sa用戶登錄失敗(賬號密碼無誤),在冰蝎的數據庫管理模塊能連上,但執行提權操作時卡了;在蟻劍中也是能連上,執行提權操作時提示“ODBC 驅動程序不支持所需的屬性錯誤”,按照這篇文章改了蟻劍的代碼也沒能成功:https://blog.csdn.net/Ca3tie1/article/details/103605485
最后大佬D上傳了一個大馬就提權成功了,不過拿到的是nt authorityetwork service,所以本地的SQL Server是降權運行的。這里的問題是同樣都是本地,為什么osql,sqlcmd命令連不上數據庫,蟻劍和冰蝎提權失敗,使用大馬就可以?
2.關于云服務器
拿到的云服務器有個內網環境,但內網里的主機上的業務與拿下的目標完全搭不上邊,可以說是完全不相關的系統。我們知道,我們自己買的云服務器都會有個內網地址,這是不是說云服務器都有一個內網環境,我們可以通過自己的這臺云服務器訪問到其所處內網主機的一些資源?但這些內網主機又不是共享一個外網地址?我們知道,當我們反彈回連shell的時候,輸入我們自己的VPS地址是能確切的回連到我們的云服務器的,那如果這些內網主機不共享一個外網地址,又為什么會將這些主機組成一個內網呢?想不明白,這是不是涉及到了云架構、云安全領域?
上面兩個問題如果有知道的師傅還請麻煩解答一下,我將思考和探究這兩個問題,如果解決了后續會在公眾號發文。
四、關于紅隊滲透的探索與想法
紅隊滲透我認為是目前在合法范圍內最貼近于實際的,效果真實猛烈,以拿權限,打穿為目的來評估系統的安全防護能力。那么紅隊的打法流程是怎樣的呢?我這里沒啥經驗,暫時不敢妄加言論,之前看到Teamssix師傅的文章有談到過這個問題,這里先附上師傅之前的連載文章:
1.淺談紅隊中的外網信息收集:
https://mp.weixin.qq.com/s/oKDDrFz180tmaTecQog8qA
2.淺談紅隊中的打點:
https://mp.weixin.qq.com/s/y6VyyJJUFzD8sQom-1Cn6Q
3.淺談紅隊中的權限維持:
https://mp.weixin.qq.com/s/3RhX3wiJt4cwLx73_wcjyw
4.淺談紅隊中的提權:
https://mp.weixin.qq.com/s/wtVDjDxwpJyHStoJfNzDRg
對于此次攻防演練的反思,我覺得紅隊在這個過程當中不能僅僅癡迷于拿權限,打穿內網,還有重要的一點就是當我們拿下一個目標之后,能否尋找下目標之前是否有被攻擊過的痕跡?查看下是否有異常的對外連接,異常的進程?公安部每年牽頭舉辦的HW行動,其初衷是想通過業內大佬的專業評估來尋找到政府、國企、央企、事業單位等重要系統薄弱環節,幫助其提升防護能力,避免受到來自外界尤其是國外APT組織的惡意攻擊。HW不應成為各個公司激烈角逐的戰場,更不應是安全從業者的噩耗(據說每年HW中總會猝死那么一兩個)。
上面僅是一個菜鳥選手對HW紅隊滲透的一點小想法,大佬不喜,請輕噴~
五、不足與改進方法
參加此次攻防演練,從中發現了自己許多不足的地方,特此提出來以期下次改進:
1.漏洞發現,外網打點能力弱
在整個HW過程中,自己僅發現一個普通權限的sql盲注,同事能找到弱口令登入后臺,能找到shiro反序列化,而我卻一個弱口令都沒碰到。
改進:有時可能不是技術上的問題,是想法和思路的問題。這個只能在平時的滲透中多注意、多思考一些,也可以通過對SRC的挖掘來提升這方面能力。
2.知識遺忘或掌握不牢固
相關知識點有學過,也實操過,遺忘了,沒想到或者在用到時發現自己其實對于這方面知識點其實也不太熟
改進方法:平時空閑時多做一些靶機測試,多練,熟悉從外網打點到提權,內網橫向獲取內網所有主機權限的這一套流程。據我所知,相關不錯的靶場國內的有紅日安全ATT&CK系列靶場,暗月靶場,國外的有vulnhub,hackthebox。這點得向dayu師傅學習,之前天天打HTB
3.攻擊方式單一
這不僅是我,也是我們整個團隊所存在的問題,都是通過傳統的web來撕開口子。
改進:多學習了解紅隊的一些打法,學學釣魚、社工,平常做做實驗。