mirror of
https://github.com/NetSPI/PowerHuntShares.git
synced 2025-05-04 19:28:42 +02:00
Add files via upload
This commit is contained in:
parent
17af4fbf30
commit
a17ceeb6aa
695
Scripts/ConfigParsers/parse-gppfiles.ps1
Normal file
695
Scripts/ConfigParsers/parse-gppfiles.ps1
Normal file
@ -0,0 +1,695 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
# This is for parsing group policy preference files and should support groups.xml, datasources.xml, drives.xml, printers.xml, scheduletasks.xml, and services.xml
|
||||||
|
|
||||||
|
function Get-GPPPasswordMod {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Retrieves plaintext passwords from specified Group Policy XML files and provides functionality to encrypt passwords.
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
This function processes specified GPP XML files and retrieves plaintext passwords for accounts pushed through Group Policy Preferences.
|
||||||
|
It also provides a method to encrypt passwords for use in XML files.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
PS C:\> Get-GPPPasswordMod -InputFilePath "\\192.168.1.1\sysvol\demo.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\USER\Preferences"
|
||||||
|
#>
|
||||||
|
[CmdletBinding()]
|
||||||
|
Param(
|
||||||
|
[Parameter(Mandatory=$false)]
|
||||||
|
[string]$InputFilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------
|
||||||
|
# Function to decrypt cpassword
|
||||||
|
# ----------------------------------------------------------------
|
||||||
|
function Get-DecryptedCpassword {
|
||||||
|
[CmdletBinding()]
|
||||||
|
Param (
|
||||||
|
[string] $Cpassword
|
||||||
|
)
|
||||||
|
|
||||||
|
try {
|
||||||
|
# Append padding
|
||||||
|
$Mod = ($Cpassword.length % 4)
|
||||||
|
switch ($Mod) {
|
||||||
|
'1' { $Cpassword = $Cpassword.Substring(0,$Cpassword.Length -1) }
|
||||||
|
'2' { $Cpassword += ('=' * (4 - $Mod)) }
|
||||||
|
'3' { $Cpassword += ('=' * (4 - $Mod)) }
|
||||||
|
}
|
||||||
|
$Base64Decoded = [Convert]::FromBase64String($Cpassword)
|
||||||
|
$AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider
|
||||||
|
[Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)
|
||||||
|
$AesIV = New-Object Byte[]($AesObject.IV.Length)
|
||||||
|
$AesObject.IV = $AesIV
|
||||||
|
$AesObject.Key = $AesKey
|
||||||
|
$DecryptorObject = $AesObject.CreateDecryptor()
|
||||||
|
[Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded, 0, $Base64Decoded.length)
|
||||||
|
return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock)
|
||||||
|
} catch { Write-Error $Error[0] }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------
|
||||||
|
# Setup data table to store GPP Information
|
||||||
|
# ----------------------------------------------------------------
|
||||||
|
if ($InputFilePath) {
|
||||||
|
$TableGPPPasswords = New-Object System.Data.DataTable
|
||||||
|
$TableGPPPasswords.Columns.Add('NewName') | Out-Null
|
||||||
|
$TableGPPPasswords.Columns.Add('Changed') | Out-Null
|
||||||
|
$TableGPPPasswords.Columns.Add('UserName') | Out-Null
|
||||||
|
$TableGPPPasswords.Columns.Add('CPassword') | Out-Null
|
||||||
|
$TableGPPPasswords.Columns.Add('Password') | Out-Null
|
||||||
|
$TableGPPPasswords.Columns.Add('File') | Out-Null
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------
|
||||||
|
# Find, parse, decrypt, and display results from XML files
|
||||||
|
# ----------------------------------------------------------------
|
||||||
|
$XmlFiles = Get-ChildItem -Path $InputFilePath -Recurse -ErrorAction SilentlyContinue -Include 'Groups.xml','Services.xml','ScheduledTasks.xml','DataSources.xml','Printers.xml','Drives.xml'
|
||||||
|
|
||||||
|
# Parse GPP config files
|
||||||
|
$XmlFiles | ForEach-Object {
|
||||||
|
$FileFullName = $_.FullName
|
||||||
|
$FileName = $_.Name
|
||||||
|
|
||||||
|
# Read the file content as a string
|
||||||
|
$fileContentString = Get-Content -Path "$FileFullName" -Raw
|
||||||
|
|
||||||
|
try {
|
||||||
|
# Attempt to load the XML content
|
||||||
|
[xml]$FileContent = [xml]$fileContentString
|
||||||
|
} catch {
|
||||||
|
Write-Error "Failed to parse XML in file '$FileFullName'. Error: $_"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Process Drives.xml
|
||||||
|
if ($FileName -eq "Drives.xml") {
|
||||||
|
$FileContent.Drives.Drive | ForEach-Object {
|
||||||
|
[string]$Username = $_.Properties.username
|
||||||
|
[string]$CPassword = $_.Properties.cpassword
|
||||||
|
[string]$Password = Get-DecryptedCpassword $CPassword
|
||||||
|
[datetime]$Changed = $_.Changed
|
||||||
|
[string]$NewName = ""
|
||||||
|
$TableGPPPasswords.Rows.Add($NewName, $Changed, $Username, $CPassword, $Password, $FileFullName) | Out-Null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Process Groups.xml
|
||||||
|
if ($FileName -eq "Groups.xml") {
|
||||||
|
$FileContent.Groups.User | ForEach-Object {
|
||||||
|
[string]$Username = $_.Properties.username
|
||||||
|
[string]$CPassword = $_.Properties.cpassword
|
||||||
|
[string]$Password = Get-DecryptedCpassword $CPassword
|
||||||
|
[datetime]$Changed = $_.Changed
|
||||||
|
[string]$NewName = $_.Properties.newname
|
||||||
|
$TableGPPPasswords.Rows.Add($NewName, $Changed, $Username, $CPassword, $Password, $FileFullName) | Out-Null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Process Services.xml
|
||||||
|
if ($FileName -eq "Services.xml") {
|
||||||
|
$FileContent.NTServices.NTService | ForEach-Object {
|
||||||
|
[string]$Username = $_.Properties.accountname
|
||||||
|
[string]$CPassword = $_.Properties.cpassword
|
||||||
|
[string]$Password = Get-DecryptedCpassword $CPassword
|
||||||
|
[datetime]$Changed = $_.Changed
|
||||||
|
[string]$NewName = ""
|
||||||
|
$TableGPPPasswords.Rows.Add($NewName, $Changed, $Username, $CPassword, $Password, $FileFullName) | Out-Null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Process ScheduledTasks.xml
|
||||||
|
if ($FileName -eq "ScheduledTasks.xml") {
|
||||||
|
$FileContent.ScheduledTasks.Task | ForEach-Object {
|
||||||
|
[string]$Username = $_.Properties.runas
|
||||||
|
[string]$CPassword = $_.Properties.cpassword
|
||||||
|
[string]$Password = Get-DecryptedCpassword $CPassword
|
||||||
|
[datetime]$Changed = $_.Changed
|
||||||
|
[string]$NewName = ""
|
||||||
|
$TableGPPPasswords.Rows.Add($NewName, $Changed, $Username, $CPassword, $Password, $FileFullName) | Out-Null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Process DataSources.xml
|
||||||
|
if ($FileName -eq "DataSources.xml") {
|
||||||
|
$FileContent.DataSources.DataSource | ForEach-Object {
|
||||||
|
[string]$Username = $_.Properties.username
|
||||||
|
[string]$CPassword = $_.Properties.cpassword
|
||||||
|
[string]$Password = Get-DecryptedCpassword $CPassword
|
||||||
|
[datetime]$Changed = $_.Changed
|
||||||
|
[string]$NewName = ""
|
||||||
|
$TableGPPPasswords.Rows.Add($NewName, $Changed, $Username, $CPassword, $Password, $FileFullName) | Out-Null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Process Printers.xml
|
||||||
|
if ($FileName -eq "Printers.xml") {
|
||||||
|
$FileContent.Printers.SharedPrinter | ForEach-Object {
|
||||||
|
[string]$Username = $_.Properties.username
|
||||||
|
[string]$CPassword = $_.Properties.cpassword
|
||||||
|
[string]$Password = Get-DecryptedCpassword $CPassword
|
||||||
|
[datetime]$Changed = $_.Changed
|
||||||
|
[string]$NewName = ""
|
||||||
|
$TableGPPPasswords.Rows.Add($NewName, $Changed, $Username, $CPassword, $Password, $FileFullName) | Out-Null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if anything was found
|
||||||
|
if (-not $XmlFiles) {
|
||||||
|
throw 'No preference files found.'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Display results
|
||||||
|
$TableGPPPasswords
|
||||||
|
}
|
||||||
|
|
||||||
|
# Allow users to encrypt passwords
|
||||||
|
function Set-EncryptedCpassword {
|
||||||
|
[CmdletBinding()]
|
||||||
|
Param (
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$Password
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create a new AES .NET Crypto Object
|
||||||
|
$AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider
|
||||||
|
[Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)
|
||||||
|
$AesIV = New-Object Byte[]($AesObject.IV.Length)
|
||||||
|
$AesObject.IV = $AesIV
|
||||||
|
$AesObject.Key = $AesKey
|
||||||
|
$EncryptorObject = $AesObject.CreateEncryptor()
|
||||||
|
|
||||||
|
# Convert password to byte array and encrypt
|
||||||
|
[Byte[]] $InputBytes = [System.Text.Encoding]::Unicode.GetBytes($Password)
|
||||||
|
[Byte[]] $EncryptedBytes = $EncryptorObject.TransformFinalBlock($InputBytes, 0, $InputBytes.Length)
|
||||||
|
$EncryptedCpassword = [Convert]::ToBase64String($EncryptedBytes)
|
||||||
|
|
||||||
|
return $EncryptedCpassword
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example path to the directory containing the GPP XML files
|
||||||
|
$pathToGPPFiles = "c:\temp\configs\ScheduledTasks.xml"
|
||||||
|
|
||||||
|
# Call the function
|
||||||
|
$gppPasswords = Get-GPPPasswordMod -InputFilePath $pathToGPPFiles
|
||||||
|
|
||||||
|
# Display the results
|
||||||
|
$gppPasswords
|
||||||
|
|
||||||
|
|
||||||
|
<# Bonus function for encrypting password
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------
|
||||||
|
# Function to encrypt a password
|
||||||
|
# ----------------------------------------------------------------
|
||||||
|
function Set-EncryptedCpassword {
|
||||||
|
[CmdletBinding()]
|
||||||
|
Param (
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$Password
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create a new AES .NET Crypto Object
|
||||||
|
$AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider
|
||||||
|
[Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)
|
||||||
|
$AesIV = New-Object Byte[]($AesObject.IV.Length)
|
||||||
|
$AesObject.IV = $AesIV
|
||||||
|
$AesObject.Key = $AesKey
|
||||||
|
$EncryptorObject = $AesObject.CreateEncryptor()
|
||||||
|
|
||||||
|
# Convert password to byte array and encrypt
|
||||||
|
[Byte[]] $InputBytes = [System.Text.Encoding]::Unicode.GetBytes($Password)
|
||||||
|
[Byte[]] $EncryptedBytes = $EncryptorObject.TransformFinalBlock($InputBytes, 0, $InputBytes.Length)
|
||||||
|
$EncryptedCpassword = [Convert]::ToBase64String($EncryptedBytes)
|
||||||
|
|
||||||
|
return $EncryptedCpassword
|
||||||
|
}
|
||||||
|
|
||||||
|
$plainTextPassword = "MyAwesomePassword!"
|
||||||
|
$encryptedPassword = Set-EncryptedCpassword -Password $plainTextPassword
|
||||||
|
Write-Output $encryptedPassword
|
||||||
|
|
||||||
|
#>
|
||||||
|
|
||||||
|
<# Printers.xml
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Printers
|
||||||
|
clsid="{1F577D12-3D1B-471e-A1B7-060317597B9C}"
|
||||||
|
disabled="1">
|
||||||
|
<SharedPrinter
|
||||||
|
clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}"
|
||||||
|
name="b35-1053-a" status="b35-1053-a"
|
||||||
|
image="2"
|
||||||
|
changed="2007-07-06 20:49:50"
|
||||||
|
uid="{D954AF72-DDFC-498D-A185-A569A0D02FC4}">
|
||||||
|
<Properties
|
||||||
|
action="U"
|
||||||
|
comment=""
|
||||||
|
path="\\PRN-CORP1\b35-1053-a"
|
||||||
|
location=""
|
||||||
|
default="1"
|
||||||
|
skipLocal="1"
|
||||||
|
deleteAll="0"
|
||||||
|
persistent="0"
|
||||||
|
deleteMaps="0"
|
||||||
|
cpassword="5gn5fUqMaeGJkLEPgl3iH9UfLATVxRAHE8GvAvekwnicLYf2Pynj7ifihvajBRA3"
|
||||||
|
port=""/>
|
||||||
|
</SharedPrinter>
|
||||||
|
<PortPrinter
|
||||||
|
clsid="{C3A739D2-4A44-401e-9F9D-88E5E77DFB3E}"
|
||||||
|
name="10.10.10.10"
|
||||||
|
status="10.10.10.10"
|
||||||
|
image="2"
|
||||||
|
changed="2007-07-06 20:50:43"
|
||||||
|
uid="{6A331F02-C488-44B6-988C-0730C2C1E374}">
|
||||||
|
<Properties
|
||||||
|
ipAddress="10.10.10.10"
|
||||||
|
action="U"
|
||||||
|
location="1st Floor"
|
||||||
|
localName="Lexmark 1150S"
|
||||||
|
comment="Only for use by graphics"
|
||||||
|
default="1"
|
||||||
|
skipLocal="1"
|
||||||
|
useDNS="0"
|
||||||
|
path="Lexmark 1150S (Color)"
|
||||||
|
deleteAll="0"
|
||||||
|
lprQueue=""
|
||||||
|
snmpCommunity="Local"
|
||||||
|
protocol="PROTOCOL_RAWTCP_TYPE"
|
||||||
|
portNumber="9100"
|
||||||
|
doubleSpool="0"
|
||||||
|
snmpEnabled="1"
|
||||||
|
snmpDevIndex="1"/>
|
||||||
|
</PortPrinter>
|
||||||
|
<LocalPrinter
|
||||||
|
clsid="{F08996D5-568B-45f5-BB7A-D3FB1E370B0A}"
|
||||||
|
name="Epsom DotMatrix"
|
||||||
|
status="1st Floor Copy Room"
|
||||||
|
image="2"
|
||||||
|
changed="2007-07-06 20:51:47"
|
||||||
|
uid="{65D3663D-BC4E-45D2-8EA8-1DB3AC7158CB}">
|
||||||
|
<Properties
|
||||||
|
action="U"
|
||||||
|
name="Epsom DotMatrix"
|
||||||
|
port="LPT1:"
|
||||||
|
path="EpsomDots"
|
||||||
|
default="1"
|
||||||
|
deleteAll="0"
|
||||||
|
location="1st Floor Copy Room"
|
||||||
|
comment="Old printer. Don't use."/>
|
||||||
|
</LocalPrinter>
|
||||||
|
</Printers>
|
||||||
|
|
||||||
|
#>
|
||||||
|
|
||||||
|
|
||||||
|
<# ScheduledTasks.xml
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ScheduledTasks clsid="{CC63F200-7309-4ba0-B154-A71CD118DBCC}"
|
||||||
|
disabled="1">
|
||||||
|
<Task clsid="{2DEECB1C-261F-4e13-9B21-16FB83BC03BD}"
|
||||||
|
name="Cleanup"
|
||||||
|
image="2"
|
||||||
|
changed="2007-07-06 20:54:40"
|
||||||
|
uid="{96C2DBEF-ECAE-4BD4-B1C7-0CD71116595C}">
|
||||||
|
<Filters>
|
||||||
|
<FilterOs hidden="1"
|
||||||
|
not="1"
|
||||||
|
bool="AND"
|
||||||
|
class="NT"
|
||||||
|
version="VISTA"
|
||||||
|
type="NE"
|
||||||
|
edition="NE"
|
||||||
|
sp="NE"/>
|
||||||
|
</Filters>
|
||||||
|
<Properties action="U"
|
||||||
|
name="Cleanup"
|
||||||
|
appName="\\scratch\filecleanup.exe"
|
||||||
|
args="-all"
|
||||||
|
startIn="c:\"
|
||||||
|
comment="Runs for almost 4 hours"
|
||||||
|
enabled="1"
|
||||||
|
deleteWhenDone="0"
|
||||||
|
startOnlyIfIdle="0"
|
||||||
|
stopOnIdleEnd="0"
|
||||||
|
noStartIfOnBatteries="1"
|
||||||
|
stopIfGoingOnBatteries="1"
|
||||||
|
cpassword="5gn5fUqMaeGJkLEPgl3iH9UfLATVxRAHE8GvAvekwnicLYf2Pynj7ifihvajBRA3"
|
||||||
|
systemRequired="0">
|
||||||
|
<Triggers>
|
||||||
|
<Trigger type="DAILY"
|
||||||
|
startHour="10"
|
||||||
|
startMinutes="0"
|
||||||
|
beginYear="2007"
|
||||||
|
beginMonth="7"
|
||||||
|
beginDay="6"
|
||||||
|
hasEndDate="0"
|
||||||
|
repeatTask="0"
|
||||||
|
interval="1"/>
|
||||||
|
</Triggers>
|
||||||
|
</Properties>
|
||||||
|
</Task>
|
||||||
|
|
||||||
|
<ImmediateTask clsid="{9F030D12-DDA3-4C26-8548-B7CE9151166A}"
|
||||||
|
name="PingCorporate"
|
||||||
|
changed="2007-07-06 20:55:15"
|
||||||
|
uid="{3D15BAA9-E05A-470C-9298-FA4C0B701695}">
|
||||||
|
<Filters>
|
||||||
|
<FilterOs hidden="1"
|
||||||
|
not="1"
|
||||||
|
bool="AND"
|
||||||
|
class="NT"
|
||||||
|
version="VISTA"
|
||||||
|
type="NE"
|
||||||
|
edition="NE"
|
||||||
|
sp="NE"/>
|
||||||
|
</Filters>
|
||||||
|
<Properties name="PingCorporate"
|
||||||
|
appName="c:\ping.exe"
|
||||||
|
args="-ip 10.10.10.10"
|
||||||
|
startIn=""
|
||||||
|
comment=""
|
||||||
|
maxRunTime="259200000"
|
||||||
|
startOnlyIfIdle="1"
|
||||||
|
idleMinutes="10"
|
||||||
|
deadlineMinutes="60"
|
||||||
|
stopOnIdleEnd="0"
|
||||||
|
noStartIfOnBatteries="1"
|
||||||
|
stopIfGoingOnBatteries="1"
|
||||||
|
systemRequired="0"/>
|
||||||
|
</ImmediateTask>
|
||||||
|
<TaskV2 clsid="{D8896631-B747-47a7-84A6-C155337F3BC8}"
|
||||||
|
name="Demo"
|
||||||
|
image="2"
|
||||||
|
changed="2008-05-28 21:07:40"
|
||||||
|
uid="{BA81EFFF-E567-4CB8-8708-6C17A5950B0A}"
|
||||||
|
bypassErrors="0"
|
||||||
|
userContext="0" removePolicy="0"
|
||||||
|
desc="This is a test of the system.">
|
||||||
|
<Properties action="U"
|
||||||
|
name="Demo"
|
||||||
|
runAs="%LogonDomain%\%LogonUser%"
|
||||||
|
logonType="InteractiveToken">
|
||||||
|
<Task version="1.2">
|
||||||
|
<RegistrationInfo>
|
||||||
|
<Author>WIN-P3LTV7KC6IO\Administrator</Author>
|
||||||
|
<Description>Demo</Description>
|
||||||
|
</RegistrationInfo>
|
||||||
|
<Principals>
|
||||||
|
<Principal id="Author">
|
||||||
|
<UserId>%LogonDomain%\%LogonUser</UserId>
|
||||||
|
<LogonType>InteractiveToken</LogonType>
|
||||||
|
<RunLevel>LeastPrivilege</RunLevel>
|
||||||
|
</Principal>
|
||||||
|
</Principals>
|
||||||
|
<Settings>
|
||||||
|
<IdleSettings>
|
||||||
|
<Duration>PT10M</Duration>
|
||||||
|
<WaitTimeout>PT1H</WaitTimeout>
|
||||||
|
<StopOnIdleEnd>true</StopOnIdleEnd>
|
||||||
|
<RestartOnIdle>true</RestartOnIdle>
|
||||||
|
</IdleSettings>
|
||||||
|
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
|
||||||
|
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
|
||||||
|
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
|
||||||
|
<AllowHardTerminate>true</AllowHardTerminate>
|
||||||
|
<StartWhenAvailable>true</StartWhenAvailable>
|
||||||
|
<RunOnlyIfNetworkAvailable>true</RunOnlyIfNetworkAvailable>
|
||||||
|
<AllowStartOnDemand>true</AllowStartOnDemand>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
<Hidden>false</Hidden>
|
||||||
|
<RunOnlyIfIdle>true</RunOnlyIfIdle>
|
||||||
|
<WakeToRun>true</WakeToRun>
|
||||||
|
<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
|
||||||
|
<Priority>7</Priority>
|
||||||
|
<RestartOnFailure>
|
||||||
|
<Interval>PT1M</Interval>
|
||||||
|
<Count>3</Count>
|
||||||
|
</RestartOnFailure>
|
||||||
|
</Settings>
|
||||||
|
<Triggers>
|
||||||
|
<TimeTrigger>
|
||||||
|
<StartBoundary>2008-05-28T14:06:04</StartBoundary>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
</TimeTrigger>
|
||||||
|
<CalendarTrigger>
|
||||||
|
<StartBoundary>2008-05-28T14:06:08</StartBoundary>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
<ScheduleByDay>
|
||||||
|
<DaysInterval>1</DaysInterval>
|
||||||
|
</ScheduleByDay>
|
||||||
|
</CalendarTrigger>
|
||||||
|
<CalendarTrigger>
|
||||||
|
<StartBoundary>2008-05-28T14:06:11</StartBoundary>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
<ScheduleByWeek>
|
||||||
|
<WeeksInterval>1</WeeksInterval>
|
||||||
|
<DaysOfWeek>
|
||||||
|
<Sunday/>
|
||||||
|
<Thursday/>
|
||||||
|
</DaysOfWeek>
|
||||||
|
</ScheduleByWeek>
|
||||||
|
</CalendarTrigger>
|
||||||
|
<CalendarTrigger>
|
||||||
|
<StartBoundary>2008-05-28T14:06:16</StartBoundary>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
<ScheduleByMonth>
|
||||||
|
<DaysOfMonth>
|
||||||
|
<Day>1</Day>
|
||||||
|
</DaysOfMonth>
|
||||||
|
<Months>
|
||||||
|
<January/>
|
||||||
|
</Months>
|
||||||
|
</ScheduleByMonth>
|
||||||
|
</CalendarTrigger>
|
||||||
|
<LogonTrigger>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
</LogonTrigger>
|
||||||
|
<BootTrigger>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
</BootTrigger>
|
||||||
|
<IdleTrigger>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
</IdleTrigger>
|
||||||
|
<RegistrationTrigger>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
</RegistrationTrigger>
|
||||||
|
<SessionStateChangeTrigger>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
<StateChange>RemoteConnect</StateChange>
|
||||||
|
</SessionStateChangeTrigger>
|
||||||
|
<SessionStateChangeTrigger>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
<StateChange>RemoteConnect</StateChange>
|
||||||
|
</SessionStateChangeTrigger>
|
||||||
|
<SessionStateChangeTrigger>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
<StateChange>SessionLock</StateChange>
|
||||||
|
</SessionStateChangeTrigger>
|
||||||
|
<SessionStateChangeTrigger>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
<StateChange>SessionUnlock</StateChange>
|
||||||
|
</SessionStateChangeTrigger>
|
||||||
|
</Triggers>
|
||||||
|
<Actions>
|
||||||
|
<Exec>
|
||||||
|
<Command>a</Command>
|
||||||
|
<Arguments>b</Arguments>
|
||||||
|
<WorkingDirectory>c</WorkingDirectory>
|
||||||
|
</Exec>
|
||||||
|
<SendEmail>
|
||||||
|
<From>a</From>
|
||||||
|
<To>b</To>
|
||||||
|
<Subject>c</Subject>
|
||||||
|
<Body>d</Body>
|
||||||
|
<HeaderFields/>
|
||||||
|
<Attachments>
|
||||||
|
<File>e</File>
|
||||||
|
</Attachments>
|
||||||
|
<Server>f</Server>
|
||||||
|
</SendEmail>
|
||||||
|
<ShowMessage>
|
||||||
|
<Title>aa</Title>
|
||||||
|
<Body>bb</Body>
|
||||||
|
</ShowMessage>
|
||||||
|
</Actions>
|
||||||
|
</Task>
|
||||||
|
</Properties>
|
||||||
|
</TaskV2>
|
||||||
|
<ImmediateTaskV2 clsid="{9756B581-76EC-4169-9AFC-0CA8D43ADB5F}"
|
||||||
|
name="ImdTask"
|
||||||
|
image="2"
|
||||||
|
changed="2008-05-27 03:49:21"
|
||||||
|
uid="{541F1F1E-CAD4-447C-B26F-5D1EAD6965AA}">
|
||||||
|
<Filters>
|
||||||
|
<FilterOs hidden="1" not="0" bool="AND" class="NT" version="Vista" type="NE" edition="NE" sp="NE"/>
|
||||||
|
<FilterOs hidden="1" not="0" bool="OR" class="NT" version="2K8" type="NE" edition="NE" sp="NE"/>
|
||||||
|
<FilterOs hidden="1" not="0" bool="OR" class="NT" version="WIN7" type="NE" edition="NE" sp="NE"/>
|
||||||
|
</Filters>
|
||||||
|
<Properties action="U"
|
||||||
|
name="ImdTask"
|
||||||
|
runAs="%LogonDomain%\%LogonUser%"
|
||||||
|
logonType="InteractiveToken">
|
||||||
|
<Task version="1.2">
|
||||||
|
<RegistrationInfo>
|
||||||
|
<Author>WIN-P3LTV7KC6IO\Administrator</Author>
|
||||||
|
<Description>Demo ImdTask </Description>
|
||||||
|
</RegistrationInfo>
|
||||||
|
<Principals>
|
||||||
|
<Principal id="Author">
|
||||||
|
<UserId>%LogonDomain%\%LogonUser</UserId>
|
||||||
|
<LogonType>InteractiveToken</LogonType>
|
||||||
|
<RunLevel>HighestAvailable</RunLevel>
|
||||||
|
</Principal>
|
||||||
|
</Principals>
|
||||||
|
<Settings>
|
||||||
|
<IdleSettings>
|
||||||
|
<Duration>PT10M</Duration>
|
||||||
|
<WaitTimeout>PT1H</WaitTimeout>
|
||||||
|
<StopOnIdleEnd>true</StopOnIdleEnd>
|
||||||
|
<RestartOnIdle>false</RestartOnIdle>
|
||||||
|
</IdleSettings>
|
||||||
|
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
|
||||||
|
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
|
||||||
|
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
|
||||||
|
<AllowHardTerminate>true</AllowHardTerminate>
|
||||||
|
<StartWhenAvailable>false</StartWhenAvailable>
|
||||||
|
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
|
||||||
|
<AllowStartOnDemand>true</AllowStartOnDemand>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
<Hidden>false</Hidden>
|
||||||
|
<RunOnlyIfIdle>false</RunOnlyIfIdle>
|
||||||
|
<WakeToRun>false</WakeToRun>
|
||||||
|
<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
|
||||||
|
<Priority>7</Priority>
|
||||||
|
</Settings>
|
||||||
|
<Actions>
|
||||||
|
<Exec><Command>calc.exe</Command>
|
||||||
|
</Exec>
|
||||||
|
</Actions>
|
||||||
|
</Task>
|
||||||
|
</Properties>
|
||||||
|
</ImmediateTaskV2>
|
||||||
|
</ScheduledTasks>
|
||||||
|
|
||||||
|
#>
|
||||||
|
|
||||||
|
<# Services.xml
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<NTServices clsid="{2CFB484A-4E96-4b5d-A0B6-093D2F91E6AE}">
|
||||||
|
<NTService
|
||||||
|
clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}"
|
||||||
|
name="Computer Browser"
|
||||||
|
image="0"
|
||||||
|
changed="2007-07-10 22:52:45"
|
||||||
|
uid="{8A3CC7D5-89F1-44DB-8D41-80F6471E17BF}">
|
||||||
|
<Properties
|
||||||
|
startupType="NOCHANGE"
|
||||||
|
serviceName="Computer Browser"
|
||||||
|
timeout="30"
|
||||||
|
accountName="LocalSystem"
|
||||||
|
interact="1"
|
||||||
|
firstFailure="NOACTION"
|
||||||
|
secondFailure="NOACTION"
|
||||||
|
thirdFailure="RESTART"
|
||||||
|
resetFailCountDelay="0"
|
||||||
|
cpassword="5gn5fUqMaeGJkLEPgl3iH9UfLATVxRAHE8GvAvekwnicLYf2Pynj7ifihvajBRA3"
|
||||||
|
restartServiceDelay="900000"/>
|
||||||
|
</NTService>
|
||||||
|
</NTServices>
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
||||||
|
|
||||||
|
<# Drives.xml
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Drives clsid="{8FDDCC1A-0C3C-43cd-A6B4-71A6DF20DA8C}"
|
||||||
|
disabled="1">
|
||||||
|
<Drive clsid="{935D1B74-9CB8-4e3c-9914-7DD559B7A417}"
|
||||||
|
name="S:"
|
||||||
|
status="S:"
|
||||||
|
image="2"
|
||||||
|
changed="2007-07-06 20:57:37"
|
||||||
|
uid="{4DA4A7E3-F1D8-4FB1-874F-D2F7D16F7065}">
|
||||||
|
<Properties action="U"
|
||||||
|
thisDrive="NOCHANGE"
|
||||||
|
allDrives="NOCHANGE"
|
||||||
|
userName="test"
|
||||||
|
cpassword="5gn5fUqMaeGJkLEPgl3iH9UfLATVxRAHE8GvAvekwnicLYf2Pynj7ifihvajBRA3"
|
||||||
|
path="\\scratch"
|
||||||
|
label="SCRATCH"
|
||||||
|
persistent="1"
|
||||||
|
useLetter="1"
|
||||||
|
letter="S"/>
|
||||||
|
</Drive>
|
||||||
|
</Drives>
|
||||||
|
|
||||||
|
#>
|
||||||
|
|
||||||
|
<# Groups.xml
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Groups clsid="{D4A3F943-1B57-4B98-B5E4-1E9C7A84B292}">
|
||||||
|
<User clsid="{A7D5F186-71E5-4A24-8B2A-C3BDE98BA2D2}"
|
||||||
|
name="example.com\IT_Dept"
|
||||||
|
image="2"
|
||||||
|
changed="2023-09-23 12:00:00"
|
||||||
|
uid="{B8C7DA29-6F69-4530-B99E-B9B5B88B215B}">
|
||||||
|
<Properties action="U"
|
||||||
|
newName=""
|
||||||
|
fullName="IT Department"
|
||||||
|
description="Group for IT department staff"
|
||||||
|
cpassword="5gn5fUqMaeGJkLEPgl3iH9UfLATVxRAHE8GvAvekwnicLYf2Pynj7ifihvajBRA3"
|
||||||
|
changeLogon="0"
|
||||||
|
noChange="0"
|
||||||
|
neverExpires="0"
|
||||||
|
acctDisabled="0"
|
||||||
|
userName="example.com\IT_Dept"/>
|
||||||
|
</User>
|
||||||
|
</Groups>
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
||||||
|
|
||||||
|
<# DataSources.xml
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<DataSources clsid="{380F820F-F21B-41ac-A3CC-24D4F80F067B}" disabled="0">
|
||||||
|
<DataSource clsid="{5C209626-D820-4d69-8D50-1FACD6214488}" name="LocalContacts"
|
||||||
|
image="1" bypassErrors="0" userContext="1" removePolicy="1"
|
||||||
|
desc="This is a local database on the local machine."
|
||||||
|
changed="2007-07-06 20:33:47" uid="{5AA6C3F8-B6D3-4FE1-8925-FEBE6F15310A}">
|
||||||
|
<Properties action="R" userDSN="1" dsn="LocalContacts"
|
||||||
|
driver="Microsoft Access (*.mdb)" description="Local Access Database"
|
||||||
|
username="test" cpassword="5gn5fUqMaeGJkLEPgl3iH9UfLATVxRAHE8GvAvekwnicLYf2Pynj7ifihvajBRA3">
|
||||||
|
<Attributes>
|
||||||
|
<Attribute name="DSN" value="C:\USERS\DEMO.MDB"/>
|
||||||
|
</Attributes>
|
||||||
|
</Properties>
|
||||||
|
</DataSource>
|
||||||
|
<DataSource clsid="{5C209626-D820-4d69-8D50-1FACD6214488}" name="SystemNodes"
|
||||||
|
image="2" bypassErrors="0" userContext="1" removePolicy="0"
|
||||||
|
changed="2007-07-06 20:35:31" uid="{F2174147-A906-4977-AE6F-019C427979D8}">
|
||||||
|
<Properties action="U" userDSN="0" dsn="SystemNodes"
|
||||||
|
driver="Microsoft Access (*.mdb)" description="All system nodes."
|
||||||
|
username="test23" cpassword="j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw">
|
||||||
|
<Attributes>
|
||||||
|
<Attribute name="DSN" value="c:\nodelist.mdb"/>
|
||||||
|
</Attributes>
|
||||||
|
</Properties>
|
||||||
|
<Filters>
|
||||||
|
<FilterRunOnce hidden="1" not="0" bool="AND"
|
||||||
|
id="{8F7D51B0-F798-4C5F-972B-36FCD0399A33}"/>
|
||||||
|
</Filters>
|
||||||
|
</DataSource>
|
||||||
|
</DataSources>
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
74
Scripts/ConfigParsers/parser-.pgpass.ps1
Normal file
74
Scripts/ConfigParsers/parser-.pgpass.ps1
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-PgPassCredentials {
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Ensure the file exists
|
||||||
|
if (-Not (Test-Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the .pgpass file
|
||||||
|
$pgpassEntries = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Array to store the extracted credentials
|
||||||
|
$credentialsList = @()
|
||||||
|
|
||||||
|
# Loop through each line in the .pgpass file
|
||||||
|
foreach ($entry in $pgpassEntries) {
|
||||||
|
# Skip comments and empty lines
|
||||||
|
if ($entry -match '^\s*#' -or $entry -match '^\s*$') {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
# Split the line by colon, expecting the format: hostname:port:database:username:password
|
||||||
|
$fields = $entry -split ':'
|
||||||
|
|
||||||
|
if ($fields.Length -eq 5) {
|
||||||
|
# Create a custom object for each entry
|
||||||
|
$credential = [PSCustomObject]@{
|
||||||
|
Hostname = $fields[0]
|
||||||
|
Port = $fields[1]
|
||||||
|
Database = $fields[2]
|
||||||
|
Username = $fields[3]
|
||||||
|
Password = $fields[4]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add the credential object to the list
|
||||||
|
$credentialsList += $credential
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Warning "Invalid format in entry: $entry"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the results as a PowerShell object
|
||||||
|
return $credentialsList
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$pgpassCredentials = Get-PgPassCredentials -FilePath "c:\temp\configs\.pgpass"
|
||||||
|
$pgpassCredentials
|
||||||
|
|
||||||
|
<# .pgpass file - used for postgres
|
||||||
|
|
||||||
|
# Format: hostname:port:database:username:password
|
||||||
|
|
||||||
|
# Local database connection
|
||||||
|
localhost:5432:mydatabase:myuser:mypassword
|
||||||
|
|
||||||
|
# Remote database connection
|
||||||
|
remote.server.com:5432:anotherdb:anotheruser:anotherpassword
|
||||||
|
|
||||||
|
# Default connection for any database on localhost
|
||||||
|
localhost:*:*:defaultuser:defaultpassword
|
||||||
|
|
||||||
|
# Wildcard example: Any database and any user connecting to localhost
|
||||||
|
localhost:*:*:*:supersecretpassword
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
111
Scripts/ConfigParsers/parser-SiteManager.xml.ps1
Normal file
111
Scripts/ConfigParsers/parser-SiteManager.xml.ps1
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
# Function to check if a string is a valid base64-encoded string
|
||||||
|
function IsBase64String {
|
||||||
|
param ([string]$string)
|
||||||
|
if ($string -match '^[a-zA-Z0-9\+/]*={0,2}$' -and ($string.Length % 4 -eq 0)) {
|
||||||
|
return $true
|
||||||
|
}
|
||||||
|
return $false
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to process the SiteManager.xml file and extract server information
|
||||||
|
function Get-SiteManagerServerInfo {
|
||||||
|
param (
|
||||||
|
[string]$xmlFilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-not (Test-Path $xmlFilePath)) {
|
||||||
|
Write-Error "File not found: $xmlFilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load the XML file
|
||||||
|
$xml = [xml](Get-Content $xmlFilePath)
|
||||||
|
|
||||||
|
# Iterate through each server entry and extract relevant information
|
||||||
|
$xml.FileZilla3.Servers.Server | ForEach-Object {
|
||||||
|
$decodedPassword = "Invalid or not present"
|
||||||
|
|
||||||
|
# Access the Pass element's inner text, ensuring it's properly treated as a string
|
||||||
|
[string]$base64Pass = $_.Pass.InnerText
|
||||||
|
# Check if the password is a valid base64 string before decoding
|
||||||
|
if ($base64Pass) {
|
||||||
|
try {
|
||||||
|
# Trim any extra whitespace from the base64 string
|
||||||
|
$cleanPass = $base64Pass.Trim()
|
||||||
|
$decodedPassword = [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($cleanPass))
|
||||||
|
} catch {
|
||||||
|
$decodedPassword = "Error decoding password: $_"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the server details
|
||||||
|
[pscustomobject]@{
|
||||||
|
Server = $_.Host
|
||||||
|
Port = $_.Port
|
||||||
|
Username = $_.User
|
||||||
|
Password = $decodedPassword
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage
|
||||||
|
$xmlFilePath = "c:\temp\configs\SiteManager.xml"
|
||||||
|
Get-SiteManagerServerInfo -xmlFilePath $xmlFilePath
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<# SiteManager.xml
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<FileZilla3>
|
||||||
|
<Servers>
|
||||||
|
<Server>
|
||||||
|
<Host>ftp.example.com</Host>
|
||||||
|
<Port>21</Port>
|
||||||
|
<Protocol>0</Protocol> <!-- 0 for FTP, 1 for SFTP -->
|
||||||
|
<Type>0</Type> <!-- 0 for normal FTP, 1 for FTP over TLS/SSL -->
|
||||||
|
<User>username</User>
|
||||||
|
<Pass encoding="base64">SGVsbG9QYXNzd29yZA==</Pass> <!-- Password encoded in base64 -->
|
||||||
|
<Logontype>1</Logontype> <!-- 0 for anonymous, 1 for normal -->
|
||||||
|
<TimezoneOffset>0</TimezoneOffset>
|
||||||
|
<PasvMode>MODE_DEFAULT</PasvMode> <!-- Default is passive mode -->
|
||||||
|
<MaximumMultipleConnections>0</MaximumMultipleConnections>
|
||||||
|
<EncodingType>Auto</EncodingType>
|
||||||
|
<BypassProxy>0</BypassProxy>
|
||||||
|
<Name>My FTP Site</Name>
|
||||||
|
<Comments>Sample FTP site for demonstration</Comments>
|
||||||
|
<LocalDir/>
|
||||||
|
<RemoteDir/>
|
||||||
|
<SyncBrowsing>0</SyncBrowsing>
|
||||||
|
<DirectoryComparison>0</DirectoryComparison>
|
||||||
|
</Server>
|
||||||
|
|
||||||
|
<Server>
|
||||||
|
<Host>sftp.example.com</Host>
|
||||||
|
<Port>22</Port>
|
||||||
|
<Protocol>1</Protocol> <!-- 1 for SFTP -->
|
||||||
|
<Type>1</Type> <!-- 1 for explicit FTP over TLS -->
|
||||||
|
<User>sftpuser</User>
|
||||||
|
<Pass encoding="base64">SGVsbG9QYXNzd29yZA==</Pass>
|
||||||
|
<Logontype>1</Logontype>
|
||||||
|
<TimezoneOffset>0</TimezoneOffset>
|
||||||
|
<PasvMode>MODE_DEFAULT</PasvMode>
|
||||||
|
<MaximumMultipleConnections>1</MaximumMultipleConnections>
|
||||||
|
<EncodingType>Auto</EncodingType>
|
||||||
|
<BypassProxy>0</BypassProxy>
|
||||||
|
<Name>My SFTP Site</Name>
|
||||||
|
<Comments>Sample SFTP site</Comments>
|
||||||
|
<LocalDir/>
|
||||||
|
<RemoteDir/>
|
||||||
|
<SyncBrowsing>0</SyncBrowsing>
|
||||||
|
<DirectoryComparison>0</DirectoryComparison>
|
||||||
|
</Server>
|
||||||
|
</Servers>
|
||||||
|
</FileZilla3>
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
288
Scripts/ConfigParsers/parser-app.config.ps1
Normal file
288
Scripts/ConfigParsers/parser-app.config.ps1
Normal file
@ -0,0 +1,288 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
# Function to parse configuration files for credentials
|
||||||
|
function Get-CredentialsFromConfigFile {
|
||||||
|
param (
|
||||||
|
[string]$configFilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Load the config file as XML
|
||||||
|
[xml]$configXml = Get-Content $configFilePath
|
||||||
|
|
||||||
|
# Initialize a DataTable to store results
|
||||||
|
$dtCredentials = New-Object System.Data.DataTable
|
||||||
|
$null = $dtCredentials.Columns.Add("Name", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Section", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("URL", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Server", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Port", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("UserName", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Password", [string])
|
||||||
|
|
||||||
|
# Helper function to add rows to DataTable
|
||||||
|
function Add-CredentialsToDataTable {
|
||||||
|
param (
|
||||||
|
[string]$name,
|
||||||
|
[string]$section,
|
||||||
|
[string]$url,
|
||||||
|
[string]$server,
|
||||||
|
[string]$port,
|
||||||
|
[string]$username,
|
||||||
|
[string]$password
|
||||||
|
)
|
||||||
|
$null = $dtCredentials.Rows.Add($name, $section, $url, $server, $port, $username, $password)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Dictionary to temporarily store related credentials
|
||||||
|
$credentialPairs = @{}
|
||||||
|
|
||||||
|
# Function to store credentials in temporary dictionary
|
||||||
|
function Add-CredentialPair {
|
||||||
|
param (
|
||||||
|
[string]$name,
|
||||||
|
[string]$section,
|
||||||
|
[string]$key,
|
||||||
|
[string]$value
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($credentialPairs[$name]) {
|
||||||
|
$credentialPairs[$name][$key] = $value
|
||||||
|
} else {
|
||||||
|
$credentialPairs[$name] = @{}
|
||||||
|
$credentialPairs[$name][$key] = $value
|
||||||
|
$credentialPairs[$name]["Section"] = $section
|
||||||
|
}
|
||||||
|
|
||||||
|
# If both username and password are available, add them to the DataTable
|
||||||
|
if ($credentialPairs[$name]["UserName"] -and $credentialPairs[$name]["Password"]) {
|
||||||
|
Add-CredentialsToDataTable -name $name -section $credentialPairs[$name]["Section"] `
|
||||||
|
-url $credentialPairs[$name]["URL"] -server $credentialPairs[$name]["Server"] `
|
||||||
|
-port $credentialPairs[$name]["Port"] -username $credentialPairs[$name]["UserName"] `
|
||||||
|
-password $credentialPairs[$name]["Password"]
|
||||||
|
|
||||||
|
# Clear the stored credential after adding it to the table
|
||||||
|
$credentialPairs.Remove($name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse all instances of appSettings for OAuth, WebClient, API, and other credentials
|
||||||
|
if ($configXml.SelectNodes('//appSettings')) {
|
||||||
|
foreach ($appSettings in $configXml.SelectNodes('//appSettings')) {
|
||||||
|
foreach ($setting in $appSettings.add) {
|
||||||
|
$key = $setting.key
|
||||||
|
$value = $setting.value
|
||||||
|
$section = "AppSettings"
|
||||||
|
|
||||||
|
# Handle specific cases for OAuth, API, and WebClient settings
|
||||||
|
switch ($key) {
|
||||||
|
"OAuthServiceUrl" { Add-CredentialPair -name "OAuth" -section $section -key "URL" -value $value }
|
||||||
|
"ClientId" { Add-CredentialPair -name "OAuth" -section $section -key "UserName" -value $value }
|
||||||
|
"ClientSecret" { Add-CredentialPair -name "OAuth" -section $section -key "Password" -value $value }
|
||||||
|
"ServiceUrl" { Add-CredentialPair -name "WebClient" -section $section -key "URL" -value $value }
|
||||||
|
"ServiceUserName" { Add-CredentialPair -name "WebClient" -section $section -key "UserName" -value $value }
|
||||||
|
"ServicePassword" { Add-CredentialPair -name "WebClient" -section $section -key "Password" -value $value }
|
||||||
|
"ApiEndpoint" { Add-CredentialPair -name "API" -section $section -key "URL" -value $value }
|
||||||
|
"ApiUserName" { Add-CredentialPair -name "API" -section $section -key "UserName" -value $value }
|
||||||
|
"ApiPassword" { Add-CredentialPair -name "API" -section $section -key "Password" -value $value }
|
||||||
|
"ApplicationUsername" { Add-CredentialPair -name "Application" -section $section -key "UserName" -value $value }
|
||||||
|
"ApplicationPassword" { Add-CredentialPair -name "Application" -section $section -key "Password" -value $value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse custom serviceCredentials section
|
||||||
|
if ($configXml.configuration.serviceCredentials) {
|
||||||
|
foreach ($setting in $configXml.configuration.serviceCredentials.add) {
|
||||||
|
$key = $setting.key
|
||||||
|
$value = $setting.value
|
||||||
|
$section = "ServiceCredentials"
|
||||||
|
|
||||||
|
# Handle specific cases for custom service credentials
|
||||||
|
switch ($key) {
|
||||||
|
"ServiceUrl" { Add-CredentialPair -name "CustomService" -section $section -key "URL" -value $value }
|
||||||
|
"UserName" { Add-CredentialPair -name "CustomService" -section $section -key "UserName" -value $value }
|
||||||
|
"Password" { Add-CredentialPair -name "CustomService" -section $section -key "Password" -value $value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse connectionStrings for server, port, username, and password
|
||||||
|
if ($configXml.configuration.connectionStrings) {
|
||||||
|
foreach ($connection in $configXml.configuration.connectionStrings.add) {
|
||||||
|
$connectionString = $connection.connectionString
|
||||||
|
$providerName = $connection.providerName
|
||||||
|
$name = $connection.name
|
||||||
|
|
||||||
|
# Initialize variables for potential data
|
||||||
|
$server = $null
|
||||||
|
$port = $null
|
||||||
|
$user = $null
|
||||||
|
$password = $null
|
||||||
|
$url = $null
|
||||||
|
|
||||||
|
# Parse connection strings
|
||||||
|
if ($connectionString -match "Host\s*=\s*([^;]+).*?Port\s*=\s*(\d+).*?Username\s*=\s*([^;]+).*?Password\s*=\s*([^;]+)") {
|
||||||
|
$server = $matches[1]
|
||||||
|
$port = $matches[2]
|
||||||
|
$user = $matches[3]
|
||||||
|
$password = $matches[4]
|
||||||
|
$url = "Host=$server;Port=$port"
|
||||||
|
} elseif ($connectionString -match "(Server|Data Source)\s*=\s*([^;,]+)(?:,(\d+))?") {
|
||||||
|
$server = $matches[2]
|
||||||
|
if ($matches[3]) { $port = $matches[3] }
|
||||||
|
$url = "Server=$server"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($connectionString -match "User\s*Id\s*=\s*([^;]+)") {
|
||||||
|
$user = $matches[1]
|
||||||
|
}
|
||||||
|
if ($connectionString -match "Password\s*=\s*([^;]+)") {
|
||||||
|
$password = $matches[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add row to the DataTable if username and password exist
|
||||||
|
if ($user -and $password) {
|
||||||
|
Add-CredentialsToDataTable -name $name -section "ConnectionStrings ($providerName)" -url $url -server $server -port $port -username $user -password $password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse system.net/mailSettings for SMTP credentials and URLs
|
||||||
|
if ($configXml.configuration.'system.net'.mailSettings) {
|
||||||
|
foreach ($smtp in $configXml.configuration.'system.net'.mailSettings.smtp) {
|
||||||
|
$smtpServer = $smtp.network.host
|
||||||
|
$smtpPort = $smtp.network.port
|
||||||
|
$smtpUser = $smtp.network.userName
|
||||||
|
$smtpPass = $smtp.network.password
|
||||||
|
$url = "smtp://${smtpServer}:${smtpPort}"
|
||||||
|
|
||||||
|
if ($smtpUser -and $smtpPass) {
|
||||||
|
Add-CredentialsToDataTable -name "SMTP Configuration" -section "SMTP" -url $url -server $smtpServer -port $smtpPort -username $smtpUser -password $smtpPass
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the parsed credentials using the DataTable
|
||||||
|
if ($dtCredentials.Rows.Count -eq 0) {
|
||||||
|
Write-Host "No credentials found." -ForegroundColor Red
|
||||||
|
} else {
|
||||||
|
$dtCredentials | select Name, Section, URL, Server, Port, UserName, Password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example of calling the function with a file path
|
||||||
|
Get-CredentialsFromConfigFile -configFilePath "c:\temp\configs\app.config"
|
||||||
|
|
||||||
|
|
||||||
|
<# app.config
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<configSections>
|
||||||
|
<!-- Section handlers for custom service credentials -->
|
||||||
|
<section name="serviceCredentials" type="System.Configuration.NameValueSectionHandler" />
|
||||||
|
<sectionGroup name="system.net">
|
||||||
|
<section name="settings" type="System.Net.Configuration.SettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
|
</sectionGroup>
|
||||||
|
</configSections>
|
||||||
|
|
||||||
|
<!-- Application-specific settings -->
|
||||||
|
<appSettings>
|
||||||
|
<add key="ApplicationUsername" value="myAppUser" />
|
||||||
|
<add key="ApplicationPassword" value="myAppPassword" />
|
||||||
|
<add key="OAuthServiceUrl" value="https://oauth.example.com/token" />
|
||||||
|
<add key="ClientId" value="myClientId" />
|
||||||
|
<add key="ClientSecret" value="myClientSecret" />
|
||||||
|
<add key="ServiceUrl" value="https://service.example.com/api" />
|
||||||
|
<add key="ServiceUserName" value="serviceUser" />
|
||||||
|
<add key="ServicePassword" value="servicePassword" />
|
||||||
|
<add key="ApiEndpoint" value="https://api.example.com/endpoint" />
|
||||||
|
<add key="ApiUserName" value="apiUser" />
|
||||||
|
<add key="ApiPassword" value="apiPassword" />
|
||||||
|
</appSettings>
|
||||||
|
|
||||||
|
<!-- Custom service credentials -->
|
||||||
|
<serviceCredentials>
|
||||||
|
<add key="ServiceUrl" value="https://customservice.example.com" />
|
||||||
|
<add key="UserName" value="customUser" />
|
||||||
|
<add key="Password" value="customPassword" />
|
||||||
|
</serviceCredentials>
|
||||||
|
|
||||||
|
<!-- Connection strings for various databases -->
|
||||||
|
<connectionStrings>
|
||||||
|
<add name="SqlServerConnection"
|
||||||
|
connectionString="Data Source=localhost;Initial Catalog=myDB;User ID=myUser;Password=myPass;"
|
||||||
|
providerName="System.Data.SqlClient" />
|
||||||
|
<add name="SqlServerIntegratedSecurity"
|
||||||
|
connectionString="Data Source=localhost;Initial Catalog=myDB;Integrated Security=True;"
|
||||||
|
providerName="System.Data.SqlClient" />
|
||||||
|
<add name="MySqlConnection"
|
||||||
|
connectionString="Server=localhost;Database=myDB;User=myUser;Password=myPass;"
|
||||||
|
providerName="MySql.Data.MySqlClient" />
|
||||||
|
<add name="PostgreSqlConnection"
|
||||||
|
connectionString="Host=localhost;Port=5432;Database=myDB;Username=myUser;Password=myPass;"
|
||||||
|
providerName="Npgsql" />
|
||||||
|
<add name="OracleConnection"
|
||||||
|
connectionString="Data Source=MyOracleDB;User Id=oracleUser;Password=oraclePass;"
|
||||||
|
providerName="Oracle.ManagedDataAccess.Client" />
|
||||||
|
</connectionStrings>
|
||||||
|
|
||||||
|
<!-- Web-specific settings -->
|
||||||
|
<system.web>
|
||||||
|
<compilation debug="true" />
|
||||||
|
<authentication mode="Forms">
|
||||||
|
<forms loginUrl="login.aspx" timeout="30">
|
||||||
|
<credentials passwordFormat="Clear">
|
||||||
|
<user name="user1" password="password1" />
|
||||||
|
<user name="user2" password="password2" />
|
||||||
|
</credentials>
|
||||||
|
</forms>
|
||||||
|
</authentication>
|
||||||
|
<customErrors mode="Off" />
|
||||||
|
</system.web>
|
||||||
|
|
||||||
|
<!-- Email (SMTP) configuration -->
|
||||||
|
<system.net>
|
||||||
|
<mailSettings>
|
||||||
|
<smtp from="you@example.com">
|
||||||
|
<network host="smtp.example.com" port="587"
|
||||||
|
userName="smtpUser"
|
||||||
|
password="smtpPassword"
|
||||||
|
defaultCredentials="false" />
|
||||||
|
</smtp>
|
||||||
|
</mailSettings>
|
||||||
|
</system.net>
|
||||||
|
|
||||||
|
<!-- WCF Service configuration -->
|
||||||
|
<system.serviceModel>
|
||||||
|
<bindings>
|
||||||
|
<basicHttpBinding>
|
||||||
|
<binding name="MyBinding">
|
||||||
|
<security mode="Transport">
|
||||||
|
<transport clientCredentialType="Basic" />
|
||||||
|
</security>
|
||||||
|
</binding>
|
||||||
|
</basicHttpBinding>
|
||||||
|
</bindings>
|
||||||
|
<client>
|
||||||
|
<endpoint address="https://example.com/service"
|
||||||
|
binding="basicHttpBinding"
|
||||||
|
bindingConfiguration="MyBinding"
|
||||||
|
contract="IMyService" />
|
||||||
|
</client>
|
||||||
|
<behaviors>
|
||||||
|
<endpointBehaviors>
|
||||||
|
<behavior>
|
||||||
|
<clientCredentials>
|
||||||
|
<userName userName="serviceUser" password="servicePassword" />
|
||||||
|
</clientCredentials>
|
||||||
|
</behavior>
|
||||||
|
</endpointBehaviors>
|
||||||
|
</behaviors>
|
||||||
|
</system.serviceModel>
|
||||||
|
|
||||||
|
</configuration>
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
79
Scripts/ConfigParsers/parser-bootstrap.ini.ps1
Normal file
79
Scripts/ConfigParsers/parser-bootstrap.ini.ps1
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-BootstrapConfig {
|
||||||
|
param (
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Read all lines from the provided file path
|
||||||
|
$iniContent = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Initialize a hash table to store key-value pairs
|
||||||
|
$fields = @{
|
||||||
|
Username = $null
|
||||||
|
Password = $null
|
||||||
|
Public = $null
|
||||||
|
Private = $null
|
||||||
|
Key = $null
|
||||||
|
Secret = $null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Loop through each line and look for the required fields
|
||||||
|
foreach ($line in $iniContent) {
|
||||||
|
if ($line -match 'username\s*=\s*(.*)') {
|
||||||
|
$fields['Username'] = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
if ($line -match 'password\s*=\s*(.*)') {
|
||||||
|
$fields['Password'] = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
if ($line -match 'public\s*=\s*(.*)') {
|
||||||
|
$fields['Public'] = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
if ($line -match 'private\s*=\s*(.*)') {
|
||||||
|
$fields['Private'] = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
if ($line -match 'key\s*=\s*(.*)') {
|
||||||
|
$fields['Key'] = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
if ($line -match 'secret\s*=\s*(.*)') {
|
||||||
|
$fields['Secret'] = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Convert the hash table into a custom PowerShell object
|
||||||
|
$configObject = [PSCustomObject]$fields
|
||||||
|
|
||||||
|
# Output the custom object
|
||||||
|
return $configObject
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example call using the example file path
|
||||||
|
$bootstrapIniPath = "c:\temp\configs\bootstrap.ini"
|
||||||
|
$config = Get-BootstrapConfig -FilePath $bootstrapIniPath
|
||||||
|
|
||||||
|
# Output the result
|
||||||
|
$config
|
||||||
|
|
||||||
|
|
||||||
|
<# bootstrap.ini
|
||||||
|
|
||||||
|
[GeneralSettings]
|
||||||
|
username=adminUser
|
||||||
|
password=P@ssw0rd123
|
||||||
|
timeout=30
|
||||||
|
loglevel=info
|
||||||
|
public=public
|
||||||
|
private=mysecret
|
||||||
|
secret=mysecret
|
||||||
|
key=mykey
|
||||||
|
|
||||||
|
[DatabaseSettings]
|
||||||
|
db_name=my_database
|
||||||
|
db_host=localhost
|
||||||
|
db_port=3306
|
||||||
|
|
||||||
|
[NetworkSettings]
|
||||||
|
protocol=http
|
||||||
|
port=8080
|
||||||
|
|
||||||
|
#>
|
60
Scripts/ConfigParsers/parser-config.xml.ps1
Normal file
60
Scripts/ConfigParsers/parser-config.xml.ps1
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-JenkinsUserCredentials {
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Ensure the file exists
|
||||||
|
if (-Not (Test-Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the XML content as plain text
|
||||||
|
$xmlText = Get-Content -Path $FilePath -Raw
|
||||||
|
|
||||||
|
# Replace XML version 1.1 with 1.0
|
||||||
|
$xmlText = $xmlText -replace "version='1.1'", "version='1.0'"
|
||||||
|
|
||||||
|
# Now parse the XML
|
||||||
|
[xml]$xmlContent = [xml]$xmlText
|
||||||
|
|
||||||
|
# Extract the full name (username)
|
||||||
|
$fullName = $xmlContent.user.fullName
|
||||||
|
|
||||||
|
# Extract the password hash
|
||||||
|
$passwordHash = $xmlContent.user.properties.'hudson.security.HudsonPrivateSecurityRealm_-Details'.passwordHash
|
||||||
|
|
||||||
|
# Create and return the result as a PowerShell object
|
||||||
|
$result = [PSCustomObject]@{
|
||||||
|
Username = $fullName
|
||||||
|
PasswordHash = $passwordHash
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$userCredentials = Get-JenkinsUserCredentials -FilePath "c:\temp\configs\config.xml"
|
||||||
|
$userCredentials
|
||||||
|
|
||||||
|
|
||||||
|
<# config.xml - jenkins - hudson.security.HudsonPrivateSecurityRealm - stored in $JENKINS_HOME/users/username/config.xml
|
||||||
|
|
||||||
|
$JENKINS_HOME/users/username/config.xml
|
||||||
|
|
||||||
|
<?xml version='1.1' encoding='UTF-8'?>
|
||||||
|
<user>
|
||||||
|
<fullName>John Doe</fullName>
|
||||||
|
<properties>
|
||||||
|
<hudson.security.HudsonPrivateSecurityRealm_-Details>
|
||||||
|
<!-- Hashed password using bcrypt -->
|
||||||
|
<passwordHash>#jbcrypt:$2a$10$D6wVozrLhk.TIq.jBBKZluIh/EqzpjCUJFT/mWUnyAO4EYmxk5.aK</passwordHash>
|
||||||
|
</hudson.security.HudsonPrivateSecurityRealm_-Details>
|
||||||
|
</properties>
|
||||||
|
</user>
|
||||||
|
|
||||||
|
#>
|
53
Scripts/ConfigParsers/parser-context.xml.ps1
Normal file
53
Scripts/ConfigParsers/parser-context.xml.ps1
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
# Function to extract credentials from a given context.xml file
|
||||||
|
function Get-CredentialsFromContextXml {
|
||||||
|
param (
|
||||||
|
[string]$contextXmlPath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path $contextXmlPath)) {
|
||||||
|
Write-Host "File not found: $contextXmlPath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load the XML file
|
||||||
|
[xml]$xml = Get-Content $contextXmlPath
|
||||||
|
|
||||||
|
# Extract username and password from the Resource element
|
||||||
|
$username = $xml.Context.Resource | Where-Object { $_.name -eq 'jdbc/MyDB' } | Select-Object -ExpandProperty username
|
||||||
|
$password = $xml.Context.Resource | Where-Object { $_.name -eq 'jdbc/MyDB' } | Select-Object -ExpandProperty password
|
||||||
|
|
||||||
|
# Create a PowerShell object to hold the extracted information
|
||||||
|
$credentials = [PSCustomObject]@{
|
||||||
|
Username = $username
|
||||||
|
Password = $password
|
||||||
|
}
|
||||||
|
|
||||||
|
# Return the credentials object
|
||||||
|
return $credentials
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage of the function
|
||||||
|
$exampleFilePath = "c:\temp\configs\context.xml"
|
||||||
|
$credentials = Get-CredentialsFromContextXml -contextXmlPath $exampleFilePath
|
||||||
|
|
||||||
|
# Display the credentials
|
||||||
|
$credentials
|
||||||
|
|
||||||
|
<# context.xml
|
||||||
|
<Context>
|
||||||
|
<Resource name="jdbc/MyDB"
|
||||||
|
auth="Container"
|
||||||
|
type="javax.sql.DataSource"
|
||||||
|
maxTotal="100"
|
||||||
|
maxIdle="30"
|
||||||
|
maxWaitMillis="10000"
|
||||||
|
username="dbuser"
|
||||||
|
password="dbpassword"
|
||||||
|
driverClassName="com.mysql.jdbc.Driver"
|
||||||
|
url="jdbc:mysql://localhost:3306/mydb"/>
|
||||||
|
</Context>
|
||||||
|
|
||||||
|
#>
|
376
Scripts/ConfigParsers/parser-db.ini.ps1
Normal file
376
Scripts/ConfigParsers/parser-db.ini.ps1
Normal file
@ -0,0 +1,376 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
# Function to extract credentials from the file
|
||||||
|
function Get-CredentialsFromConfig {
|
||||||
|
param (
|
||||||
|
[string]$filePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path $filePath)) {
|
||||||
|
Write-Host "File not found: $filePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the content of the file
|
||||||
|
$fileContent = Get-Content -Path $filePath
|
||||||
|
|
||||||
|
# Create an array to hold the results
|
||||||
|
$credentials = @()
|
||||||
|
|
||||||
|
# Initialize variables for the current section and credentials
|
||||||
|
$currentSection = ""
|
||||||
|
$currentUsername = ""
|
||||||
|
$currentPassword = ""
|
||||||
|
|
||||||
|
# Loop through each line of the file
|
||||||
|
foreach ($line in $fileContent) {
|
||||||
|
# Check if the line indicates a new section (e.g., [DB2], [MySQL])
|
||||||
|
if ($line -match '^\[.*\]$') {
|
||||||
|
# If we have collected both a username and password, store the credentials
|
||||||
|
if ($currentUsername -and $currentPassword) {
|
||||||
|
$credentials += [PSCustomObject]@{
|
||||||
|
Section = $currentSection
|
||||||
|
Username = $currentUsername
|
||||||
|
Password = $currentPassword
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Start a new section
|
||||||
|
$currentSection = $line.Trim('[]')
|
||||||
|
$currentUsername = ""
|
||||||
|
$currentPassword = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if the line contains a User_Name field
|
||||||
|
if ($line -match '^User_Name=(.*)$') {
|
||||||
|
$currentUsername = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if the line contains a Password field
|
||||||
|
if ($line -match '^Password=(.*)$') {
|
||||||
|
$currentPassword = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# If the last section contains credentials, add them to the array
|
||||||
|
if ($currentUsername -and $currentPassword) {
|
||||||
|
$credentials += [PSCustomObject]@{
|
||||||
|
Section = $currentSection
|
||||||
|
Username = $currentUsername
|
||||||
|
Password = $currentPassword
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Return the results
|
||||||
|
return $credentials
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example call to the function with a sample file path
|
||||||
|
$filePath = "c:\temp\configs\dbxdrivers.ini"
|
||||||
|
$credentials = Get-CredentialsFromConfig -filePath $filePath
|
||||||
|
|
||||||
|
# Display the results
|
||||||
|
$credentials | Format-Table -AutoSize
|
||||||
|
|
||||||
|
|
||||||
|
<# dbxdrivers.ini
|
||||||
|
|
||||||
|
[Installed Drivers]
|
||||||
|
DB2=1
|
||||||
|
Interbase=1
|
||||||
|
MySQL=1
|
||||||
|
Oracle=1
|
||||||
|
Informix=1
|
||||||
|
MSSQL=1
|
||||||
|
UIB Interbase6=1
|
||||||
|
UIB Interbase65=1
|
||||||
|
UIB Interbase7=1
|
||||||
|
UIB Interbase71=1
|
||||||
|
UIB FireBird102=1
|
||||||
|
UIB FireBird103=1
|
||||||
|
UIB FireBird15=1
|
||||||
|
UIB Yaffil=1
|
||||||
|
|
||||||
|
[DB2]
|
||||||
|
GetDriverFunc=getSQLDriverDB2
|
||||||
|
LibraryName=dbexpdb2.dll
|
||||||
|
VendorLib=db2cli.dll
|
||||||
|
Database=DBNAME
|
||||||
|
User_Name=user
|
||||||
|
Password=password
|
||||||
|
BlobSize=-1
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
DB2 TransIsolation=ReadCommited
|
||||||
|
|
||||||
|
[Interbase]
|
||||||
|
GetDriverFunc=getSQLDriverINTERBASE
|
||||||
|
LibraryName=dbexpint.dll
|
||||||
|
VendorLib=gds32.dll
|
||||||
|
Database=database.gdb
|
||||||
|
RoleName=RoleName
|
||||||
|
User_Name=sysdba
|
||||||
|
Password=masterkey
|
||||||
|
ServerCharSet=
|
||||||
|
SQLDialect=1
|
||||||
|
BlobSize=-1
|
||||||
|
CommitRetain=False
|
||||||
|
WaitOnLocks=True
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
Interbase TransIsolation=ReadCommited
|
||||||
|
Trim Char=False
|
||||||
|
|
||||||
|
[MySQL]
|
||||||
|
GetDriverFunc=getSQLDriverMYSQL
|
||||||
|
LibraryName=dbexpmysql.dll
|
||||||
|
VendorLib=libmysql.dll
|
||||||
|
HostName=localhost
|
||||||
|
Database=DBNAME
|
||||||
|
User_Name=root
|
||||||
|
Password=
|
||||||
|
BlobSize=-1
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
|
||||||
|
[Oracle]
|
||||||
|
GetDriverFunc=getSQLDriverORACLE
|
||||||
|
LibraryName=dbexpora.dll
|
||||||
|
VendorLib=oci.dll
|
||||||
|
DataBase=Database Name
|
||||||
|
User_Name=user
|
||||||
|
Password=password
|
||||||
|
BlobSize=-1
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
Oracle TransIsolation=ReadCommited
|
||||||
|
RowsetSize=20
|
||||||
|
OS Authentication=False
|
||||||
|
Multiple Transaction=False
|
||||||
|
Trim Char=False
|
||||||
|
|
||||||
|
[Informix]
|
||||||
|
GetDriverFunc=getSQLDriverINFORMIX
|
||||||
|
LibraryName=dbexpinf.dll
|
||||||
|
VendorLib=isqlb09a.dll
|
||||||
|
HostName=ServerName
|
||||||
|
DataBase=Database Name
|
||||||
|
User_Name=user
|
||||||
|
Password=password
|
||||||
|
BlobSize=-1
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
Informix TransIsolation=ReadCommited
|
||||||
|
Trim Char=False
|
||||||
|
|
||||||
|
[MSSQL]
|
||||||
|
GetDriverFunc=getSQLDriverMSSQL
|
||||||
|
LibraryName=dbexpmss.dll
|
||||||
|
VendorLib=oledb
|
||||||
|
HostName=ServerName
|
||||||
|
DataBase=Database Name
|
||||||
|
User_Name=user
|
||||||
|
Password=password
|
||||||
|
BlobSize=-1
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
MSSQL TransIsolation=ReadCommited
|
||||||
|
OS Authentication=False
|
||||||
|
|
||||||
|
|
||||||
|
[AutoCommit]
|
||||||
|
False=0
|
||||||
|
True=1
|
||||||
|
|
||||||
|
[BlockingMode]
|
||||||
|
False=0
|
||||||
|
True=1
|
||||||
|
|
||||||
|
[WaitOnLocks]
|
||||||
|
False=1
|
||||||
|
True=0
|
||||||
|
|
||||||
|
[CommitRetain]
|
||||||
|
False=0
|
||||||
|
True=1
|
||||||
|
|
||||||
|
[OS Authentication]
|
||||||
|
False=0
|
||||||
|
True=1
|
||||||
|
|
||||||
|
[Multiple Transaction]
|
||||||
|
False=0
|
||||||
|
True=1
|
||||||
|
|
||||||
|
[Trim Char]
|
||||||
|
False=0
|
||||||
|
True=1
|
||||||
|
|
||||||
|
[DB2 TransIsolation]
|
||||||
|
DirtyRead=0
|
||||||
|
ReadCommited=1
|
||||||
|
RepeatableRead=2
|
||||||
|
|
||||||
|
[Interbase TransIsolation]
|
||||||
|
ReadCommited=1
|
||||||
|
RepeatableRead=2
|
||||||
|
|
||||||
|
[Oracle TransIsolation]
|
||||||
|
DirtyRead=0
|
||||||
|
ReadCommited=1
|
||||||
|
RepeatableRead=2
|
||||||
|
|
||||||
|
[Informix TransIsolation]
|
||||||
|
DirtyRead=0
|
||||||
|
ReadCommited=1
|
||||||
|
RepeatableRead=2
|
||||||
|
|
||||||
|
[MSSQL TransIsolation]
|
||||||
|
DirtyRead=0
|
||||||
|
ReadCommited=1
|
||||||
|
RepeatableRead=2
|
||||||
|
|
||||||
|
[SQLDialect]
|
||||||
|
1=0
|
||||||
|
2=1
|
||||||
|
3=2
|
||||||
|
|
||||||
|
[UIB Interbase6]
|
||||||
|
GetDriverFunc=getSQLDriverINTERBASE
|
||||||
|
LibraryName=dbexpUIBint6.dll
|
||||||
|
VendorLib=GDS32.DLL
|
||||||
|
BlobSize=-1
|
||||||
|
CommitRetain=False
|
||||||
|
Database=database.ib
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
Password=masterkey
|
||||||
|
RoleName=RoleName
|
||||||
|
ServerCharSet=
|
||||||
|
SQLDialect=3
|
||||||
|
Interbase TransIsolation=ReadCommited
|
||||||
|
User_Name=SYSDBA
|
||||||
|
WaitOnLocks=True
|
||||||
|
|
||||||
|
[UIB Interbase65]
|
||||||
|
GetDriverFunc=getSQLDriverINTERBASE
|
||||||
|
LibraryName=dbexpUIBint65.dll
|
||||||
|
VendorLib=GDS32.DLL
|
||||||
|
BlobSize=-1
|
||||||
|
CommitRetain=False
|
||||||
|
Database=database.ib
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
Password=masterkey
|
||||||
|
RoleName=RoleName
|
||||||
|
ServerCharSet=
|
||||||
|
SQLDialect=3
|
||||||
|
Interbase TransIsolation=ReadCommited
|
||||||
|
User_Name=SYSDBA
|
||||||
|
WaitOnLocks=True
|
||||||
|
|
||||||
|
[UIB Interbase7]
|
||||||
|
GetDriverFunc=getSQLDriverINTERBASE
|
||||||
|
LibraryName=dbexpUIBint7.dll
|
||||||
|
VendorLib=GDS32.DLL
|
||||||
|
BlobSize=-1
|
||||||
|
CommitRetain=False
|
||||||
|
Database=database.ib
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
Password=masterkey
|
||||||
|
RoleName=RoleName
|
||||||
|
ServerCharSet=
|
||||||
|
SQLDialect=3
|
||||||
|
Interbase TransIsolation=ReadCommited
|
||||||
|
User_Name=SYSDBA
|
||||||
|
WaitOnLocks=True
|
||||||
|
|
||||||
|
[UIB Interbase71]
|
||||||
|
GetDriverFunc=getSQLDriverINTERBASE
|
||||||
|
LibraryName=dbexpUIBint71.dll
|
||||||
|
VendorLib=GDS32.DLL
|
||||||
|
BlobSize=-1
|
||||||
|
CommitRetain=False
|
||||||
|
Database=database.ib
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
Password=masterkey
|
||||||
|
RoleName=RoleName
|
||||||
|
ServerCharSet=
|
||||||
|
SQLDialect=3
|
||||||
|
Interbase TransIsolation=ReadCommited
|
||||||
|
User_Name=SYSDBA
|
||||||
|
WaitOnLocks=True
|
||||||
|
|
||||||
|
[UIB FireBird102]
|
||||||
|
GetDriverFunc=getSQLDriverINTERBASE
|
||||||
|
LibraryName=dbexpUIBfire102.dll
|
||||||
|
VendorLib=GDS32.DLL
|
||||||
|
BlobSize=-1
|
||||||
|
CommitRetain=False
|
||||||
|
Database=database.fb
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
Password=masterkey
|
||||||
|
RoleName=RoleName
|
||||||
|
ServerCharSet=
|
||||||
|
SQLDialect=3
|
||||||
|
Interbase TransIsolation=ReadCommited
|
||||||
|
User_Name=SYSDBA
|
||||||
|
WaitOnLocks=True
|
||||||
|
|
||||||
|
[UIB FireBird103]
|
||||||
|
GetDriverFunc=getSQLDriverINTERBASE
|
||||||
|
LibraryName=dbexpUIBfire103.dll
|
||||||
|
VendorLib=GDS32.DLL
|
||||||
|
BlobSize=-1
|
||||||
|
CommitRetain=False
|
||||||
|
Database=database.fb
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
Password=masterkey
|
||||||
|
RoleName=RoleName
|
||||||
|
ServerCharSet=
|
||||||
|
SQLDialect=3
|
||||||
|
Interbase TransIsolation=ReadCommited
|
||||||
|
User_Name=SYSDBA
|
||||||
|
WaitOnLocks=True
|
||||||
|
|
||||||
|
[UIB FireBird15]
|
||||||
|
GetDriverFunc=getSQLDriverINTERBASE
|
||||||
|
LibraryName=dbexpUIBfire15.dll
|
||||||
|
VendorLib=fbclient.dll
|
||||||
|
BlobSize=-1
|
||||||
|
CommitRetain=False
|
||||||
|
Database=database.fb
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
Password=masterkey
|
||||||
|
RoleName=RoleName
|
||||||
|
ServerCharSet=
|
||||||
|
SQLDialect=3
|
||||||
|
Interbase TransIsolation=ReadCommited
|
||||||
|
User_Name=SYSDBA
|
||||||
|
WaitOnLocks=True
|
||||||
|
|
||||||
|
[UIB Yaffil]
|
||||||
|
GetDriverFunc=getSQLDriverINTERBASE
|
||||||
|
LibraryName=dbexpUIByaffil.dll
|
||||||
|
VendorLib=GDS32.DLL
|
||||||
|
BlobSize=-1
|
||||||
|
CommitRetain=False
|
||||||
|
Database=database.gdb
|
||||||
|
ErrorResourceFile=
|
||||||
|
LocaleCode=0000
|
||||||
|
Password=masterkey
|
||||||
|
RoleName=RoleName
|
||||||
|
ServerCharSet=
|
||||||
|
SQLDialect=3
|
||||||
|
Interbase TransIsolation=ReadCommited
|
||||||
|
User_Name=SYSDBA
|
||||||
|
WaitOnLocks=True
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
78
Scripts/ConfigParsers/parser-example.rdp.ps1
Normal file
78
Scripts/ConfigParsers/parser-example.rdp.ps1
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-RdpCredentials {
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-not (Test-Path -Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the RDP file contents
|
||||||
|
$rdpContent = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Initialize variables to store username and password
|
||||||
|
$username = ""
|
||||||
|
$encryptedPassword = ""
|
||||||
|
$decryptedPassword = ""
|
||||||
|
|
||||||
|
# Parse the RDP file for username and encrypted password fields
|
||||||
|
foreach ($line in $rdpContent) {
|
||||||
|
if ($line -match "^username:s:(.+)$") {
|
||||||
|
$username = $matches[1]
|
||||||
|
}
|
||||||
|
if ($line -match "^password 51:b:(.+)$") {
|
||||||
|
$encryptedPassword = $matches[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Attempt to decrypt the password if it exists
|
||||||
|
if ($encryptedPassword) {
|
||||||
|
try {
|
||||||
|
# Convert the encrypted password from Base64 to byte array
|
||||||
|
$passwordBytes = [Convert]::FromBase64String($encryptedPassword)
|
||||||
|
|
||||||
|
# Use DPAPI to decrypt the password
|
||||||
|
$decryptedPassword = [System.Text.Encoding]::Unicode.GetString([System.Security.Cryptography.ProtectedData]::Unprotect($passwordBytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser))
|
||||||
|
} catch {
|
||||||
|
Write-Warning "Unable to decrypt password: $_"
|
||||||
|
$decryptedPassword = "Unable to decrypt"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$encryptedPassword = "No password found"
|
||||||
|
$decryptedPassword = "No password found"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a PowerShell object to return the results
|
||||||
|
$result = [PSCustomObject]@{
|
||||||
|
Username = $username
|
||||||
|
EncryptedPassword = $encryptedPassword
|
||||||
|
DecryptedPassword = $decryptedPassword
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$credentials = Get-RdpCredentials -FilePath "c:\temp\configs\example.rdp"
|
||||||
|
$credentials
|
||||||
|
|
||||||
|
|
||||||
|
<# example.rdp - decryption needs to be done on the target system using dpapi
|
||||||
|
|
||||||
|
screen mode id:i:2
|
||||||
|
desktopwidth:i:1920
|
||||||
|
desktopheight:i:1080
|
||||||
|
session bpp:i:32
|
||||||
|
winposstr:s:0,3,0,0,800,600
|
||||||
|
full address:s:yourserver.com
|
||||||
|
username:s:YourUsername
|
||||||
|
password 51:b:encrypted_password_value
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
50
Scripts/ConfigParsers/parser-htpasswd.ps1
Normal file
50
Scripts/ConfigParsers/parser-htpasswd.ps1
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-HtpasswdContent {
|
||||||
|
param (
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path $FilePath)) {
|
||||||
|
Write-Error "File not found at path: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the file contents
|
||||||
|
$lines = Get-Content $FilePath
|
||||||
|
|
||||||
|
# Initialize an array to store user objects
|
||||||
|
$users = @()
|
||||||
|
|
||||||
|
# Process each line
|
||||||
|
foreach ($line in $lines) {
|
||||||
|
# Split each line into username and hashed password
|
||||||
|
$parts = $line -split ':', 2
|
||||||
|
if ($parts.Length -eq 2) {
|
||||||
|
# Create a custom object for each user
|
||||||
|
$userObj = [pscustomobject]@{
|
||||||
|
Username = $parts[0]
|
||||||
|
PasswordHash = $parts[1]
|
||||||
|
}
|
||||||
|
# Add the user object to the array
|
||||||
|
$users += $userObj
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the results
|
||||||
|
return $users
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage
|
||||||
|
$result = Get-HtpasswdContent -FilePath "c:\temp\configs\.htpasswd"
|
||||||
|
$result
|
||||||
|
|
||||||
|
<# .htpasswd
|
||||||
|
|
||||||
|
user1:$apr1$5lRQ1y3v$pmOQf9/fNVE5dTtQDBl9D1
|
||||||
|
user2:$apr1$Jd9UE91p$J/H8G9HSvj5l8LKQ2qfd3.
|
||||||
|
admin:$apr1$GZJoqjNF$wl8IjDhZC84z5Bb4wHOv50
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
73
Scripts/ConfigParsers/parser-jboss-cli.xml.ps1
Normal file
73
Scripts/ConfigParsers/parser-jboss-cli.xml.ps1
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
# Define the function to extract username and password from a jboss-cli.xml file and return an object
|
||||||
|
function Get-JbossCredentials {
|
||||||
|
param (
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-not (Test-Path -Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return $null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load the XML file
|
||||||
|
[xml]$jbossCliXml = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Extract the username and password
|
||||||
|
$username = $jbossCliXml."jboss-cli".authentication.username
|
||||||
|
$password = $jbossCliXml."jboss-cli".authentication.password
|
||||||
|
|
||||||
|
# Return a PowerShell object with the username and password
|
||||||
|
return [pscustomobject]@{
|
||||||
|
Username = $username
|
||||||
|
Password = $password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage
|
||||||
|
$xmlFilePath = "c:\temp\configs\jboss-cli.xml"
|
||||||
|
$credentials = Get-JbossCredentials -FilePath $xmlFilePath
|
||||||
|
|
||||||
|
# Output the returned object (optional for testing)
|
||||||
|
$credentials
|
||||||
|
|
||||||
|
<# jboss-cli.xml
|
||||||
|
|
||||||
|
<jboss-cli xmlns="urn:jboss:cli:1.2">
|
||||||
|
<!-- The default controller host and port -->
|
||||||
|
<controller>
|
||||||
|
<host>127.0.0.1</host> <!-- Specify the host, e.g., localhost or a remote address -->
|
||||||
|
<port>9990</port> <!-- The management port of JBoss/WildFly, default is 9990 -->
|
||||||
|
</controller>
|
||||||
|
|
||||||
|
<!-- The authentication details for the controller -->
|
||||||
|
<authentication>
|
||||||
|
<username>admin</username> <!-- Your management user -->
|
||||||
|
<password>password</password> <!-- Your management user's password -->
|
||||||
|
</authentication>
|
||||||
|
|
||||||
|
<!-- Optionally enable secure connections using SSL -->
|
||||||
|
<ssl>
|
||||||
|
<enabled>false</enabled> <!-- Set to true if using SSL/TLS for the connection -->
|
||||||
|
<keystore-path></keystore-path>
|
||||||
|
<keystore-password></keystore-password>
|
||||||
|
<truststore-path></truststore-path>
|
||||||
|
<truststore-password></truststore-password>
|
||||||
|
</ssl>
|
||||||
|
|
||||||
|
<!-- Custom properties for the CLI session -->
|
||||||
|
<properties>
|
||||||
|
<!-- For example, to disable coloring in the CLI output -->
|
||||||
|
<property name="jboss.cli.color" value="false"/>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<!-- Configuration of command history behavior -->
|
||||||
|
<history>
|
||||||
|
<enabled>true</enabled> <!-- Whether to enable CLI command history -->
|
||||||
|
<max-size>500</max-size> <!-- The maximum number of commands to store in history -->
|
||||||
|
</history>
|
||||||
|
</jboss-cli>
|
||||||
|
|
||||||
|
#>
|
115
Scripts/ConfigParsers/parser-krb5.conf.ps1
Normal file
115
Scripts/ConfigParsers/parser-krb5.conf.ps1
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-ConfigCredentials {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Initialize a hashtable to store extracted values
|
||||||
|
$configData = @{
|
||||||
|
Domain = $null
|
||||||
|
Server = $null
|
||||||
|
Username = $null
|
||||||
|
Password = $null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path -Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the configuration file
|
||||||
|
$configFile = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Parse the configuration file line by line
|
||||||
|
foreach ($line in $configFile) {
|
||||||
|
# Ignore comment lines and empty lines
|
||||||
|
if ($line -match '^\s*#' -or $line -match '^\s*$') {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the domain (e.g., default_realm or ad_domain or similar)
|
||||||
|
if ($line -match 'default_realm\s*=\s*(.+)') {
|
||||||
|
$configData.Domain = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the server (e.g., kdc or krb5_server or similar)
|
||||||
|
if ($line -match 'kdc\s*=\s*(.+)') {
|
||||||
|
$configData.Server = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the username (e.g., principal or ldap_default_bind_dn or similar)
|
||||||
|
if ($line -match 'principal\s*=\s*(.+)') {
|
||||||
|
$configData.Username = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
elseif ($line -match 'ldap_default_bind_dn\s*=\s*(.+)') {
|
||||||
|
$configData.Username = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the password (e.g., password or ldap_default_authtok or similar)
|
||||||
|
if ($line -match 'password\s*=\s*(.+)') {
|
||||||
|
$configData.Password = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
elseif ($line -match 'ldap_default_authtok\s*=\s*(.+)') {
|
||||||
|
$configData.Password = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the extracted configuration as a PowerShell object
|
||||||
|
[PSCustomObject]@{
|
||||||
|
Domain = $configData.Domain
|
||||||
|
Server = $configData.Server
|
||||||
|
Username = $configData.Username
|
||||||
|
Password = $configData.Password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$config = Get-ConfigCredentials -FilePath "c:\temp\configs\krb5.conf"
|
||||||
|
$config | Format-List
|
||||||
|
|
||||||
|
|
||||||
|
<# krb5.conf - use for kerberos authention on linux systems
|
||||||
|
|
||||||
|
[libdefaults]
|
||||||
|
default_realm = EXAMPLE.COM
|
||||||
|
dns_lookup_realm = false
|
||||||
|
dns_lookup_kdc = true
|
||||||
|
rdns = false
|
||||||
|
ticket_lifetime = 24h
|
||||||
|
forwardable = yes
|
||||||
|
|
||||||
|
[realms]
|
||||||
|
EXAMPLE.COM = {
|
||||||
|
kdc = ad.example.com
|
||||||
|
admin_server = ad.example.com
|
||||||
|
default_domain = example.com
|
||||||
|
}
|
||||||
|
|
||||||
|
[domain_realm]
|
||||||
|
.example.com = EXAMPLE.COM
|
||||||
|
example.com = EXAMPLE.COM
|
||||||
|
|
||||||
|
# Insecure: Exposing credentials in krb5.conf for automated ticket retrieval (NOT recommended)
|
||||||
|
[login]
|
||||||
|
krb5_get_init_creds_keytab = false
|
||||||
|
|
||||||
|
# Insecure: Plaintext credentials for AD principal
|
||||||
|
[appdefaults]
|
||||||
|
kinit = {
|
||||||
|
principal = admin@EXAMPLE.COM
|
||||||
|
password = P@ssw0rd123
|
||||||
|
}
|
||||||
|
|
||||||
|
pam = {
|
||||||
|
debug = false
|
||||||
|
ticket_lifetime = 36000
|
||||||
|
renew_lifetime = 36000
|
||||||
|
forwardable = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
374
Scripts/ConfigParsers/parser-machine.config.ps1
Normal file
374
Scripts/ConfigParsers/parser-machine.config.ps1
Normal file
@ -0,0 +1,374 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
# Function to parse configuration files for credentials
|
||||||
|
function Get-CredentialsFromConfigFile {
|
||||||
|
param (
|
||||||
|
[string]$configFilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Load the config file as XML
|
||||||
|
[xml]$configXml = Get-Content $configFilePath
|
||||||
|
|
||||||
|
# Initialize a DataTable to store results
|
||||||
|
$dtCredentials = New-Object System.Data.DataTable
|
||||||
|
$null = $dtCredentials.Columns.Add("Name", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Section", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("URL", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Server", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Port", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("UserName", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Password", [string])
|
||||||
|
|
||||||
|
# Helper function to add rows to DataTable
|
||||||
|
function Add-CredentialsToDataTable {
|
||||||
|
param (
|
||||||
|
[string]$name,
|
||||||
|
[string]$section,
|
||||||
|
[string]$url,
|
||||||
|
[string]$server,
|
||||||
|
[string]$port,
|
||||||
|
[string]$username,
|
||||||
|
[string]$password
|
||||||
|
)
|
||||||
|
$null = $dtCredentials.Rows.Add($name, $section, $url, $server, $port, $username, $password)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Dictionary to temporarily store related credentials
|
||||||
|
$credentialPairs = @{}
|
||||||
|
|
||||||
|
# Function to store credentials in temporary dictionary
|
||||||
|
function Add-CredentialPair {
|
||||||
|
param (
|
||||||
|
[string]$name,
|
||||||
|
[string]$section,
|
||||||
|
[string]$key,
|
||||||
|
[string]$value
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($credentialPairs[$name]) {
|
||||||
|
$credentialPairs[$name][$key] = $value
|
||||||
|
} else {
|
||||||
|
$credentialPairs[$name] = @{}
|
||||||
|
$credentialPairs[$name][$key] = $value
|
||||||
|
$credentialPairs[$name]["Section"] = $section
|
||||||
|
}
|
||||||
|
|
||||||
|
# If both username and password are available, add them to the DataTable
|
||||||
|
if ($credentialPairs[$name]["UserName"] -and $credentialPairs[$name]["Password"]) {
|
||||||
|
Add-CredentialsToDataTable -name $name -section $credentialPairs[$name]["Section"] `
|
||||||
|
-url $credentialPairs[$name]["URL"] -server $credentialPairs[$name]["Server"] `
|
||||||
|
-port $credentialPairs[$name]["Port"] -username $credentialPairs[$name]["UserName"] `
|
||||||
|
-password $credentialPairs[$name]["Password"]
|
||||||
|
|
||||||
|
# Clear the stored credential after adding it to the table
|
||||||
|
$credentialPairs.Remove($name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse all instances of appSettings for OAuth, WebClient, API, and other credentials
|
||||||
|
if ($configXml.SelectNodes('//appSettings')) {
|
||||||
|
foreach ($appSettings in $configXml.SelectNodes('//appSettings')) {
|
||||||
|
foreach ($setting in $appSettings.add) {
|
||||||
|
$key = $setting.key
|
||||||
|
$value = $setting.value
|
||||||
|
$section = "AppSettings"
|
||||||
|
|
||||||
|
# Handle specific cases for OAuth, API, and WebClient settings
|
||||||
|
switch ($key) {
|
||||||
|
"OAuthServiceUrl" { Add-CredentialPair -name "OAuth" -section $section -key "URL" -value $value }
|
||||||
|
"ClientId" { Add-CredentialPair -name "OAuth" -section $section -key "UserName" -value $value }
|
||||||
|
"ClientSecret" { Add-CredentialPair -name "OAuth" -section $section -key "Password" -value $value }
|
||||||
|
"ServiceUrl" { Add-CredentialPair -name "WebClient" -section $section -key "URL" -value $value }
|
||||||
|
"ServiceUserName" { Add-CredentialPair -name "WebClient" -section $section -key "UserName" -value $value }
|
||||||
|
"ServicePassword" { Add-CredentialPair -name "WebClient" -section $section -key "Password" -value $value }
|
||||||
|
"ApiEndpoint" { Add-CredentialPair -name "API" -section $section -key "URL" -value $value }
|
||||||
|
"ApiUserName" { Add-CredentialPair -name "API" -section $section -key "UserName" -value $value }
|
||||||
|
"ApiPassword" { Add-CredentialPair -name "API" -section $section -key "Password" -value $value }
|
||||||
|
"ApplicationUsername" { Add-CredentialPair -name "Application" -section $section -key "UserName" -value $value }
|
||||||
|
"ApplicationPassword" { Add-CredentialPair -name "Application" -section $section -key "Password" -value $value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse custom serviceCredentials section
|
||||||
|
if ($configXml.configuration.serviceCredentials) {
|
||||||
|
foreach ($setting in $configXml.configuration.serviceCredentials.add) {
|
||||||
|
$key = $setting.key
|
||||||
|
$value = $setting.value
|
||||||
|
$section = "ServiceCredentials"
|
||||||
|
|
||||||
|
# Handle specific cases for custom service credentials
|
||||||
|
switch ($key) {
|
||||||
|
"ServiceUrl" { Add-CredentialPair -name "CustomService" -section $section -key "URL" -value $value }
|
||||||
|
"UserName" { Add-CredentialPair -name "CustomService" -section $section -key "UserName" -value $value }
|
||||||
|
"Password" { Add-CredentialPair -name "CustomService" -section $section -key "Password" -value $value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse connectionStrings for server, port, username, and password
|
||||||
|
if ($configXml.configuration.connectionStrings) {
|
||||||
|
foreach ($connection in $configXml.configuration.connectionStrings.add) {
|
||||||
|
$connectionString = $connection.connectionString
|
||||||
|
$providerName = $connection.providerName
|
||||||
|
$name = $connection.name
|
||||||
|
|
||||||
|
# Initialize variables for potential data
|
||||||
|
$server = $null
|
||||||
|
$port = $null
|
||||||
|
$user = $null
|
||||||
|
$password = $null
|
||||||
|
$url = $null
|
||||||
|
|
||||||
|
# Parse connection strings
|
||||||
|
if ($connectionString -match "Host\s*=\s*([^;]+).*?Port\s*=\s*(\d+).*?Username\s*=\s*([^;]+).*?Password\s*=\s*([^;]+)") {
|
||||||
|
$server = $matches[1]
|
||||||
|
$port = $matches[2]
|
||||||
|
$user = $matches[3]
|
||||||
|
$password = $matches[4]
|
||||||
|
$url = "Host=$server;Port=$port"
|
||||||
|
} elseif ($connectionString -match "(Server|Data Source)\s*=\s*([^;,]+)(?:,(\d+))?") {
|
||||||
|
$server = $matches[2]
|
||||||
|
if ($matches[3]) { $port = $matches[3] }
|
||||||
|
$url = "Server=$server"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($connectionString -match "User\s*Id\s*=\s*([^;]+)") {
|
||||||
|
$user = $matches[1]
|
||||||
|
}
|
||||||
|
if ($connectionString -match "Password\s*=\s*([^;]+)") {
|
||||||
|
$password = $matches[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add row to the DataTable if username and password exist
|
||||||
|
if ($user -and $password) {
|
||||||
|
Add-CredentialsToDataTable -name $name -section "ConnectionStrings ($providerName)" -url $url -server $server -port $port -username $user -password $password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse system.net/mailSettings for SMTP credentials and URLs
|
||||||
|
if ($configXml.configuration.'system.net'.mailSettings) {
|
||||||
|
foreach ($smtp in $configXml.configuration.'system.net'.mailSettings.smtp) {
|
||||||
|
$smtpServer = $smtp.network.host
|
||||||
|
$smtpPort = $smtp.network.port
|
||||||
|
$smtpUser = $smtp.network.userName
|
||||||
|
$smtpPass = $smtp.network.password
|
||||||
|
$url = "smtp://${smtpServer}:${smtpPort}"
|
||||||
|
|
||||||
|
if ($smtpUser -and $smtpPass) {
|
||||||
|
Add-CredentialsToDataTable -name "SMTP Configuration" -section "SMTP" -url $url -server $smtpServer -port $smtpPort -username $smtpUser -password $smtpPass
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the parsed credentials using the DataTable
|
||||||
|
if ($dtCredentials.Rows.Count -eq 0) {
|
||||||
|
Write-Host "No credentials found." -ForegroundColor Red
|
||||||
|
} else {
|
||||||
|
$dtCredentials | select Name, Section, URL, Server, Port, UserName, Password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example of calling the function with a file path
|
||||||
|
Get-CredentialsFromConfigFile -configFilePath "c:\temp\configs\machine.config"
|
||||||
|
|
||||||
|
|
||||||
|
<# machine.config
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<configSections>
|
||||||
|
<!-- Section handlers for configuration settings -->
|
||||||
|
<sectionGroup name="system.net">
|
||||||
|
<section name="settings" type="System.Net.Configuration.SettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
|
</sectionGroup>
|
||||||
|
</configSections>
|
||||||
|
|
||||||
|
<!-- App settings for all .NET applications -->
|
||||||
|
<appSettings>
|
||||||
|
<!-- Example of username and password in appSettings -->
|
||||||
|
<add key="ApplicationUsername" value="myAppUser" />
|
||||||
|
<add key="ApplicationPassword" value="myAppPassword" />
|
||||||
|
</appSettings>
|
||||||
|
|
||||||
|
<!-- OAuth/Token-Based Service Endpoints -->
|
||||||
|
<appSettings>
|
||||||
|
<add key="OAuthServiceUrl" value="https://oauth.example.com/token" />
|
||||||
|
<add key="ClientId" value="myClientId" />
|
||||||
|
<add key="ClientSecret" value="myClientSecret" />
|
||||||
|
</appSettings>
|
||||||
|
|
||||||
|
<!-- WebClient or HttpClient Credentials -->
|
||||||
|
<appSettings>
|
||||||
|
<add key="ServiceUrl" value="https://service.example.com/api" />
|
||||||
|
<add key="ServiceUserName" value="serviceUser" />
|
||||||
|
<add key="ServicePassword" value="servicePassword" />
|
||||||
|
</appSettings>
|
||||||
|
|
||||||
|
<!-- AppSettings Section -->
|
||||||
|
<appSettings>
|
||||||
|
<add key="ApiEndpoint" value="https://api.example.com/endpoint" />
|
||||||
|
<add key="ApiUserName" value="apiUser" />
|
||||||
|
<add key="ApiPassword" value="apiPassword" />
|
||||||
|
</appSettings>
|
||||||
|
|
||||||
|
<!-- Custom Sections for Service Credentials -->
|
||||||
|
<configSections>
|
||||||
|
<section name="serviceCredentials" type="System.Configuration.NameValueSectionHandler" />
|
||||||
|
</configSections>
|
||||||
|
|
||||||
|
<serviceCredentials>
|
||||||
|
<add key="ServiceUrl" value="https://customservice.example.com" />
|
||||||
|
<add key="UserName" value="customUser" />
|
||||||
|
<add key="Password" value="customPassword" />
|
||||||
|
</serviceCredentials>
|
||||||
|
|
||||||
|
<!-- Connection string settings -->
|
||||||
|
<connectionStrings>
|
||||||
|
<!-- SQL Server (Standard Authentication) -->
|
||||||
|
<add name="SqlServerConnection"
|
||||||
|
connectionString="Data Source=localhost;Initial Catalog=myDB;User ID=myUser;Password=myPass;"
|
||||||
|
providerName="System.Data.SqlClient" />
|
||||||
|
|
||||||
|
<!-- SQL Server (Windows Authentication) -->
|
||||||
|
<add name="SqlServerIntegratedSecurity"
|
||||||
|
connectionString="Data Source=localhost;Initial Catalog=myDB;Integrated Security=True;"
|
||||||
|
providerName="System.Data.SqlClient" />
|
||||||
|
|
||||||
|
<!-- SQL Server (Encrypted Connection) -->
|
||||||
|
<add name="SqlServerEncryptedConnection"
|
||||||
|
connectionString="Data Source=localhost;Initial Catalog=myDB;User ID=myUser;Password=myPass;Encrypt=True;TrustServerCertificate=False;"
|
||||||
|
providerName="System.Data.SqlClient" />
|
||||||
|
|
||||||
|
<!-- MySQL (Standard Connection) -->
|
||||||
|
<add name="MySqlConnection"
|
||||||
|
connectionString="Server=localhost;Database=myDB;User=myUser;Password=myPass;"
|
||||||
|
providerName="MySql.Data.MySqlClient" />
|
||||||
|
|
||||||
|
<!-- MySQL (SSL/Encrypted Connection) -->
|
||||||
|
<add name="MySqlConnectionWithSSL"
|
||||||
|
connectionString="Server=localhost;Database=myDB;User=myUser;Password=myPass;SslMode=Required;"
|
||||||
|
providerName="MySql.Data.MySqlClient" />
|
||||||
|
|
||||||
|
<!-- PostgreSQL (Standard Connection) -->
|
||||||
|
<add name="PostgreSqlConnection"
|
||||||
|
connectionString="Host=localhost;Port=5432;Database=myDB;Username=myUser;Password=myPass;"
|
||||||
|
providerName="Npgsql" />
|
||||||
|
|
||||||
|
<!-- Oracle (Standard Connection) -->
|
||||||
|
<add name="OracleConnection"
|
||||||
|
connectionString="Data Source=MyOracleDB;User Id=oracleUser;Password=oraclePass;"
|
||||||
|
providerName="System.Data.OracleClient" />
|
||||||
|
|
||||||
|
<!-- Oracle (TNS Connection) -->
|
||||||
|
<add name="OracleTNSConnection"
|
||||||
|
connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=myHost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=myService)));User Id=oracleUser;Password=oraclePass;"
|
||||||
|
providerName="Oracle.ManagedDataAccess.Client" />
|
||||||
|
|
||||||
|
<!-- SQLite (No Authentication Required) -->
|
||||||
|
<add name="SQLiteConnection"
|
||||||
|
connectionString="Data Source=myDatabase.db;"
|
||||||
|
providerName="System.Data.SQLite" />
|
||||||
|
|
||||||
|
<!-- Microsoft Access (OLEDB with username and password) -->
|
||||||
|
<add name="AccessConnection"
|
||||||
|
connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myAccessFile.accdb;User Id=admin;Password=myPass;"
|
||||||
|
providerName="System.Data.OleDb" />
|
||||||
|
|
||||||
|
<!-- Azure SQL (Standard SQL Authentication) -->
|
||||||
|
<add name="AzureSqlConnection"
|
||||||
|
connectionString="Server=tcp:myserver.database.windows.net,1433;Initial Catalog=myDB;Persist Security Info=False;User ID=myUser;Password=myPass;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
|
||||||
|
providerName="System.Data.SqlClient" />
|
||||||
|
</connectionStrings>
|
||||||
|
|
||||||
|
<!-- Compilation settings for applications -->
|
||||||
|
<system.web>
|
||||||
|
<compilation debug="false" />
|
||||||
|
<authentication mode="Forms">
|
||||||
|
<!-- Forms authentication with username and password -->
|
||||||
|
<forms loginUrl="login.aspx" timeout="30">
|
||||||
|
<credentials passwordFormat="Clear">
|
||||||
|
<user name="user1" password="password1" />
|
||||||
|
<user name="user2" password="password2" />
|
||||||
|
</credentials>
|
||||||
|
</forms>
|
||||||
|
</authentication>
|
||||||
|
<customErrors mode="Off" />
|
||||||
|
</system.web>
|
||||||
|
|
||||||
|
<!-- Machine-wide database settings -->
|
||||||
|
<system.data>
|
||||||
|
<DbProviderFactories>
|
||||||
|
<add name="Microsoft SQL Server Compact Data Provider"
|
||||||
|
invariant="System.Data.SqlServerCe.4.0"
|
||||||
|
description=".NET Framework Data Provider for Microsoft SQL Server Compact"
|
||||||
|
type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
|
||||||
|
</DbProviderFactories>
|
||||||
|
</system.data>
|
||||||
|
|
||||||
|
<!-- Credentials for SMTP (system.net) -->
|
||||||
|
<system.net>
|
||||||
|
<mailSettings>
|
||||||
|
<smtp from="you@example.com">
|
||||||
|
<network host="smtp.example.com" port="587"
|
||||||
|
userName="smtpUser"
|
||||||
|
password="smtpPassword"
|
||||||
|
defaultCredentials="false" />
|
||||||
|
</smtp>
|
||||||
|
</mailSettings>
|
||||||
|
</system.net>
|
||||||
|
|
||||||
|
<!-- Global assembly cache settings -->
|
||||||
|
<runtime>
|
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Web" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
</assemblyBinding>
|
||||||
|
</runtime>
|
||||||
|
|
||||||
|
<!-- Logging and tracing settings -->
|
||||||
|
<system.diagnostics>
|
||||||
|
<sources>
|
||||||
|
<source name="System.Net" switchValue="Verbose">
|
||||||
|
<listeners>
|
||||||
|
<add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener" />
|
||||||
|
</listeners>
|
||||||
|
</source>
|
||||||
|
</sources>
|
||||||
|
</system.diagnostics>
|
||||||
|
|
||||||
|
<!-- WCF (Windows Communication Foundation) Service Bindings -->
|
||||||
|
<system.serviceModel>
|
||||||
|
<bindings>
|
||||||
|
<basicHttpBinding>
|
||||||
|
<binding name="MyBinding">
|
||||||
|
<security mode="Transport">
|
||||||
|
<transport clientCredentialType="Basic" />
|
||||||
|
</security>
|
||||||
|
</binding>
|
||||||
|
</basicHttpBinding>
|
||||||
|
</bindings>
|
||||||
|
<client>
|
||||||
|
<endpoint address="https://example.com/service"
|
||||||
|
binding="basicHttpBinding"
|
||||||
|
bindingConfiguration="MyBinding"
|
||||||
|
contract="IMyService" />
|
||||||
|
</client>
|
||||||
|
<behaviors>
|
||||||
|
<endpointBehaviors>
|
||||||
|
<behavior>
|
||||||
|
<clientCredentials>
|
||||||
|
<userName userName="serviceUser" password="servicePassword" />
|
||||||
|
</clientCredentials>
|
||||||
|
</behavior>
|
||||||
|
</endpointBehaviors>
|
||||||
|
</behaviors>
|
||||||
|
</system.serviceModel>
|
||||||
|
</configuration>
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
89
Scripts/ConfigParsers/parser-my.cnf.ps1
Normal file
89
Scripts/ConfigParsers/parser-my.cnf.ps1
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
|
||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-MySQLCredentials {
|
||||||
|
param (
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path -Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return $null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the file content
|
||||||
|
$fileContent = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Initialize variables to store username and password
|
||||||
|
$username = $null
|
||||||
|
$password = $null
|
||||||
|
|
||||||
|
# Parse the file content
|
||||||
|
foreach ($line in $fileContent) {
|
||||||
|
if ($line -match '^\s*user\s*=\s*(.+)$') {
|
||||||
|
$username = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
elseif ($line -match '^\s*password\s*=\s*(.+)$') {
|
||||||
|
$password = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if both username and password are found
|
||||||
|
if ($username -and $password) {
|
||||||
|
# Create a custom PowerShell object to return the credentials
|
||||||
|
$credentials = [PSCustomObject]@{
|
||||||
|
Username = $username
|
||||||
|
Password = $password
|
||||||
|
}
|
||||||
|
return $credentials
|
||||||
|
} else {
|
||||||
|
Write-Warning "Username or password not found in the file."
|
||||||
|
return $null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$credentials = Get-MySQLCredentials -FilePath "c:\temp\configs\my.cnf"
|
||||||
|
$credentials
|
||||||
|
|
||||||
|
|
||||||
|
<# my.cnf
|
||||||
|
|
||||||
|
[client]
|
||||||
|
# Client configuration options
|
||||||
|
user=yourusername
|
||||||
|
password=yourpassword
|
||||||
|
port=3306
|
||||||
|
socket=/var/run/mysqld/mysqld.sock
|
||||||
|
|
||||||
|
[mysqld]
|
||||||
|
# MySQL server configuration
|
||||||
|
user=mysql
|
||||||
|
pid-file=/var/run/mysqld/mysqld.pid
|
||||||
|
socket=/var/run/mysqld/mysqld.sock
|
||||||
|
port=3306
|
||||||
|
basedir=/usr
|
||||||
|
datadir=/var/lib/mysql
|
||||||
|
tmpdir=/tmp
|
||||||
|
log-error=/var/log/mysql/error.log
|
||||||
|
bind-address=127.0.0.1
|
||||||
|
max_connections=100
|
||||||
|
skip-external-locking
|
||||||
|
|
||||||
|
# Buffer pool size for InnoDB
|
||||||
|
innodb_buffer_pool_size=256M
|
||||||
|
|
||||||
|
# Other MySQL server settings
|
||||||
|
max_allowed_packet=16M
|
||||||
|
query_cache_limit=1M
|
||||||
|
query_cache_size=16M
|
||||||
|
log_bin=/var/log/mysql/mysql-bin.log
|
||||||
|
|
||||||
|
[mysql]
|
||||||
|
# Client-specific settings for the MySQL command-line tool
|
||||||
|
user=yourusername
|
||||||
|
password=yourpassword
|
||||||
|
no-auto-rehash
|
||||||
|
|
||||||
|
#>
|
86
Scripts/ConfigParsers/parser-php.ini.ps1
Normal file
86
Scripts/ConfigParsers/parser-php.ini.ps1
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-PhpIniCredentials {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Initialize a hashtable to store extracted values
|
||||||
|
$configData = @{
|
||||||
|
Username = $null
|
||||||
|
Password = $null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path -Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the configuration file
|
||||||
|
$configFile = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Parse the configuration file line by line
|
||||||
|
foreach ($line in $configFile) {
|
||||||
|
# Ignore comment lines and empty lines
|
||||||
|
if ($line -match '^\s*;' -or $line -match '^\s*$') {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the username (e.g., mysql.default_user)
|
||||||
|
if ($line -match '^\s*mysql\.default_user\s*=\s*"(.+)"') {
|
||||||
|
$configData.Username = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the password (e.g., mysql.default_password)
|
||||||
|
if ($line -match '^\s*mysql\.default_password\s*=\s*"(.+)"') {
|
||||||
|
$configData.Password = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the extracted configuration as a PowerShell object
|
||||||
|
[PSCustomObject]@{
|
||||||
|
Username = $configData.Username
|
||||||
|
Password = $configData.Password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$credentials = Get-PhpIniCredentials -FilePath "c:\temp\configs\php.ini"
|
||||||
|
$credentials | Format-List
|
||||||
|
|
||||||
|
|
||||||
|
<# php.ini - storing mysql credentials
|
||||||
|
|
||||||
|
|
||||||
|
[PHP]
|
||||||
|
; Basic PHP settings
|
||||||
|
|
||||||
|
; Maximum size of POST data allowed
|
||||||
|
post_max_size = 8M
|
||||||
|
|
||||||
|
; Maximum allowed size for uploaded files
|
||||||
|
upload_max_filesize = 2M
|
||||||
|
|
||||||
|
; INSECURE: Storing database credentials in php.ini (not recommended)
|
||||||
|
; This exposes credentials to anyone with access to php.ini or via phpinfo() if not secured.
|
||||||
|
|
||||||
|
mysql.default_user = "dbuser"
|
||||||
|
mysql.default_password = "P@ssw0rd123"
|
||||||
|
mysql.default_host = "localhost"
|
||||||
|
mysql.default_database = "example_db"
|
||||||
|
|
||||||
|
; Log errors to a file
|
||||||
|
log_errors = On
|
||||||
|
error_log = /var/log/php_errors.log
|
||||||
|
|
||||||
|
; Ensure that this option is Off to avoid disclosing sensitive configuration details
|
||||||
|
expose_php = Off
|
||||||
|
|
||||||
|
; Ensure that phpinfo() is secured or disabled to prevent exposure of configuration data
|
||||||
|
disable_functions = phpinfo
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
59
Scripts/ConfigParsers/parser-pureftpd.passwd.ps1
Normal file
59
Scripts/ConfigParsers/parser-pureftpd.passwd.ps1
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-PureFtpCredentials {
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path $FilePath)) {
|
||||||
|
Write-Error "The file at path $FilePath does not exist."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Initialize an array to store user credentials
|
||||||
|
$credentials = @()
|
||||||
|
|
||||||
|
# Read the file line by line
|
||||||
|
Get-Content $FilePath | ForEach-Object {
|
||||||
|
# Skip empty lines
|
||||||
|
if ($_ -match '^\s*$') { return }
|
||||||
|
|
||||||
|
# Split the line into components using ':' as delimiter
|
||||||
|
$fields = $_ -split ':'
|
||||||
|
|
||||||
|
# Check if we have at least the username and password fields
|
||||||
|
if ($fields.Length -ge 2) {
|
||||||
|
$username = $fields[0]
|
||||||
|
$passwordHash = $fields[1]
|
||||||
|
|
||||||
|
# Create a custom object for each user
|
||||||
|
$credentialObject = [PSCustomObject]@{
|
||||||
|
Username = $username
|
||||||
|
PasswordHash = $passwordHash
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add the object to the credentials array
|
||||||
|
$credentials += $credentialObject
|
||||||
|
} else {
|
||||||
|
Write-Error "The line '$_' does not contain enough fields."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the results as a PowerShell object array
|
||||||
|
return $credentials
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$ftpCredentials = Get-PureFtpCredentials -FilePath "c:\temp\configs\pureftpd.passwd"
|
||||||
|
$ftpCredentials | Format-Table
|
||||||
|
|
||||||
|
|
||||||
|
<# pureftpd.passwd - used by pureftpd, passwords stored as MD5 or SHA-1 hash
|
||||||
|
|
||||||
|
username:$1$X9p2ER8W$M7P5CxX5CHPxuAiB5BBJq/:1001:1001::/home/ftp/username:/bin/false::
|
||||||
|
user2:$1$XYz3ERzW$G9P7CxF6CPxxuAiB6BBJq/:1002:1002::/home/ftp/user2:/bin/false::
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
135
Scripts/ConfigParsers/parser-putty.reg.ps1
Normal file
135
Scripts/ConfigParsers/parser-putty.reg.ps1
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
# Putty.reg does not store passwords, but can point to private keys
|
||||||
|
|
||||||
|
function Parse-PuttyRegFile {
|
||||||
|
param (
|
||||||
|
[string]$filePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-not (Test-Path $filePath)) {
|
||||||
|
Write-Host "File not found: $filePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the contents of the .reg file
|
||||||
|
$regContent = Get-Content -Path $filePath
|
||||||
|
|
||||||
|
# Create a list to store extracted session details
|
||||||
|
$sessionDetails = @()
|
||||||
|
|
||||||
|
# Variables to hold extracted data for each session
|
||||||
|
$currentSession = ""
|
||||||
|
$hostName = ""
|
||||||
|
$portNumber = ""
|
||||||
|
$userName = ""
|
||||||
|
$privateKeyPath = ""
|
||||||
|
|
||||||
|
# Iterate through the lines of the file
|
||||||
|
foreach ($line in $regContent) {
|
||||||
|
# Detect session headers (e.g., "[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\My%20SSH%20Session]")
|
||||||
|
if ($line -match '^\[HKEY_CURRENT_USER\\Software\\SimonTatham\\PuTTY\\Sessions\\(.+?)\]') {
|
||||||
|
# If we're processing a new session, save the previous one
|
||||||
|
if ($currentSession -ne "") {
|
||||||
|
$sessionDetails += [pscustomobject]@{
|
||||||
|
Session = $currentSession
|
||||||
|
HostName = $hostName
|
||||||
|
Port = [int]$portNumber
|
||||||
|
UserName = $userName
|
||||||
|
PrivateKeyPath = $privateKeyPath
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Reset variables for the new session
|
||||||
|
$currentSession = $matches[1]
|
||||||
|
$hostName = ""
|
||||||
|
$portNumber = ""
|
||||||
|
$userName = ""
|
||||||
|
$privateKeyPath = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract HostName
|
||||||
|
if ($line -match '"HostName"="(.+?)"') {
|
||||||
|
$hostName = $matches[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract PortNumber (convert hex to decimal)
|
||||||
|
if ($line -match '"PortNumber"=dword:(\w{8})') {
|
||||||
|
$portNumber = [convert]::ToInt32($matches[1], 16)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract UserName
|
||||||
|
if ($line -match '"UserName"="(.+?)"') {
|
||||||
|
$userName = $matches[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract PrivateKeyFile (path to the private key)
|
||||||
|
if ($line -match '"PublicKeyFile"="(.+?)"') {
|
||||||
|
$privateKeyPath = $matches[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# After the loop, add the last session if it exists
|
||||||
|
if ($currentSession -ne "") {
|
||||||
|
$sessionDetails += [pscustomobject]@{
|
||||||
|
Session = $currentSession
|
||||||
|
HostName = $hostName
|
||||||
|
Port = [int]$portNumber
|
||||||
|
UserName = $userName
|
||||||
|
PrivateKeyPath = $privateKeyPath
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Return the session details
|
||||||
|
return $sessionDetails
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$puttySessions = Parse-PuttyRegFile -filePath "c:\temp\configs\putty.reg"
|
||||||
|
|
||||||
|
# Display the results
|
||||||
|
$puttySessions | Format-Table -AutoSize
|
||||||
|
|
||||||
|
|
||||||
|
<# putty.reg
|
||||||
|
|
||||||
|
Windows Registry Editor Version 5.00
|
||||||
|
|
||||||
|
[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY]
|
||||||
|
"TermWidth"=dword:00000050
|
||||||
|
"TermHeight"=dword:00000018
|
||||||
|
"WinTitle"="PuTTY"
|
||||||
|
|
||||||
|
[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\Default%20Settings]
|
||||||
|
"HostName"=""
|
||||||
|
"PortNumber"=dword:00000016
|
||||||
|
"Protocol"="ssh"
|
||||||
|
"TerminalType"="xterm"
|
||||||
|
"Font"="Courier New"
|
||||||
|
"FontHeight"=dword:0000000a
|
||||||
|
"WinHeight"=dword:00000018
|
||||||
|
"WinWidth"=dword:00000050
|
||||||
|
"ConnectionSharing"=dword:00000001
|
||||||
|
|
||||||
|
[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\My%20SSH%20Session]
|
||||||
|
"HostName"="192.168.1.100"
|
||||||
|
"PortNumber"=dword:00000016
|
||||||
|
"Protocol"="ssh"
|
||||||
|
"TerminalType"="xterm"
|
||||||
|
"Font"="Courier New"
|
||||||
|
"FontHeight"=dword:0000000a
|
||||||
|
"WinHeight"=dword:00000018
|
||||||
|
"WinWidth"=dword:00000050
|
||||||
|
"Compression"=dword:00000001
|
||||||
|
"ConnectionSharing"=dword:00000001
|
||||||
|
"PublicKeyFile"="C:\\Users\\YourUsername\\.ssh\\id_rsa.ppk"
|
||||||
|
"LogFileName"="C:\\putty_logs\\my_session.log"
|
||||||
|
"LogType"=dword:00000001
|
||||||
|
"LogFileClash"=dword:00000001
|
||||||
|
"LogFlush"=dword:00000001
|
||||||
|
"LogOmitPasswords"=dword:00000001
|
||||||
|
"LogOmitData"=dword:00000000
|
||||||
|
"UserName"="myusername" ; Username stored here
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
179
Scripts/ConfigParsers/parser-server.xml.ps1
Normal file
179
Scripts/ConfigParsers/parser-server.xml.ps1
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Parse-UserPasswordFromXML {
|
||||||
|
param (
|
||||||
|
[string]$filePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Load the XML file
|
||||||
|
[xml]$xmlContent = Get-Content -Path $filePath
|
||||||
|
|
||||||
|
# Define an array to store the user credentials
|
||||||
|
$credentials = @()
|
||||||
|
|
||||||
|
# Parse basicRegistry user credentials
|
||||||
|
$xmlContent.server.basicRegistry.user | ForEach-Object {
|
||||||
|
$credentials += [pscustomobject]@{
|
||||||
|
User = $_.name
|
||||||
|
Password = $_.password
|
||||||
|
Source = 'basicRegistry'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse variable-based credentials (DB_USER and DB_PASS)
|
||||||
|
$dbUser = $xmlContent.server.variable | Where-Object { $_.name -eq "DB_USER" }
|
||||||
|
$dbPass = $xmlContent.server.variable | Where-Object { $_.name -eq "DB_PASS" }
|
||||||
|
|
||||||
|
if ($dbUser -and $dbPass) {
|
||||||
|
$credentials += [pscustomobject]@{
|
||||||
|
User = $dbUser.value
|
||||||
|
Password = $dbPass.value
|
||||||
|
Source = 'variable'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse containerAuthData credentials
|
||||||
|
$xmlContent.server.dataSource.containerAuthData | ForEach-Object {
|
||||||
|
$credentials += [pscustomobject]@{
|
||||||
|
User = $_.user
|
||||||
|
Password = $_.password
|
||||||
|
Source = 'containerAuthData'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse authData credentials
|
||||||
|
$xmlContent.server.authData | ForEach-Object {
|
||||||
|
$credentials += [pscustomobject]@{
|
||||||
|
User = $_.user
|
||||||
|
Password = $_.password
|
||||||
|
Source = 'authData'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Return the collected credentials as an array of objects
|
||||||
|
return $credentials
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$parsedCredentials = Parse-UserPasswordFromXML -filePath "c:\temp\configs\server.xml"
|
||||||
|
|
||||||
|
# Display the results
|
||||||
|
$parsedCredentials | Format-Table -AutoSize
|
||||||
|
|
||||||
|
|
||||||
|
<# server.xml
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Copyright (c) 2017,2023 IBM Corporation and others.
|
||||||
|
All rights reserved. This program and the accompanying materials
|
||||||
|
are made available under the terms of the Eclipse Public License 2.0
|
||||||
|
which accompanies this distribution, and is available at
|
||||||
|
http://www.eclipse.org/legal/epl-2.0/
|
||||||
|
|
||||||
|
SPDX-License-Identifier: EPL-2.0
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
IBM Corporation - initial API and implementation
|
||||||
|
-->
|
||||||
|
<server>
|
||||||
|
<include location="../fatTestPorts.xml" />
|
||||||
|
|
||||||
|
<featureManager>
|
||||||
|
<feature>componenttest-1.0</feature>
|
||||||
|
<feature>restConnector-2.0</feature>
|
||||||
|
<feature>jdbc-4.2</feature>
|
||||||
|
<feature>mpOpenApi-1.0</feature>
|
||||||
|
</featureManager>
|
||||||
|
|
||||||
|
<variable name="onError" value="FAIL"/>
|
||||||
|
|
||||||
|
<keyStore id="defaultKeyStore" password="Liberty"/>
|
||||||
|
|
||||||
|
<basicRegistry>
|
||||||
|
<user name="adminuser" password="adminpwd" />
|
||||||
|
<user name="reader" password="readerpwd" />
|
||||||
|
<user name="user" password="userpwd" />
|
||||||
|
</basicRegistry>
|
||||||
|
<administrator-role>
|
||||||
|
<user>adminuser</user>
|
||||||
|
</administrator-role>
|
||||||
|
<reader-role>
|
||||||
|
<user>reader</user>
|
||||||
|
</reader-role>
|
||||||
|
|
||||||
|
<library id="Derby">
|
||||||
|
<file name="${shared.resource.dir}/derby/derby.jar"/>
|
||||||
|
</library>
|
||||||
|
|
||||||
|
<variable name="DB_USER" value="dbuser"/>
|
||||||
|
<variable name="DB_PASS" value="dbpass"/>
|
||||||
|
|
||||||
|
<dataSource id="DataSourceWithoutJDBCDriver" jndiName="jdbc/withoutJDBCDriver" connectionSharing="MatchCurrentState" transactional="false">
|
||||||
|
<containerAuthData id="dbuser-auth" user="dbuser" password="{xor}Oz0vPiws"/>
|
||||||
|
<properties.derby.embedded databaseName="memory:withoutJDBCDriver"/>
|
||||||
|
</dataSource>
|
||||||
|
|
||||||
|
<dataSource id="DefaultDataSource" isolationLevel="TRANSACTION_READ_COMMITTED">
|
||||||
|
<jdbcDriver libraryRef="Derby"/>
|
||||||
|
<!-- user/password settings defined in bootstrap.properties -->
|
||||||
|
<properties.derby.embedded databaseName="memory:defaultdb" createDatabase="create"
|
||||||
|
user="${DB_USER}" password="${DB_PASS}"/>
|
||||||
|
</dataSource>
|
||||||
|
|
||||||
|
<dataSource id="jdbc/nonexistentdb" jndiName="${id}">
|
||||||
|
<connectionManager id="NestedConPool" agedTimeout="1h2m3s" connectionTimeout="0s" maxIdleTime="40m" reapTime="2m30s"/>
|
||||||
|
<jdbcDriver libraryRef="Derby"/>
|
||||||
|
<properties.derby.embedded databaseName="memory:doesNotExist"/>
|
||||||
|
</dataSource>
|
||||||
|
|
||||||
|
<transaction enableHADBPeerLocking="false">
|
||||||
|
<dataSource transactional="false" containerAuthDataRef="auth1">
|
||||||
|
<connectionManager maxPoolSize="5" connectionTimeout="0s"/>
|
||||||
|
<jdbcDriver libraryRef="Derby"/>
|
||||||
|
<properties.derby.embedded databaseName="memory:recoverydb" createDatabase="create"/>
|
||||||
|
</dataSource>
|
||||||
|
</transaction>
|
||||||
|
|
||||||
|
<!-- ejbLite and batch features are intentionally disabled -->
|
||||||
|
<databaseStore id="unavailableDBStore">
|
||||||
|
<dataSource id="unavailableDS">
|
||||||
|
<jdbcDriver libraryRef="Derby"/>
|
||||||
|
<properties.derby.embedded databaseName="memory:unavailabledb"/>
|
||||||
|
</dataSource>
|
||||||
|
</databaseStore>
|
||||||
|
|
||||||
|
<!-- mongo feature intentionally disabled, so it doesn't matter that we are using an incorrect library -->
|
||||||
|
<mongo id="mongo" libraryRef="DerbyLib"/>
|
||||||
|
<mongoDB id="MongoDBNotEnabled" jndiName="mongo/db" mongoRef="mongo" databaseName="db-test" />
|
||||||
|
|
||||||
|
<authData id="auth1" user="dbuser" password="dbpass"/>
|
||||||
|
|
||||||
|
<authData id="auth2" user="dbuser" password="wrong_password"/>
|
||||||
|
|
||||||
|
<dataSource jndiName="jdbc/defaultauth" containerAuthDataRef="auth1"> <!-- id omitted for testing -->
|
||||||
|
<connectionManager enableSharingForDirectLookups="false"/>
|
||||||
|
<jdbcDriver id="NestedDerbyDriver" libraryRef="Derby"
|
||||||
|
javax.sql.DataSource="org.apache.derby.jdbc.EmbeddedDataSource"
|
||||||
|
javax.sql.ConnectionPoolDataSource="org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource"
|
||||||
|
javax.sql.XADataSource="org.apache.derby.jdbc.EmbeddedXADataSource"/>
|
||||||
|
<onConnect>SET CURRENT SCHEMA = APP</onConnect>
|
||||||
|
<onConnect>SET CURRENT SQLID = APP</onConnect>
|
||||||
|
<properties.derby.embedded databaseName="memory:defaultdb" createDatabase="create"/>
|
||||||
|
</dataSource>
|
||||||
|
|
||||||
|
<dataSource id="WrongDefaultAuth" jndiName="jdbc/wrongdefaultauth"
|
||||||
|
connectionManagerRef="pool1" containerAuthDataRef="auth2" commitOrRollbackOnCleanup="rollback"
|
||||||
|
invalidProperty="The property's value." jdbcDriverRef="DerbyDriver" queryTimeout="2m10s"
|
||||||
|
recoveryAuthDataRef="auth2" statementCacheSize="15" validationTimeout="20s">
|
||||||
|
<properties databaseName="memory:defaultdb" createDatabase="create"/>
|
||||||
|
</dataSource>
|
||||||
|
|
||||||
|
<connectionManager id="pool1" maxPoolSize="10" purgePolicy="ValidateAllConnections"/>
|
||||||
|
|
||||||
|
<jdbcDriver id="DerbyDriver" libraryRef="Derby"/>
|
||||||
|
|
||||||
|
<javaPermission codebase="${shared.resource.dir}/derby/derby.jar" className="java.security.AllPermission"/>
|
||||||
|
</server>
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
105
Scripts/ConfigParsers/parser-settings.ini.ps1
Normal file
105
Scripts/ConfigParsers/parser-settings.ini.ps1
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-IniCredentials {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Initialize an array to store the credentials
|
||||||
|
$credentials = @()
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path -Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the INI file content
|
||||||
|
$iniFile = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Initialize variables to track current section and credentials
|
||||||
|
$currentSection = ""
|
||||||
|
$username = $null
|
||||||
|
$password = $null
|
||||||
|
|
||||||
|
# Parse the INI file line by line
|
||||||
|
foreach ($line in $iniFile) {
|
||||||
|
# Ignore comment lines and empty lines
|
||||||
|
if ($line -match '^\s*;' -or $line -match '^\s*$') {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
# Detect section headers (e.g., [DatabaseSettings])
|
||||||
|
if ($line -match '^\s*\[(.+)\]\s*$') {
|
||||||
|
# If we have collected username and password, store them before moving to the next section
|
||||||
|
if ($username -and $password) {
|
||||||
|
$credentials += [PSCustomObject]@{
|
||||||
|
Section = $currentSection
|
||||||
|
Username = $username
|
||||||
|
Password = $password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# Reset username and password for the new section
|
||||||
|
$username = $null
|
||||||
|
$password = $null
|
||||||
|
|
||||||
|
# Update current section
|
||||||
|
$currentSection = $matches[1].Trim()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
# Match username and password in the lines
|
||||||
|
if ($line -match '^\s*username\s*=\s*(.+)$') {
|
||||||
|
$username = $matches[1].Trim()
|
||||||
|
} elseif ($line -match '^\s*password\s*=\s*(.+)$') {
|
||||||
|
$password = $matches[1].Trim()
|
||||||
|
} elseif ($line -match '^\s*user\s*=\s*(.+)$') {
|
||||||
|
$username = $matches[1].Trim()
|
||||||
|
} elseif ($line -match '^\s*pass\s*=\s*(.+)$') {
|
||||||
|
$password = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Capture any remaining username/password pair after the last section
|
||||||
|
if ($username -and $password) {
|
||||||
|
$credentials += [PSCustomObject]@{
|
||||||
|
Section = $currentSection
|
||||||
|
Username = $username
|
||||||
|
Password = $password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the credentials as PowerShell objects
|
||||||
|
return $credentials
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$parsedCredentials = Get-IniCredentials -FilePath "c:\temp\configs\setting.ini"
|
||||||
|
$parsedCredentials | Format-Table -AutoSize
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<# setting.ini
|
||||||
|
|
||||||
|
[GeneralSettings]
|
||||||
|
app_name = MyApp
|
||||||
|
version = 1.0.0
|
||||||
|
theme = dark
|
||||||
|
|
||||||
|
[DatabaseSettings]
|
||||||
|
host = localhost
|
||||||
|
port = 3306
|
||||||
|
username = dbuser
|
||||||
|
password = dbpass
|
||||||
|
|
||||||
|
[CustomSettings]
|
||||||
|
user = myuser
|
||||||
|
pass = mypass
|
||||||
|
|
||||||
|
[Logging]
|
||||||
|
log_level = DEBUG
|
||||||
|
log_file = /var/log/myapp.log
|
||||||
|
|
||||||
|
#>
|
63
Scripts/ConfigParsers/parser-shadow.ps1
Normal file
63
Scripts/ConfigParsers/parser-shadow.ps1
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
|
||||||
|
function Get-ShadowFileCredentials {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Initialize an array to store extracted user data
|
||||||
|
$credentials = @()
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path -Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the shadow file
|
||||||
|
$shadowFile = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Parse each line in the shadow file
|
||||||
|
foreach ($line in $shadowFile) {
|
||||||
|
# Ignore empty lines or comments (if any)
|
||||||
|
if ($line -match '^\s*$' -or $line -match '^\s*#') {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
# Split the line into fields using colon as a delimiter
|
||||||
|
$fields = $line -split ':'
|
||||||
|
|
||||||
|
# Extract username and password hash
|
||||||
|
$username = $fields[0]
|
||||||
|
$passwordHash = $fields[1]
|
||||||
|
|
||||||
|
# Create an object to store the extracted information
|
||||||
|
$userObject = [PSCustomObject]@{
|
||||||
|
Username = $username
|
||||||
|
PasswordHash = $passwordHash
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add the object to the array
|
||||||
|
$credentials += $userObject
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the array of credentials
|
||||||
|
return $credentials
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$shadowData = Get-ShadowFileCredentials -FilePath "c:\temp\configs\shadow"
|
||||||
|
$shadowData | Format-Table -AutoSize
|
||||||
|
|
||||||
|
|
||||||
|
<# shadow - linux password file
|
||||||
|
|
||||||
|
root:$6$examplehash$E5iNRLtC5/j/kCkRhYlOro.Y9PzE0Gv8jlsfLZUNwlEm7HMBZSO9.mUvefOrKT6BjKSO4obQ.EtCZKhQgmgwV0:19000:0:99999:7:::
|
||||||
|
user1:$6$examplehash$OwhxlyS5hoxfFE4tmtyOR8Hw1k8PLqokP9FYxYP8QMG3wO0u.0Xvd4g/0Udr6BQZilJk4k7XwlxJ6p0RJ2IL5/:19000:0:99999:7:::
|
||||||
|
nobody:*:19000:0:99999:7:::
|
||||||
|
daemon:*:19000:0:99999:7:::
|
||||||
|
|
||||||
|
#>
|
105
Scripts/ConfigParsers/parser-smb.conf.ps1
Normal file
105
Scripts/ConfigParsers/parser-smb.conf.ps1
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-SmbConfCredentials {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Initialize a hashtable to store extracted values
|
||||||
|
$configData = @{
|
||||||
|
Username = $null
|
||||||
|
Password = $null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path -Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the configuration file
|
||||||
|
$configFile = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Parse the configuration file line by line
|
||||||
|
foreach ($line in $configFile) {
|
||||||
|
# Ignore comment lines and empty lines
|
||||||
|
if ($line -match '^\s*#' -or $line -match '^\s*$') {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the username
|
||||||
|
if ($line -match '^\s*username\s*=\s*(.+)') {
|
||||||
|
$configData.Username = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the password
|
||||||
|
if ($line -match '^\s*password\s*=\s*(.+)') {
|
||||||
|
$configData.Password = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the extracted configuration as a PowerShell object
|
||||||
|
[PSCustomObject]@{
|
||||||
|
Username = $configData.Username
|
||||||
|
Password = $configData.Password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$credentials = Get-SmbConfCredentials -FilePath "c:\temp\configs\smb.conf"
|
||||||
|
$credentials | Format-List
|
||||||
|
|
||||||
|
|
||||||
|
<# smb.conf
|
||||||
|
|
||||||
|
[global]
|
||||||
|
# General server settings
|
||||||
|
workgroup = EXAMPLE
|
||||||
|
realm = EXAMPLE.COM
|
||||||
|
server string = Samba Server Version %v
|
||||||
|
security = ads
|
||||||
|
encrypt passwords = yes
|
||||||
|
kerberos method = secrets and keytab
|
||||||
|
log file = /var/log/samba/log.%m
|
||||||
|
max log size = 50
|
||||||
|
|
||||||
|
# Domain and authentication settings
|
||||||
|
idmap config * : backend = tdb
|
||||||
|
idmap config EXAMPLE : backend = rid
|
||||||
|
idmap config EXAMPLE : range = 10000-20000
|
||||||
|
template shell = /bin/bash
|
||||||
|
winbind use default domain = yes
|
||||||
|
winbind offline logon = yes
|
||||||
|
winbind enum users = yes
|
||||||
|
winbind enum groups = yes
|
||||||
|
|
||||||
|
# INSECURE: Credentials for binding to Active Directory (avoid plaintext credentials)
|
||||||
|
# This exposes the AD admin account and password directly in the smb.conf file
|
||||||
|
username = ad-admin
|
||||||
|
password = P@ssw0rd123
|
||||||
|
|
||||||
|
# Kerberos keytab file location (more secure than plaintext credentials)
|
||||||
|
dedicated keytab file = /etc/krb5.keytab
|
||||||
|
kerberos method = secrets and keytab
|
||||||
|
|
||||||
|
[homes]
|
||||||
|
comment = Home Directories
|
||||||
|
browseable = no
|
||||||
|
writable = yes
|
||||||
|
|
||||||
|
[printers]
|
||||||
|
comment = All Printers
|
||||||
|
path = /var/spool/samba
|
||||||
|
printable = yes
|
||||||
|
guest ok = no
|
||||||
|
writable = no
|
||||||
|
browseable = no
|
||||||
|
|
||||||
|
[shared]
|
||||||
|
path = /srv/samba/shared
|
||||||
|
browseable = yes
|
||||||
|
read only = no
|
||||||
|
valid users = @staff
|
||||||
|
#>
|
133
Scripts/ConfigParsers/parser-sssd.conf.ps1
Normal file
133
Scripts/ConfigParsers/parser-sssd.conf.ps1
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-ConfigCredentials {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Initialize a hashtable to store extracted values
|
||||||
|
$configData = @{
|
||||||
|
Domain = $null
|
||||||
|
Server = $null
|
||||||
|
Username = $null
|
||||||
|
Password = $null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path -Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the configuration file
|
||||||
|
$configFile = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Parse the configuration file line by line
|
||||||
|
foreach ($line in $configFile) {
|
||||||
|
# Ignore comment lines and empty lines
|
||||||
|
if ($line -match '^\s*#' -or $line -match '^\s*$') {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the domain (e.g., ad_domain or similar)
|
||||||
|
if ($line -match 'ad_domain\s*=\s*(.+)') {
|
||||||
|
$configData.Domain = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the server (e.g., krb5_server or similar)
|
||||||
|
if ($line -match 'krb5_server\s*=\s*(.+)') {
|
||||||
|
$configData.Server = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the username (e.g., ldap_default_bind_dn or similar)
|
||||||
|
if ($line -match 'ldap_default_bind_dn\s*=\s*(.+)') {
|
||||||
|
$configData.Username = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract the password (e.g., ldap_default_authtok or similar)
|
||||||
|
if ($line -match 'ldap_default_authtok\s*=\s*(.+)') {
|
||||||
|
$configData.Password = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the extracted configuration as a PowerShell object
|
||||||
|
[PSCustomObject]@{
|
||||||
|
Domain = $configData.Domain
|
||||||
|
Server = $configData.Server
|
||||||
|
Username = $configData.Username
|
||||||
|
Password = $configData.Password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$config = Get-ConfigCredentials -FilePath "c:\temp\configs\sssd.conf"
|
||||||
|
$config | Format-List
|
||||||
|
|
||||||
|
|
||||||
|
<# sssd.conf - used to support kerberos authentication in Linux
|
||||||
|
|
||||||
|
|
||||||
|
[sssd]
|
||||||
|
config_file_version = 2
|
||||||
|
services = nss, pam, ssh, sudo
|
||||||
|
domains = example.com
|
||||||
|
|
||||||
|
[nss]
|
||||||
|
filter_groups = root
|
||||||
|
filter_users = root
|
||||||
|
|
||||||
|
[pam]
|
||||||
|
offline_credentials_expiration = 2
|
||||||
|
offline_failed_login_attempts = 3
|
||||||
|
offline_failed_login_delay = 5
|
||||||
|
|
||||||
|
[domain/example.com]
|
||||||
|
# Basic configuration for connecting to Active Directory
|
||||||
|
id_provider = ad
|
||||||
|
auth_provider = ad
|
||||||
|
access_provider = ad
|
||||||
|
|
||||||
|
# Enable Kerberos for authentication
|
||||||
|
krb5_realm = EXAMPLE.COM
|
||||||
|
krb5_server = ad.example.com
|
||||||
|
krb5_kpasswd = ad.example.com
|
||||||
|
|
||||||
|
# Active Directory server information
|
||||||
|
ad_domain = example.com
|
||||||
|
ad_server = ad.example.com
|
||||||
|
ad_hostname = linuxclient.example.com
|
||||||
|
|
||||||
|
# INSECURE PRACTICE: Hardcoding AD username and password in sssd.conf
|
||||||
|
# These values will expose the username and password in plaintext
|
||||||
|
ldap_default_bind_dn = cn=admin,cn=users,dc=example,dc=com
|
||||||
|
ldap_default_authtok = P@ssw0rd123
|
||||||
|
|
||||||
|
# Using the above configuration exposes credentials to anyone who can read this file
|
||||||
|
|
||||||
|
# User and group filtering (optional)
|
||||||
|
ldap_id_mapping = true
|
||||||
|
|
||||||
|
# Performance optimizations
|
||||||
|
cache_credentials = true
|
||||||
|
enumerate = false
|
||||||
|
use_fully_qualified_names = false
|
||||||
|
|
||||||
|
# Access Control (Optional: limit login to users in AD group 'LinuxAdmins')
|
||||||
|
access_provider = simple
|
||||||
|
simple_allow_groups = LinuxAdmins
|
||||||
|
|
||||||
|
# Security settings
|
||||||
|
min_id = 1000
|
||||||
|
fallback_homedir = /home/%u
|
||||||
|
|
||||||
|
# Timeout and retry settings for better AD stability
|
||||||
|
ldap_search_timeout = 10
|
||||||
|
ldap_connection_expire_timeout = 60
|
||||||
|
|
||||||
|
# Debugging options (uncomment for troubleshooting)
|
||||||
|
# debug_level = 9
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
101
Scripts/ConfigParsers/parser-standalone.xml-ps1.ps1
Normal file
101
Scripts/ConfigParsers/parser-standalone.xml-ps1.ps1
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Parse-DataSourceConfig {
|
||||||
|
param (
|
||||||
|
[string]$ConfigPath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Load the XML config
|
||||||
|
[xml]$configXml = Get-Content -Path $ConfigPath
|
||||||
|
|
||||||
|
# Define a hashtable to store results
|
||||||
|
$result = @{}
|
||||||
|
|
||||||
|
# Parse the server and port from the connection URL
|
||||||
|
$connectionUrl = $configXml.server.subsystem.datasources.datasource."connection-url"
|
||||||
|
if ($connectionUrl -match "jdbc:mysql://([^:/]+)(?::(\d+))?") {
|
||||||
|
$result.Server = $matches[1]
|
||||||
|
$result.Port = if ($matches[2]) { $matches[2] } else { "3306" } # Default MySQL port
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the username
|
||||||
|
$result.Username = $configXml.server.subsystem.datasources.datasource.security."user-name"
|
||||||
|
|
||||||
|
# Get the password
|
||||||
|
$result.Password = $configXml.server.subsystem.datasources.datasource.security.password
|
||||||
|
|
||||||
|
# Get the keystore password from the vault section
|
||||||
|
$keystorePassword = $configXml.server.security.vault."vault-option" | Where-Object { $_.name -eq "KEYSTORE_PASSWORD" }
|
||||||
|
$result.KeystorePassword = $keystorePassword.value
|
||||||
|
|
||||||
|
# Convert hashtable to PowerShell object
|
||||||
|
$resultObject = [PSCustomObject]$result
|
||||||
|
|
||||||
|
# Output the result object
|
||||||
|
return $resultObject
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage
|
||||||
|
$parsedConfig = Parse-DataSourceConfig -ConfigPath "c:\temp\configs\standalone.xml"
|
||||||
|
$parsedConfig
|
||||||
|
|
||||||
|
|
||||||
|
<# standalone.xml used by jboss
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<server xmlns="urn:jboss:domain:11.0">
|
||||||
|
|
||||||
|
<extensions>
|
||||||
|
<extension module="org.jboss.as.connector"/>
|
||||||
|
<!-- Other extensions -->
|
||||||
|
</extensions>
|
||||||
|
|
||||||
|
<subsystem xmlns="urn:jboss:domain:datasources:5.0">
|
||||||
|
<datasources>
|
||||||
|
<datasource jndi-name="java:/jdbc/MyDS" pool-name="MyDS_Pool" enabled="true" use-java-context="true">
|
||||||
|
<connection-url>jdbc:mysql://localhost:3306/mydatabase</connection-url>
|
||||||
|
<driver>mysql</driver>
|
||||||
|
<security>
|
||||||
|
<user-name>${VAULT::vault::mydbuser}</user-name>
|
||||||
|
<password>${VAULT::vault::mydbpassword}</password>
|
||||||
|
</security>
|
||||||
|
<pool>
|
||||||
|
<min-pool-size>5</min-pool-size>
|
||||||
|
<max-pool-size>20</max-pool-size>
|
||||||
|
</pool>
|
||||||
|
<validation>
|
||||||
|
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
|
||||||
|
<validate-on-match>true</validate-on-match>
|
||||||
|
<background-validation>true</background-validation>
|
||||||
|
</validation>
|
||||||
|
<timeout>
|
||||||
|
<blocking-timeout-millis>5000</blocking-timeout-millis>
|
||||||
|
</timeout>
|
||||||
|
<statement>
|
||||||
|
<track-statements>false</track-statements>
|
||||||
|
</statement>
|
||||||
|
</datasource>
|
||||||
|
|
||||||
|
<drivers>
|
||||||
|
<driver name="mysql" module="com.mysql">
|
||||||
|
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
|
||||||
|
</driver>
|
||||||
|
</drivers>
|
||||||
|
</datasources>
|
||||||
|
</subsystem>
|
||||||
|
|
||||||
|
<security>
|
||||||
|
<vault>
|
||||||
|
<vault-option name="KEYSTORE_URL" value="${jboss.server.config.dir}/vault.keystore"/>
|
||||||
|
<vault-option name="KEYSTORE_PASSWORD" value="password"/>
|
||||||
|
<vault-option name="VAULT_BLOCK" value="vault"/>
|
||||||
|
<vault-option name="ATTRIBUTE" value="my_password"/>
|
||||||
|
</vault>
|
||||||
|
</security>
|
||||||
|
|
||||||
|
<!-- Other subsystems like transactions, deployments, security, etc. -->
|
||||||
|
|
||||||
|
</server>
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
97
Scripts/ConfigParsers/parser-sysprep.inf.ps1
Normal file
97
Scripts/ConfigParsers/parser-sysprep.inf.ps1
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-SysprepCredentials {
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if file exists
|
||||||
|
if (-Not (Test-Path $FilePath)) {
|
||||||
|
Write-Error "File does not exist: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Initialize an empty hashtable to store credentials
|
||||||
|
$credentials = @{
|
||||||
|
AdminPassword = $null
|
||||||
|
JoinDomain = $null
|
||||||
|
DomainAdmin = $null
|
||||||
|
DomainAdminPassword = $null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the sysprep.inf file
|
||||||
|
$fileContent = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Loop through each line and extract relevant credentials
|
||||||
|
foreach ($line in $fileContent) {
|
||||||
|
if ($line -match 'AdminPassword\s*=\s*(.+)') {
|
||||||
|
$credentials['AdminPassword'] = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($line -match 'JoinDomain\s*=\s*(.+)') {
|
||||||
|
$credentials['JoinDomain'] = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($line -match 'DomainAdmin\s*=\s*(.+)') {
|
||||||
|
$credentials['DomainAdmin'] = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($line -match 'DomainAdminPassword\s*=\s*(.+)') {
|
||||||
|
$credentials['DomainAdminPassword'] = $matches[1].Trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create and return a PowerShell object
|
||||||
|
$credObject = [pscustomobject]@{
|
||||||
|
AdminPassword = $credentials['AdminPassword']
|
||||||
|
JoinDomain = $credentials['JoinDomain']
|
||||||
|
DomainAdmin = $credentials['DomainAdmin']
|
||||||
|
DomainAdminPassword = $credentials['DomainAdminPassword']
|
||||||
|
}
|
||||||
|
|
||||||
|
return $credObject
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$result = Get-SysprepCredentials -FilePath "c:\temp\configs\sysprep.inf"
|
||||||
|
$result
|
||||||
|
|
||||||
|
<# sysprep.inf
|
||||||
|
|
||||||
|
[Unattended]
|
||||||
|
OemSkipEula=Yes
|
||||||
|
InstallFilesPath=C:\sysprep\i386
|
||||||
|
|
||||||
|
[GuiUnattended]
|
||||||
|
AdminPassword=YourAdminPassword
|
||||||
|
EncryptedAdminPassword=NO
|
||||||
|
OEMSkipRegional=1
|
||||||
|
TimeZone=004
|
||||||
|
OemSkipWelcome=1
|
||||||
|
|
||||||
|
[UserData]
|
||||||
|
ProductKey=XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
|
||||||
|
FullName="Your Name"
|
||||||
|
OrgName="Your Organization"
|
||||||
|
ComputerName=*
|
||||||
|
|
||||||
|
[Display]
|
||||||
|
BitsPerPel=32
|
||||||
|
Xresolution=1024
|
||||||
|
YResolution=768
|
||||||
|
Vrefresh=60
|
||||||
|
|
||||||
|
[SetupMgr]
|
||||||
|
DistFolder=C:\sysprep\i386
|
||||||
|
DistShare=windist
|
||||||
|
|
||||||
|
[Identification]
|
||||||
|
JoinDomain=YourDomain
|
||||||
|
DomainAdmin=YourDomainAdmin
|
||||||
|
DomainAdminPassword=YourDomainAdminPassword
|
||||||
|
|
||||||
|
[Networking]
|
||||||
|
InstallDefaultComponents=Yes
|
||||||
|
|
||||||
|
#>
|
99
Scripts/ConfigParsers/parser-tnsnames.ora.ps1
Normal file
99
Scripts/ConfigParsers/parser-tnsnames.ora.ps1
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Extract-OracleCredentials {
|
||||||
|
param(
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
if (-Not (Test-Path -Path $FilePath)) {
|
||||||
|
Write-Error "File path does not exist: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Initialize an empty array to store the results
|
||||||
|
$credentialsList = @()
|
||||||
|
|
||||||
|
# Read the file contents
|
||||||
|
$fileContent = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Initialize variables to store temporary values
|
||||||
|
$currentDatabase = $null
|
||||||
|
$currentUser = $null
|
||||||
|
$currentPassword = $null
|
||||||
|
|
||||||
|
foreach ($line in $fileContent) {
|
||||||
|
# Trim the line for easier processing
|
||||||
|
$line = $line.Trim()
|
||||||
|
|
||||||
|
# Match a database name (lines that don't start with a '(' and end with '=')
|
||||||
|
if ($line -match '^\w+\s*=\s*$') {
|
||||||
|
if ($currentDatabase -and $currentUser -and $currentPassword) {
|
||||||
|
# Store the previous credentials
|
||||||
|
$credentialsList += [pscustomobject]@{
|
||||||
|
Database = $currentDatabase
|
||||||
|
User = $currentUser
|
||||||
|
Password = $currentPassword
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Reset the user and password for the next database entry
|
||||||
|
$currentDatabase = $line -replace '\s*=\s*$', '' # Remove the equals sign
|
||||||
|
$currentUser = $null
|
||||||
|
$currentPassword = $null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Match the USER line
|
||||||
|
if ($line -match 'USER\s*=\s*(.+)$') {
|
||||||
|
$currentUser = $matches[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Match the PASSWORD line
|
||||||
|
if ($line -match 'PASSWORD\s*=\s*(.+)$') {
|
||||||
|
$currentPassword = $matches[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Capture the last set of credentials
|
||||||
|
if ($currentDatabase -and $currentUser -and $currentPassword) {
|
||||||
|
$credentialsList += [pscustomobject]@{
|
||||||
|
Database = $currentDatabase
|
||||||
|
User = $currentUser
|
||||||
|
Password = $currentPassword
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the results as a list of objects
|
||||||
|
return $credentialsList
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$result = Extract-OracleCredentials -FilePath "c:\temp\configs\tnsnames.ora"
|
||||||
|
$result | Format-Table
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<# tnsnames.ora - oracle
|
||||||
|
|
||||||
|
MYDB =
|
||||||
|
(DESCRIPTION =
|
||||||
|
(ADDRESS = (PROTOCOL = TCP)(HOST = mydbserver.example.com)(PORT = 1521))
|
||||||
|
(CONNECT_DATA =
|
||||||
|
(SERVICE_NAME = mydbservice)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(USER = myusername)
|
||||||
|
(PASSWORD = mypassword)
|
||||||
|
|
||||||
|
MYDB_ALIAS =
|
||||||
|
(DESCRIPTION =
|
||||||
|
(ADDRESS_LIST =
|
||||||
|
(ADDRESS = (PROTOCOL = TCP)(HOST = mydbserver.example.com)(PORT = 1521))
|
||||||
|
)
|
||||||
|
(CONNECT_DATA =
|
||||||
|
(SERVICE_NAME = mydbservice)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(USER = anotheruser)
|
||||||
|
(PASSWORD = anotherpassword)
|
||||||
|
|
||||||
|
#>
|
78
Scripts/ConfigParsers/parser-tomcat-users.xml.ps1
Normal file
78
Scripts/ConfigParsers/parser-tomcat-users.xml.ps1
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-TomcatUsers {
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$TomcatConfigFile
|
||||||
|
)
|
||||||
|
|
||||||
|
# Load the XML file
|
||||||
|
[xml]$xml = Get-Content -Path $TomcatConfigFile
|
||||||
|
|
||||||
|
# Create an array to store the results
|
||||||
|
$usersList = @()
|
||||||
|
|
||||||
|
# Select the user nodes from the XML
|
||||||
|
$users = $xml.'tomcat-users'.user
|
||||||
|
|
||||||
|
# Loop through each user and extract the name and password attributes
|
||||||
|
foreach ($user in $users) {
|
||||||
|
# Create a PowerShell object for each user
|
||||||
|
$userObject = [PSCustomObject]@{
|
||||||
|
Username = $user.name
|
||||||
|
Password = $user.password
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add the object to the list
|
||||||
|
$usersList += $userObject
|
||||||
|
}
|
||||||
|
|
||||||
|
# Display the list of users as a table
|
||||||
|
return $usersList
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage
|
||||||
|
$tomcatConfigFilePath = "c:\temp\configs\tomcat-users.xml"
|
||||||
|
Get-TomcatUsers -TomcatConfigFile $tomcatConfigFilePath | Format-Table -AutoSize
|
||||||
|
|
||||||
|
|
||||||
|
<# tomcat-users.xml
|
||||||
|
|
||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
<tomcat-users>
|
||||||
|
<!--
|
||||||
|
NOTE: By default, no user is included in the "manager-gui" role required
|
||||||
|
to operate the "/manager/html" web application. If you wish to use this app,
|
||||||
|
you must define such a user - the username and password are arbitrary.
|
||||||
|
-->
|
||||||
|
<!--
|
||||||
|
NOTE: The sample user and role entries below are wrapped in a comment
|
||||||
|
and thus are ignored when reading this file. Do not forget to remove
|
||||||
|
<!.. ..> that surrounds them.
|
||||||
|
-->
|
||||||
|
<role rolename="admin-gui"/>
|
||||||
|
<role rolename="admin-script"/>
|
||||||
|
<role rolename="manager-gui"/>
|
||||||
|
<role rolename="manager-status"/>
|
||||||
|
<role rolename="manager-script"/>
|
||||||
|
<role rolename="manager-jmx"/>
|
||||||
|
<user name="admin" password="admin" roles="admin-gui,admin-script,manager-gui,manager-status,manager-script,manager-jmx"/>
|
||||||
|
</tomcat-users>
|
||||||
|
|
||||||
|
#>
|
143
Scripts/ConfigParsers/parser-unattend.xml.ps1
Normal file
143
Scripts/ConfigParsers/parser-unattend.xml.ps1
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Parse-UnattendFile {
|
||||||
|
param (
|
||||||
|
[string]$filePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Load the XML file
|
||||||
|
[xml]$xmlContent = Get-Content -Path $filePath
|
||||||
|
|
||||||
|
# Create an array to store the parsed credentials
|
||||||
|
$credentials = @()
|
||||||
|
|
||||||
|
# Define namespaces used in the XML file
|
||||||
|
$namespace = @{
|
||||||
|
"unattend" = "urn:schemas-microsoft-com:unattend"
|
||||||
|
"wcm" = "http://schemas.microsoft.com/WMIConfig/2002/State"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to decode Base64 if password is encoded
|
||||||
|
function Decode-PasswordIfNeeded {
|
||||||
|
param (
|
||||||
|
[string]$passwordValue,
|
||||||
|
[bool]$isPlainText
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($isPlainText -eq $false) {
|
||||||
|
try {
|
||||||
|
# Decode Base64 password
|
||||||
|
$decodedPassword = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($passwordValue))
|
||||||
|
return $decodedPassword
|
||||||
|
} catch {
|
||||||
|
Write-Host "Error: Unable to decode Base64 string, returning original value."
|
||||||
|
return $passwordValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return $passwordValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse AutoLogon credentials
|
||||||
|
$autoLogon = $xmlContent.unattend.settings.component | Where-Object {
|
||||||
|
$_.name -eq "Microsoft-Windows-Shell-Setup" -and $_.AutoLogon -ne $null
|
||||||
|
}
|
||||||
|
if ($autoLogon) {
|
||||||
|
$username = $autoLogon.AutoLogon.Username
|
||||||
|
$password = $autoLogon.AutoLogon.Password.Value
|
||||||
|
$isPlainText = $autoLogon.AutoLogon.Password.PlainText -eq "true"
|
||||||
|
|
||||||
|
# Decode password if necessary
|
||||||
|
$password = Decode-PasswordIfNeeded -passwordValue $password -isPlainText $isPlainText
|
||||||
|
|
||||||
|
$credentials += [pscustomobject]@{
|
||||||
|
User = $username
|
||||||
|
Password = $password
|
||||||
|
Source = "AutoLogon"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse LocalAccounts credentials
|
||||||
|
$localAccounts = $xmlContent.unattend.settings.component.UserAccounts.LocalAccounts.LocalAccount | Where-Object { $_ -ne $null }
|
||||||
|
foreach ($account in $localAccounts) {
|
||||||
|
$username = $account.Name
|
||||||
|
$password = $account.Password.Value
|
||||||
|
$isPlainText = $account.Password.PlainText -eq "true"
|
||||||
|
|
||||||
|
# Decode password if necessary
|
||||||
|
$password = Decode-PasswordIfNeeded -passwordValue $password -isPlainText $isPlainText
|
||||||
|
|
||||||
|
$credentials += [pscustomobject]@{
|
||||||
|
User = $username
|
||||||
|
Password = $password
|
||||||
|
Source = "LocalAccount"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Return the collected credentials as an array of objects
|
||||||
|
return $credentials
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage:
|
||||||
|
$parsedCredentials = Parse-UnattendFile -filePath "c:\temp\configs\unattend-base64.xml"
|
||||||
|
|
||||||
|
# Display the results
|
||||||
|
$parsedCredentials | Format-Table -AutoSize
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<# unattend.xml
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<unattend xmlns="urn:schemas-microsoft-com:unattend">
|
||||||
|
<settings pass="specialize">
|
||||||
|
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
|
||||||
|
<ComputerName>*</ComputerName>
|
||||||
|
<RegisteredOrganization>acme corp.</RegisteredOrganization>
|
||||||
|
<RegisteredOwner>acme corp.</RegisteredOwner>
|
||||||
|
<WindowsFeatures>
|
||||||
|
<ShowInternetExplorer>false</ShowInternetExplorer>
|
||||||
|
</WindowsFeatures>
|
||||||
|
<AutoLogon>
|
||||||
|
<Username>LocalAdmin</Username>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
<LogonCount>10</LogonCount>
|
||||||
|
<Password>
|
||||||
|
<Value>UEBzc3dvcmQxMjMh</Value> <!-- This is Base64 for 'P@ssword123!' -->
|
||||||
|
<PlainText>false</PlainText>
|
||||||
|
</Password>
|
||||||
|
</AutoLogon>
|
||||||
|
</component>
|
||||||
|
</settings>
|
||||||
|
|
||||||
|
<settings pass="oobeSystem">
|
||||||
|
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
|
||||||
|
<UserAccounts>
|
||||||
|
<LocalAccounts>
|
||||||
|
<LocalAccount wcm:action="add">
|
||||||
|
<Password>
|
||||||
|
<Value>UEBzc3dvcmQxMjMh</Value> <!-- This is Base64 for 'P@ssword123!' -->
|
||||||
|
<PlainText>false</PlainText>
|
||||||
|
</Password>
|
||||||
|
<Group>Administrators</Group>
|
||||||
|
<Description>Provisioning Admin</Description>
|
||||||
|
<DisplayName>LocalAdmin</DisplayName>
|
||||||
|
<Name>LocalAdmin</Name>
|
||||||
|
</LocalAccount>
|
||||||
|
</LocalAccounts>
|
||||||
|
</UserAccounts>
|
||||||
|
<OOBE>
|
||||||
|
<HideEULAPage>true</HideEULAPage>
|
||||||
|
<HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
|
||||||
|
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
|
||||||
|
<HideOnlineAccountScreens>true</HideOnlineAccountScreens>
|
||||||
|
<HideLocalAccountScreen>true</HideLocalAccountScreen>
|
||||||
|
<ProtectYourPC>1</ProtectYourPC>
|
||||||
|
</OOBE>
|
||||||
|
</component>
|
||||||
|
</settings>
|
||||||
|
</unattend>
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
110
Scripts/ConfigParsers/parser-vnc.ini.ps1
Normal file
110
Scripts/ConfigParsers/parser-vnc.ini.ps1
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
function Get-VNCPassword {
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$VncIniPath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Define the fixed DES key used by VNC
|
||||||
|
$desKey = [byte[]](0x23, 0x52, 0x6A, 0x3B, 0x58, 0x92, 0x67, 0x34)
|
||||||
|
|
||||||
|
# Read the vnc.ini file
|
||||||
|
if (-Not (Test-Path -Path $VncIniPath)) {
|
||||||
|
Write-Error "The file path '$VncIniPath' does not exist."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
$vncIniContent = Get-Content -Path $VncIniPath
|
||||||
|
|
||||||
|
# Extract the encrypted password from the ini file
|
||||||
|
$encryptedHex = ($vncIniContent | ForEach-Object {
|
||||||
|
if ($_ -match '^Password=(.+)$') {
|
||||||
|
return $matches[1]
|
||||||
|
}
|
||||||
|
}).Trim()
|
||||||
|
|
||||||
|
if (-not $encryptedHex) {
|
||||||
|
Write-Output "Password not found in vnc.ini"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Convert the hex string to a byte array
|
||||||
|
$encryptedBytes = for ($i = 0; $i -lt $encryptedHex.Length; $i += 2) {
|
||||||
|
[Convert]::ToByte($encryptedHex.Substring($i, 2), 16)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a DES crypto object and set the key and mode
|
||||||
|
$des = New-Object System.Security.Cryptography.DESCryptoServiceProvider
|
||||||
|
$des.Key = $desKey # Assign the key as a byte array
|
||||||
|
$des.Mode = [System.Security.Cryptography.CipherMode]::ECB
|
||||||
|
$des.Padding = [System.Security.Cryptography.PaddingMode]::None
|
||||||
|
|
||||||
|
# Create a decryptor
|
||||||
|
$decryptor = $des.CreateDecryptor()
|
||||||
|
|
||||||
|
# Decrypt the encrypted password
|
||||||
|
$decryptedBytes = $decryptor.TransformFinalBlock($encryptedBytes, 0, $encryptedBytes.Length)
|
||||||
|
|
||||||
|
# Convert the decrypted byte array to a string, trimming null characters
|
||||||
|
$decryptedPassword = [System.Text.Encoding]::ASCII.GetString($decryptedBytes).Trim("`0")
|
||||||
|
|
||||||
|
# Return the decrypted password as an object
|
||||||
|
return [pscustomobject]@{
|
||||||
|
DecryptedPassword = $decryptedPassword
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage
|
||||||
|
$path = "c:\temp\configs\vnc.ini"
|
||||||
|
$passwordObject = Get-VNCPassword -VncIniPath $path
|
||||||
|
$passwordObject
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<# vnc.ini
|
||||||
|
|
||||||
|
[Server]
|
||||||
|
# The port on which the VNC server listens for connections (default: 5900)
|
||||||
|
Port=5900
|
||||||
|
|
||||||
|
# Defines the IP address to bind the VNC server to. Leave blank to bind to all interfaces.
|
||||||
|
BindTo=0.0.0.0
|
||||||
|
|
||||||
|
# Enable or disable authentication. If 1, authentication is enabled.
|
||||||
|
Authentication=1
|
||||||
|
|
||||||
|
# VNC password (encoded or plain text depending on the software)
|
||||||
|
Password=01d47b4186dfa5a3
|
||||||
|
|
||||||
|
# Encryption (optional). Enable or disable encryption for VNC connections.
|
||||||
|
Encryption=1
|
||||||
|
|
||||||
|
# Set the idle timeout for client connections (in seconds)
|
||||||
|
IdleTimeout=600
|
||||||
|
|
||||||
|
# Maximum number of clients that can connect at once
|
||||||
|
MaxClients=5
|
||||||
|
|
||||||
|
[Security]
|
||||||
|
# Use SSL encryption for communication between VNC clients and server
|
||||||
|
UseSSL=0
|
||||||
|
|
||||||
|
# If SSL is enabled, provide the path to the SSL certificate file.
|
||||||
|
SSLCertificateFile=C:\path\to\ssl\certificate.pem
|
||||||
|
|
||||||
|
# Enable or disable TLS encryption
|
||||||
|
UseTLS=1
|
||||||
|
|
||||||
|
[Logging]
|
||||||
|
# Enable or disable logging. If 1, logging is enabled.
|
||||||
|
EnableLogging=1
|
||||||
|
|
||||||
|
# Log file location
|
||||||
|
LogFile=C:\path\to\log\vncserver.log
|
||||||
|
|
||||||
|
# Log level (INFO, DEBUG, ERROR, etc.)
|
||||||
|
LogLevel=INFO
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
329
Scripts/ConfigParsers/parser-web.config.ps1
Normal file
329
Scripts/ConfigParsers/parser-web.config.ps1
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
# Function to parse configuration files for credentials
|
||||||
|
function Get-CredentialsFromConfigFile {
|
||||||
|
param (
|
||||||
|
[string]$configFilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Load the config file as XML
|
||||||
|
[xml]$configXml = Get-Content $configFilePath
|
||||||
|
|
||||||
|
# Initialize a DataTable to store results
|
||||||
|
$dtCredentials = New-Object System.Data.DataTable
|
||||||
|
$null = $dtCredentials.Columns.Add("Name", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Section", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("URL", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Server", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Port", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("UserName", [string])
|
||||||
|
$null = $dtCredentials.Columns.Add("Password", [string])
|
||||||
|
|
||||||
|
# Helper function to add rows to DataTable
|
||||||
|
function Add-CredentialsToDataTable {
|
||||||
|
param (
|
||||||
|
[string]$name,
|
||||||
|
[string]$section,
|
||||||
|
[string]$url,
|
||||||
|
[string]$server,
|
||||||
|
[string]$port,
|
||||||
|
[string]$username,
|
||||||
|
[string]$password
|
||||||
|
)
|
||||||
|
$null = $dtCredentials.Rows.Add($name, $section, $url, $server, $port, $username, $password)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Dictionary to temporarily store related credentials
|
||||||
|
$credentialPairs = @{}
|
||||||
|
|
||||||
|
# Function to store credentials in temporary dictionary
|
||||||
|
function Add-CredentialPair {
|
||||||
|
param (
|
||||||
|
[string]$name,
|
||||||
|
[string]$section,
|
||||||
|
[string]$key,
|
||||||
|
[string]$value
|
||||||
|
)
|
||||||
|
|
||||||
|
if ($credentialPairs[$name]) {
|
||||||
|
$credentialPairs[$name][$key] = $value
|
||||||
|
} else {
|
||||||
|
$credentialPairs[$name] = @{}
|
||||||
|
$credentialPairs[$name][$key] = $value
|
||||||
|
$credentialPairs[$name]["Section"] = $section
|
||||||
|
}
|
||||||
|
|
||||||
|
# If both username and password are available, add them to the DataTable
|
||||||
|
if ($credentialPairs[$name]["UserName"] -and $credentialPairs[$name]["Password"]) {
|
||||||
|
Add-CredentialsToDataTable -name $name -section $credentialPairs[$name]["Section"] `
|
||||||
|
-url $credentialPairs[$name]["URL"] -server $credentialPairs[$name]["Server"] `
|
||||||
|
-port $credentialPairs[$name]["Port"] -username $credentialPairs[$name]["UserName"] `
|
||||||
|
-password $credentialPairs[$name]["Password"]
|
||||||
|
|
||||||
|
# Clear the stored credential after adding it to the table
|
||||||
|
$credentialPairs.Remove($name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse all instances of appSettings for OAuth, WebClient, API, and other credentials
|
||||||
|
if ($configXml.SelectNodes('//appSettings')) {
|
||||||
|
foreach ($appSettings in $configXml.SelectNodes('//appSettings')) {
|
||||||
|
foreach ($setting in $appSettings.add) {
|
||||||
|
$key = $setting.key
|
||||||
|
$value = $setting.value
|
||||||
|
$section = "AppSettings"
|
||||||
|
|
||||||
|
# Handle specific cases for OAuth, API, and WebClient settings
|
||||||
|
switch ($key) {
|
||||||
|
"OAuthServiceUrl" { Add-CredentialPair -name "OAuth" -section $section -key "URL" -value $value }
|
||||||
|
"ClientId" { Add-CredentialPair -name "OAuth" -section $section -key "UserName" -value $value }
|
||||||
|
"ClientSecret" { Add-CredentialPair -name "OAuth" -section $section -key "Password" -value $value }
|
||||||
|
"ServiceUrl" { Add-CredentialPair -name "WebClient" -section $section -key "URL" -value $value }
|
||||||
|
"ServiceUserName" { Add-CredentialPair -name "WebClient" -section $section -key "UserName" -value $value }
|
||||||
|
"ServicePassword" { Add-CredentialPair -name "WebClient" -section $section -key "Password" -value $value }
|
||||||
|
"ApiEndpoint" { Add-CredentialPair -name "API" -section $section -key "URL" -value $value }
|
||||||
|
"ApiUserName" { Add-CredentialPair -name "API" -section $section -key "UserName" -value $value }
|
||||||
|
"ApiPassword" { Add-CredentialPair -name "API" -section $section -key "Password" -value $value }
|
||||||
|
"ApplicationUsername" { Add-CredentialPair -name "Application" -section $section -key "UserName" -value $value }
|
||||||
|
"ApplicationPassword" { Add-CredentialPair -name "Application" -section $section -key "Password" -value $value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse custom serviceCredentials section
|
||||||
|
if ($configXml.configuration.serviceCredentials) {
|
||||||
|
foreach ($setting in $configXml.configuration.serviceCredentials.add) {
|
||||||
|
$key = $setting.key
|
||||||
|
$value = $setting.value
|
||||||
|
$section = "ServiceCredentials"
|
||||||
|
|
||||||
|
# Handle specific cases for custom service credentials
|
||||||
|
switch ($key) {
|
||||||
|
"ServiceUrl" { Add-CredentialPair -name "CustomService" -section $section -key "URL" -value $value }
|
||||||
|
"UserName" { Add-CredentialPair -name "CustomService" -section $section -key "UserName" -value $value }
|
||||||
|
"Password" { Add-CredentialPair -name "CustomService" -section $section -key "Password" -value $value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse connectionStrings for server, port, username, and password
|
||||||
|
if ($configXml.configuration.connectionStrings) {
|
||||||
|
foreach ($connection in $configXml.configuration.connectionStrings.add) {
|
||||||
|
$connectionString = $connection.connectionString
|
||||||
|
$providerName = $connection.providerName
|
||||||
|
$name = $connection.name
|
||||||
|
|
||||||
|
# Initialize variables for potential data
|
||||||
|
$server = $null
|
||||||
|
$port = $null
|
||||||
|
$user = $null
|
||||||
|
$password = $null
|
||||||
|
$url = $null
|
||||||
|
|
||||||
|
# Parse connection strings
|
||||||
|
if ($connectionString -match "Host\s*=\s*([^;]+).*?Port\s*=\s*(\d+).*?Username\s*=\s*([^;]+).*?Password\s*=\s*([^;]+)") {
|
||||||
|
$server = $matches[1]
|
||||||
|
$port = $matches[2]
|
||||||
|
$user = $matches[3]
|
||||||
|
$password = $matches[4]
|
||||||
|
$url = "Host=$server;Port=$port"
|
||||||
|
} elseif ($connectionString -match "(Server|Data Source)\s*=\s*([^;,]+)(?:,(\d+))?") {
|
||||||
|
$server = $matches[2]
|
||||||
|
if ($matches[3]) { $port = $matches[3] }
|
||||||
|
$url = "Server=$server"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($connectionString -match "User\s*Id\s*=\s*([^;]+)") {
|
||||||
|
$user = $matches[1]
|
||||||
|
}
|
||||||
|
if ($connectionString -match "Password\s*=\s*([^;]+)") {
|
||||||
|
$password = $matches[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add row to the DataTable if username and password exist
|
||||||
|
if ($user -and $password) {
|
||||||
|
Add-CredentialsToDataTable -name $name -section "ConnectionStrings ($providerName)" -url $url -server $server -port $port -username $user -password $password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse system.net/mailSettings for SMTP credentials and URLs
|
||||||
|
if ($configXml.configuration.'system.net'.mailSettings) {
|
||||||
|
foreach ($smtp in $configXml.configuration.'system.net'.mailSettings.smtp) {
|
||||||
|
$smtpServer = $smtp.network.host
|
||||||
|
$smtpPort = $smtp.network.port
|
||||||
|
$smtpUser = $smtp.network.userName
|
||||||
|
$smtpPass = $smtp.network.password
|
||||||
|
$url = "smtp://${smtpServer}:${smtpPort}"
|
||||||
|
|
||||||
|
if ($smtpUser -and $smtpPass) {
|
||||||
|
Add-CredentialsToDataTable -name "SMTP Configuration" -section "SMTP" -url $url -server $smtpServer -port $smtpPort -username $smtpUser -password $smtpPass
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Output the parsed credentials using the DataTable
|
||||||
|
if ($dtCredentials.Rows.Count -eq 0) {
|
||||||
|
Write-Host "No credentials found." -ForegroundColor Red
|
||||||
|
} else {
|
||||||
|
$dtCredentials | select Name, Section, URL, Server, Port, UserName, Password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example of calling the function with a file path
|
||||||
|
Get-CredentialsFromConfigFile -configFilePath "c:\temp\configs\web.config"
|
||||||
|
|
||||||
|
|
||||||
|
<# web.config
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<!-- Config Sections for Custom Service Credentials -->
|
||||||
|
<configSections>
|
||||||
|
<section name="serviceCredentials" type="System.Configuration.NameValueSectionHandler" />
|
||||||
|
<sectionGroup name="system.net">
|
||||||
|
<section name="settings" type="System.Net.Configuration.SettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
|
</sectionGroup>
|
||||||
|
</configSections>
|
||||||
|
|
||||||
|
<!-- Application Settings for web application -->
|
||||||
|
<appSettings>
|
||||||
|
<add key="ApplicationUsername" value="myAppUser" />
|
||||||
|
<add key="ApplicationPassword" value="myAppPassword" />
|
||||||
|
<add key="OAuthServiceUrl" value="https://oauth.example.com/token" />
|
||||||
|
<add key="ClientId" value="myClientId" />
|
||||||
|
<add key="ClientSecret" value="myClientSecret" />
|
||||||
|
<add key="ServiceUrl" value="https://service.example.com/api" />
|
||||||
|
<add key="ServiceUserName" value="serviceUser" />
|
||||||
|
<add key="ServicePassword" value="servicePassword" />
|
||||||
|
<add key="ApiEndpoint" value="https://api.example.com/endpoint" />
|
||||||
|
<add key="ApiUserName" value="apiUser" />
|
||||||
|
<add key="ApiPassword" value="apiPassword" />
|
||||||
|
</appSettings>
|
||||||
|
|
||||||
|
<!-- Custom service credentials -->
|
||||||
|
<serviceCredentials>
|
||||||
|
<add key="ServiceUrl" value="https://customservice.example.com" />
|
||||||
|
<add key="UserName" value="customUser" />
|
||||||
|
<add key="Password" value="customPassword" />
|
||||||
|
</serviceCredentials>
|
||||||
|
|
||||||
|
<!-- Connection strings for various databases -->
|
||||||
|
<connectionStrings>
|
||||||
|
<add name="SqlServerConnection"
|
||||||
|
connectionString="Data Source=localhost;Initial Catalog=myDB;User ID=myUser;Password=myPass;"
|
||||||
|
providerName="System.Data.SqlClient" />
|
||||||
|
<add name="SqlServerIntegratedSecurity"
|
||||||
|
connectionString="Data Source=localhost;Initial Catalog=myDB;Integrated Security=True;"
|
||||||
|
providerName="System.Data.SqlClient" />
|
||||||
|
<add name="MySqlConnection"
|
||||||
|
connectionString="Server=localhost;Database=myDB;User=myUser;Password=myPass;"
|
||||||
|
providerName="MySql.Data.MySqlClient" />
|
||||||
|
<add name="PostgreSqlConnection"
|
||||||
|
connectionString="Host=localhost;Port=5432;Database=myDB;Username=myUser;Password=myPass;"
|
||||||
|
providerName="Npgsql" />
|
||||||
|
<add name="OracleConnection"
|
||||||
|
connectionString="Data Source=MyOracleDB;User Id=oracleUser;Password=oraclePass;"
|
||||||
|
providerName="Oracle.ManagedDataAccess.Client" />
|
||||||
|
</connectionStrings>
|
||||||
|
|
||||||
|
<!-- Web-specific settings for forms authentication, session state, and errors -->
|
||||||
|
<system.web>
|
||||||
|
<!-- Compilation settings -->
|
||||||
|
<compilation debug="true" targetFramework="4.0" />
|
||||||
|
|
||||||
|
<!-- Authentication settings for web applications -->
|
||||||
|
<authentication mode="Forms">
|
||||||
|
<forms loginUrl="login.aspx" timeout="30">
|
||||||
|
<credentials passwordFormat="Clear">
|
||||||
|
<user name="user1" password="password1" />
|
||||||
|
<user name="user2" password="password2" />
|
||||||
|
</credentials>
|
||||||
|
</forms>
|
||||||
|
</authentication>
|
||||||
|
|
||||||
|
<!-- Authorization settings to allow or deny user access -->
|
||||||
|
<authorization>
|
||||||
|
<allow users="*" /> <!-- Allow all users -->
|
||||||
|
<deny users="?" /> <!-- Deny anonymous users -->
|
||||||
|
</authorization>
|
||||||
|
|
||||||
|
<!-- Custom error pages -->
|
||||||
|
<customErrors mode="RemoteOnly">
|
||||||
|
<error statusCode="404" redirect="404.aspx" />
|
||||||
|
<error statusCode="500" redirect="500.aspx" />
|
||||||
|
</customErrors>
|
||||||
|
|
||||||
|
<!-- Session State settings (optional) -->
|
||||||
|
<sessionState mode="InProc" timeout="20" />
|
||||||
|
</system.web>
|
||||||
|
|
||||||
|
<!-- SMTP settings for email (relevant for web applications) -->
|
||||||
|
<system.net>
|
||||||
|
<mailSettings>
|
||||||
|
<smtp from="you@example.com">
|
||||||
|
<network host="smtp.example.com" port="587"
|
||||||
|
userName="smtpUser"
|
||||||
|
password="smtpPassword"
|
||||||
|
defaultCredentials="false" />
|
||||||
|
</smtp>
|
||||||
|
</mailSettings>
|
||||||
|
</system.net>
|
||||||
|
|
||||||
|
<!-- WCF (Windows Communication Foundation) Service configuration for web applications -->
|
||||||
|
<system.serviceModel>
|
||||||
|
<bindings>
|
||||||
|
<basicHttpBinding>
|
||||||
|
<binding name="MyBinding">
|
||||||
|
<security mode="Transport">
|
||||||
|
<transport clientCredentialType="Basic" />
|
||||||
|
</security>
|
||||||
|
</binding>
|
||||||
|
</basicHttpBinding>
|
||||||
|
</bindings>
|
||||||
|
<client>
|
||||||
|
<endpoint address="https://example.com/service"
|
||||||
|
binding="basicHttpBinding"
|
||||||
|
bindingConfiguration="MyBinding"
|
||||||
|
contract="IMyService" />
|
||||||
|
</client>
|
||||||
|
<behaviors>
|
||||||
|
<endpointBehaviors>
|
||||||
|
<behavior>
|
||||||
|
<clientCredentials>
|
||||||
|
<userName userName="serviceUser" password="servicePassword" />
|
||||||
|
</clientCredentials>
|
||||||
|
</behavior>
|
||||||
|
</endpointBehaviors>
|
||||||
|
</behaviors>
|
||||||
|
</system.serviceModel>
|
||||||
|
|
||||||
|
<!-- IIS-specific settings for URL rewriting and other web server configurations -->
|
||||||
|
<system.webServer>
|
||||||
|
<!-- Enable URL rewriting (optional) -->
|
||||||
|
<rewrite>
|
||||||
|
<rules>
|
||||||
|
<rule name="RedirectToHTTPS">
|
||||||
|
<match url="(.*)" />
|
||||||
|
<conditions>
|
||||||
|
<add input="{HTTPS}" pattern="^OFF$" />
|
||||||
|
</conditions>
|
||||||
|
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
|
||||||
|
</rule>
|
||||||
|
</rules>
|
||||||
|
</rewrite>
|
||||||
|
|
||||||
|
<!-- Enable static content compression (optional) -->
|
||||||
|
<staticContent>
|
||||||
|
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
|
||||||
|
</staticContent>
|
||||||
|
|
||||||
|
<!-- HTTP modules and handlers (optional) -->
|
||||||
|
<modules runAllManagedModulesForAllRequests="true" />
|
||||||
|
</system.webServer>
|
||||||
|
|
||||||
|
</configuration>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
101
Scripts/ConfigParsers/parser-winscp.ini.ps1
Normal file
101
Scripts/ConfigParsers/parser-winscp.ini.ps1
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-WinSCPConfig {
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if file exists
|
||||||
|
if (-not (Test-Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read the WinSCP.ini file content
|
||||||
|
$content = Get-Content -Path $FilePath
|
||||||
|
|
||||||
|
# Initialize an empty object for results
|
||||||
|
$result = [PSCustomObject]@{
|
||||||
|
HostName = $null
|
||||||
|
PortNumber = $null
|
||||||
|
PrivateKeyFile = $null
|
||||||
|
UserName = $null
|
||||||
|
Password = $null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse the .ini file for relevant information
|
||||||
|
foreach ($line in $content) {
|
||||||
|
if ($line -match '^HostName=(.*)') {
|
||||||
|
$result.HostName = $matches[1]
|
||||||
|
} elseif ($line -match '^PortNumber=(.*)') {
|
||||||
|
$result.PortNumber = [int]$matches[1]
|
||||||
|
} elseif ($line -match '^PrivateKeyFile=(.*)') {
|
||||||
|
$result.PrivateKeyFile = $matches[1]
|
||||||
|
} elseif ($line -match '^UserName=(.*)') {
|
||||||
|
$result.UserName = $matches[1]
|
||||||
|
} elseif ($line -match '^Password=(.*)') {
|
||||||
|
$result.Password = $matches[1] # Encrypted password in .ini
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Return the result object
|
||||||
|
return $result
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage
|
||||||
|
$winSCPConfig = Get-WinSCPConfig -FilePath "c:\temp\configs\WinSCP.ini"
|
||||||
|
$winSCPConfig
|
||||||
|
|
||||||
|
<# winscp decryption function that uses dpapi below
|
||||||
|
|
||||||
|
function ConvertFrom-DPAPI {
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$EncryptedPassword
|
||||||
|
)
|
||||||
|
|
||||||
|
# Convert the base64 encoded password back to byte array
|
||||||
|
$passwordBytes = [Convert]::FromBase64String($EncryptedPassword)
|
||||||
|
|
||||||
|
# Use the Windows DPAPI to decrypt the password
|
||||||
|
$decryptedBytes = [System.Security.Cryptography.ProtectedData]::Unprotect($passwordBytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser)
|
||||||
|
|
||||||
|
# Convert the decrypted byte array back to a string (UTF-8 encoded)
|
||||||
|
$decryptedPassword = [System.Text.Encoding]::UTF8.GetString($decryptedBytes)
|
||||||
|
|
||||||
|
return $decryptedPassword
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage with an encrypted password from WinSCP.ini
|
||||||
|
$encryptedPassword = "Base64EncryptedPasswordHere"
|
||||||
|
$decryptedPassword = ConvertFrom-DPAPI -EncryptedPassword $encryptedPassword
|
||||||
|
Write-Output "Decrypted Password: $decryptedPassword"
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
||||||
|
|
||||||
|
|
||||||
|
<# winscp.ini
|
||||||
|
|
||||||
|
|
||||||
|
[Configuration\Interface]
|
||||||
|
Random=4074A9829D979781989E96
|
||||||
|
|
||||||
|
[Sessions\example]
|
||||||
|
HostName=ftp.example.com
|
||||||
|
PortNumber=21
|
||||||
|
UserName=myuser
|
||||||
|
Password=0V5aNH+/kT8= ; Encrypted password
|
||||||
|
LocalDirectory=C:\Users\myuser\Documents
|
||||||
|
RemoteDirectory=/public_html
|
||||||
|
FSProtocol=0
|
||||||
|
PostLoginCommands=
|
||||||
|
PrivateKeyFile=
|
||||||
|
|
||||||
|
[Configuration\Interface\Commander]
|
||||||
|
LastLocalDirectory=C:\Users\myuser\Documents
|
||||||
|
LastRemoteDirectory=/public_html
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
121
Scripts/ConfigParsers/parser-wp-config.php.ps1
Normal file
121
Scripts/ConfigParsers/parser-wp-config.php.ps1
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
# Author: Scott Sutherland, NetSPI (@_nullbind / nullbind)
|
||||||
|
|
||||||
|
function Get-WPConfigCredentials {
|
||||||
|
param (
|
||||||
|
[string]$FilePath
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the file exists
|
||||||
|
if (-Not (Test-Path $FilePath)) {
|
||||||
|
Write-Error "File not found: $FilePath"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Initialize variables for username and password
|
||||||
|
$dbUsername = $null
|
||||||
|
$dbPassword = $null
|
||||||
|
|
||||||
|
# Read the file line by line
|
||||||
|
Get-Content $FilePath | ForEach-Object {
|
||||||
|
$line = $_
|
||||||
|
|
||||||
|
# Match the DB_USER line and extract the username
|
||||||
|
if ($line -match "define\(\s*'DB_USER'\s*,\s*'([^']+)'\s*\)") {
|
||||||
|
$dbUsername = $matches[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Match the DB_PASSWORD line and extract the password
|
||||||
|
if ($line -match "define\(\s*'DB_PASSWORD'\s*,\s*'([^']+)'\s*\)") {
|
||||||
|
$dbPassword = $matches[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if both username and password were found
|
||||||
|
if ($dbUsername -and $dbPassword) {
|
||||||
|
# Return the results as a PowerShell object
|
||||||
|
[PSCustomObject]@{
|
||||||
|
Username = $dbUsername
|
||||||
|
Password = $dbPassword
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Error "Username or Password not found in the configuration file."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Example usage
|
||||||
|
$credentials = Get-WPConfigCredentials -FilePath "c:\temp\configs\wp-config.php"
|
||||||
|
$credentials
|
||||||
|
|
||||||
|
|
||||||
|
<# wp-config.php
|
||||||
|
|
||||||
|
<?php
|
||||||
|
// ** MySQL settings - You can get this info from your web host ** //
|
||||||
|
/** The name of the database for WordPress */
|
||||||
|
define( 'DB_NAME', 'your_database_name' );
|
||||||
|
|
||||||
|
/** MySQL database username */
|
||||||
|
define( 'DB_USER', 'your_database_username' );
|
||||||
|
|
||||||
|
/** MySQL database password */
|
||||||
|
define( 'DB_PASSWORD', 'your_secure_password_here' );
|
||||||
|
|
||||||
|
/** MySQL hostname */
|
||||||
|
define( 'DB_HOST', 'localhost' );
|
||||||
|
|
||||||
|
/** Database Charset to use in creating database tables. */
|
||||||
|
define( 'DB_CHARSET', 'utf8' );
|
||||||
|
|
||||||
|
/** The Database Collate type. Don't change this if in doubt. */
|
||||||
|
define( 'DB_COLLATE', '' );
|
||||||
|
|
||||||
|
/**#@+
|
||||||
|
* Authentication Unique Keys and Salts.
|
||||||
|
*
|
||||||
|
* Change these to different unique phrases!
|
||||||
|
* You can generate these using the WordPress.org secret-key service
|
||||||
|
* https://api.wordpress.org/secret-key/1.1/salt/
|
||||||
|
* You can change these at any point in time to invalidate all existing cookies.
|
||||||
|
* This will force all users to have to log in again.
|
||||||
|
*/
|
||||||
|
define('AUTH_KEY', 'put_your_unique_phrase_here');
|
||||||
|
define('SECURE_AUTH_KEY', 'put_your_unique_phrase_here');
|
||||||
|
define('LOGGED_IN_KEY', 'put_your_unique_phrase_here');
|
||||||
|
define('NONCE_KEY', 'put_your_unique_phrase_here');
|
||||||
|
define('AUTH_SALT', 'put_your_unique_phrase_here');
|
||||||
|
define('SECURE_AUTH_SALT', 'put_your_unique_phrase_here');
|
||||||
|
define('LOGGED_IN_SALT', 'put_your_unique_phrase_here');
|
||||||
|
define('NONCE_SALT', 'put_your_unique_phrase_here');
|
||||||
|
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WordPress Database Table prefix.
|
||||||
|
*
|
||||||
|
* You can have multiple installations in one database if you give each a unique
|
||||||
|
* prefix. Only numbers, letters, and underscores please!
|
||||||
|
*/
|
||||||
|
$table_prefix = 'wp_';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For developers: WordPress debugging mode.
|
||||||
|
*
|
||||||
|
* Change this to true to enable the display of notices during development.
|
||||||
|
* It is strongly recommended that plugin and theme developers use WP_DEBUG
|
||||||
|
* in their development environments.
|
||||||
|
*/
|
||||||
|
define( 'WP_DEBUG', false );
|
||||||
|
|
||||||
|
/* That's all, stop editing! Happy publishing. */
|
||||||
|
|
||||||
|
/** Absolute path to the WordPress directory. */
|
||||||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||||||
|
define( 'ABSPATH', __DIR__ . '/' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Sets up WordPress vars and included files. */
|
||||||
|
require_once ABSPATH . 'wp-settings.php';
|
||||||
|
|
||||||
|
|
||||||
|
#>
|
Loading…
x
Reference in New Issue
Block a user