logo Homepage
+  NewbieContest
|-+  Programmation» Autres langages» Auto-élévation Powershell
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: Auto-élévation Powershell  (Lu 11042 fois)
Vex

Profil challenge

Classement : 3527/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 5


Voir le profil
« le: 27 Avril 2017 à 15:50:55 »

Bonjour bonsoir,

Je viens vers vous car j'ai un petit problème sur un script Powershell.
Mes connaissances en powershell sont limitée (pour l'instant) donc ce point m'embête vraiment.

J'ai fais un script qui change une valeur dans le registre de windows, ce qui inclut que le script doit être exécute en administrateur.

Le hic, c'est que je veux balancer ce script à plusieurs utilisateur du domaine qui n'ont pas les accès (ni en local ni du domaine) d'administrateur.

Voilà l'idée que j'avais: Faire un script qui fait une auto-élévation avec des IDs pré-enregistrés pour qu'ils n'apparaissent pas en clair dans le script.

Pour l'auto-élévation, j'ai trouvé pas mal de topic sur plein de forums différents:

https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.security/get-credential
https://blogs.msdn.microsoft.com/virtual_pc_guy/2010/09/23/a-self-elevating-powershell-script/
http://web.archive.org/web/20160822030847/http://geekswithblogs.net/Lance/archive/2007/02/16/106518.aspx
https://blog.kloud.com.au/2016/04/21/using-saved-credentials-securely-in-powershell-scripts/
https://social.technet.microsoft.com/Forums/windows/en-US/132e170f-e3e8-4178-9454-e37bfccd39ea/startprocess-verb-runas-credential?forum=winserverpowershell
http://stackoverflow.com/questions/6239647/using-powershell-credentials-without-being-prompted-for-a-password
http://stackoverflow.com/questions/7690994/powershell-running-a-command-as-administrator

(liste non-exhaustive, ce sont que ceux que j'ai gardé sous la main)

Mais c'est là que le manque de connaissance apparaît. Enfin, juste pour dire que j'ai fait tout de même quelques recherches..

J'arrive à faire l'auto-élévation, le problème c'est que j'aimerais que ça fasse pas de bannière de demande d'ID mais que ça prennent ceux que j'aurais éventuellement pré-enregistré, pour que l'auto-élévation ne se fasse pas en clair devant l'utilisateur.

J'avais donc commencé à faire ça:
Code:

$username = "nomDomaine\UserDomaine"
$password = cat C:\testsecure.txt | convertto-securestring #mon mdp que j'ai stocké en utilisant "read-host -assecurestring | convertfrom-securestring | out-file C:\testsecure.txt"
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password

Start-Process powershell -Verb runAs -ArgumentList $cred


###########################################################################
#mon script

Clear-Host
Write-host '#############################################################################' -ForegroundColor Blue
Write-host 'Script version : 0.1' -ForegroundColor Gray
Write-host 'Auteur : Vex' -ForegroundColor Gray
Write-host 'Actions du script :' -ForegroundColor Gray
Write-host '- Active/Désactive protocole RDP' -ForegroundColor Gray
Write-host '#############################################################################' -ForegroundColor Blue
Write-host 'ChangeLog :' -ForegroundColor Gray
Write-host 'Version 0.1 : Création & tests du script' -ForegroundColor Gray
Write-host '#############################################################################' -ForegroundColor Blue

$Path = "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server"

$Name = "fDenyTSConnections"

$value = (Get-ItemProperty -Path $Path -Name $Name).$Name

if($value -eq 0)
{
    Set-ItemProperty -Path $Path -Name $Name -Value 1
    Write-Host "Connexions RDP refusées" -ForegroundColor Red
}
else
{
    Set-ItemProperty -Path $Path -Name $Name -Value 0
    Write-Host "Connexions RDP Autorisées" -ForegroundColor Green
}
###########################################################################

Write-Host -NoNewLine "Press any key to continue..."
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

Journalisée
the lsd
Administrateur

Profil challenge

Classement : 189/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #1 le: 27 Avril 2017 à 21:35:32 »

Alors, sur la partie powershell, je pourrais pas aider plus que ça, par contre, sur la partie logique du script, tu me fais peur :

1/ tu as quand même un fichier avec un pass admin (local ou AD, osef). Même s'il est chiffré, c'est pas très grave.
2/ le script qui est exécuté va se donner des droits admins

Tu me donnes 2mn sur ton poste et je suis roi du monde hein Même si les droits sont bien mis sur les deux fichiers, il suffit de démarrer la bécane sur un live CD pour récupérer le fichier contenant le pass admin et de péter le chiffrement, ou alors de modifier le script pour -au hasard- balancer une commande powershell qui ajoute le user courant dans le groupe admin. Tu fais comme tu le sens hein, mais si tu fais ça, donne moi l'adresse de ta boite, je t'envoie un devis pour un pentest ^^

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
S0410N3
Administrateur

Profil challenge

Classement : 10/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1260


Voir le profil WWW
« #2 le: 28 Avril 2017 à 05:40:30 »

Vu que tu parles de domaine j'imagine que tu as un Active Directory.
Si tu pousses ton script par GPO inutile que tes users aient les droits admin. Après avec un script powershell c'est un poil chiant souvent. Par défaut l'exécution est désactivée sur les postes pour des raisons de sécurité.

Cela dit il y a mieux et ça s'appelle les stratégies de préférences, toujours dans les GPO.
Tu as la possibilité par là de modifier, créer, etc. le registre (et plein d'autres choses).
 
Au passage il y a aussi des stratégies pour configurer directement les accès terminal server.
C'est normalement ce que tu devrais utiliser si je comprends bien ce que fait ton script.

Bref pas mal de façons de faire
Journalisée

Enjoy (copyleft de quelqu'un qui a trop parlé)

S0410N3

-------------------------------------------------------------------------------------
La folie est le prix à payer pour le temps passé à être trop lucide.
-------------------------------------------------------------------------------------
http://forum.hardware.fr/hfr/Discussions/Societe/francais-repere-repaire-sujet_19265_1.htm
Vex

Profil challenge

Classement : 3527/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 5


Voir le profil
« #3 le: 28 Avril 2017 à 07:19:52 »

Citation
Tu me donnes 2mn sur ton poste et je suis roi du monde hein  Même si les droits sont bien mis sur les deux fichiers, il suffit de démarrer la bécane sur un live CD pour récupérer le fichier contenant le pass admin et de péter le chiffrement, ou alors de modifier le script pour -au hasard- balancer une commande powershell qui ajoute le user courant dans le groupe admin. Tu fais comme tu le sens hein, mais si tu fais ça, donne moi l'adresse de ta boite, je t'envoie un devis pour un pentest ^^

Je sais bien que c'est pas sécurisé du tout, mais pour l'instant j'ai pas de soucis de sécurité vu que le script ne fonctionne même pas 

Citation
Si tu pousses ton script par GPO inutile que tes users aient les droits admin. Après avec un script powershell c'est un poil chiant souvent. Par défaut l'exécution est désactivée sur les postes pour des raisons de sécurité.
Citation
Tu as la possibilité par là de modifier, créer, etc. le registre (et plein d'autres choses).

Le script agis sur une clef registre, donc même en le poussant par GPO, ils ont besoin à minima des droits d'admin local pour que le script fonctionne, non ?

Après vous avoir lu j'en viens à penser que c'est certainement pas la bonne solution, je penses que je vais me pencher sur autre chose alors 

Tout de même, si quelqu'un passe sur ce post et trouve une solution, voici ce sur quoi je me suis arrêté hier, ça touche presque au but .. :

Script qui lance un script en admin:
Code:
$passwd = Read-Host "Enter password" -AsSecureString
$encpwd = ConvertFrom-SecureString $passwd
$encpwd > C:\Users\Vex\Desktop\password.bin
$script = C:\Users\Vex\Desktop\Test_Admin.ps1

$encpwd = Get-Content C:\Users\Vex\Desktop\password.bin
$passwd = ConvertTo-SecureString $encpwd
$cred = New-Object System.Management.Automation.PSCredential 'FLOPCP117\Administrateur',$passwd
#Start-Process PowerShell -verb runAs -Cred $cred -ArgumentList '-noexit', 'C:\Users\Vex\Desktop\Test_Admin.ps1'
#Start-Process powershell -Credential $cred -ArgumentList '-noexit', '-command &{Start-Process -FilePath ''C:\Users\Vex\Desktop\Test_Admin.ps1'' -verb runas}'
Start-Process powershell -Credential $cred -ArgumentList '-noprofile -command &{Start-Process $script -verb runas}'

@the_lsd ne crie pas, je sais je sais, c'est pas sécurisé 
Le script lancé:
Code:
Clear-Host
Write-host '#############################################################################' -ForegroundColor Blue
Write-host 'Script version : 0.1' -ForegroundColor Gray
Write-host 'Auteur : Vex' -ForegroundColor Gray
Write-host 'Actions du script :' -ForegroundColor Gray
Write-host '- Active/Désactive protocole RDP' -ForegroundColor Gray
Write-host '#############################################################################' -ForegroundColor Blue
Write-host 'ChangeLog :' -ForegroundColor Gray
Write-host 'Version 0.1 : Création & tests du script' -ForegroundColor Gray
Write-host '#############################################################################' -ForegroundColor Blue

$Path = "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server"

$Name = "fDenyTSConnections"

$value = (Get-ItemProperty -Path $Path -Name $Name).$Name

if($value -eq 0)
{
    Set-ItemProperty -Path $Path -Name $Name -Value 1
    Write-Host "Connexions RDP refusées" -ForegroundColor Red
}
else
{
    Set-ItemProperty -Path $Path -Name $Name -Value 0
    Write-Host "Connexions RDP Autorisées" -ForegroundColor Green
}
Read-Host
Journalisée
S0410N3
Administrateur

Profil challenge

Classement : 10/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1260


Voir le profil WWW
« #4 le: 28 Avril 2017 à 07:56:27 »

Citation
Le script agis sur une clef registre, donc même en le poussant par GPO, ils ont besoin à minima des droits d'admin local pour que le script fonctionne, non ?

Bah je ne sais pas tu touches au HKLM donc là ça serait sur une GPO machine, pas utilisateur.
Pour un script sur une GPO utilisateur effectivement tu aurais aussi le problème de droits a priori, surtout pour taper sur HKLM.

Si tu modifies le HKCU c'est effectivement différent mais pour ça il y a les stratégies de préférences dans les GPO utilisateurs... pas besoin de passer par un script.
Il en va de même pour le HKLM si je n'ai pas été clair sauf que là c'est dans les stratégies de préférences machine.
Au passage tu peux définir du ciblage directement dessus, par user machine ou autre. Pas besoin de créer une OU spécifique.

Après je cite des façons de faire mais le mieux c'est d'utiliser les stratégies prévues pour terminal server comme je l'ai déjà dit sans se soucier de tout ça
Journalisée

Enjoy (copyleft de quelqu'un qui a trop parlé)

S0410N3

-------------------------------------------------------------------------------------
La folie est le prix à payer pour le temps passé à être trop lucide.
-------------------------------------------------------------------------------------
http://forum.hardware.fr/hfr/Discussions/Societe/francais-repere-repaire-sujet_19265_1.htm
Pages: [1]
  Imprimer  
 
Aller à: