BloodHound, Active Directory ortamına yönelik kırmızı takım çalışmaları için oldukça faydalı ve hem yatayda yayılma hem de yetki yükseltme için kullanılabilecek saldırını yollarını kolayca tespit edebilen bir araçtır. Fakat büyük Active Directory altyapılarda mavi takım veya sistem yöneticisi açısından bakıldığında BloodHound uygulamasını direkt olarak kullanmak zorlaşabilmektedir.
Saldırı yolları ile ilgili en önemli sorun bazen milyonlara varan saldırı yolu arasından öncelikli olarak hangisinin seçilmesi ve giderilmesi gerektiğinin tespitidir. Bazen engellediğimiz bir ilişki (Group Üyeliği, ACE, Oturum vb) binlerce saldırı yolunun Tier0 objelere erişimini engelleyebilmektedir.
Bu blog yazımızda Bloodhound ve ekibimiz tarafından geliştirilen Kangal isimli aracı kullanarak, Active Directory ortamındaki saldırı yollarını nasıl önceliklendireceğimize ve nasıl gidereceğimize dair bir analiz gerçekleştireceğiz.
Bu analizdeki işlemleri iteratif ve sistematik bir şekilde kendi ortamınızda uygulayarak süreç sonunda hem saldırı yolları hem de yetkilendirme açısından oldukça güvenli bir Active Directory ortamına sahip olabilirsiniz. Bu sayede de saldırganların özellikle Ransomware vakalarındaki manevraları olabildiğince kısıtlanacaktır.
Kangal aracını buradan indirebilirsiniz
Kangal ve Combined Attack Paths Yöntemi
Combined Attack Paths olarak adlandırdığımız yöntem aslında Active Directory ortamında Tier0 olarak sınıflandırılan objelere yönelik saldırı yollarının birleştirilerek özet ve hedef odaklı bir hale getirilmesidir. Bu sayede milyonlarca saldırı yolu arasında en riskli ve giderildiğinde en fazla etkiyi oluşturabilecek olan saldırı yollarına/ilişkilere odaklanılabilmektedir.
Kangal ismini verdiğimiz Python betiği Bloodhound ile toplanan veri üzerinde analiz yaparak Combined Attack Paths grafı oluşturmakta ve graftaki grupları skorlamaktadır. Bu skorlara göre de ilişkiler kolaylıkla önceliklendirilebilmektedir.
Sharphound ile Active Directory ortamımızdaki veriyi elde ettikten ve bu veriyi BloodHound aracılığı ile Neo4j veritabanına yükledikten sonra analizimize başlayabiliriz.
BloodHound ile Find Shortest Path to Domain Admins sorgusunu çalıştırdığımızda aşağıdaki gibi bir çıktı elde etmekteyiz. Bu çıktı kırmızı takım tarafından kullanılabilir olsa da mavi takım tarafından kullanılabilirliği oldukça zordur.
BloodHound Find Shortest Path to Domain Admins Sorgusu
Shortest Path to High Value Targets sorgusu da benzer bir çıktı vermektedir ve bu çıktıyı BloodHound arayüzü üzerinden incelenmesi büyük ortamlarda zor olabilmektedir.
BloodHound Shortest Path to High Value Targets Sorgusu
Son olarak kullandığımız test ortamına ait BloodHound tarafından üretilen istatistikler de aşağıdaki gibidir.
BloodHound Veritabanı İstatistikleri
Analiz Süreci
1. Tier0 Objelerin Belirlenmesi
Bloodhound taraması sonucunda çeşitli objeler (Domain Admins, Administrators vb) highvalue olarak işaretlenmektedir. Fakat BloodHound bu objelerin üyelerini, bu objeleri içeren OU ve etkileyen GPO’ları ayrıca çeşitli grupları yetkisiz olarak işaretlemektedir. Bu nedenle öncelikle aşağıdaki adımlar gerçekleştirilmelidir.
- Aşağıdaki Neo4j sorgusu ile highvalue objeler listelenmeli ve incelenmelidir. Eğer bu objeler dışında kurum özelinde önemli/yetkili farklı objeler bulunuyorsa onlar da highvalue olarak işaretlenmelidir. Bu işlem BloodHound arayüzünden veya Neo4j üzerinden gerçekleştirilebilir.
BloodHound tarafından işaretlenmiş high value objelerin ve obje tiplerinin listelenmesi (9 obje)
- İnceleme ve işaretleme aşaması tamamlandıktan sonra aşağıdaki Neo4j sorgusu ile highvalue grupların tüm üyeleri de highvalue olarak işaretlenmelidir.
- Aşağıdaki Neo4j sorgusu ile de highvalue objeleri içerisinde barındıran Container ve OU objeleri aynı şekilde highvalue olarak işaretlenmelidir.
- Aşağıdaki Neo4j sorgusu ile highvalue domain veya OU objelerine linklenmiş Group Policy Objeleri de highvalue olarak işaretlenmelidir.
- Son olarak aşağıdaki Neo4j sorgusu ile highvalue (yani Tier0) olarak işaretlenmiş objeler tekrar listelenmeli ve tekrar gözden geçirilmelidir. Eğer highvalue olarak işaretlenmemesi gereken objeler tespit edilirse, Active Directory ortamından bu objenin yetkileri devre dışı bırakılmalı ve SharpHound taraması tekrarlanmalıdır. Tarama sonucunda da birinci adımdan itibaren tüm adımlar tekrarlanmalıdır.
Komutlar çalıştırıldıktan sonra high value objelerin ve obje türlerinin listelenmesi (33 obje)
2. Combined Attack Path Ağacının Oluşturulması
Tier0 objeleri belirlendikten sonra Kangal aracı çalıştırılarak Neo4j üzerinde Combined Attack Path yapısı oluşturulabilmektedir. Kangal aracı gerekli paketler yüklendikten sonra aşağıdaki komutla Neo4j kullanıcı adı ve parola bilgileri ile çalıştırılmalıdır.
Kangal aracının komut satırı üzerinden çalıştırılması
Aracın çalışması tamamlandığında BloodHound arayüzüne aşağıdaki Neo4j sorgusu girilerek oluşan saldırı yolları görülebilmektedir.
BloodHound arayüzü ile Combined Attack Path ağacının görüntülenmesi
Oluşan ağaç sayesinde ilk başta incelenmesi zor olan veri gruplanarak daha özet bir hale getirilmiş oldu. Bu ağaçtaki saldırı yolları incelendiğinde Tier0’a gelen yolların bazı gruplar altında toplandıkları da kolayca görülebilmekte. Bu ağaç yapısında örnek olarak Tier0 ile Group8 arasındaki bağlantıyı kestiğimizde Group8 altındaki tüm grupların da Tier0’ya ulaşmasını engelleyeceğiz. Bu sayede birkaç işlemle aslında çok büyük bir riski ortadan kaldırmış olacağız.
Saldırı yollarını gidermeye başlamadan önce aşağıdaki sorgu ile Neo4j üzerinde Tier objelerinin risk skorları tespit edilebilmektedir.
Bu sorgu sonucunda Neo4j veritabanındaki Table sekmesinde aşağıdaki değerler görülecektir.
Değer | Açıklama |
---|---|
level | Tier objesinin Tier0 objesine olan uzaklığını yani seviyesini göstermektedir. |
sum_child_count | Tier objesine bağlı toplam kaç adet Tier objesi olduğunu göstermektedir. |
members | Tier objesinin üyelerine ait objectid değerlerini barındırmaktadır. |
name | Tier objesinin ismini göstermektedir. |
index | Tier objesinin bulunduğu seviyede kaçıncı indexte olduğu göstermektedir. |
sum_member_count | Tier objesinin ve bağlı diğer Tier objelerinin toplam kaç üyesi olduğunu göstermektedir. |
Bu değerler içerisinde sum_member_count bizim için oldukça önemlidir. Bu değer, ilgili Tier’ın barındırdığı objelerin Active Directory ortamındaki kaç obje tarafından ele geçirilebileceğini göstermektedir. Örneğin Tier0 için bu değer 2583’tür. Bu da 2583 yetkisiz Active Directory objesinin Tier0 objelerini ele geçirebileceğini göstermektedir. Bu değer de aşağıdaki sorgu ile elde edilebilmektedir.
Tier0 objesi için sum_member_count değerinin görüntülenmesi
3. Saldırı Yollarının Giderilmesi
Tier0 objeleri üzerindeki risk değerini de tespit ettikten sonra önceliklendirme yaparak saldırı yollarının giderilmesi işlemine başlanmalıdır. Burada önceliklendirme işlemi yine sum_member_count değeri ile gerçekleştirilebilmektedir. Aşağıdaki Neo4j sorgusu ile Tier0 üzerinde yetkisi olan en riskli (en fazla üyeye sahip olan) 5 grup listelenebilmektedir.
Tier0 üzerindeki en riskli 5 grubun tespit edilmesi
Bu grupların üyelerini ve bu üyelerin Tier0 üzerinde hangi yetkilere sahip olduğunu tespit etmek için de aşağıdaki Neo4j sorgusu kullanılabilmektedir.
Tier0 üzerindeki en riskli objeleri ve bu objelerin yetkilerinin tespit edilmesi
Çıktıda ayrıca Enterprise Read-Only Domain Controller grubunun domain objesi üzerinde GetChanges yetkisine sahip olduğu görülmektedir. Bu yetki normal ve varsayılan bir yetkidir. Bu nedenle Enterprise Read-Only Domain Controller grubunun da highvalue olarak işaretlenmesi gerekmektedir. Analiz süreci boyunca bu şekilde yetkili olarak tespit edilen objeler not edilmeli ve bir sonraki iterasyonda highvalue olarak işaretlenmelidir.
Bu listeyi daha kolay analiz edebilmek adına aşağıdaki komutla etkilenen yetkili objelerin listesi elde edilebilmektedir.
Tier0 üyesi etkilenen objelerin listelenmesi
Yetkili objeler elde edildikten sonra bu objeler üzerindeki yetkiler incelenerek adım adım giderilmelidir.
Örnek olarak fslab.local domain objesinin Security sekmesine gidildiğinde bu obje üzerindeki ACL değerleri görülebilmektedir. Bu değerlerden gereksiz, geniş veya şüpheli olanlar kaldırılmalı veya kısıtlanmalıdır. Bu arayüzde örnek olarak CO-blackgirl-admingroup grubunun domain ve domain altındaki tüm objeler için FullControl(GenericAll) yetkisine sahip olduğu görülmektedir. Bu yetki sadece belirli admin objelerinde bulunması gereken çok geniş bir yetkidir. Bu nedenle bu ve benzer yetkiler kaldırılmalı ve kısıtlanmalıdır.
fslab.local domain objesi üzerindeki tehlikeli Access Control Entry değerlerinin görüntülenmesi
Bir diğer örnekte de DC üzerinde ExecuteDCOM yetkisi olan üç kullanıcı tespit edilmiştir. Bu yetki Distributed COM Users grubu ile aktarılmaktadır. Bu nedenle bu yetkiye ihtiyacı olmayan kullanıcılar bu gruptan çıkarılarak bu yetkilerin de önüne geçilmelidir.
Distributed COM Users grubu üyelerinin görüntülenmesi
Son örneğimizde de BARBARA_CLINE objesi üzerindeki ACL bilgileri görüntülenmektedir. Buradaki önemli nokta ise JO-teamojavi-admingroup grubunun BARBARA_CLINE objesi üzerinde kalıtımsal olarak FullControl(GenericAll) yetkisine sahip olmasıdır. Bu yetki aslında BARBARA_CLINE objesinin üyesi olduğu FSR isimli OU’ya uygulanmış fakat kalıtımsal olarak BARBARA kullanıcısını da etkilemiştir.
Kalıtımsal olarak aktarılan Access Control Entry değerlerinin görüntülenmesi
Sonuç
Bu işlemler tamamlandıktan ve zararlı/tehlikeli ilişkiler temizlendikten sonra ilk aşamadan itibaren analiz süreci tekrarlanmalıdır. İşlemler tamamlandıktan sonra tekrar SharpHound taraması gerçekleştirildiğinde aşağıdaki veritabanı istatistikleri elde edilmiştir.
Analiz sonrası veritabanı istatistiklerin görüntülenmesi
Ayrıca işlemler gerçekleştirilip tekrar Combined Attack Path ağacı oluşturulduğunda aşağıdaki gibi bir görsel elde edilmektedir. Yine ilk ağaçla karşılaştırıldığında saldırı yollarının azaldığı görülebilmektedir.
Analiz sonrası saldırı yollarının tekrar incelenmesi
Son olarak Tier0 objesi üzerindeki sum_member_count değeri incelendiğinde bu değerin de yarı yarıya düştüğü görülebilmektedir.
Analiz sonrası Tier0 grubuna ait sum_member_count değerinin görüntülenmesi
Analiz sonrası en riskli grupların listelenmesi