---
# System prepended metadata

title: Groupe 01 - Envie de droner

---

# Groupe 01 - Envie de droner
## Dronocole-Réseau

Ceci est le write-up du **challenge 3**.
Fichier présent:
- 1 - *.pcap

Outils utilisés:
- Wireshark
- Python3
- GeoJson


### Question 1 - Nombre de datagramme
Le fichier fournit lors de ce challenge est un pcap contenant des paquets UDP sur les ports 5005, on suppose alors qu'il ne s'agit pas d'un protocole existant et que les paquets proviennent d'un protocole non connu.

On s'aperçoit que le premier bit dans le payload peut comporter 3 valeurs possibles :
- 01 (Envoyé par l'unité mobile), taille du payload : **61**
- 02 (Envoyé par l'unité mobile), taille du payload : **19**
- 03 (Envoyé par le drone), taille du payload : **61**

On suppose qu'il existe déjà 2 types de datagrammes possibles, car taille de payload différent.

Cependant, le numéro de version diffère entre **01** et **03**. De plus, le **03** se produit une fois toutes les minutes depuis le drone. À l'inverse du **01** qui est envoyé depuis l'unité mobile. On peut en conclure que ce sont des paquets différents.

Il existe donc **3** types de datagrammes.

![alt](/resolution/Q1_1.png)

### Question 2 - Nombre de drones
Pour cette question, il suffit d'énumérer les adresses ip, par exemple :
![alt](/resolution/Q2_1.png)
Sachant qu'une adresse correspond à l'unité mobile, il y a donc **4** drones.

### Question 3 - ID du 1er paquet malveillant
En utilisant scapy, on peut résumer les coordonnées envoyées à chaque drone (paquet de types 01, cf question 1):
```python=
from scapy.all import *
import json

# rdpcap comes from scapy and loads in our pcap file
packets = rdpcap('../Documents/fic3.pcap')

# Let's iterate through every packet
res1 = []
res2 = []
res3 = []
res4 = []
i = 0
for packet in packets:
    i=i+1
    data = packet[Raw].load
    
    if data[0] == 1:
        x = data[39:43]
        x = struct.unpack('<f', x)
        y = data[47:51]
        y = struct.unpack('<f', y)
        z = data[55:59]
        z = struct.unpack('<f', z)
        if packet[IP].dst == "192.168.1.2":
            res1.append([y[0], x[0], z[0]])
        if packet[IP].dst == "192.168.1.3":
            res2.append([y[0], x[0], z[0]])
        if packet[IP].dst == "192.168.1.4":
            res3.append([y[0], x[0], z[0]])
        if packet[IP].dst == "192.168.1.5":
            res4.append([y[0], x[0], z[0]])
        print("i=", i, end=' ')
        print("x", x, " y", y, " z", z, end=' ')
        print("ip", packet[IP].dst)

print("192.168.1.2")        
print(res1)
print("192.168.1.3")        
print(res2)
print("192.168.1.4")        
print(res3)
print("192.168.1.5")        
print(res4)
```

on obtient:
```
192.168.1.2
[[2.334272861480713, 48.848175048828125, 15.135461807250977], [2.3357105255126953, 48.84761047363281, 15.596811294555664], [2.336622476577759, 48.84634780883789, 15.834531784057617], [2.336794137954712, 48.844242095947266, 15.19697380065918], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.334272861480713, 48.848175048828125, 15.135461807250977], [2.3357105255126953, 48.84761047363281, 15.596811294555664]]
192.168.1.3
[[2.3338866233825684, 48.84767532348633, 15.845846176147461], [2.3356032371520996, 48.84705352783203, 15.813843727111816], [2.3378562927246094, 48.84730529785156, 15.251222610473633], [2.3404312133789062, 48.846954345703125, 15.420145034790039], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3338866233825684, 48.84767532348633, 15.845846176147461], [2.3356032371520996, 48.84705352783203, 15.813843727111816]]
192.168.1.4
[[2.3366546630859375, 48.847816467285156, 14.489563941955566], [2.3343372344970703, 48.848209381103516, 15.511064529418945], [2.333242893218994, 48.847660064697266, 15.711281776428223], [2.335388660430908, 48.847293853759766, 15.511064529418945], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3366546630859375, 48.847816467285156, 14.489563941955566], [2.3343372344970703, 48.848209381103516, 15.511064529418945]]
192.168.1.5
[[2.3340368270874023, 48.845611572265625, 14.200901985168457], [2.3328351974487305, 48.844791412353516, 15.458374977111816], [2.3348093032836914, 48.84452438354492, 14.982762336730957], [2.3371052742004395, 48.84445571899414, 15.048612594604492], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3340368270874023, 48.845611572265625, 14.200901985168457], [2.3328351974487305, 48.844791412353516, 15.458374977111816]]
```
À partir de ces données, on constate que la coordonnée `2.3499019145965576, 48.85296630859375, 8.` est envoyée pendant plusieurs minutes à tous les drones, ce sont ces paquets qui correspondent au spoofing réalisé par l'attaquant, il suffit maintenant de retrouver le 1er de ces paquets dans Wireshark pour trouver son ID:
![alt](/resolution/Q3_1.png)
On tombe donc bien sur **169**.

### Question 4 - Destination finale des drones

Nous prenons les résultats de position de la question 3 et nous les plaçons sur le site geojson **https://geojson.io**.

```
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "LineString",
        "coordinates": [
          [2.334272861480713, 48.848175048828125, 15.135461807250977], [2.3357105255126953, 48.84761047363281, 15.596811294555664], [2.336622476577759, 48.84634780883789, 15.834531784057617], [2.336794137954712, 48.844242095947266, 15.19697380065918], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.3499019145965576, 48.85296630859375, 8.0], [2.334272861480713, 48.848175048828125, 15.135461807250977], [2.3357105255126953, 48.84761047363281, 15.596811294555664]]},
      "properties": {
        "prop0": "192.168.1.2",
        "prop1": 0
       }
      
     }
    ]
}
```

![alt](/resolution/Q4_1.png)

On voit que les drones se dirigent vers la cathédrale Notre Dame.

PS: L'unité mobile retrouve un état normal vers la fin du pcap, en demandant les positions **02** et en ordonnant de se déplacer comme avant **03**. C'est un comportement attendu que les positions bouclent, car il y a des paquets **01** (qui servent à ordonner le drone de se déplacer), des **02** (permettant de demander la position d'un drone), mais pas de **03** (la réponse du drone au paquet **02**). Donc les drones n'ont pas pu renvoyer leurs positions, car ils sont trop loin pour répondre ou déconnecté.

