Oui, je peux lancer un VM ou à distance dans quelque chose et essayer le mot de passe ... Je sais ... mais y a-t-il un outil ou un script qui simulera une connexion juste assez pour confirmer ou nier que le mot de passe est correct?
Scénario:
Le mot de passe d'un compte de service serveur est "oublié" ... mais nous pensons savoir de quoi il s'agit. Je voudrais transmettre les informations d'identification à quelque chose et le récupérer avec "mot de passe correct" ou "mot de passe incorrect".
J'ai même pensé à un script de mappage de lecteur avec ce compte d'utilisateur et ce mot de passe transmis pour voir s'il a mappé le lecteur avec succès ou non, mais s'est perdu dans la logique de le faire fonctionner correctement ... quelque chose comme:
-Script demande un nom d'utilisateur via msgbox -script demande un mot de passe via msgbox -script essaie de mapper un lecteur à un partage commun auquel tout le monde a accès à -script démappe le lecteur en cas de succès -script renvoie une msgbox popup indiquant "Correct Password" ou bien "Incorrect" Mot de passe"
Toute aide est appréciée ... vous penseriez que ce serait un événement rare ne nécessitant pas d'outil pour le prendre en charge, mais ... eh bien ...
runas /u:yourdomain\a_test_user notepad.exe
L'utilitaire vous demandera le mot de passe, si le bon mot de passe a été fourni, le bloc-notes se lancera, sinon il produira l'erreur 1326: le nom d'utilisateur ou le mot de passe est incorrect
Script Powershell:
#usage: Test-UserCredential -username UserNameToTest -password (Read-Host)
Function Test-UserCredential {
Param($username, $password)
Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$ct = [System.DirectoryServices.AccountManagement.ContextType]::Machine, $env:computername
$opt = [System.DirectoryServices.AccountManagement.ContextOptions]::SimpleBind
$pc = New-Object System.DirectoryServices.AccountManagement.PrincipalContext -ArgumentList $ct
$Result = $pc.ValidateCredentials($username, $password).ToString()
$Result
}
http://powershellcommunity.org/Forums/tabid/54/aft/8034/Default.aspx
Vous pouvez aussi utiliser:
Net Use \\ computername\sharename [mot de passe]/USER:] username]
S'il existe un partage portant ce nom sur l'ordinateur distant. Ou utiliser C$
si le compte est administrateur.
Vous pouvez écrire une fonction vbscript facile qui peut vérifier cela ... quelque chose comme:
Function GoodPassword(strAdminUsername, strAdminPassword, strNTDomain)
Const ADS_SECURE_AUTHENTICATION = 1
On Error Resume Next
Set objIADS = GetObject("WinNT:").OpenDSObject("WinNT://" & _
strNTDomain, strAdminUserame, _
strAdminPassword, _
ADS_SECURE_AUTHENTICATION)
if err.number = 0 then
GoodPassword = True
Else
GoodPassword = False
End If
On Error GoTO 0
End Function
Sources:
Sur le bureau Windows, vous pouvez utiliser Active Directory Explorer par SysInternals/MS lui-même:
https://docs.Microsoft.com/en-us/sysinternals/downloads/adexplorer
À l'aide du code ci-dessus, vérifiez tous les comptes de domaine pour voir s'ils utilisent un certain mot de passe.
$usernames = Get-ADUser -Filter * | select -ExpandProperty SamAccountName
foreach ($username in $usernames) {
$password = "Password"
Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$ct = [System.DirectoryServices.AccountManagement.ContextType]::Machine, $env:computername
$opt = [System.DirectoryServices.AccountManagement.ContextOptions]::SimpleBind
$pc = New-Object System.DirectoryServices.AccountManagement.PrincipalContext -ArgumentList $ct
$Result = $pc.ValidateCredentials("domain\$username", $password).ToString()
If ($Result -eq "True") {echo "$username" >> C:\result.txt}
}
Ouvrez PowerShell avec privilège administrateur et entrez les commandes ci-dessous:
changez la valeur de
your_password
etyour_username
$PlainPassword="your_password"
$SecurePassword = $PlainPassword | ConvertTo-SecureString -AsPlainText-Force
$UserName = "your_username"
$Credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $UserName,$SecurePassword
Start-Process whoami -Credential $Credentials
En utilisant ceci, nous créons une information d'identification avec username
et password
, et passons cette information d'identification à Start-Process
. Parce que whoami
n'ouvre pas un programme en arrière-plan nous ne nous soucions donc pas de la fermeture.
Si vous essayez de tester les mots de passe utilisateur sur PC-A depuis PC-B, vous pouvez le faire avec WinRM et Python.
Activez WinRM sur PC-A et pip install pywinrm
Sur PC-B. Passez la commande précédente à winrm.Session().run_ps()
, vérifiez le code d'état du résultat, 0 est correct tandis que 1 est faux.
Référence
Documentation du processus de démarrage: https://docs.Microsoft.com/en-us/powershell/module/Microsoft.powershell.management/start-process?view=powershell-6
Créer des informations d'identification: http://duffney.io/AddCredentialsToPowerShellFunctions
Comment activer WinRM: https://docs.Microsoft.com/en-us/windows/win32/winrm/installation-and-configuration-for-windows-remote-management
Configuration rapide de WinRM: https://docs.Microsoft.com/en-us/powershell/module/Microsoft.wsman.management/set-wsmanquickconfig?view=powershell-6
Configuration WinRM de base d'Ansible: https://docs.ansible.com/ansible/latest/user_guide/windows_setup.html
Vous pouvez utiliser l'un des nombreux outils bien connus pour tester les mots de passe. Celui que j'ai vu est L0phtcrack . Il existe peut-être même un moyen de le faire hors ligne avec un vidage de votre base de données d'authentification. Dans "l'autre monde", nous utilisons "john the ripper" pour des trucs comme ça.