# [SOC] YARA

## Introduction

Le **YARA** est un langage pour écrire des règles de détection de malware.

Il s'agit d'un langage simple et descriptif qui est adopté par le grand public.

Il est découpé par section qui ont chacune leur utilité.

![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-05/scaled-1680-/iSAimage.png)

## Source

- [TryHackMe - Yara](https://tryhackme.com/r/room/yara)
- [Cuckoosandbox - Sandbox pour tester vos règles Yara](https://github.com/cuckoosandbox)
- [PEfile - Scan les exécutables Windows PE ](https://github.com/erocarrera/pefile)

## Annexes

- [Github - Awesome Yara](https://github.com/InQuest/awesome-yara)
- [Valhalla - Base de règles Yara Opensource](https://valhalla.nextron-systems.com/)

## Anatomie d'une règle

[![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-05/scaled-1680-/EANimage.png)](https://wiki.neopipe.fr/uploads/images/gallery/2024-05/EANimage.png)

## Manuel

#### Installation

```bash
apt install -y yara
```

#### Meta

Cette section permet de donner des informations complémentaires qui ne seront pas interprêtés comme le ferait un commentaire dans du code.

Par exemple on peut utiliser le mot-clé **desc**, pour donner une description à notre règle afin qu'elle soit plus explicite pour les utilisateurs.

#### Strings

Cette section permet de détecter des chaînes de caractères présente dans les fichiers.

Voici un exemple d'utilisation :

```
rule helloworld_checker{
	strings:
		$hello_world = "Hello World!"

	condition:
		$hello_world
}
```

On peut aussi détecter des chaînes multiples :

```
rule helloworld_checker{
	strings:
		$hello_world = "Hello World!"
		$hello_world_lowercase = "hello world"
		$hello_world_uppercase = "HELLO WORLD"

	condition:
		any of them
}
```

#### Opérateurs

Comme dans les langages de programmation traditionnels, on peut utiliser des opérateurs pour nos conditions :

```
rule helloworld_checker{
	strings:
		$hello_world = "Hello World!"

	condition:
        #hello_world <= 10
}
```

<table border="1" id="bkmrk-op%C3%A9rateurs-descripti" style="border-collapse: collapse; width: 100%; height: 119.2px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">**Opérateurs**  
</td><td class="align-center" style="height: 29.8px;">**Descriptions**  
</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">&lt;=  
</td><td class="align-center" style="height: 29.8px;">Plus petit ou égal  
</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">&gt;=  
</td><td class="align-center" style="height: 29.8px;">Plus grand ou égal  
</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">!=  
</td><td class="align-center" style="height: 29.8px;">Différent de  
</td></tr></tbody></table>

#### Combinaisons

On peut utiliser les mot-clés suivants pour combiner nos conditions :

<table border="1" id="bkmrk-mot-cl%C3%A9s-description" style="border-collapse: collapse; width: 100%; height: 119.2px;"><colgroup><col style="width: 50.0618%;"></col><col style="width: 50.0618%;"></col></colgroup><tbody><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">**Mot-clés**  
</td><td class="align-center" style="height: 29.8px;">**Descriptions**  
</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">and  
</td><td class="align-center" style="height: 29.8px;">Les deux conditions doivent être valides  
</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">or  
</td><td class="align-center" style="height: 29.8px;">Au moins l'une des deux conditions doit être valide  
</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">not  
</td><td class="align-center" style="height: 29.8px;">Inverse la condition (true devient false et false devient true)  
</td></tr></tbody></table>

Voici un exemple pour vérifier si la chaîne est présente et si la taille du fichier est inférieure à 10KB :

```
rule helloworld_checker{
	strings:
		$hello_world = "Hello World!" 
        
        condition:
	        $hello_world and filesize < 10KB 
}
```

#### Lancer le scan

```bash
yara <RULE>.yar <FILE_TO_SCAN>
```

<p class="callout success">Si la règle match, la commande renverra le nom de la règle qui a matchée ainsi que le nom du fichier qui a matché.</p>

#### Scanners d'IOC basés sur Yara

- [Loki](https://github.com/Neo23x0/Loki/releases)
- [THOR](https://www.nextron-systems.com/thor-lite/)
- [Fenrir](https://github.com/Neo23x0/Fenrir)
- [YAYA](https://www.eff.org/deeplinks/2020/09/introducing-yaya-new-threat-hunting-tool-eff-threat-lab)

## Loki

#### Mettre à jour la base de signature

```bash
python loki.py --update
```

#### Lancer un scan d'un dossier

```bash
python loki.py -p <DIR>
```

## YarGen

Cet outil permet de créer une règle Yara à partir d'un ou plusieurs fichiers connus pour être malveillants.

Il va se baser sur les chaînes de caractères et les informations pour générer la règle qui va détecter le ou les fichiers.

#### Téléchargement

- [Github - YarGen](https://github.com/Neo23x0/yarGen)

#### Mettre à jour l'outil

```bash
python3 yarGen.py --update
```


<p class="callout info">Cela va mettre à jour la base avec les chaînes et les opcodes.</p>

#### Créer une règle

```bash
python3 yarGen.py -m <FILE_PATH> --excludegood -o <OUTPUT.yar>
```

<p class="callout warning">Bien que l'outil soit fonctionnel, il est recommandé d'éditer la règle pour supprimer les chaînes qui pourraient lever des faux-positifs.</p>