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.