PowerQuest.psm1
function New-Level { param([String]$instruction,[String]$indice,[String]$solution) $password = ConvertTo-SecureString $solution -AsPlainText -Force $Script:level++ New-LocalUser "PowerQuest$Script:level" -Password $password -PasswordNeverExpires -UserMayNotChangePassword #| Add-LocalGroupMember Administrateurs Start-Process "cmd.exe" -Credential (New-Object management.automation.pscredential "PowerQuest$Script:level",$password) -ArgumentList "/C" $SecureSolution = ConvertFrom-SecureString (ConvertTo-SecureString "Le mot de passe pour PowerQuest$Script:level est '$solution'." -AsPlainText -Force) -key(1..16) $SecureIndice = ConvertFrom-SecureString (ConvertTo-SecureString $indice -AsPlainText -Force) -key(1..16) (New-Item "C:\Users\PowerQuest$($Script:level-1)\.instruction" -Value "Le mot de passe pour PowerQuest$Script:level est $instruction." -Force).Attributes = 'Hidden' (New-Item "C:\Users\PowerQuest$($Script:level-1)\.indice" -Value $SecureIndice -Force).Attributes = 'Hidden' (New-Item "C:\Users\PowerQuest$($Script:level-1)\.solution" -Value $SecureSolution -Force).Attributes = 'Hidden' } function Get-Instruction { if ($env:USERNAME -match 'PowerQuest') { Get-Content "$env:USERPROFILE\.instruction" } else { Get-Content C:\Users\PowerQuest0\.instruction } } function Get-Indice { if ($env:USERNAME -match 'PowerQuest') { $SecureIndice = ConvertTo-SecureString (Get-Content "$env:USERPROFILE\.indice") -key(1..16) (New-Object System.Management.Automation.PSCredential 'N/A', $SecureIndice).GetNetworkCredential().Password [int](Get-Content C:\Temp\.malus)+5 | Set-Content C:\Temp\.malus } else { Get-Content C:\Users\PowerQuest0\.instruction } } function Get-Solution { if ($env:USERNAME -match 'PowerQuest') { $SecureSolution = ConvertTo-SecureString (Get-Content "$env:USERPROFILE\.solution") -key(1..16) (New-Object System.Management.Automation.PSCredential 'N/A', $SecureSolution).GetNetworkCredential().Password [int](Get-Content C:\Temp\.malus)+10 | Set-Content C:\Temp\.malus } else { Get-Content C:\Users\PowerQuest0\.instruction } } function Disable-PasswordComplexity { secedit /export /cfg secpol.cfg (Get-Content secpol.cfg).Replace("PasswordComplexity = 1", "PasswordComplexity = 0") | Out-File secpol.cfg secedit /configure /db c:\windows\security\local.sdb /cfg secpol.cfg /areas SECURITYPOLICY Remove-Item -Force secpol.cfg -Confirm:$false } function Build-Levels { New-Level PowerQuest1 PowerQuest1 PowerQuest1 # Level 1 $mot_compose = 'hard_','unders_','s_','_en','en_','multi_','_team' | Get-Random New-Item "C:\Users\PowerQuest$Script:level\Documents\$mot_compose" -Force New-Level "le document avec un '_' dans son nom, à remplacer par l'édition PowerShell en minuscule" ` "Affichez la variable 'PSEdition'" ` $mot_compose.Replace('_',$PSEdition.ToLower()) # Level 2 New-Level "le nombre de commandes de type Cmdlet" ` "Utilisez la Cmdlet 'Measure-Object'" ` (Get-Command -CommandType Cmdlet | Measure-Object).Count # Level 3 New-Level "le nombre de DLL Windows dont le nom commence par 'K'" ` "Utilisez un caractère générique" ` (Get-ChildItem C:\Windows\System32\k*.dll).Count # Level 4 New-Level "le numero de série du Bios sans espace" ` "Utilisez la Cmdlet 'Get-ComputerInfo'" ` (Get-CimInstance -ClassName Win32_BIOS).SerialNumber.Replace(' ','') # Level 5 New-Level "le 'MachineID' dans la clé de registre 'HKLM:\SOFTWARE\Microsoft\SQMClient'" ` "Utilisez la Cmdlet 'Get-ItemProperty'" ` (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\SQMClient").MachineID # Level 6 New-Level "l'identifiant universel unique (UUID) du systeme Windows" ` "Utilisez la classe 'Win32_ComputerSystemProduct'" ` (Get-CimInstance Win32_ComputerSystemProduct).UUID # Level 7 New-Level "l'identifiant de sécurité (SID) de l'utilisateur PowerQuest$Script:level" ` "Utilisez une propriété de l'objet renvoyé par 'Get-LocalUser'" ` (Get-LocalUser "PowerQuest$Script:level").SID.Value # Level 8 $alea = Get-Random -Maximum 1000 New-Item "C:\Users\PowerQuest$Script:level\Documents\$alea" -Force New-Level "le nom de la cmdlet équivalente à 'mount' + le nom du fichier dans Documents" ` "Utilisez la Cmdlet 'Get-Alias'" ` ((Get-Alias mount).Definition + (Get-ChildItem).Name) # Level 9 New-Level "l'Adresse Mac de l'adaptateur '$(Get-NetAdapter).Name'" ` "Utilisez la Cmdlet 'Get-NetAdapter'" ` (Get-NetAdapter).MacAddress # Level 10 New-Level "l'Adresse IPv4 de l'adaptateur '$(Get-NetAdapter).Name'" ` "Utilisez la Cmdlet 'Get-NetIPAddress'" ` (Get-NetAdapter | Get-NetIPAddress).IPv4Address # Level 11 For($i=1;$i -lt (Get-Random -Maximum 1000);$i++) { New-Item "C:\Users\PowerQuest$Script:level\Documents\A ranger\$(Get-Random -Maximum 1000)$i" -ItemType ('File','Directory' | Get-Random) -Force } New-Level "le nombre de fichiers dans les Documents 'A ranger'" ` "Utilisez l'option 'File' de la Cmdlet 'Get-ChildItem'" ` (Get-ChildItem "C:\Users\PowerQuest$Script:level\Documents\A ranger" -File).Count # Level 12 New-Level "le nombre de capacités Windows non présentes sur le système en ligne" ` "Utilisez la Cmdlet 'Get-WindowsCapability'" ` (Get-WindowsCapability -Online | Where-Object State -eq NotPresent).Count # Level 13 For($i=1;$i -lt (Get-Random -Maximum 1000);$i++) { (New-Item "C:\Users\PowerQuest$Script:level\Documents\Confidentiels\$(Get-Random -Maximum 1000)$i" -ItemType ('File','Directory' | Get-Random) -Force).Attributes = 'Hidden' } New-Level "le nombre de dossiers cachés dans les Documents 'Confidentiels'" ` "Utilisez les options 'Directory' et 'Hidden'" ` (Get-ChildItem "C:\Users\PowerQuest$Script:level\Documents\Confidentiels" -Directory -Hidden).Count # Level 14 $alea = Get-Random -Maximum 1000 (New-Item "C:\Users\PowerQuest$Script:level\Documents\Coffre Fort" -Value $alea -Force).Attributes = 'Hidden' $numero_ligne = 845..881 | Get-Random New-Level "la valeur du paramètre déclaré à la ligne $numero_ligne du script système 'winrm.vbs' + le code secret du document caché" ` "Cherchez dans 'C:\Windows\System32'" ` ((Get-Content C:\Windows\System32\winrm.vbs)[$numero_ligne].Split('"')[1] + $alea) # Level 15 New-Level "le nombre de services en cours d'exécution dont le type de démarrage est manuel" ` "Testez les propriétés 'Status' et 'StartType'" ` (Get-Service | Where-Object Status -eq Running | Where-Object StartType -eq Manual).Count # Level 16 New-Level "le nombre de services qui dépendent directement du service 'Remote Procedure Call' (RPCSS)" ` "Utilisez l'option '-DependentServices'" ` (Get-Service RPCSS -DependentServices).Count # Level 17 New-Level "le nombre de propriétés de l'objet 'Process'" ` "Utilisez la Cmdlet 'Get-Member'" ` (Get-Process | Get-Member -MemberType Properties).Count # Level 18 $fourniture = 'stylo','crayon','gomme','bloc-notes','agrafeuse','trombones','ciseaux','règle','calculatrice' | Get-Random New-Item "C:\Users\PowerQuest$Script:level\Desktop\$fourniture" -Force New-Level "la fourniture sur le bureau + le nombre de variables d'environnement du système" ` "Listez les éléments enfants du provider 'Env:'" ` ($fourniture + (Get-ChildItem Env:).Count) # Level 19 (New-Item "C:\Users\PowerQuest$Script:level\Documents\Confidentiels\PassPhrase" -Value "éclair âpre sur l'île ô combien unique des îlots émerveillés" -Force).Attributes = 'Hidden' New-Level "la phrase secrète dans les Documents 'Confidentiels', toute en MAJUSCULES et sans espace" ` "Utilisez les méthodes 'toUpper' et 'Replace'" ` (Get-Content "C:\Users\PowerQuest$Script:level\Documents\Confidentiels\PassPhrase").toUpper().Replace(' ','') } function Start-Playing { $Script:level=0 Remove-Item C:\Users\PowerQuest* -Recurse -Force -Confirm:$false 1..20 | ForEach-Object { Remove-LocalUser "PowerQuest$_" -ErrorAction SilentlyContinue } Remove-Item C:\Temp\.malus -Force -ErrorAction SilentlyContinue Disable-PasswordComplexity (New-Item C:\Temp\.malus -Force).Attributes = 'Hidden' icacls "C:\Temp\.malus" /grant Utilisateurs:F New-Item C:\Users\PowerQuest0\Documents -ItemType Directory -Force Build-Levels Get-Help PowerQuest } |