Salta el contingut

Forense en Dispositius IoT

Introducció

El forense en dispositius IoT (Internet of Things) és una de les àrees de major creixement en la disciplina forense, impulsada per la proliferació d'objectes connectats en entorns industrials (ICS/SCADA), domèstics i de salut. Amb milers de milions de dispositius desplegats globalment, qualsevol d'ells pot ser un punt d'entrada per a un atacant o contenir evidències valuoses d'un incident.

Els reptes particulars del forense IoT: - Varietat enorme de sistemes operatius i arquitectures (ARM, MIPS, RISC-V) - Memòria volàtil molt limitada o sense swap - Firmware propietari sense documentació pública - Absència d'eines estàndard d'anàlisi (no hi ha Autopsy per a una cafetera) - Cadena de custòdia complexa (el dispositiu pot estar en funcionament crític)

Tipus de Dispositius IoT per a Forense

mindmap
  root((IoT Forense))
    Dispositius domèstics
      Smart TV
      Altaveus intel·ligents
      Termostats
      Bombetes WiFi
    Industrial ICS/SCADA
      PLCs Siemens
      Sistemes HVAC
      Supervisió energia
    Salut
      Monitors cardíacs
      Bombes d'insulina
      Escàners mèdics
    Transport
      ECUs vehicles
      Caixetes negres
      Càmeres de trànsit
    Xarxa
      Routers domèstics
      Switches industrials
      Punts d'accés WiFi

Estratègia Forense en IoT

Fase 1: Identificació del Dispositiu

Abans de cap anàlisi, identificar:

# En un router o dispositiu amb port de xarxa:
nmap -sV -O --version-all 192.168.1.1  # Detectar OS i serveis

# Identificar el fabricant per MAC
arp -a  # Llistar dispositius a la xarxa
# xx:xx:xx és la OUI (Organizationally Unique Identifier) del fabricant
# curl https://api.macvendors.com/DC:A6:32  # Raspberry Pi

# Buscar informació del firmware a les bases de dades:
# - https://www.firmware.re
# - https://firmware-analysis-plus.github.io
# - CVE Database del fabricant

Fase 2: Adquisició d'Evidències IoT

La metodologia varia molt segons el dispositiu:

flowchart TD
    DEVICE[Dispositiu IoT] --> Q1{Té port de xarxa\no WiFi actiu?}
    Q1 -->|Sí| NETWORK[Adquisició via xarxa:\nSSH dump, API, logs remots]
    Q1 -->|No| Q2{Té ports\nhardware UART/JTAG?}
    Q2 -->|Sí| SERIAL[Adquisició via port sèrie:\nConsola de debug]
    Q2 -->|No| Q3{Xip de memòria\naccessible?}
    Q3 -->|Sí| CHIP[Dessoldadura del xip\ni lectura directa]
    Q3 -->|No| EMULATION[Emulació del firmware\namb QEMU]

Adquisició via xarxa

# Si el dispositiu té SSH habilitat (molts routers):
# Crear una còpia bit a bit de la memòria flash via SSH
ssh root@192.168.1.1 "dd if=/dev/mtd0 bs=1M" | \
  dd of=router-flash-NOMCOGNOM.img bs=1M

# Calcular hash per a cadena de custòdia
sha256sum router-flash-NOMCOGNOM.img > router-flash-NOMCOGNOM.sha256

# Descarregar fitxers de configuració del router
ssh root@192.168.1.1 "tar -czf - /etc/config" | \
  tar -xzf - -C router-config-NOMCOGNOM/

Adquisició via UART (Universal Asynchronous Receiver-Transmitter)

Molts dispositius IoT tenen un port UART de debug en la placa base, que proporciona accés a la consola de boot (u-boot) i al sistema operatiu:

Hardware necessari:
- Soldador i destreses de SMD bàsiques
- Adaptador USB-to-UART (TTL 3.3V): FTDI FT232R (~5€)
- Fils de connexió
- Software: minicom, screen, PuTTY
# Connectar l'adaptador UART i identificar el port
ls /dev/ttyUSB*      # Linux: /dev/ttyUSB0
ls /dev/tty.usb*     # macOS

# Connectar-se a la consola (typical: 115200 baud, 8N1)
screen /dev/ttyUSB0 115200
# o
minicom -b 115200 -D /dev/ttyUSB0

# Una vegada connectat, potser veureu el boot d'u-boot:
# U-Boot 2019.01 (Dec 15 2020 - 04:49:30 +0000)
# Podeu interrompre el boot prement qualsevol tecla
# i accedir a la consola de u-boot

Fase 3: Extracció i Anàlisi del Firmware

# Eina principal: Binwalk - anàlisi d'imatges de firmware
docker run --rm \
  -v $(pwd):/work \
  --name binwalk-NOMCOGNOM \
  cincan/binwalk:latest \
  -e /work/router-flash-NOMCOGNOM.img \
  -C /work/extracted/

# Binwalk identificarà i extraurà automàticament:
# - Sistema de fitxers squashfs, cramfs, jffs2
# - Fitxers de configuració (XML, JSON)
# - Certificats SSL
# - Codis binaris (ELF ARM, MIPS)
# - Dades de configuració NVRAM

# Analitzar el sistema de fitxers extret
ls extracted/_router-flash.img.extracted/

# Buscar contrasenyes en text clar
grep -r "password" extracted/ --include="*.conf" -l
grep -r "passwd" extracted/etc/ 2>/dev/null
grep -r "admin" extracted/etc/passwd 2>/dev/null
# Firmwalker - script de cerca de vulnerabilitats en firmware extret
git clone https://github.com/craigz28/firmwalker.git
cd firmwalker
./firmwalker.sh ../extracted/ ../firmwalker-report-NOMCOGNOM.txt

# El script busca automàticament:
# - Contrasenyes hardcodejades
# - Claus privades SSL
# - Binaris amb SUID/SGID
# - Ports oberts en scripts
# - Credencials d'APIs
# Script Python per a anàlisi de firmware
import os
import hashlib
import re

def analyze_firmware(extracted_path, analyst):
    """Anàlisi bàsica d'un firmware extret"""
    findings = {
        'analyst': analyst,
        'path': extracted_path,
        'passwords': [],
        'keys': [],
        'interesting_files': []
    }

    # Buscar passwords en fitxers de text
    password_patterns = [
        r'password\s*[=:]\s*["\']?(\S+)',
        r'passwd\s*[=:]\s*["\']?(\S+)',
        r'secret\s*[=:]\s*["\']?(\S+)',
    ]

    for root, dirs, files in os.walk(extracted_path):
        for filename in files:
            filepath = os.path.join(root, filename)
            try:
                with open(filepath, 'r', errors='ignore') as f:
                    content = f.read()
                    for pattern in password_patterns:
                        matches = re.findall(pattern, content, re.IGNORECASE)
                        if matches:
                            findings['passwords'].append({
                                'file': filepath,
                                'matches': matches[:5]  # Primeres 5 coincidències
                            })

                # Detectar claus privades
                if 'PRIVATE KEY' in content:
                    findings['keys'].append(filepath)

            except (IOError, PermissionError):
                pass

    return findings

results = analyze_firmware('/work/extracted/', 'NOMCOGNOM')
print(f"Contrasenyes trobades: {len(results['passwords'])}")
print(f"Claus privades: {len(results['keys'])}")

Fase 4: Anàlisi de la Memòria Volàtil

# Si el dispositiu té Linux i podem executar codi (via UART o SSH):

# Capturar la memòria RAM
# /proc/mem és la memòria del procés actual, /dev/mem és tota la memòria física
dd if=/dev/mem bs=1M count=256 of=/tmp/ram-dump-NOMCOGNOM.bin 2>/dev/null

# Transferir a la nostra màquina
scp root@192.168.1.1:/tmp/ram-dump-NOMCOGNOM.bin ./

# Buscar strings interessants en la memòria
strings ram-dump-NOMCOGNOM.bin | grep -E "password|key|secret|token|wifi"

# Buscar la contrasenya WiFi en memòria (sovint en clar)
strings ram-dump-NOMCOGNOM.bin | grep -A2 -B2 "wifi_password\|wpa_psk"

Fase 5: Documentació IoT específica

La cadena de custòdia per a IoT ha d'incloure:

## Formulari de custòdia IoT - NOMCOGNOM

### Identificació del dispositiu
- Fabricant: _______________
- Model: _______________
- Número de sèrie: _______________
- Versió de firmware: _______________
- Adreça MAC: _______________

### Estat del dispositiu en el moment de la trobada
- [ ] Encès / [ ] Apagat
- Connectat a xarxa: [ ] Sí / [ ] No
- Tipus de connexió: Ethernet / WiFi / 4G / Bluetooth
- Temperatura: ___°C (rellevant per a dispositius que s'auto-destrueixen per calor)

### Mètode d'adquisició
- [ ] Via xarxa (SSH/FTP/API)
- [ ] Via port sèrie UART
- [ ] Dessoldat del xip
- [ ] Emulació de firmware
- Eines usades: _______________

### Hash de les evidències
| Fitxer | SHA-256 |
|--------|---------|
| firmware-dump.img | abc123... |
| ram-dump.bin | def456... |
| config-backup.tar | ghi789... |

### Cadena de custòdia
| Data/Hora | Acció | Responsable |
|-----------|-------|-------------|
| | Adquisició original | NOMCOGNOM |
| | Còpia verificada | |
| | Anàlisi | |

Miniactivitat

Tens un router domèstic (TP-Link TL-WR841N) que s'ha usat suposadament per a realitzar atacs de DDoS des d'una botnet.

  1. Quin mètode d'adquisició és el més adequat per a aquest dispositiu?
  2. Quines evidències específiques buscaríes en el firmware d'un dispositiu compromès per una botnet Mirai?
  3. El router és del propietari del pis on vivies de lloguer. Com afecta al RGPD el fet que el router pugui contenir historial DNS de totes les seves navegacions?

Lab pràctic: Anàlisi de firmware amb Binwalk

# docker-compose per al lab IoT
version: '3'
services:
  binwalk-lab:
    image: cincan/binwalk:latest
    container_name: iot-lab-NOMCOGNOM
    volumes:
      - ./firmware:/work/firmware
      - ./output:/work/output
    command: sleep infinity

  # Servidor per a descarregar firmwares de prova
  firmware-server:
    image: nginx:alpine
    container_name: fw-server-NOMCOGNOM
    volumes:
      - ./test-firmware:/usr/share/nginx/html
    ports:
      - "8090:80"
# Iniciar el lab
docker compose up -d

# Descarregar un firmware de router de prova (DD-WRT, OpenWRT)
# Arxius disponibles a: https://downloads.openwrt.org/releases/
wget https://downloads.openwrt.org/releases/23.05.3/targets/x86/64/openwrt-23.05.3-x86-64-generic-ext4-combined.img.gz \
  -O firmware/openwrt-test.img.gz

gunzip firmware/openwrt-test.img.gz

# Analitzar amb Binwalk
docker exec iot-lab-NOMCOGNOM \
  binwalk -e /work/firmware/openwrt-test.img \
  -C /work/output/

# Explorar el sistema de fitxers extret
ls output/

Exercici pràctic

Anàlisi forense d'un firmware de router compromès:

El professor proporcionarà un fitxer firmware-compromised.img que és un firmware de router amb modificacions sospitoses. Realitza:

  1. Extracció completa amb Binwalk
  2. Identificació de fitxers modificats (comparar hashos amb la versió oficial)
  3. Localitzar els artefactes de compromís (backdoor, credentials, C2)
  4. Documentar les troballes amb evidències (captures de pantalla, hashos)
  5. Construir la línia temporal de l'atac

Lliura un informe forense_iot_NOMCOGNOM.pdf amb la metodologia seguida i les conclusions.