08. Firmware Analysis
ํ์จ์ด ๋ถ์์ ํ์์ฑ
- IoT ๊ธฐ๊ธฐ, ์ค๋งํธ ๊ธฐ๊ธฐ ๋ฑ ์๋ฒ ๋๋ ์์คํ ์ ๋ฐ์ด๋๋ฆฌ ์์ ์ฑ ์ฆ์ง ํ์
- ์ค๋งํธ ๊ฐ์ ๋ฑ IoT ๊ธฐ๊ธฐ ๊ณต๊ฒฉ ์ฆ๊ฐ
- ์๊ฒฉ ๋ฉ๋์ปฌ ํ์จ์ด ๊ณต๊ฒฉ ์ฆ๊ฐ
- ํ์จ์ด ์์ค์ ๋์ด๋ ๋์ ๊ณต๊ฒฉ ์ฆ๊ฐ
- ๊ตญ๊ฐ๊ธฐ๊ฐ๋ง ํ์จ์ด ๊ณต๊ฒฉ ์ฆ๊ฐ
OWASP IoT Top 10
- Weak, Guessable, or Hardcoded Passwords
- Insecure Network Services
- Insecure Ecosystem Interfaces
- Insecure web, backend API, cloud, โฆ
- Lack of Secure Update Mechanism
- Use of Insecure or Outdated Components
- Insufficient Privacy Protection
- Insecure Data Transfer and Storage
- Lack of Device Management
- Asset management, system monitoring, response, โฆ
- Insecure Default Settings
- Lack of Physical Hardening
ํ์จ์ด ๋ถ์ ํ๋ก์ธ์ค
- ํ์จ์ด ํ๋ ๋ฐ ์ถ์ถ: ์ ์กฐ์ฌ ์ ๊ณต, ํจํท ์ค๋ํ, ํ๋์ ๋ฉ๋ชจ๋ฆฌ ๋คํ, JTAG ์ด์ฉ, UART ์ฐ๊ฒฐ
- ์ ์ ๋ถ์: ํ์จ์ด ๊ตฌ์กฐ ๋ถ์, ํ์ผ ์์คํ ๋ถ์
- ๋์ ๋ถ์:
- ๊ฒ์ฆ vector ์ ์ : ์ธํฐํ์ด์ค ๋ถ์, ๋คํธ์ํฌ ํจํท ๋ถ์
- ๊ฒ์ฆ vector ํ์
- ๊ฒ์ฆ vector ํ๊ฐ ๋ฐ ์ ์
- ๋ถ์ ํ๊ฒฝ ์กฐ์ฑ: ์์กด์ฑ ๋ฌธ์ ํด๊ฒฐ, ๋์ ๋ถ์ ์ํ
ํ์จ์ด ์ด๋ฏธ์ง ํ๋
- ์ ์กฐ์ฌ ์ ๊ณต ํ์จ์ด: ์ ์กฐ์ฌ ํํ์ด์ง์์ ์ ๋ฐ์ดํธ ๋ฑ์ ์ง์์ ์ํด ์ ๊ณต
- ํจํท ์ค๋ํ: ๋คํธ์ํฌ๋ฅผ ํตํ ํ์จ์ด ์ ๋ฐ์ดํธ ์ ์ ์ก๋๋ ์ด๋ฏธ์ง ์ถ์ถ
- ํ๋์ ๋ฉ๋ชจ๋ฆฌ ๋คํ: ์๋ฒ ๋๋ ์ฅ์น์ ํ๋์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ํ์จ์ด ๋คํ (๋๋ฐ์ด์ค ๋ถํด ๋ฐ ๋ฐ์ดํฐ ์ํธ ์ฐธ๊ณ ํ์)
- JTAG (Joint Test Action Group) ์ด์ฉ: ์๋ฒ ๋๋ ๊ธฐ๊ธฐ ๋๋ฒ๊น ํ์ค ์ฅ๋น. Emulator ์ด์ฉ ๊ฐ๋ฅ. ๋นํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ(ํ์จ์ด) ์ถ์ถ ๊ธฐ๋ฅ ์ ๊ณต
- UART (Universal Asynchronous Receiver/Transmitter): ๋ณ๋ ฌ/์ง๋ ฌ ๋ฐ์ดํฐ ์ ์ก ํ๋์จ์ด. JTAG๋ณด๋ค ๊ฐ๋จํ๊ณ ์ ๋ ด. ๋๋ฒ๊น ์ฉ๋๋ก ๋ง์ด ์ด์ฉ. UART ํฌํธ ์กด์ฌ ์ ํ์จ์ด ๋คํ ๊ฐ๋ฅ
๋์ ๋ถ์ ํ์จ์ด ๋ถ์
- ๋์ ๋ถ์: ์ ์ ๋ถ์๋ง์ผ๋ก๋ ์ค์ ์ฒ๋ฆฌ ๊ณผ์ ๋ฐ ๊ฒฐ๊ณผ ํ์ธ ์ด๋ ค์. ํน์ ์ ๋ ฅ์ ๋ํ ์ถ๋ ฅ ๊ณผ์ ๊ณผ ๊ฒฐ๊ณผ ํ์ธ ๊ฐ๋ฅ
- ๋์ ๋ถ์ ํ๊ฒฝ: QEMU์ ๊ฐ์ emulator ์ด์ฉ. ๋์ ๋๋ฐ์ด์ค์ ๋์ผ ํ๊ฒฝ ๊ตฌํ. GDB ๋ฑ ๋๋ฒ๊ฑฐ๋ก ๋์ ๋ถ์ ์ํ. ํ๋์จ์ด ์์กด์ฑ ๋ฌธ์ ํด๊ฒฐ ํ์
ํ์จ์ด ๊ตฌ์กฐ ๋ถ์ ํ์จ์ด ๋ถ์
- ํ์จ์ด ๊ตฌ์กฐ ๋ถ์: Bootloader / kernel ์ด๋ฏธ์ง / filesystem ๋ฑ์ offset ํ์
ํ์. ๋ํ ๋๊ตฌ: Firmware Mod Kit,
binwalk - ํ์ผ ์์คํ
์ถ์ถ ๋ฐ ๋ถ์: ํ์จ์ด ์ด๋ฏธ์ง์์ filesystem ๋คํ. ์ง์ ์ด์์ฒด์ ์์ mount (์:
sudo mount โv โo loop โt ext2 filesys.img /tmp/fs). Mount๋ ํ์ผ ์์คํ ๋ด ์คํ ์ฝ๋ ํ์ผ ์ถ์ถ ๋ฐ ๋ถ์
์ด๋ฏธ์ง ํ์ผ ๋ถ์ ํ์จ์ด ๋ถ์
- ํ์จ์ด ์ด๋ฏธ์ง ํ์ผ ๊ตฌ์กฐ ๋ถ์:
- Bootloader: ์์คํ ํ๋์จ์ด ์ด๊ธฐํ ๋ฐ kernel์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ
- Kernel: ํ๋์จ์ด์ ์ํํธ์จ์ด ๊ฐ ์ค๊ฐ์
- File system: ํฌ๊ธฐ ๋ฌธ์ ๋ก ์์ถ๋์ด ์์
- ํ์จ์ด ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ ๋ฐฉ๋ฒ:
- ํด์ ๊ฐ์ด๋ ์ฒดํฌ์ฌ ๊ฐ ์ด์ฉ
- ๊ฒ์ฆ ๊ณผ์ ๋ณ์กฐ ์ ๋ฌด๋ ฅํ
- Watchdog ์ฌ์ฉ ๊ฐ๋ฅ (์์ฒด ๋ณ์กฐ ๊ฐ๋ฅ์ฑ์ผ๋ก ์ ๋ขฐ๋ ๋ฌธ์ )
์์ค์ฝ๋ ๋ถ์ โ ์ ์ ๋ถ์ ํ์จ์ด ๋ถ์
- ํ์จ์ด ์์ค์ฝ๋/๋ฐ์ด๋๋ฆฌ ๋ถ์ ์:
Buffer overflow๋ฐ์ ๊ฐ๋ฅ ์ทจ์ฝ ํจ์ ๊ฒ์ฌ (์:strcpy(),sprint())- Debugging code ํฌํจ ์ฌ๋ถ ๊ฒ์ฌ
- ์ ๋ฐ์ดํธ ๋ชจ๋ ๋ถ์
- ๋ก๊ทธ์ธ ๋ชจ๋ ๋ถ์
- Password/์ํธํ ํค์ ํ๋์ฝ๋ฉ ์ฌ๋ถ ๋ถ์
ํ์จ์ด ์ทจ์ฝ์ ๋ถ์
- FirmwareModificationKit์ ํตํ ์ถ์ถ ๋ฐ ๋ถ์: ํ์จ์ด ์ด๋ฏธ์ง๋ก๋ถํฐ ํ์ผ ์์คํ ์ถ์ถ. ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ ๋ฃจํด ํฌํจ ํ์ผ ๋ถ์
- ๋ฌธ์์ด ๊ฒ์ ๊ธฐ๋ฐ ๋ถ์: ํค์๋ ๋ฌธ์์ด ๊ฒ์ (์:
Certificate)์ผ๋ก ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ ๋ฐฉ๋ฒ ๋ถ์ - ๋ถํ ๋ก๊ทธ ๋ถ์: ๋ถํ ๋ก๊ทธ ๋ถ์์ ํตํ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ ๊ณผ์ ํ์ธ. (์: 1024 bit RSA ํค ์์ฒด ์์ฑ ํ์ธ)
- ํ์ผ์์คํ ํ์ผ ๋ถ์: ์ธ์ฆ์ ์ฐ๊ฒฐ ํํ / ์ธ์ฆ์ ํ์ผ ์์ฒด ๋ถ์
NAS ์ทจ์ฝ์ ๋ถ์ ์ฌ๋ก 1 ์ทจ์ฝ์ ๋ถ์ ์ฌ๋ก
- ํ์จ์ด ํ๋: ์ ์กฐ์ฌ ํํ์ด์ง ์ ๊ณต (๋ฒ์ 5592, ๋ฆด๋ฆฌ์ฆ 2015.08.08)
- ๊ธฐ๋ณธ ์ธํฐํ์ด์ค: ๊ธฐ๋ณธ ๊ด๋ฆฌ์ ๊ณ์ ์์. ๋ฆฌ๋ ์ค๋ฅผ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ OS๋ก customizing
- ์ ์กฐ์ฌ ์นํ์ด์ง ์ ๊ณต ํ์จ์ด ์ด๋ฏธ์ง ๋ถ์ ์๋:
- FMK ์ด์ฉ
- ์๋ฏธ ์๋ filesystem ํ์ ๋ถ๊ฐ๋ฅ
- ์ผ๋ฐ์ ์ธ ํ์จ์ด ๊ตฌ์กฐ๊ฐ ์๋
NAS ์ทจ์ฝ์ ๋ถ์ ์ฌ๋ก 2 ์ทจ์ฝ์ ๋ถ์ ์ฌ๋ก
- UART ์ฐ๊ฒฐ ์ shell: UART ์ฐ๊ฒฐ ์ root ๊ถํ์ ๋ถํธ๋ก๋ ์ ํ๋ ๊ฐ๋ฅ
- ์ทจ์ฝํ ์ธ์ ์ ๋ฌ ๋ฃจํด
- ํ์จ์ด ํ๋: ์ ์กฐ์ฌ ํํ์ด์ง ์ ๊ณต
- ๋๋ฒ๊น ์ฉ ๋ฐฑ๋์ด: ๋ณ๋ ์ธ๊ฐ ๊ณผ์ ์์ด ์ ๊ทผ ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ์ ์กด์ฌ. ํน์ ์ธ์๊ฐ ์ ๋ฌ ์ ์ฌ์ฉ ๊ฐ๋ฅ
NAS ํ์จ์ด ๋ถ์ ๊ฒฐ๊ณผ ์ทจ์ฝ์ ๋ถ์ ์ฌ๋ก
- ์ผ๋ฐ ์ฌ์ฉ์ ๋๋ฒ๊น
์ฉ ๋ฐฑ๋์ด ์ ๊ทผ ๋ฐ ํ์ฉ:
help.cgi๋d์ธ์๊ฐ 999์ธ์ง ํ์ธ. ์ฐธ์ด๋ฉด ๋๋ฒ๊น ์ฉ ๋ฐฑ๋์ด ๋ฃจํด ์คํ ํ์ฉ- ๋ฐฑ๋์ด ๋ฃจํด์
votmdnjem์ธ์์ ๊ฐ์ด!@elqjrld&*์ธ์ง ๋น๊ต. ๋์ผํ๋ฉด ๋ช ๋ น ์คํ ๋ฐ ๊ฒฐ๊ณผ ์ถ๋ ฅ
- ๋๋ฒ๊น
์ฉ ๋ฐฑ๋์ด ํ์ฉ ๋ช
๋ น์ด ์คํ ์์:
- ๋ฐฑ๋์ด ์ ์: NAS ์ผ๋ฐ ์ฌ์ฉ์ ๋ก๊ทธ์ธ ํ,
[IP]/help.cgi?d=999๋ก ์ ์ id๋ช ๋ น์ด ์คํ:!@elqjrld&*์ ๋ ฅls๋ช ๋ น์ด ์คํ:!@elqjrld&*์ ๋ ฅ ๋ฐ Input Box์ ์ด๋ํ html ํ์ผ ์ ๋ ฅ (์:logout.html)
- ๋ฐฑ๋์ด ์ ์: NAS ์ผ๋ฐ ์ฌ์ฉ์ ๋ก๊ทธ์ธ ํ,
์ค๋งํธ ์คํผ์ปค ๋ถ์ ์ทจ์ฝ์ ๋ถ์ ์ฌ๋ก
- ์คํผ์ปค ์ ์กฐ์ฌ์ ๋ฉ์ธ ์๋ฒ์์ ๋ช ๋ น ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- ์คํผ์ปค๋ ์ฌ์ฉ์ ์์ฑ ๋ช ๋ น ์ ๋ ฅ ๋ฐ ์๋ฒ ๋ช ๋ น ์ถ๋ ฅ ์ญํ
- ์ ํ๋ ๊ณต๊ฒฉ ๊ฒฝ๋ก
์ค๋งํธ ์คํผ์ปค ๋ถ์ ์ค๋งํธ ์คํผ์ปค ๋ถ์
- ์ค๋งํธ ์คํผ์ปค์ ๋ฌผ๋ฆฌ์ ๊ตฌ์กฐ ํ์ธ (NUGU ์คํผ์ปค):
- ์ ๊ทผ ์ฌ์ด ์์น(๊ณ ๋ฌด์ปค๋ฒ ๋ฐ)์ UART, USB ์ถ์ ํ ์คํธ ํฌํธ ๋ฐ๊ฒฌ
- USB ํฌํธ์ D-pair ์ฐ๊ฒฐ ํ์ธ (USB ํตํ ๊ณต๊ฒฉ ๊ฐ๋ฅ)
- ๋ง์ดํฌ๊ฐ ๊ธฐํ ์ฌ์ด์ ์์น (๋ ์ด์ ์ด์ฉ ๊ณต๊ฒฉ ๋ถ๊ฐ๋ฅ)
- ์ค๋งํธ ์คํผ์ปค์ ๋ถํด ์ฌ์ง์๋ฃ (SKT NUGU): (์ฌ์ง ์๋ฃ: USB N.C.๋์ง ์์, ๋ฉ์ธ๋ณด๋ ์ง์ ํ๋ก, ๊ธฐํ ๋ท๋ฉด ๋ง์ดํฌ, ๋ฐ๋ฉด ํ ์คํ ํฌํธ)
- NUGU candle ํด์ฒด:
- ํ๋จ ๋ถ๋ถ ํด์ฒด ์ UART ํ ๋ ธ์ถ
UART_RX,UART_TX,GND,DC_IN_PWํ ํ์ธ
- UART (Universal Asynchronous Receiver / Transmitter) ํ ์ญํ :
TX: ๋ฐ์ดํฐ ์ก์RX: ๋ฐ์ดํฐ ์์GND: ๊ทธ๋ผ์ด๋VCC: ์ ์
UART ํฌํธ ์ ์ ๋ฐ ๋ถ์ ์ค๋งํธ ์คํผ์ปค ๋ถ์
- ๋ฐฉ๋ฒ 1: ์ผ์ด๋ธ ์ ์ ๊ณต๊ธ ํ ์๋์ด๋
ธ ์ด์ฉ ์ฐ๊ฒฐ:
- AI ์คํผ์ปค์ฉ ์ผ์ด๋ธ๋ก ์ ์ ๊ณต๊ธ ํ ์๋์ด๋ ธ๋ก UART ์ฐ๊ฒฐ
- ๊ฒฐ๊ณผ: ์ฝ์ ์ ์๋ ๋ฌธ์์ด๋ง ์ถ๋ ฅ
- ๋ฐฉ๋ฒ 2: ์ผ์ด๋ธ ์ ์ ๊ณต๊ธ ํ UART to USB ์ด์ฉ ์ฐ๊ฒฐ:
- AI ์คํผ์ปค์ฉ ์ผ์ด๋ธ๋ก ์ ์ ๊ณต๊ธ ํ UART to USB๋ก ์ฐ๊ฒฐ
- ์ฃผ๋ก ์ฌ์ฉ๋๋ baud rate ๋ชจ๋ ์๋
- ๊ฒฐ๊ณผ: ์ฝ์ ์ ์๋ ๋ฌธ์์ด ์ถ๋ ฅ
- ๋ฐฉ๋ฒ 3: ์ ํธ๋ถ์๊ธฐ๋ฅผ ํตํ UART ํ ๋ถ์:
- Baud rate 115200์ผ ๋ ๋ถํ ๋ฉ์์ง ์ถ๋ ฅ ํ์ธ
- Python script ์์ฑ ๋ถ์ ๊ฒฐ๊ณผ, ๋ถํ ๋ฉ์์ง ์ ์ ์ถ๋ ฅ ํ์ธ
- ๋ฐฉ๋ฒ 4: FT232RL USB to UART converter:
- Baud rate 115200์ผ๋ก ์ค์
- ์ฐ๊ฒฐ ์ผ์ด๋ธ ์ฌํ์ธ
- ๊ฒฐ๊ณผ: Uboot shell ํ๋ ์ฑ๊ณต
Uboot Shell ์ค๋งํธ ์คํผ์ปค ๋ถ์
- Uboot๋ ๋๋ฐ์ด์ค ๋ถํ ๊ณผ์ ์ค ํ๋
- Uboot ๋ช ๋ น์ด๋ Kernel ์คํ ์ ์ ์คํ๋จ
- ๋ฉ๋ชจ๋ฆฌ ์ง์ ์์ /์ฝ๊ธฐ ๊ฐ๋ฅ
- ์์ ์ฃผ์ ๋ฉ๋ชจ๋ฆฌ ๋คํ (ํ์จ์ด ๋คํ) ๊ฐ๋ฅ
ํ์จ์ด ์ ๋ฐ์ดํธ ํจํท ๋ถ์ ์ค๋งํธ ์คํผ์ปค ๋ถ์
- NUGU ์คํผ์ปค ํ์จ์ด ์ ๋ฐ์ดํธ ํจํท์ ์ํธํ๋์ด ์์
ํ์จ์ด ๋ถ์ ์์ฝ
- ํ์จ์ด ํ๋: ์ ์กฐ์ฌ ๋ค์ด๋ก๋, ํจํท ์ค๋ํ, ๋๋ฒ๊น ํฌํธ ๋คํ ๋ฑ
- ํ์จ์ด ๊ตฌ์กฐ ๋ถ์: ์น์ ๋ณ offset ํ์ธ, ํ์ผ ์์คํ ํ์ธ ๋ฐ ๋ถ์
- ์ ์ /๋์ ๋ถ์: ๋ฐ์ด๋๋ฆฌ ํ์ผ ๋ถ์๊ณผ ์ ์ฌ (๋๋ฒ๊น ์ฝ๋, ํ๋์ฝ๋ฉ๋ ํจ์ค์๋, ์ทจ์ฝ ํจ์ ์ฌ์ฉ ์ฌ๋ถ ๋ฑ)
- ๊ฒ์ฆ ๋ฒกํฐ ์ ์ : ์ฌ์ฉ์ ์ธํฐํ์ด์ค, ๋คํธ์ํฌ ์ฒ๋ฆฌ, ์ธ๋ถ ์ ๋ ฅ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ํ์จ์ด ๋ฌด๊ฒฐ์ฑ ์ฒ๋ฆฌ ๋ถ๋ถ ๋ถ์
Firmware Analysis
stringscommand options:-n: ์ต์ ๊ธ์ ์-e: ์ธ์ฝ๋ฉ ํ์-tx,-to: ๋ฌธ์์ด์ offset ์ถ๋ ฅ (x: hexadecimal, o: octal)
binwalk
- ์ค์น ๋ฐฉ๋ฒ (linux):
sudo apt install binwalk - ํ์ผ ํ์๊ธฐ root ๋๋ ํ ๋ฆฌ:
\\wsl$ - WSL ํ์ธ:
wsl โl -v - Ubuntu version ํ์ธ:
lsb_release โa - ๋ฐฑ์
:
wsl โexport Ubuntu-20.04 backup.tar - ๋ณต๊ตฌ:
wsl โimport Ubuntu-20.04 (install location) (file location) - ํ์จ์ด ์ด๋ฏธ์ง ํ์ธ:
binwalk ****.bin(์ปค๋ ์ด๋ฏธ์ง์ ์ฃผ์ ํ์ธ) - ์ปค๋ ์ด๋ฏธ์ง ์ถ์ถ:
dd if=****.bin skip=์์์ฃผ์ bs=1 of=kernel.lzmaif: input filebs: block sizeof: output file
- ์ปค๋ ํ์ผ ํ์ธ:
file kernel.lzmaunlzma kernel.lzmafile kernelbinwalk kernel(kernel version ๋ฐ ๋ฐ์ดํฐ ํ์ธ)
sasquatch์ค์น:git clone https://github.com/devttys0/sasquatch(์ค์น ํbinwalk์คํ)
firmware modification kit (FMK)
- ์ฌ์ดํธ:
- ์ค์น (Ubuntu 20.04 and newer):
sudo apt-get install git build-essential zlib1g-dev liblzma-dev python3-magic autoconf python-is-python3(์๋ฌ ์sudo apt updateํ ์ฌ์๋)- Git Clone:
git clone https://github.com/rampageX/firmware-mod-kit
- ํ์จ์ด ์ถ์ถ:
./extract-firmware.sh ****.bin
Firmware analysis ๊ณผ์
- Procedure:
- Download ํ์จ์ด from the Internet
- Try to find hardcoded passwords
- Extract the file system of the firmware
- Analyze the file system (Directory hierarchy, Analyze important files)
- Your report must include:
- Where/how you download the firmware
- Screenshots of the above procedure steps
- Detailed explanation of the screenshots
