Firmware
펌웨어는 임베디드 시스템을 위한 소프트웨어로, 비휘발성 메모리에 저장된다.
많은 벤더사(제조업체)들은 펌웨어를 저장하기 위해 플래시 메모리를 사용하며, 이를 통해 시스템 기능을 개선하고 펌웨어를 업데이트 함으로써 보안 취약점을 쉽게 수정할 수 있다.
펌웨어 업데이트를 위해 펌웨어 이미지가 제공되며, 업데이트는 사용자가 수동으로 하거나, 장치가 자동으로 처리할 수 있다.
(오픈소스 펌웨어 이미지 - OpenWrt)
https://downloads.openwrt.org/releases/18.06.4/targets/ar71xx/generic/
Index of /releases/18.06.4/targets/ar71xx/generic/
downloads.openwrt.org
https://downloads.openwrt.org/releases/18.06.4/targets/ar71xx/generic/
Index of /releases/18.06.4/targets/ar71xx/generic/
downloads.openwrt.org
펌웨어 이미지는 file 명령어가 식별 가능한 표준 아카이브 형식인 경우가 많으며, 만약 알려지지 않은 파일 형식이라면 file 명령어는 단순히 binary data를 포함하고 있다고만 출력한다.
(file 명령어 = 파일 형식을 알려주는 리눅스 도구)
또한, strings 명령어를 사용해 펌웨어 이미지 내의 사람이 읽을 수 있는 문자열만 추려서 볼 수 있다.
[바이너리 데이터에서 확인가능한 펌웨어 이미지 정보]
- Magic number
: 파일의 맨 앞에 위치하는 고유한 값으로, 파일이나 데이터의 형식(type)을 식별하기 위해 존재한다.
- BIN Header
: 바이너리 형식의 파일에서 파일의 구조, 버전, 길이, 데이터 시작 위치(offset), 무결성 검사 정보 등을 담고 있는 헤더 정보 영역.
- TRX 헤더의 Magic number (HDR0)
: TRX 포맷이란, 보통 임베디드 리눅스 시스템 특히, Broadcom 기반의 라우터 펌웨어에서 사용되는 바이너리 포맷이다.
- uImage 헤더의 Magic number (0x27051956)
: uImage란 U-Boot라는 부트로더에서 사용하는 커널 이미지 포맷으로, 임베디드 장비에서 Linux 커널을 부팅할 때 사용된다.
- gzip 포맷(deflate 방식)의 Magic number (0x1f8b08)
: gzip이란 .gz 확장자를 사용하는 압축 포맷으로, 내부적으로 deflate 알고리즘을 사용해 압축한다. 이때, magic number에서 0x1f 0x8b는 gzip의 고유 식별자이며, 0x08은 압축 방식(deflate)을 나타낸다.| - little-endian 방식의 SquashFS 파일 시스템의 Magic number (hsqs)
: SquashFS란 읽기 전용 압축 파일 시스템으로, 임베디드 시스템이나 라우터, IoT 장비 등에서 많이 사용된다.
little-endian 방식으로, 0x68737173 = hsps가 magic number이다. 이 파일 시스템을 압축 해제하여 루트 파일 시스템 분석이 가능하다. - JFFS2 파티션이 시작되는 위치 (0xdeadc0de)
: JFFS2(Journaling Flash File System v2)란 플래시 메모리 전용 파일 시스템으로, 0xdeadc0de는 유머러스한 매직 넘버로 유명하며, 이는 일부 장치/펌웨어에서 파일 시스템의 시작 or 리포맷된 파티션의 마커(식별자)로 사용된다.
+ Binwalk
: 이 도구를 사용하면 펌웨어의 파일 형식들을 스캔할 수 있고, 자체 정의한 시그니처 파일을 통해 새로운 포맷도 분석할 수 있다. 자동 추출, 엔트로피 분석, hexdump 등 다양한 기능을 제공한다.
또, --extract (binwalk -e 또는 binwalk --extract)를 사용하면 식별한 파일들을 자동으로 해당 도구를 사용해 추출해 준다. 이때, 파일 오프셋 계산 및 자동 추출이 한 번에 이루어진다.
재귀적으로 파일 스캔 및 추출을 해야 할 경우 binwalk의 --extract와 --matryoshka를 함께 사용한다. (binwalk -eM)
+ binvis
: binvis는 펌웨어/바이너리 파일을 시각화해 주는 도구로, 각 바이트를 색상으로 표현해 데이터의 패턴이나 구조를 시각적으로 나타내준다. 이를 통해 패턴이 있는(무작위적이지 않은) 영역을 식별할 수 있다.
+ gzip 압축 데이터는 gunzip으로 압축 해제하고, SquashFS 파일 시스템은 unsquashfs로 추출할 수 있다.
하지만, 많은 제조사들이 unsquashfs가 제대로 추출하지 못하는 비표준 포맷을 사용하므로, 이러한 경우에는 sasquatch를 사용한다.
+ LZMA로 압축된 데이터는 unlzma 명령어로 압축 해제 가능하다. LZMA란 7z에서 많이 쓰이는 고압축 알고리즘으로 리눅스 커널 등의 펌웨어 내부에서 종종 사용한다. gzip보다 압축률이 더 높고 느린 대신 용량이 적다.
+ readelf 명령어를 사용해 ELF 형식(리눅스의 표준 실행파일/라이브러리 포맷)의 실행 파일을 분석할 수 있다. -h 옵션은 헤더 정보를 출력한다.
+ objdump 명령어를 사용해 ELF 파일을 disassemble 할 수 있다. 이때, -D 옵션은 모든 섹션을 디스어셈블하며, objdump는 디버깅이나 리버싱 할 때 기계어 분석에 유용하다.
+ 추출된 SquashFS 파일 시스템을 루트 디렉터리로 설정하고, chroot 명령어로 ELF 파일을 실행할 수 있다.
# 파일 시스템에서 찾아야 하는 것
- Password files - /etc/passwd, /etc/shadow 등
- Encryption Keys - .pem, .key, .der 등
- Public Key Certificates - .crt, .cer, ca-certificates 등
- Executable files - /bin, /sbin, .sh, .cgi 등
- Configuration files - .conf, .ini, .json, .xml, nginx.conf 등
- Interesting keywords - admin, password, api key, token, secret 등
이때, firmwalker를 사용해 중요한 파일/키워드를 자동으로 찾아 분석할 수 있다.
GitHub - craigz28/firmwalker: Script for searching the extracted firmware file system for goodies!
GitHub - craigz28/firmwalker: Script for searching the extracted firmware file system for goodies!
Script for searching the extracted firmware file system for goodies! - craigz28/firmwalker
github.com
firmwalker는 펌웨어 파일 시스템 분석에 특화된 자동화 도구로, 특정 경로나 키워드, 파일명 패턴을 기준으로 검색한다.
기본적으로, binwalk로 추출한 squashfs-root 디렉터리를 입력으로 이용해 분석한다.
- firmwalker의 분석 항목 example
: passwd, shadow, .pem 파일, .key 파일, .crt 파일, init 스크립트, busybox 경로, url과 ip address, 하드코딩된 키워드, crontab 등
+ 일반적으로, 시스템 계정 정보는 /etc/passwd에 있고, 계정들의 해시된 비밀번호는 /etc/shadow에 저장되어 있다.
<<Password Cracking Tool>>
- John the Ripper
John the Ripper password cracker
John the Ripper password cracker
John the Ripper password cracker John the Ripper is an Open Source password security auditing and password recovery tool available for many operating systems. John the Ripper jumbo supports hundreds of hash and cipher types, including for: user passwords o
www.openwall.com
2. Hashcat
hashcat - advanced password recovery
hashcat - advanced password recovery
Download Name Version Date Download Signature hashcat binaries v6.2.6 2022.09.02 Download PGP hashcat sources v6.2.6 2022.09.02 Download PGP Signing key on PGP keyservers: RSA, 2048-bit. Key ID: 2048R/8A16544F. Fingerprint: A708 3322 9D04 0B41 99CC 0052 3C
hashcat.net
+ 많은 임베디드 장치들은 HTTPS를 지원하기 위해 펌웨어 안에 하드코딩된 비밀키를 포함하고 있으며, 이를 통해 키 유출 시 실제 HTTPS 복호화를 시뮬레이션할 수 있어 보안 문제가 된다.
또, 서로 다른 제조사인 경우에도 같은 암호 키를 사용하는 경우가 많아 문제가 되고 있다.
아래는 임베디드 시스템의 private key들을 모아놓은 dataset이다.
littleblackbox/docs at master · devttys0/littleblackbox · GitHub
littleblackbox/docs at master · devttys0/littleblackbox
Database of private SSL/SSH keys for embedded devices - devttys0/littleblackbox
github.com
+ openssl 프로그램을 통해 비밀키, 공개키, X.509 인증서를 처리할 수 있다.
예시) $ openssl x509 -in certificate.pem -text -noout
: PEM 형식의 X.509 인증서 내용을 확인할 수 있는 명령어
공개키 인증서의 fingerprint를 컴퓨터 검색 엔진(shodan, censys 등)에 검색하여 인터넷에 연결된 장치들 중 같은 인증서를 사용하는 수를 추정할 수 있다. -> 이때, 다수의 장치에서 공통의 인증서를 사용한다? 매우 위험한 상태.
펌웨어 주요 보안 점검 체크 사항
- 디바이스 정보 유출 유무 - 디바이스가 민감한 정보를 로그, 네트워크, UART 등을 통해 노출하는지?
ex) /proc 경로 노출, 디버깅 포트 열림, printk() 남용 - 디바이스가 인증되지 않은 명령을 수용하는지? - 인증 없이 관리자 명령 수행 가능한지
ex) 로그인 없이 시스템 리부팅, 설정 초기화 명령 수행 가능 - Replay Attack 취약 여부 - replay를 했을 때 동일하게 동작 시 문제
-> nonce, timestamp, signature 등을 사용해 방지 - 디지털 서명 적용 여부 - 없으면 악성 펌웨어로 변조 및 덮어쓰기 가능 / 있으면 부팅 과정에서 위조 여부 확인 가능
- 불필요한 서비스 실행 여부 - 필요하지 않은 포트/서비스가 켜져 있는 경우
-> netstat, ps, nmap 등으로 탐지 가능 - 백도어 존재 여부 - 개발자용 테스트 계정, 하드코딩된 관리자 암호, 숨겨진 API 등 -> 존재하면 비인가 접근 가능해짐
- 이미 알려진 취약점이 있는 구형 소프트웨어 사용 여부
- SUID/SGID 바이너리 존재 여부 - 권한 상승에 악용 가능 (find / -perm /6000)
- World-writable 파일/디렉터리 - 누구나 쓰기 가능한 파일
- 암호화되지 않은 인증 정보 - 평문 패스워드, API 키, DB 접속 정보가 .conf, .env, .json 등에 저장되어 있는지
- 스크립트 내 시스템 명령어 호출 여부 - system(), exec() 호출이 있는 .sh, .cgi 스크립트
- 정적 컴파일 여부 - 동적일 경우 취약점 주입 가능성 존재
- 취약한 함수 사용 여부 - strcpy, sprintf, gets 등 -> checksec, flawfinder 등 사용
- ASLR, NX, RELRO 등 보호 기법 미적용 여부 - checksec 또는 readelf로 확인
- 공통 코드 시그니처(YARA) 매칭 - 알려진 악성코드나 툴킷 코드와 매칭되는지 여부 확인
- 실행 가능한 init 스크립트 확인 - /etc/init.d/, /etc/rc.local 등에서 자동 실행 명령 확인
- 의심스러운 사용자 정의 명령/백도어 - telnetd, nc -l, bash -i 같은 명령 존재 여부
- 로그 남기는 명령 확인 - logger, /var/log/messages, dmesg 확인
'시스템 보안' 카테고리의 다른 글
[펌웨어/리버싱] Ghidra, Angr (0) | 2025.04.04 |
---|---|
버퍼 오버플로우 공격(BOF, Buffer Overflow Attack) (0) | 2025.03.27 |
[시스템 보안] Windows(윈도우) 인증 과정 (2) | 2025.03.27 |