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.
- Quin mètode d'adquisició és el més adequat per a aquest dispositiu?
- Quines evidències específiques buscaríes en el firmware d'un dispositiu compromès per una botnet Mirai?
- 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:
- Extracció completa amb Binwalk
- Identificació de fitxers modificats (comparar hashos amb la versió oficial)
- Localitzar els artefactes de compromís (backdoor, credentials, C2)
- Documentar les troballes amb evidències (captures de pantalla, hashos)
- Construir la línia temporal de l'atac
Lliura un informe forense_iot_NOMCOGNOM.pdf amb la metodologia seguida i les conclusions.