Sighting In, Hunting For A User
Password Spraying Overview
Password spraying can result in gaining access to systems and potentially gaining a foothold on a target network. The attack involves attempting to log into an exposed service using one common password and a longer list of usernames or email addresses.
Password Spraying Considerations
While password spraying is useful for a penetration tester or red teamer, careless use may cause considerable harm, such as locking out hundreds of production accounts.
One example is brute-forcing attempts to identify the password for an account using a long list of passwords. In contrast, password spraying is a more measured attack, utilizing very common passwords across multiple industries. The below table visualizes a password spray.
Attack
Username
Password
1
bob.smith@inlanefreight.local
Welcome1
1
john.doe@inlanefreight.local
Welcome1
1
jane.doe@inlanefreight.local
Welcome1
DELAY
2
bob.smith@inlanefreight.local
Passw0rd
2
john.doe@inlanefreight.local
Passw0rd
2
jane.doe@inlanefreight.local
Passw0rd
DELAY
3
bob.smith@inlanefreight.local
Winter2022
3
john.doe@inlanefreight.local
Winter2022
3
jane.doe@inlanefreight.local
Winter2022
It’s common to find a password policy that allows five bad attempts before locking out the account, with a 30-minute auto-unlock threshold.
If you don’t know the password policy, a good rule of thumb is to wait a few hours between attempts, which should be long enough for the account lockout threshold to reset.
It is best to obtain the password policy before attempting the attack during an internal assessment, but this is not always possible.
We can err on the side of caution and either choose to do just one targeted password spraying attempt using a weak/common password as a "hail mary" if all other options for a foothold or furthering access have been exhausted.
Depending on the type of assessment, we can always ask the client to clarify the password policy. If we already have a foothold or were provided a user account as part of testing, we can enumerate the password policy in various ways.
Enumerating & Retrieving Password Policies
Enumerating the Password Policy - from Linux - Credentialed
With valid domain credentials, the password policy can also be obtained remotely using tools such as CrackMapExec (or the successor: NetExec) or rpcclient
.
Enumerating the Password Policy - from Linux - SMB NULL Sessions
Without credentials, we may be able to obtain the password policy via an SMB NULL session or LDAP anonymous bind.
An SMB NULL session can be enumerated easily. For enumeration, we can use tools such as enum4linux
, CrackMapExec
(or the successor: NetExec), rpcclient
, etc.
We can use rpcclient to check a Domain Controller for SMB NULL session access.
Once connected, we can issue an RPC command such as querydominfo
to obtain information about the domain and confirm NULL session access.
Let's try this using enum4linux. enum4linux
is a tool built around the Samba suite of tools nmblookup
, net
, rpcclient
and smbclient
to use for enumeration of windows hosts and domains
The tool enum4linux-ng is a rewrite of enum4linux
in Python, but has additional features such as the ability to export data as YAML or JSON files which can later be used to process the data further or feed it to other tools. It also supports colored output, among other features
Enumerating Null Session - from Windows
It is less common to do this type of null session attack from Windows, but we could use the command net use \\host\ipc$ "" /u:""
to establish a null session from a windows machine and confirm if we can perform more of this type of attack.
Let's see some common errors when trying to authenticate:
Error: Account is Disabled
Error: Password is Incorrect
Error: Account is locked out (Password Policy)
Enumerating the Password Policy - from Linux - LDAP Anonymous Bind
LDAP anonymous binds allow unauthenticated attackers to retrieve information from the domain, such as a complete listing of users, groups, computers, user account attributes, and the domain password policy.
With an LDAP anonymous bind, we can use LDAP-specific enumeration tools such as windapsearch.py
, ldapsearch
, ad-ldapdomaindump.py
, etc., to pull the password policy. With ldapsearch, it can be a bit cumbersome but doable. One example command to get the password policy is as follows:
Enumerating the Password Policy - from Windows
If we can authenticate to the domain from a Windows host, we can use built-in Windows binaries such as net.exe
to retrieve the password policy.
We can also use various tools such as PowerView, CrackMapExec ported to Windows, SharpMapExec, SharpView, etc.
Using built-in commands is helpful if we land on a Windows system and cannot transfer tools to it, or we are positioned on a Windows system by the client, but have no way of getting tools onto it. One example using the built-in net.exe binary is:
PowerView is also quite handy for this:
The choice of tools depends on the goal of the assessment, stealth considerations, any anti-virus or EDR in place, and other potential restrictions on the target host.
Password Spraying - Making a Target User List
Detailed User Enumeration
To mount a successful password spraying attack, we first need a list of valid domain users to attempt to authenticate with. There are several ways that we can gather a target list of valid users:
By leveraging an SMB NULL session to retrieve a complete list of domain users from the domain controller
Utilizing an LDAP anonymous bind to query LDAP anonymously and pull down the domain user list
Using a tool such as
Kerbrute
to validate users utilizing a word list from a source such as the statistically-likely-usernames GitHub repo, or gathered by using a tool such as linkedin2username to create a list of potentially valid usersUsing a set of credentials from a Linux or Windows attack system either provided by our client or obtained through another means such as LLMNR/NBT-NS response poisoning using
Responder
or even a successful password spray using a smaller wordlist
Regardless of the method we choose, and if we have the password policy or not, we must always keep a log of our activities, including, but not limited to:
The accounts targeted
Domain Controller used in the attack
Time of the spray
Date of the spray
Password(s) attempted
This will help us ensure that we do not duplicate efforts. If an account lockout occurs or our client notices suspicious logon attempts, we can supply them with our notes to crosscheck against their logging systems and ensure nothing nefarious was going on in the network.
SMB NULL Session to Pull User List
If you are on an internal machine but don’t have valid domain credentials, you can look for SMB NULL sessions or LDAP anonymous binds on Domain Controllers. Either of these will allow you to obtain an accurate list of all users within Active Directory and the password policy. If you already have credentials for a domain user or SYSTEM
access on a Windows host, then you can easily query Active Directory for this information.
It’s possible to do this using the SYSTEM account because it can impersonate
the computer. A computer object is treated as a domain user account (with some differences, such as authenticating across forest trusts). If you don’t have a valid domain account, and SMB NULL sessions and LDAP anonymous binds are not possible, you can create a user list using external resources such as email harvesting and LinkedIn. This user list will not be as complete, but it may be enough to provide you with access to Active Directory.
Some tools that can leverage SMB NULL sessions and LDAP anonymous binds include enum4linux, rpcclient, and CrackMapExec (or the successor: NetExec), among others.
Regardless of the tool, we'll have to do a bit of filtering to clean up the output and obtain a list of only usernames, one on each line. We can do this with enum4linux
with the -U
flag.
We can use the enumdomusers
command after connecting anonymously using rpcclient
.
Finally, we can use CrackMapExec
with the --users
flag. This is a useful tool that will also show the badpwdcount
(invalid login attempts), so we can remove any accounts from our list that are close to the lockout threshold.
It also shows the baddpwdtime
, which is the date and time of the last bad password attempt, so we can see how close an account is to having its badpwdcount
reset.
Gathering Users with LDAP Anonymous
We can use various tools to gather users when we find an LDAP anonymous bind. Some examples include windapsearch and ldapsearch. If we choose to use ldapsearch
we will need to specify a valid LDAP search filter.
Tools such as windapsearch
make this easier. Here we can specify anonymous access by providing a blank username with the -u
flag and the -U
flag to tell the tool to retrieve just users.
Enumerating Users with Kerbrute
As mentioned in the Initial Enumeration of The Domain
section, if we have no access at all from our position in the internal network, we can use Kerbrute
to enumerate valid AD accounts and for password spraying.
This tool uses Kerberos Pre-Authentication, which is a much faster and potentially stealthier way to perform password spraying. This method does not generate Windows event ID 4625: An account failed to log on, or a logon failure which is often monitored for.
The tool sends TGT requests to the domain controller without Kerberos Pre-Authentication to perform username enumeration. If the KDC responds with the error PRINCIPAL UNKNOWN
, the username is invalid.
This method of username enumeration does not cause logon failures and will not lock out accounts.
However, once we have a list of valid users and switch gears to use this tool for password spraying, failed Kerberos Pre-Authentication attempts will count towards an account's failed login accounts and can lead to account lockout, so we still must be careful regardless of the method chosen.
Let's try out this method using the jsmith.txt wordlist of 48,705 possible common usernames in the format flast
. The statistically-likely-usernames GitHub repo is an excellent resource for this type of attack and contains a variety of different username lists that we can use to enumerate valid usernames using Kerbrute
.
Using Kerbrute for username enumeration will generate event ID 4768: A Kerberos authentication ticket (TGT) was requested. This will only be triggered if Kerberos event logging is enabled via Group Policy.
Defenders can tune their SIEM tools to look for an influx of this event ID, which may indicate an attack. If we are successful with this method during a penetration test, this can be an excellent recommendation to add to our report.
If we are unable to create a valid username list using any of the methods highlighted above, we could turn back to external information gathering and search for company email addresses or use a tool such as linkedin2username to mash up possible usernames from a company's LinkedIn page.
Credentialed Enumeration to Build our User List
With valid credentials, we can use any of the tools stated previously to build a user list. A quick and easy way is using CrackMapExec.
Last updated