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
}