Extraire un champs en JSON dans Splunk pour Gophish

Bonjour à tous, aujourd’hui j’ai du réaliser un rapport d’une campagne de phishing réalisée avec Gophish. Vous me connaissez, je suis pas du genre à aimer bosser dans Excel, du coup j’ai mis les résultats directement dans Splunk. Gophish est un super outil mais il a un format de log chelou a base de CSV avec du Json dedans. Du coup, on regarder rapidement comment extraire un champs en JSON dans Splunk. Alors je ne parle pas de log en format entièrement en JSON, hein, je parle bien d’évènements de « normaux » (syslog, CSV, texte, etc) avec un champs en JSON au milieu. Par exemple, un log raw de Gophish ressemble à ça :

7,jean.dupont@geekeries.org,2020-11-03T14:36:52Z,Clicked Link,"{""payload"":{""rid"":[""fKteVMb""]},""browser"":{""address"":""12.34.56.78"",""user-agent"":""Mozilla/5.0 (Linux; U; Android 11; fr-fr; Mi MIX 2S Build/QKQ1.191828.002) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3579.141 Mobile Safari/537.36 XiaoMi/MiuiBrowser/12.42.1-g""}}"

On voit bien ici que le dernier élément du CSV (colonne « details » d’un export raw de Gophish) est un bon gros JSON des familles. Du coup c’est pas idéal à extraire en field extraction classique avec le source type et transform dans Splunk puisque le Json change fortement en fonction du type d’évènement. Bref, c’est un peu relou. Par contre, en search … Lire la suite

Auto élévation de privilèges en PowerShell

élévation de privilèges en PowerShell

Salut à tous, aujourd’hui on va s’intéresser au RunAs dans PowerShell, et plus particulièrement comment faire une élévation de privilèges en PowerShell. J’ai récemment eu besoin de distribuer un script à quelques utilisateurs, tous administrateur local de leur poste, pour qu’ils l’exécutent en tant qu’admin.

Je vous passe les détails, mais comme il n’y avait pas que des utilisateurs avancés en PowerShell, il me fallait un mode « clic-clic un peu propre » pour qu’ils lancent le script via un batch à la souris.

D’autant plus que le script jardine dans le registre et les fichiers système tout en utilisant des paramètres interactifs, en chemin relatif (puisqu’on ne sait pas où sur le poste nos utilisateurs vont exécuter le livrable). Et le tout sur des configuration de postes sécurisés qui ne me laissaient pas faire ce que je voulais via le traditionnel runas.exe.

Le diable est dans les détails… J’ai galéré un moment pour trouver un enchainement propre de mon .cmd et du .ps1, qui permet de s’affranchir des problématiques de chemin de fichiers, sans utiliser runas.exe.

Au final je m’en suis sortie comme ça.

Reconstruction du chemin dans le script CMD

C’est la partie la plus simple, vous … Lire la suite

Key=Value en regex, extraction en PowerShell

Key=Value en Regex

Salut à tous, aujourd’hui je vous propose un focus sur la capture de structures répétées type Key=Value en Regex (ou expression régulières). C’est pas bien compliqué mais il semble qu’il y en ai quelques uns qui ne soit pas au courant du comment faire (et pour ceux qui savent même pas les comment/quoi des regex c’est par ici).

Comme un bon exemple est toujours plus parlant voici le genre de structure qu’on veut extraire :

key1="valueA" key2="valueB" key3="valueC"

Celui qui débute avec les regex aura surement envie d’écrire une regex de ce type:

(key1=\".*\") (key2=\".*\") (key3=\".*\")

Sauf que cette expression de capture des Key=Value en Regex, en plus d’être peu optimisée, n’est pas généralisable. J’entends que si le texte à analyser ne contient pas toujours les mêmes clés et pas forcément le même nombre entre plusieurs lignes. Exemple où cela ne fonctionne plus :

key1="valueA" key2="valueB" key3="valueC"
key1="valueA" key3="valueB" key5="valueC" key0="valueC"
key2="valueB" key52="valueC"

Du coup, là, on va commencer à devoir faire de vraies expressions régulières.

Première optimisation

Déjà, il est souhaitable ne pas utiliser

(.*) # "n'importe quoi plusieurs fois"

mais lui préférer :

([^=]+)= #"Tout jusqu'à un caractère spécifique"

Deuxième optimisation

Plutôt que simplement des groupes de … Lire la suite

Get-Date en "locals" US – PowerShell

Get-Date en "locals" US

Salut à tous, aujourd’hui une brève astuce dont on a eu besoin au boulot : comment sortir un Get-Date en « locals » US (ou une autre timezone, hein). En tout cas un local différent de celui de votre console. Exemple, si je saisi dans ma console :

(Get-Date).tostring("MMM d HH:mm:ss")
déc. 12 15:17:04

Je me retrouve avec un bel accent bien français sur « é » de « décembre ».

Sauf que parfois souvent, on a besoin que le format de sortie soit homogène entre différentes machines sur tout un parc. Par exemple, quand toutes ces machines parlent à un unique SIEM (au hasard… Splunk ?). C’est beaucoup plus simple si le timestamp arrive dans le même pattern quelque soient les sources.

Et donc, comment qu’on fait pour sortir un Get-Date en « locals » US ? Tout simplement, comme ça :

$LocaleUS = New-Object System.Globalization.CultureInfo("en-US")
(Get-Date).tostring("MMM d HH:mm:ss",$LocaleUS)
Dec 12 15:22:22 

Vous la voulez en UTC votre date, en plus ? Histoire que tout le monde parle dans le même référentiel ? Rien de plus simple :

$Timestamp = ((Get-Date).ToUniversalTime()).tostring("MMM d HH:mm:ss",$LocaleUS)
Dec 2 14:24:46

Et voilà, c’est tout bête, mais c’est bien pratique dès que vos scripts … Lire la suite