1. 펌웨어를 획득하는 방법들
1.
제조사에서 공개하는 펌웨어 다운로드
2.
Programming Interface(ISP, ICSP)를 이용하여 추출
ISP(In System Programming)은 이미 보드에 장착한 비휘발성 메모리(Flash 등)을 프로그래밍 하는 것.
주로 AVR 아키텍처에서 사용하는 방법이며 AVR 칩에 기록하는 다운로딩과 반대로 플래쉬롬에 저장된 프로그램 코드를 빼내어 오는 덤프(Dump), Read 기능 등이 존재
3.
펌웨어가 자동/수동 업데이트가 될 때 패킷 스니핑
포트 미러링, TWIN IP, ARP Spoofing 등의 방법 존재
4.
UART 디버그 포트 접속을 통한 쉘 획득 후 추출
5.
Flash Memory( Desoldering 후 ) 물리적 덤프
6.
JTAG 디버깅 포트 연결 후 펌웨어 덤프
2. Embedded Linux의 구조
3. 부트로더 컴파일
부트로더란?
•
운영체제 진입 전에 실행되는 프로그램
•
하드웨어 기본 세팅
•
운영체제 커널 로딩
•
펌웨어 및 메모리 읽기/쓰기 가능
•
펌웨어 업데이트(network, serial, usb)
•
멀티 부팅 기능
부트로더 종류
•
U-boot
•
Redboot
•
Netboot
4. Root File System
루트 파일 시스템이란?
•
커널 부팅 완료 후 로딩되는 파일들
•
OS와 인터페이스의 역할
•
BusyBox ⇒ 임베디드에서 주로 이용하는 RFS
5. 유무선 공유기 공격 벡터들
•
공유기 관리페이지
•
공유기 원격 서비스 공격 (여러 데몬들)
dhcpd, webserver, ftpserver, snmp, vpn ... etc
6. 취약점 탐지 전략
•
디렉토리 구성 파악
•
사용자의 입력을 받는 대상 파악
•
주요 취약점 존재 여부 분석
•
디버깅
1) 부팅과정 분석
•
/etc/init.d/rcS 같은 파일에 초기화 스크립트가 존재
•
/sbin/initime
◦
공유기 상태 진단
◦
공유기 초기화 작업 수행
◦
각종 서비스 실행
2)프로세스 목록
•
실제 실행되는 데몬들을 확인하면서 공격 벡터가 될만한 부분들 식별. http 가 돌아가는 것으로 보아 웹 서버가 동작 중임. 그럼 어떤 웹서버가 돌아가는지 파악하는 flaw 필요
•
Boa 웹 서버가 돌아가는 것으로 보임. boa_vh.conf 설정파일에서 해당 웹서버 설정 내용들을 볼 수 있음. 위 사진의 경우 boa가 올라가 있는데 버전을 확인한 뒤, 해당 버전에 기존에 알려진 취약점이 있는 지 확인할 필요 있음.
•
또한 웹 페이지가 딱 필요한 것만 있는게 아니라 + 해서 존재하는 경우도 많음. 즉 쓰지 않는 page나 cgi가 많음. 보통 제품을 개발할 때 솔루션을 같이 제공하는 업체들이 많음. 해당 솔루션에서 제공하는 다양한 기능들을 전부다 사용하는 장비도 있고 특정 기능만 사용하는 장비도 있음. 사용되지 않는 기능들은 동작하지 않게 해야하지만 그대로 들어있는 경우도 많음.
•
가령 개발용 CGI같은 것들은 제거를 해야하지만 그대로 들어가 있는 경우가 있고 이런 것들은 백도어로 악용 될 수도 있음.
7. 취약점 탐색 (정적, 동적 분석)
1) 정적 분석
•
위험한 함수가 사용되는 부분을 타고 분석 - 요즘은 거의 안 먹힘
strcpy, strcat, sprinf, system, execl, getenv 등
2) 동적 분석
•
위험한 함수의 call trace 분석 (Itrace, strace 등 )
◦
Itrace 컴파일 시 많은 에러가 발생. 따라서 buildroot를 이요해서 컴파일 하면 좋음
◦
Yocto - 빌드 시스템
▪
라파에 올라가는 sd카드 이미지를 만들고 싶다. 그러면 라파에 올라가는 부트로더, 커널, RFS을 만들어야함. 라파 용으로 저 3개를 만드는 방법이 존재하는데 이거를 미리 정의해놓은것. 만약 UBOOT을 쓴다고 하면 UBOOT의 특정 버전을 받아오고 빌드를 함.
▪
Yocto에 다양한 레시피가 있음. 라파용, 뭐 용 등등. 저 레시피를 이용해서 RFS, 부트로더, 커널 등을 만들 수 있음.
▪
Yocto가 나오기 전에 사용했던 빌드 시스템이 바로 buildroot임
•
gdb, gdbserver - 필수
◦
타겟 장비에 gdbserver를 넣어두고, 분석 pc에서 gdb로 디버깅
◦
gdb를 직접 빌드해서 타겟에 올려서 쓸 때 문제가 생길 수 있음. 특정 라이브러리 버전을 잘 맞춰야 함. 버전 문제 때문에 정상 동작이 안할수 있음.
8. 외부 파일 다운로드
•
펌웨어를 분석할 때 외부 파일을 다운로드 할 수 있는 방법을 찾으면 좋음
•
따라서 내부에 어떠한 기능들이 존재하는지 확인해야 함
•
가령 iptime에는 외부 파일을 다운로드 받을 수 있는 아래과 같은 기능이 없음
일반적으로 wget, nc, scp, ftp 등의 기능이 없음.
•
하지만 http가 존재함. 따라서 저거를 이용해서 gdb를 다운받아서 분석해야 함
9. 임베디드 기기의 용량 문제
•
iptime의 경우 바이너리 용량은 대락 300kb 이기 때문에 새로운 바이너리를 올리기 부족하다.
•
이런 경우 Ram FS을 이용해서 해결할 수 있다 - 램에 마운트