dimanche 13 juillet 2014

De l'intérêt des Metadata de Réplication lors d'audit Forensic Active Directory, Partie 2

Bonjour à tous.

Cet article fait suite à l'article De l'intérêt des Metadata de Réplication lors d'audit Forensic Active Directory, Partie 1

Nous avons vu très rapidement dans la première partie qu'il pouvait être intéressant d'analyser les Metadata de Réplication dans le cadre d'un audit Forensic Active Directory.

Avant d'entrer dans le détails de l'audit, nous allons aborder aujourd'hui les différentes méthodes pour récupérer les Metadata de Réplication. L'objectif étant bien évidemment d'automatiser au maximum la récupération de ces données.


Nous avons vu dans le 1er article que l'on peut utiliser l'outil Repadmin et plus particulièrement avec le paramètre Repadmin /Showobjmeta

Un exemple avec les metadata d'une OU :


Repadmin nous permet de récupérer très facilement les metadata pour un objet donné.

Par contre il est difficile à utiliser pour récupérer les metadata d'un nombre important d'objets.
De plus le format de sortie  impose un traitement assez conséquent pour avoir des informations exploitables.

On l'utilisera donc plutôt pour avoir les metadata d'un objet unique. On pourra s'en servir par exemple pour récupérer le timestamp et le DC d'origine d'une modification d'un attribut pour ensuite consulter les logs.


Nous allons voir maintenant un autre outil qui va nous permettre de récupérer les metadata de réplication.
C'est un outil généralement peu utilisé mais qui peut rendre bien des services, LDP.

Pour récupérer les metadata de réplication il suffit de se positionner sur l'objet et de faire un clic-droit puis Advanced et Replication Metadata


Et on affiche les metadata :


Le problème c'est que comme pour Repadmin, ce n'est pas facilement exploitable d'autant plus qu'avec ldp nous n'avons pas le nom des attributs...
On peut toutefois récupérer les informations sous une forme plus exploitable.
Pour ceci on peut effectuer une recherche sur l'objet et en spécifiant l'attribut msDS-ReplAttributeMetaData



Le format de sortie est de type DS_REPL_VALUE_META_DATA qui a une structure de type XML.

On peut de plus effectuer la recherche sur plusieurs objet.

Par exemple, en effectuant une recherche sur le conteneur Users pour tous les groupes.
Vous remarquerez que j'utilise ici l'attribut msDS-ReplValueMetaData et non msDS-ReplAttributeMetaData. C'est uniquement pour vous montrer que l'on peut récupérer les metadata de plusieurs objets. Je reviendrais en revanche en détail sur cet attribut dans un autre article puisqu'il est très intéressant pour l'audit des groupes.



On arrive donc a récupérer les informations de plusieurs objets dans un format plus exploitable (XML).
On a toutefois toujours besoin de retraitement pour exploiter les données.


On va désormais passer aux méthodes permettant de récupérer les metadata dans un format exploitable

On va commencer par utiliser la méthode GetReplicationMetadata de la classe DomainController


Voici le code utilisé:

$DomainName = "metadata.adds"
$ObjectDistinguishedName = ""
$DirectoryContext = new-object System.DirectoryServices.ActiveDirectory.DirectoryContext("Domain",$DomainName)
$DomainController = [System.DirectoryServices.ActiveDirectory.DomainController]::findOne($DirectoryContext)
$MetaData = $DomainController.GetReplicationMetadata($ObjectDistinguishedName)


On peut donc récupérer facilement les informations dans un format exploitable.
L'intérêt de cette méthode est qu'elle est simple à utiliser et ne nécessite pas l'utilisation du module Powershell ActiveDirectory.


On va maintenant voir une solution utilisant l'attribut msDS-ReplAttributeMetaData et le module Powershell ActiveDirectory.

J'ai fait une fonction relativement simple qui permet de récupérer ces informations en fournissant le DistinguishedName d'un objet  :



Voici le code de la fonction :

Function Get-ADObjectMetadata {
 Param(
        [Parameter(Mandatory=$true,Position=1)]
        [String] $ObjectDN
        )

    ### Chargement du module ActiveDirectory
    try { Import-Module ActiveDirectory |Out-Null}
    catch { Write-Warning "Cannot load ActiveDirectory module."; Break }

    $ADObject = Get-ADObject $ObjectDN -Properties "msDS-ReplAttributeMetaData"

    $ReplAttributeMetaData = $ADObject."msDS-ReplAttributeMetaData"
    $ReplAttributeMetaData = "<root>" + $ReplAttributeMetaData + "</root>"
    $ReplAttributeMetaData = $ReplAttributeMetaData.Replace([char]0," ")
    $ReplAttributeMetaData = [XML]$ReplAttributeMetaData
    $ReplAttributeMetaData = $ReplAttributeMetaData.root.DS_REPL_ATTR_META_DATA

    $TabObjectMetadata = @()

    $ReplAttributeMetaData | Foreach {
        $obj = New-Object psobject
        $obj |Add-Member -type NoteProperty -name AttributeName -value $_.pszAttributeName
        $obj |Add-Member -type NoteProperty -name Version -value $_.dwVersion
        $obj |Add-Member -type NoteProperty -name TimeLastOriginatingChange -value $_.ftimeLastOriginatingChange
        $obj |Add-Member -type NoteProperty -name usnOriginatingChange -value $_.usnOriginatingChange
        $obj |Add-Member -type NoteProperty -name usnLocalChange -value $_.usnLocalChange
        $obj |Add-Member -type NoteProperty -name LastOriginatingDsaDN -value $_.pszLastOriginatingDsaDN

        $TabObjectMetadata += $obj
        }

    return $TabObjectMetadata
    }

Encore une fois les données sont facilement exploitables.


Pour finir, Windows Server 2012 R2 (et Powershell 4.0) apporte de nombreuses Cmdlets.
Get-ADReplicationAttributeMetadata répond parfaitement à notre besoin en toute simplicité.



Je vais m’arrêter ici pour les différentes méthodes permettant de récupérer les metadata de réplication.
Nous verrons dans la suite l'attribut msDS-ReplValueMetaData et l'intérêt qu'il peut avoir dans un audit Forensic Active Directory.

Merci de m'avoir lu.
A la prochaine.

Aucun commentaire:

Enregistrer un commentaire