文章作者:klion
本文來源:MITRE|ATT&CK中文站
https://huntingday.github.io/
0x01本節重點快速預覽
觀察正常的net-ntlm認證和帶有中間人攻擊的net-ntlm認證的區別
簡單了解重放攻擊的一些利用前提條件
smb重放在當前已控機器為windows下的各種利用方式
smb重放在當前已控機器為linux下的各種利用方式
關於msf中的一些smb重放攻擊模塊的簡單利用
如何簡單防禦這種攻擊方式
大致環境說明[注:此處將全程以smbv2.x版本為例進行演示]:
0x02先來仔細觀察正常的net-ntlm認證和帶有中間人攻擊的net-ntlm認證的區別
此處我們就不妨再簡單回顧下net-ntlm的認證過程,首先,當用戶在Client上正常輸入帳號密碼和域以後,此時密碼會率先被hash一次,而後Client將username發給Server,Server會返回一個16位元組的挑戰碼,Client收到這個挑戰以後會繼續用那個之前已經hash過的密碼用挑戰再hash一次[生成response],之後再把這個挑戰和response一同發給server,server再丟給dc去驗證,在之前的文章中,我們已經詳細說明過關於net-ntlm的認證過程,還不太清楚的朋友不妨去那裡再看看,這裡純粹是為了圖方便,就暫且假定DC和Server在同一臺機器[smbserver]上,ok,開始今天的正題,上面說的認證過程都是假定在就只有客戶端和服務端兩臺機器沒有任何外部惡意幹擾的前提下,如果此時兩臺機器間莫名多了一個第三者,而這個第三者通過不停的轉換機器角色來同時欺騙Smbserver和Client兩端,那後果可想而知,這樣一來的話,不管是挑戰碼還是response此時都要經過這個第三者,就相當於這個第三者可以拿著Client的憑據去訪問SmbServer中的資源,如果這個憑據的用戶權限在smbserver中很大,大到可以隨意操作smbserver,此時憑據再一旦認證成功,隨後再立即執行一段shellcode,那Smbserver基本也就淪陷了,所以,看到這兒大家也應該都明白了,這本質上只是一種設計缺陷而並非什麼漏洞,是在設計之初考慮問題不到位所導致的
關於smb重放的利用核心:
從上面的攻擊過程來看,此利用的核心主要在於先欺騙後重放上,首先,需要明白的是,內網其它機器的流量,是不會無故經過你的機器的,如果流量不能經過自己的機器,那也就意味著後面拿不到目標機器請求的挑戰和響應,自然也就沒法進行重放利用了,所以,我們就需要藉助其它的一些手段讓目標機器的指定流量都事先經過自己的機器,而可用於欺騙的方式就相對比較多了,比如,眾所周知的NBNS,DNS,LLMNR,WPAD,PROXY,HTTP,HTTPS...關於對每種協議欺騙的利用細節,內容確實較多,準備後續再繼續展開單獨來說明,今天我們暫時只側重在初步利用上,先有個總體認知即可,更深度的利用,來日方長
0x03簡單了解關於smb重放的一些利用條件
首先來簡單看下不同Windows版本所對應的Smb版本,顧名思義,smb版本越高,內置的安全機制就越完善,利用難度也就越大,另外,它默認工作在tcp/udp的139和445埠上,屬上層協議[偏應用層]
關於smb重放的一些利用前提條件:
目標機器不能開啟smb籤名[只要說到籤名,核心就是為了防數據篡改,任何協議都是如此],否則利用無效,一般情況下,windowsserver會默認開啟,而windows單機系統[win7/8/8.1/10]默認都不會開,另外,對一些打了ms08-068[KB957097]補丁的老系統[比如windowsxp/2003以下的系統]利用也是無效的,到此為止,想必大家心裡都有底了,其實主要還是想在不得已的情況下,以此方式來突破一些核心的內網伺服器,既然是涉及到欺騙動作,動靜兒肯定不會小到哪裡去,但相比arp來講,一個應用層的協議欺騙動靜肯定是要比arp小的多的多,ok,廢話不多講,來簡單看下實際利用
首先,就來嘗試快速掃下目標內網中所有禁用了smb籤名的windows機器,很快就發現兩臺windows機器,一臺win7和一臺winserver2008r2,且smb籤名默認都已被禁用,現在我們的目的就是想對win7這臺機器進行重放來拿到它的net-ntlmv2的hash好做下一步的操作,如果你想直接利用此hash再一併自動獲取那臺windows2008r2機器的system權限的shell,就需要有個前提,就是這兩臺機器的帳號密碼必須完全一致,不然重放的時候肯定會認證失敗,認證失敗也就意味著沒法登陸,後面的一些列動作自然也就沒法執行了,本文的後續操作會全部側重在在線抓hash而非直接拿shell上,如果真的是實戰利用,個人也不建議直接這樣去拿shell,一來不靠譜[雖然表面上看起來很方便,挺自動化,但在實戰中這未必是好處,反而是冗餘的累贅],二來太招搖,抓個hash和直接上shell,完全不是一個重量級的操作,假設目標內網機器全部脫網?上shell肯定會更麻煩,與其在一個不確定性的環境裡折騰那個,不如先想辦法把hash拿到,hash有了,後面想怎麼玩都可以,除非你事先就直接處在別人的內網中[比如,vpn內網],否則最好不要直接上shell,廢話有點多了,只是希望大家能明白
0x04smb重放在當前已控機器為windows下的各種利用方式[藉助Inveigh腳本實現]
首先,我們先來假設這麼一種情況,當前你已經拿下了目標web所在的那臺伺服器[也就是IIS75-CN這臺機器,並且它在純內網環境下(暫且可理解為只有內網ip的那種)],而後,你又通過其它的方式確定了同內網下的某個管理員的個人機位置[即PC-Win7CN這臺機器],現在的目的,就是想藉助IIS75-CN這臺機器對同網段下的PC-Win7CN機器以協議欺騙的方式來拿到IIS75-CN這臺機器管理員的net-ntlmv2hash,其實,說白點就是釣魚,至於具體怎麼做就很簡單了,我們只需要在web那臺機器的網站主頁裡隨便插一個帶有unc路徑的圖片即可,因為事先已在同內網下做好欺騙,所以此時當管理員一打開網站,他機器的net-ntlmhash就會被我們捕捉到,後面想拿著這個hash做什麼就看實際需求了,為什麼要用unc路徑?原因就是它請求資源走的是smb[file://],而我們要利用的恰恰就是這一點,到此就該很明了了,ok,說完思路,咱們就來看看具體怎麼搞,下面先來介紹一個非常實用且功能強悍的powershell腳本Invoke-Inveigh,集各種協議欺騙和smb重放利用與一身的內網攻擊套件,此處暫以在線抓hash為主,到後續我們還會找機會單獨說明該工具,那時再去看relay部分的深度利用
先在IIS75-CN這臺機器上用Inveigh做好欺騙,為了更貼近實戰,仍然會直接在beacon下操作,實戰中大可不必把所有的協議欺騙都開起來,這樣動靜兒會很大,其實有一兩個足矣
而後,去指定的目標站點目錄下找到主頁索引文件編輯插入以下unc路徑,此處的內網ip,可以隨便指向一臺目標內網確實存活的windows機器的ip,至於那個共享在不在都關係不大,因為我們的根本目的是為了抓PC-Win7CN機器管理員的hash
一旦管理員在PC-Win7CN機器上訪問該網站,機器用戶的net-hashv2hash就會被我們捕捉到,其實並不僅僅是PC-Win7CN這一臺機器的hash,同內網下的所有機器只要打開該網站,hash也都會被捕捉到
http://192.168.3.129/
拿到net-ntlmv2的hash以後,再粘回來自己用hashcat嘗試跑一下,萬一跑到了密碼明文,特別注意,我此處說的是假設你運氣好,萬一,跑出了明文,那後面的事情,就相對好辦了[其實,大多數情況下都是很難跑出來的,尤其目標域內強制強密碼策略,幾乎都是看人品運氣]
#hashcat64.exe-a0-m5600hash.txtpasswd.txt
最後,抓到我們想要的hash以後,記得去把上面的欺騙給關掉,此處圖方便直接把Inveigh對應的powershell進程給幹掉即可,看清楚,別殺錯了,頭一個是我們自己的beacon進程
其實,在這個過程中還會有個問題,假如當前機器[IIS75-CN]的防火牆已事先開啟,此時你去起powershell一般都會彈出個如下的攔截提示,解決辦法倒是很簡單,手動執行netsh加條另外程序規則即可
0x05smb重放在當前已控機器為linux下的各種利用方式[Responder嗅探器+impacket套件]
話既然感到這兒,就順便多說幾句,其實在linux中默認就已經為我們裝好了一個非常實用的攻擊套件,就是python,哪怕只有一個python2.6.6,哪怕你暫時還沒拿到目標機器的root權限,這些都並不影響你繼續內網滲透,在實戰中它往往能幫我們不少的忙,所以個人還是那句話,在linux平臺下的滲透方式儘量形成全部bash和python化[當然啦,如果的c功底夠硬,肯定更佳,畢竟,在linux中,這種交互也是最直接的],而在windows下的滲透方式則儘量全部形成powershell,vbs,bat化,儘量不要過於依賴外部工具[甚至有些都完全沒必要的,功能重複卻毫無特色的工具],系統內置的越通用的東西,活的時間也肯定會相對更長,而且也更隱蔽,一旦慢慢養成了這樣的滲透習慣,以後對陌生環境的適應力和生存率自然就會更高,你攻擊手法的精湛程度肯定也會在另一個臺階上,一起加油
首先,來看下Responder嗅探器
實戰中我們是完全沒必要把所有服務[其實就是偽造惡意服務]都開起來,有一兩個足矣,只需編輯Responder.conf配置,把裡面不需要的服務全都Off掉,而後直接指定本地網卡接口進行內網欺騙即可
#gitclonehttps://github.com/SpiderLabs/Responder.git
#pythonResponder.py-Iens33
剩下的事情就不用管了,只需等著,一旦目標內網任何機器有訪問windows共享[smb]的動作,這兒就會立即捕捉到相應的net-ntlmv2的hash,如下,我們只需把它好好記錄,拖回來嘗試破解即可
其次,我們再來看下impacket套件的簡單利用
利用過程幾乎同上,也是通過事先偽造惡意smb伺服器,一旦目標內網機器訪問到我們事先準備好的這個惡意共享時,對應的net-ntlmv2就會被抓取過來,只不過,impacket自身並沒有帶欺騙功能,所以此處演示只能靠我們自己手工去訪問惡意smb伺服器,很雞肋,當然啦,也可以通過在其它的地方插入UNC路徑的方式來獲取,但還不太完美,就不細說了,如下,192.168.3.69便是我們用impacket偽造的惡意smb伺服器
如上所述,當目標內網有機器訪問到我們的惡意smb伺服器後,便會抓取對應機器的net-ntlmv2hash,之後再通過smbrelayx.py腳本拿著這段抓到的hash去嘗試重放192.168.3.129這臺目標機器,一旦重放成功,便會把129這臺機器的本地用戶及密碼hash全部解密導出來,具體如下,其實個人並不建議在這兒直接執行payload或者系統命令,腳本默認也是通過服務的形式來執行命令的,很不穩定
其實,在impacket套件中還有個非常好用的ntlmrelayx.py腳本,用它我們直接拿著現有的hash去嘗試重放指定機器上的指定服務,還是那句話,雖然很強大,但利用起來卻顯的很雞肋[雞肋是雞肋,不過並不影響我們把對應的模塊代碼摳出來,單獨拿到別的地方用,或者參照著重新實現,這才是真正的價值所在],有機會我會把impacket中的一些比較強悍實用的功能,全都單獨拿出來說,此處就不再囉嗦了
# python ntlmrelayx.py -t 192.168.3.129
其實,在impacket套件中還有個非常好用的ntlmrelayx.py腳本,用它我們直接拿著現有的hash去嘗試重放指定機器上的指定服務,還是那句話,雖然很強大,但利用起來卻顯的很雞肋[雞肋是雞肋,不過並不影響我們把對應的模塊代碼摳出來,單獨拿到別的地方用,或者參照著重新實現,這才是真正的價值所在],有機會我會把impacket中的一些比較強悍實用的功能,全都單獨拿出來說,此處就不再囉嗦了
# python ntlmrelayx.py -t 192.168.3.129
0x06關於msf中的一些協議欺騙/smb重放模塊的簡單利
用此處,只簡單提一下nbns_response[主要用來在內網進行機器名欺騙]和smb_relay[重放成功後要執行的操作,比如,此處是直接執行一個meterpreter的payload]模塊的簡單利用,現在,假設當前我們就處在目標內網中[比如,vpn內網或者你通過無線接進去的,等等一些其它的方式吧...],圖方便,我們就可以嘗試直接用msf來搞,當然啦,還是習慣性的把問題說在前面,meterpreter肯定是不免殺的,能不能正常回來不敢保證,此處僅僅只是為了演示效果,ok,來看具體操作
首先,藉助smb_relay模塊先把smb重放成功後要執行的操作準備好,很顯然,這裡是直接嘗試彈個meterpreter回來,smbhost參數則是用於指定要重放[攻擊]的目標內網機器[此處是IIS75-CN]
之後,開始利用nbns_response模塊執行NBNS欺騙,注意,這裡正則的意思是,只要匹配到含有這個字符串的共享路徑全部欺騙到192.168.3.69這臺
機器上[入侵者已控的那臺linux[Ubuntu16.04LTS]機器],然後會把流過的net-ntlmv2的hash再丟給smb_relay模塊到192.168.3.129機器上去進行重放,一旦重放成功,就開始執行事先準備好的meterpreterpayload,之後便是看到的如下的效果,meterpreter被正常彈回
只上面要輸入了正確的192.168.3.129機器的帳號密碼,meterpreter便會被正常彈回,其實msf中還有一些相關的利用模塊,不過使用上也幾乎都大同小異,無非就是先欺騙後重放,此處不再贅述
0x08關於協議欺騙和smb重放攻擊的一些簡單防禦手法
開啟Smb籤名
Smb共享如果壓根用不到,直接關掉相應的服務或者開啟系統防火牆限制445埠出入站
部署各種ATA&ATP產品來實時監控這種專門針對內網攻擊的惡意流量
更多..
一點小結:
暫時先不用太關注文中的某些工具怎麼用,先把問題的核心了解清楚才是根本目的,其實關於整個利用過程核心的點,就兩個,第一個就是欺騙,如何藉助像LLMNR,WPAD,NBNS,DNS,PROXY,HTTP,HTTPS這種協議實現對目標內網機器的欺騙讓相應的流量都流經自己,是我們需要深入理解的東西,後續有機會也會就每種協議的欺騙流程細節做進一步的學習分享,篇幅限制,所以這裡就沒展開說,第二個才是重放,所謂重放的意思其實就是拿著別人家的鑰匙去開別人家的門,然後再進去做些齷齪的事情,比如,裝個探頭,安個竊聽,留個定位...此處可以看到,我們全程都側重在捕捉net-ntlmv2的hash上,但現實是,抓hash也只是整個內網滲透中一個很小的環節而已[雖然小,但確實價值不菲],之所以沒有深入去提及各種工具在重放成功後如何進行各種操作,是因為在實戰中,個人也並不太建議那樣去幹,因為上面都是演示,為了讓大家看到實際效果,所以都是直接一次性重放成功,但實際上可能並不是這樣,而且如果重放成功後就立即執行操作,出了問題,也很難判斷到底是哪裡的問題,不妨先通過這種方式把各個機器的hash搜集下,留著後續慢慢用,還是那句話,也許web確實可以做到全程自動化掃描利用,但內網,尤其在一些戒備森嚴,拓撲複雜的內網中,是很難像自己想像中的那樣自動化的,關鍵突破還是得靠手工,如果內網都能上完全自動化,估計那個時候也就不再需要像我這樣的低級滲透手了[大家全部專門去研究算法,協議即可,這其實也是我理想中的頂級對抗,嘿嘿...],敲定算法,找幾個頂尖的程式設計師多花點兒時間就能搞定了,話說回來,拿到hash也並不能保證就一定能幹什麼,只能說可能會多個突破口而已,萬一運氣真的不好,hash死活跑不出來,那就只能繼續另謀他路了,滲透本就靈活,不用非在一條路上走到死,有經驗的朋友,想必都能聽懂我在說什麼了,嘿嘿...寫的倉促,文中肯定會有很多不足和缺陷,弟兄們多指正。