Ganhando acesso ROOT#
Bypass uBoot kernel call#
Videos base: 1. Glitching Linux Bootloader for Shells and Freedom - Rooting a TP-Link Security Camera
Assume 3.3V para a comunicação SPI da FLASH MEM.
Identificar UART TX RX pinos
- Conecta no device BR: 115200
- Para isso, ele simplesmente testa com o multimetro.
- O pino que flutua entre 3.3V e 0V é o TX.
Explicação sobre o uBoot - Possibilita a iteração com um kb antes de carregar o kernel Linux.
Para isso, ele faz um jump nos pinos de CLK e VCC da Flash Memory.
Mas o curto e usado para bypass “First Auto Negotiation” no primeiro segundo — que suponho que seja instantes antes de carregar o kernel, no momento que o uBoot “aponta” para a SPI —, mostrado no boot process via UART.
Ele consegue acesso ao shell do uBoot com essa falha proposital.
Nesse shell
printenv – mostra os argumentos passados para o kernel.
e para minha surpresa, ele muda o init= para init=/bin/sh!! — Ele usou no inicio da declaração dos env: default=“bootargs=console=ttyS0…” para => “setenv bootargs console=…”
Ele faz uma obs que, quando colar na UART shell, perderá/ficara desconfigurado os caracteres, mas, mesmo assim funciona. pq enviou correto e o “echo” ficou louco
depois:
run bootcmd – para iniciar o boot process.
- No shell do OS ele inicia/chama o init antigo na tentativa de executar normalmente. Ele observa que nem todos os disp funcionam devido a modulos e configurações iniciais.
Modificando o firmware – root persistente:#
2. Persistent Root Shell via IoT Firmware Modification - Rooting a TP-Link Security Camera
Por design Squash FS é montado RO!! Por algum motivo, ele gosta de remover a Flash SPI para extrir os dados. Penso que isso pode ser feito sem remove-la.
- Para extraír o firmware, sabe ne? precisará de um extrator!
Ele tem uma versão anterior do firmware extraido, os checksum n bateram. Ele usa o vbindiff para ver as diferenças — isso e meio irrelevante, mas é so pela ferramenta comentei.
Depois de extraír:
binwalk — Ele guarda o endereço de start e o sizeof itotal do squash FS — informações estas que serão usadas para “colar” o novo firmware posteriormente.
Para extrair:
dd if=firm.img of=rootfs.bin bs=1 skip=<offset de start> count=<sizeof squashfs>
Onde:
- bs=1 — Pelo alinhamento de memória, possivelmente alinhamento da SPI Flash Mem.
- skip — endereço inicial do rootfs
- count — Tamanho dela (rootfs)
Ele checa com file <image>.
Extrai o RF
unsquashfs rootfs
Ele modifica o /etc/inittab na linha do TTYS0 ele muda o shell para /bin/sh.
Reempacotando:
makesquashfs rootfs_dir outputfile.bin
Ele demonstra que os files usam compressão (cmd file roots*.imb) diferentes, o que afetou no tamanho. o original uzava XZ.
Compressão com o mesmo algoritmo:
makesquashfs rootfs_dir outputfile.bin -comp xz
Recriando o novo firmware para gravação
dd if=newrootfs.bin of=newfw.bin seek=<offset de start> count=<sizeof squashfs> bs=1 conv=notrunc
notas: input file – no caso do video, o newrootfs.bin é o SQFS modificado. o Output File é uma copia da extração para replace.
seek – a posisção de gravação (complementar ao skip). conv=notrunc – como os files/sessão são diff, isso mantem os dados não sobrepostos. (olhar no manual isso).
Check:
binwalk newfw.bin
Regravar na flash o firmware.