> For the complete documentation index, see [llms.txt](https://book.onosh.ovh/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.onosh.ovh/ctf/hacktheshields-2026/web-forensic-projet-orion-verifier.md).

# Web / Forensic - Projet Orion-Verifier

### Énoncé

> Nous avons mis la main sur un portail de vérification de l'unité Orion (en version Alpha) ainsi que sur une archive de leur dépôt de code source (fichier ZIP). D'après nos renseignements, un développeur incompétent d'Orion a malencontreusement commité un fichier critique contenant des secrets avant de réaliser son erreur. Il a cru bien faire en supprimant le commit et en réécrivant l'historique... Mais sur Git, rien ne disparaît vraiment si l'on sait où chercher.

{% file src="/files/x3anTgz05vqTrIV8Wh2K" %}

***

### Reconnaissance initiale

#### Contenu du dépôt

L'archive fournie contient un dépôt Git avec la structure suivante :

```
orion_verifier/
├── .git/           
├── CHANGELOG.md
├── README.md
├── config.py
├── docs/
├── requirements.txt
├── tests/
└── verifier.py
```

#### Historique Git visible

```
git log --all --oneline --graph

* 7347a24 Update changelog and remove sensitive files
* 0394d53 Add unit tests
* 2bff3d9 Add documentation and gitignore
* f48e3f4 Initial commit: Setup du projet Orion Verifier
```

L'historique "propre" ne contient que 4 commits anodins. Le dernier en date (`7347a24`) mentionne explicitement **"remove sensitive files",** ce qui est déjà un indice fort : quelqu'un a essayé d'effacer quelque chose.

***

### Analyse du `.git`

#### Fichiers clés du répertoire `.git`

```
.git/
├── COMMIT_EDITMSG
├── HEAD
├── ORIG_HEAD       
├── logs/
├── objects/    
├── packed-refs
└── refs/
```

#### Le fichier `ORIG_HEAD`

Lorsqu'un développeur effectue un `git reset`, `git rebase`, ou `git merge`, Git sauvegarde automatiquement l'ancien pointeur HEAD dans le fichier **`ORIG_HEAD`**. C'est un mécanisme de sécurité interne de Git, conçu pour permettre l'annulation de l'opération.

```
$ cat .git/ORIG_HEAD
249823615b585bbc30f6c398bdf10fd21f5d86fc
```

Ce hash pointe vers un commit qui n'apparaît **plus** dans `git log` : il est *orphelin* (unreachable), mais toujours présent dans les objets Git.

***

### Retrouver le commit supprimé

#### Vérification avec `git fsck`

```
$ git fsck --unreachable
unreachable commit 249823615b585bbc30f6c398bdf10fd21f5d86fc
unreachable blob 8a804645b3cac63fe2c3d30caddfa97eb5046556
unreachable blob 25ede5bf5f8530014173affbeb496026c1798d72
unreachable tree a7b9a7d6c0f261840dd3b38611c77295246623e9
...
```

Le commit `2498236...` est bien présent dans les objets Git sous le statut `unreachable`. Git ne le liste pas dans `git log` car aucune branche ni aucun tag ne pointe vers lui, mais **il n'a pas été purgé** (cela nécessiterait un `git gc --prune=all` explicite).

#### Consultation du commit orphelin

```
$ git show 249823615b585bbc30f6c398bdf10fd21f5d86fc
```

```
commit 249823615b585bbc30f6c398bdf10fd21f5d86fc
Author: Orion Dev Team <dev@orion.internal>
Date:   Mon Nov 10 23:30:49 2025 +0100

    Add production credentials and configuration

diff --git a/.backup_secrets.b64 b/.backup_secrets.b64
new file mode 100644
index 0000000..8a80464
--- /dev/null
+++ b/.backup_secrets.b64
@@ -0,0 +1 @@
+U0hJRUxEU3tHMVRfUjNWMzRMU19USDNfUDRTVH0=

diff --git a/.env b/.env
new file mode 100644
index 0000000..25ede5b
--- /dev/null
+++ b/.env
@@ -0,0 +1,5 @@
+# Configuration de production
+DATABASE_URL=postgresql://prod-db.orion.internal/orion_prod
+API_KEY=sk_live_51HxK9mP2qR3sT4uV5wX6yZ7aB8cD9eF0gH1iJ2kL3mN4oP5qR6sT7uV8wX9yZ
+SECRET_KEY=super_secret_key_do_not_commit_this_in_real_life
+DEBUG=false
```

Deux fichiers sensibles ont été commités :

| Fichier               | Contenu                                                 |
| --------------------- | ------------------------------------------------------- |
| `.env`                | Credentials de production (DB URL, API Key, Secret Key) |
| `.backup_secrets.b64` | Chaîne encodée en Base64                                |

***

### Décodage du secret

Le fichier `.backup_secrets.b64` contient :

```
U0hJRUxEU3tHMVRfUjNWMzRMU19USDNfUDRTVH0=
```

Décodage Base64 :

```bash
$ echo "U0hJRUxEU3tHMVRfUjNWMzRMU19USDNfUDRTVH0=" | python -c "import base64,sys; print(base64.b64decode(sys.stdin.read().strip()).decode())"
SHIELDS{G1T_R3V34LS_TH3_P4ST}
```
