2.1.2. Moteur malicious_powershell
2.1.2.1. Présentation
la détection des techniques d’exploitation offusquées, discrètes et sophistiquées
le désencodage de payloads encodés
la détection de Shellcodes polymorphes
Note
Codebreaker détecte les shellcodes destinés à des plate-formes Windows ou Linux en 32 et 64bits.
2.1.2.2. Événements générés
- dans l'interface principale nommée WEB UI du GCenter dans l'écran
`Alerts`
(l'interface principale nommée WEB UI est décrite dans la Présentation de l'interface graphique WEB UI).Pour visualiser les alertes; il faut sélectionner le filtre SHELLCODE et ainsi visualiser la liste des alertes : voir la présentation de l'Ecran `Alerts` de la web UI.En cliquant sur une alerte, les informations détaillées de cette alerte sont affichées :voir Codebreaker Powershell pour les Codebreaker Powershell.
- Dans l'interface Kibana UI : pour celaPour visualiser les alertes; il faut sélectionner le filtre SHELLCODE et ainsi visualiser la liste des alertes : voir la présentation de l'Ecran `Alerts` de la web UI.En cliquant sur une alerte, il faut sélectionner sur la commande
`Go hunting`
puis sélectionner la flèche à gauche de l'alerte.L'interface affiché est l'interface nommée Kibana UI (décrite dans la Présentation de l'interface graphique Kibana).Les informations détaillées de cette alerte sont visualisables en format tableau ou jason .Les informations détaillées de cette alerte sont affichées :voir Codebreaker Powershell pour les Codebreaker Powershell.
2.1.2.2.1. Codebreaker Shellcode
2.1.2.2.1.1. Exemple d'alerte Codebreaker Shellcode dans la webui
Les compteurs sont détaillées dans la Structure des données des logs Codebreaker Shellcode.
2.1.2.2.1.2. Exemple de log Codebreaker Shellcode
{
"_index": "codebreaker-2023.10.11-000164",
"_type": "_doc",
"_id": "kAP9HosBeBoubSygpAwN",
"_version": 1,
"_score": 1,
"_source": {
"encodings": [
{
"options": "EBX, 3, Mixed",
"count": 1,
"name": "Alpha"
}
],
"gcap": "gcap-xxxxxxxxx.domain.local",
"state": "Exploit",
"uuid": "e3f51d11-661d-4164-9ce6-3aade7d3cfd6",
"timestamp_analyzed": "2023-10-11T13:47:00.895Z",
"dest_port": "37644",
"type": "codebreaker",
"timestamp_detected": "2023-10-11T13:45:47.655Z",
"dest_ip": "X.X.X.X",
"src_port": "4242",
"event_type": "shellcode",
"MD5": "933b3f084048ca6...",
"severity": 1,
"@version": "1",
"calls": {
"0": {
"ret": "0",
"args": "{'filename': 'THIS IS SP... SHELLCODE !', 'argv': ['THIS IS SP... SHELLCODE !'], 'envp': []}",
"call": "sys_execve"
},
"stop": "End of shellcode (Exit)"
},
"flow_id": "2046395805270250",
"gcenter": "gcenter-xxx.domain.local",
"SHA256": "5017d890b00903bba30a692e673b6ba740642bad846d4f9a6ac63f3a1551a502",
"file_id": "10-11-2023T13:46:56_b2b0c75...9c_gcap-xxxxxxxxx.domain.local",
"src_ip": "X.X.X.X",
"sub_type": "Linux_x86_32",
"@timestamp": "2023-10-11T13:47:00.895Z"
},
"fields": {
"calls.0.ret": [
"0"
],
"calls.stop": [
"End of shellcode (Exit)"
],
"type": [
"codebreaker"
],
"uuid": [
"e3f51d11-661d-4164-9ce6-3aade7d3cfd6"
],
"calls.0.args": [
"{'filename': 'THIS IS SP... SHELLCODE !', 'argv': ['THIS IS SP... SHELLCODE !'], 'envp': []}"
],
"calls.0.call": [
"sys_execve"
],
"src_ip": [
"X.X.X.X"
],
"event_type": [
"shellcode"
],
"sub_type": [
"Linux_x86_32"
],
"flow_id": [
2046395805270250
],
"@version": [
"1"
],
"state": [
"Exploit"
],
"dest_port": [
37644
],
"severity": [
1https://10.2.19.128/ui/home/main
],
"gcenter": [
"gcenter-xxx.domain.local"
],
"timestamp_detected": [
"2023-10-11T13:45:47.655Z"
],
"SHA256": [
"5017d890b00903bba30a692e673b6ba740642bad846d4f9a6ac63f3a1551a502"
],
"src_port": [
4242
],
"@timestamp": [
"2023-10-11T13:47:00.895Z"
],
"dest_ip": [
"X.X.X.X"
],
"file_id": [
"10-11-2023T13:46:56_b2b0c75...9c_gcap-xxxxxxxxx.domain.local"
],
"encodings.count": [
1
],
"gcap": [
"gcap-xxxxxxxxx.domain.local"
],
"timestamp_analyzed": [
"2023-10-11T13:47:00.895Z"
],
"encodings.options": [
"EBX, 3, Mixed"
],
"encodings.name": [
"Alpha"
],
"MD5": [
"933b3f084048ca6..."
]
}
}
2.1.2.2.1.3. Structure des données des logs Codebreaker Shellcode
Les logs sont composés de différentes parties :
la partie entête
la partie source définie par "_source"
la partie champs définie par "_fields"
La partie entête des logs Codebreaker Shellcode
La partie entête contient :
{
"_index": "codebreaker-2023.10.11-000164",
"_type": "_doc",
"_id": "kAP9HosBeBoubSygpAwN",
"_version": 1,
"_score": 1,
Champ |
Requis |
Description |
Valeurs ou exemple |
---|---|---|---|
_index |
Oui |
Index interne |
codebreaker-2023.10.11-000164 |
_type |
Oui |
type par défault |
_doc |
_id |
Oui |
identifiant interne |
kAP9HosBeBoubSygpAwN |
_version |
Oui |
version interne |
1 |
_score |
Oui |
pertinence de la réponse par rapport à la requête |
1 |
La partie source des logs Codebreaker Shellcode
La partie source définie par "_source" contient :
"_source": {
"encodings": [
{
"options": "EBX, 3, Mixed",
"count": 1,
"name": "Alpha"
}
],
"gcap": "gcap-xxxxxxxxx.domain.local",
"state": "Exploit",
"uuid": "e3f51d11-661d-4164-9ce6-3aade7d3cfd6",
"timestamp_analyzed": "2023-10-11T13:47:00.895Z",
"dest_port": "37644",
"type": "codebreaker",
"timestamp_detected": "2023-10-11T13:45:47.655Z",
"dest_ip": "X.X.X.X",
"src_port": "4242",
"event_type": "shellcode",
"MD5": "933b3f084048ca6...",
"severity": 1,
"@version": "1",
"calls": {
"0": {
"ret": "0",
"args": "{'filename': 'THIS IS SP... SHELLCODE !', 'argv': ['THIS IS SP... SHELLCODE !'], 'envp': []}",
"call": "sys_execve"
},
"stop": "End of shellcode (Exit)"
},
"flow_id": "2046395805270250",
"gcenter": "gcenter-xxx.domain.local",
"SHA256": "5017d890b00903bba30a692e673b6ba740642bad846d4f9a6ac63f3a1551a502",
"file_id": "10-11-2023T13:46:56_b2b0c75...9c_gcap-xxxxxxxxx.domain.local",
"src_ip": "X.X.X.X",
"sub_type": "Linux_x86_32",
"@timestamp": "2023-10-11T13:47:00.895Z"
},
Champ |
Requis |
Description |
Valeurs ou exemple |
---|---|---|---|
@timestamp |
Oui |
Timestamp analyzed |
2023-10-11T13:47:00.895Z |
@version |
oui |
version du document |
1 |
calls |
Oui |
Catégorie calls voir le Tableau récapitulatif des compteurs de la catégorie "calls" |
|
dest_ip |
Oui |
Adresse IP de destination |
x.x.x.x |
Description (dans webui) |
oui |
Champ description sur la menace. Uniquement present dans la web ui |
Les adversaires peuvent abuser des interprètes de commande et de script pour exécuter des commandes, des scripts ou des binaires... |
dest_port |
Non |
Port de destination |
37644 |
encodings |
oui |
Catégorie encodings voir le Tableau récapitulatif des compteurs de la catégorie "Encodings" |
1 |
event_type (Alert type dans webui) |
Oui |
Type d’exploit |
shellcode |
file_id |
Oui |
Catégorie fileinfo: Identifiant du fichier |
0-11-2023T13:46:56_b2b0c75...9c_gcap-xxxxxxxxx.domain.local |
flow_id |
Oui |
Identifiant unique du flux. Permet de retrouver le fileinfo associé |
2046395805270250 |
gcap |
Oui |
Nom du gcap associé à l’alerte |
gcap-xxx.domain.local |
gcenter |
Oui |
Nom du GCenter associé à l’alerte. |
gcenter-xxx.domain.local |
Hostname (webui) |
oui |
Nom de l’hôte de l’émetteur de la menace |
En cas absence du hostname, c'est son IP qui est affiché |
MD5 |
Oui |
Hash MD5 du fichier analysé |
933b3f084048ca6... |
MITRE ASSOCIATIONS |
oui |
Catégorie MITRE de la menace |
Execution |
Name dans webui |
Oui |
somme des informations des champs state + sub_type + MD5 + SHA256 |
Execution : Command and Scripting Interpreter
Persistence : Hijack Execution Flow
Privilege Escalation : Hijack Execution Flow
Defense Evasion : Hijack Execution Flow
|
severity |
Oui |
Code du résultat de l’analyse. |
Compris entre 0 et 3.
0=clean, 1=infected, 2=suspicious, 3=Other
|
SHA256 |
Oui |
Hash SHA256 du fichier analysé |
5017d890b00903bb... |
src_ip |
Oui |
Adresse IP source |
X.X.X.X |
src_port |
Oui |
Port source |
4242 |
state |
Oui |
Résultat de l’analyse par codebreaker (Exploit, Suspicious) |
Exploit |
sub_type |
Oui |
Le sous-type du fichier (Windows_x86_32, Linux_x86_32)
Le système d’exploitation lié à l’exécutable si c’est un shellcode.
|
Linux_x86_32 |
timestamp analyzed |
Oui |
Date et heure de la dernière analyse du fichier |
2023-10-11T13:47:00.895Z |
timestamp detected |
Oui |
Date et heure de la première capture du fichier |
2023-10-11T13:45:47.655Z |
type |
Oui |
Type d’événement |
codebreaker |
uuid ou id |
Oui |
Identifiant unique de l’alerte |
e3f51d11-661d-4164-9ce6-3aade7d3cfd6 |
Champ |
Requis |
Description |
Valeurs ou exemple |
---|---|---|---|
return |
Oui |
Code de retour de l’appel système utilisé |
0 |
args |
Oui |
Arguments de l’appel système utilisé |
{'filename': 'THIS IS SP... SHELLCODE !', 'argv': ['THIS IS SP... SHELLCODE !'], 'envp': []} |
call |
Oui |
Nom de l’appel système utilisé |
sys_execve |
stop |
Oui |
Marque la fin des appels systèmes du shellcode (End of shellcode, End of shellcode (Exit)) |
End of shellcode (Exit) |
index |
oui |
Index interne |
0 |
Champ |
Requis |
Description |
Valeurs ou exemple |
---|---|---|---|
encodings.count |
oui |
Nombre d’encodages successif |
1 |
encodings.name |
oui |
Nom de l’encodage |
1 |
encodings.options |
oui |
Options d’encodage |
EBX, 3, Mixed |
La partie champs des logs Codebreaker Shellcode
La partie champs définie par "fields" contient les même compteurs que dans la partie source: se référer à la section partie source
2.1.2.2.2. Codebreaker Powershell
2.1.2.2.2.1. Exemple d'alerte Codebreaker Powershell dans la webui
Les compteurs sont détaillées dans la partie Structure des données des logs Codebreaker Powershell.
2.1.2.2.2.2. Exemple de log Codebreaker Powershell
{
"_index": "codebreaker-2023.10.11-000164",
"_type": "_doc",
"_id": "EAP8HosBeBoubSygnQy_",
"_version": 1,
"_score": 1,
"_source": {
"gcap": "gcap-xxxxxxxxx.domain.local",
"event_type": "powershell",
"state": "Exploit",
"severity": 1,
"MD5": "01c0d252b17e794fd7007fd46ec469c0",
"@version": "1",
"flow_id": "2061844798658535",
"scores": {
"proba_obfuscated": 1,
"analysis_detailed": {
"FmtStr": 198,
"StrReplace": 0,
"StartBitsTransfer": 0,
"GetContent": 0,
"CharInt": 16,
"InvokeExpression": 0,
"WebClientInvokation": 0,
"StreamWriter": 0,
"AddContent": 0,
"StrJoin": 0,
"StreamReader": 0,
"SystemIOFile": 0,
"InvokeWebRequest": 0,
"InvokeRestMethod": 0,
"Base64": 0,
"StrCat": 28,
"SetContent": 0
},
"analysis": 242
},
"dest_port": "57244",
"SHA256": "dc6b2982353692543ad03c7e87e667d916564e5eccfef97acce877aa4d5fd3fc",
"uuid": "9a1333a3-e864-478e-88ae-f9823623dfec",
"file_id": "10-11-2023T13:45:46...32_gcap-xxxxxxxxx.domain.local",
"type": "codebreaker",
"src_ip": "X.X.X.X",
"timestamp_analyzed": "2023-10-11T13:45:53.836Z",
"timestamp_detected": "2023-10-11T13:44:46.022Z",
"gcenter": "gcenter-xxx.domain.local",
"dest_ip": "X.X.X.X",
"sub_type": "powershell",
"src_port": "4242",
"@timestamp": "2023-10-11T13:45:53.836Z"
},
"fields": {
"scores.analysis_detailed.SystemIOFile": [
0
],
"scores.analysis_detailed.Base64": [
0
],
"scores.analysis_detailed.StreamWriter": [
0
],
"type": [
"codebreaker"
],
"uuid": [
"9a1333a3-e864-478e-88ae-f9823623dfec"
],
"scores.analysis_detailed.WebClientInvokation": [
0
],
"src_ip": [
"X.X.X.X"
],
"scores.analysis_detailed.StrReplace": [
0
],
"event_type": [
"powershell"
],
"scores.analysis_detailed.InvokeRestMethod": [
0
],
"sub_type": [
"powershell"
],
"flow_id": [
2061844798658535
],
"@version": [
"1"
],
"state": [
"Exploit"
],
"dest_port": [
57244
],
"scores.analysis_detailed.InvokeWebRequest": [
0
],
"severity": [
1
],
"scores.analysis_detailed.FmtStr": [
198
],
"scores.analysis_detailed.StreamReader": [
0
],
"gcenter": [
"gcenter-xxx.domain.local"
],
"scores.analysis_detailed.SetContent": [
0
],
"scores.proba_obfuscated": [
1
],
"timestamp_detected": [
"2023-10-11T13:44:46.022Z"
],
"scores.analysis_detailed.GetContent": [
0
],
"SHA256": [
"dc6b2982353692543ad03c7e87e667d916564e5eccfef97acce877aa4d5fd3fc"
],
"src_port": [
4242
],
"scores.analysis_detailed.StrCat": [
28
],
"@timestamp": [
"2023-10-11T13:45:53.836Z"
],
"scores.analysis_detailed.AddContent": [
0
],
"dest_ip": [
"X.X.X.X"
],
"file_id": [
"10-11-2023T13:45:46...32_gcap-xxxxxxxxx.domain.local"
],
"scores.analysis_detailed.StrJoin": [
0
],
"scores.analysis_detailed.InvokeExpression": [
0
],
"gcap": [
"gcap-xxxxxxxxx.domain.local"
],
"timestamp_analyzed": [
"2023-10-11T13:45:53.836Z"
],
"scores.analysis": [
242
],
"scores.analysis_detailed.StartBitsTransfer": [
0
],
"scores.analysis_detailed.CharInt": [
16
],
"MD5": [
"01c0d252b17e794fd7007fd46ec469c0"
]
}
}
2.1.2.2.2.3. Structure des données des logs Codebreaker Powershell
Les logs sont composés de différentes parties :
la partie entête
la partie source définie par "_source"
la partie champs définie par "_fields"
La partie entête des logs Codebreaker Powershell
La partie entête contient :
{
"_index": "codebreaker-2023.10.11-000164",
"_type": "_doc",
"_id": "EAP8HosBeBoubSygnQy",
"_version": 1,
"_score": 1,
Champ |
Requis |
Description |
Valeurs ou exemple |
---|---|---|---|
_index |
Oui |
Index interne |
codebreaker-2023.10.11-000164 |
_type |
Oui |
type par défault |
_doc |
_id |
Oui |
identifiant interne |
EAP8HosBeBoubSygnQy |
_version |
Oui |
version interne |
1 |
_score |
Oui |
pertinence de la réponse par rapport à la requête |
1 |
La partie source des logs Codebreaker Powershell
La partie source définie par "_source" contient :
"_source": {
"gcap": "gcap-xxxxxxxxx.domain.local",
"event_type": "powershell",
"state": "Exploit",
"severity": 1,
"MD5": "01c0d252b17e794fd7007fd46ec469c0",
"@version": "1",
"flow_id": "2061844798658535",
"scores": {
"proba_obfuscated": 1,
"analysis_detailed": {
"FmtStr": 198,
"StrReplace": 0,
"StartBitsTransfer": 0,
"GetContent": 0,
"CharInt": 16,
"InvokeExpression": 0,
"WebClientInvokation": 0,
"StreamWriter": 0,
"AddContent": 0,
"StrJoin": 0,
"StreamReader": 0,
"SystemIOFile": 0,
"InvokeWebRequest": 0,
"InvokeRestMethod": 0,
"Base64": 0,
"StrCat": 28,
"SetContent": 0
},
"analysis": 242
},
"dest_port": "57244",
"SHA256": "dc6b2982353692543ad03c7e87e667d916564e5eccfef97acce877aa4d5fd3fc",
"uuid": "9a1333a3-e864-478e-88ae-f9823623dfec",
"file_id": "10-11-2023T13:45:46...32_gcap-xxxxxxxxx.domain.local",
"type": "codebreaker",
"src_ip": "X.X.X.X",
"timestamp_analyzed": "2023-10-11T13:45:53.836Z",
"timestamp_detected": "2023-10-11T13:44:46.022Z",
"gcenter": "gcenter-xxx.domain.local",
"dest_ip": "X.X.X.X",
"sub_type": "powershell",
"src_port": "4242",
"@timestamp": "2023-10-11T13:45:53.836Z"
},
Champ |
Requis |
Description |
Valeurs ou exemple |
---|---|---|---|
gcap |
Oui |
Nom du gcap associé à l’alerte |
gcap-xxx.domain.local |
event_type |
Oui |
Type d’exploit |
powershell |
state |
Oui |
Résultat de l’analyse par codebreaker (Exploit, Suspicious) |
Exploit |
severity |
Oui |
Code du résultat de l’analyse |
Compris entre 0 et 3
0=clean, 1=infected, 2=suspicious, 3=Other
|
MD5 |
Oui |
Hash MD5 du fichier analysé |
01c0d252b17e794fd7007fd46ec469c0 |
@version |
oui |
version du document |
1 |
flow_id |
Oui |
Identifiant unique du flux. Permet de retrouver le fileinfo associé |
2061844798658535 |
scores |
Oui |
voir le Tableau récapitulatif des compteurs de catégorie "scores" |
|
dest_port |
Oui |
Port de destination |
57244 |
SHA256 |
Oui |
Hash SHA256 du fichier analysé |
dc6b2982353692543ad03c7e87e667... |
uuid |
Oui |
Identifiant unique de l’alerte |
9a1333a3-e864-478e-88ae-f9823623dfec |
file_id |
Oui |
Catégorie fileinfo: Identifiant du fichier |
10-11-2023T13:45:46...32_gcap-xxxxxxxxx.domain.local |
type |
Oui |
Type d’événement |
codebreaker |
src_ip |
Oui |
Adresse IP source |
X.X.X.X |
timestamp analyzed |
Oui |
Date et heure de la dernière analyse du fichier |
2023-10-11T13:45:53.836Z |
timestamp detected |
Oui |
Date et heure de la première capture du fichier |
2023-10-11T13:44:46.022Z |
gcenter |
Oui |
Nom du GCenter associé à l’alerte. |
gcenter-xxx.domain.local |
dest_ip |
Oui |
Adresse IP de destination |
x.x.x.x |
sub_type |
Oui |
Le sous-type du fichier |
powershell |
src_port |
Oui |
Port source |
4242 |
@timestamp |
Oui |
Timestamp analyzed |
2023-10-11T13:45:53.836Z |
Champ |
Requis |
Description |
Valeurs ou exemple |
---|---|---|---|
proba_obfuscated |
Oui |
Probabilité que le powershell soit offusqué. Valeur entre 0 et 1 |
1 |
analysis_detailed |
Oui |
analyse détaillée. Elle comprends les compteurs suivants: |
|
FmtStr |
Oui |
Catégorie scores/analysis_detailed
Score représenté par un entier d’un/des patterns fmtstr détectés
|
198 |
StrReplace |
Oui |
Catégorie scores/analysis_detailed
Score représenté par un entier d’un/des patterns strreplace détectés
|
0 |
StartBitsTransfer |
Oui |
Catégorie scores/analysis_detailed
Commande Start-BitsTransfer
|
0 |
GetContent |
Oui |
Catégorie scores/analysis_detailed
Applet Get-Content pour lire les données du fichier
|
0 |
CharInt |
Oui |
Catégorie scores/analysis_detailed
Score représenté par un entier d’un/des patterns charint détectés
|
16 |
InvokeExpression |
Oui |
Catégorie scores/analysis_detailed
Applet InvokeExpression
|
0 |
WebClientInvokation |
Oui |
Catégorie scores/analysis_detailed
Score représenté par un entier d’un/des patterns webclientinvokation détectés
|
0 |
StreamWriter |
Oui |
Catégorie scores/analysis_detailed
Écrire un fichier qui répertorie les répertoires
|
0 |
AddContent |
Oui |
Catégorie scores/analysis_detailed
Ajoute du contenu à un fichier / dossier
|
0 |
StrJoin |
Oui |
Catégorie scores/analysis_detailed
Score représenté par un entier d’un/des patterns strjoin détectés
|
0 |
StreamReader |
Oui |
Catégorie scores/analysis_detailed
Objet pour lire et afficher chaque nom de répertoire
|
0 |
SystemIOFile |
Oui |
Catégorie scores/analysis_detailed
Manipulation d’un fichier (création, ouverture, copie…)
|
0 |
InvokeWebRequest |
Oui |
Catégorie scores/analysis_detailed
L'applet Invoke-WebRequest envoie des requêtes HTTP et HTTPS à une page Web
|
0 |
Base64 |
Oui |
Catégorie scores/analysis_detailed
Score représenté par un entier d’un/des patterns base64 détectés
|
0 |
StrCat |
Oui |
Catégorie scores/analysis_detailed
Fonction qui concatène des chaînes
|
28 |
SetContent |
Oui |
Catégorie scores/analysis_detailed
Applet SetContent écrit du nouveau contenu ou remplace le contenu existant dans un fichier
|
0 |
analysis |
Oui |
Catégorie scores |
242 |
La partie champs des logs Codebreaker Powershell
La partie champs définie par "fields" contient les même compteurs que dans la partie source: se référer à la section partie source
2.1.2.3. Visualisation de l'état de Codebreaker
La visualisation de l'état courant du moteur est donnée dans l'Ecran `Health checks` de la web UI.