[Research] Firmware Emulation with FirmAE Part 1 (ko)
안녕하세요! Hackyboiz에서 가장 낮은 곳(low-level)을 맡고 있는 newp1ayer48
입니다! 🤸🏻♂️
이전 글에서 디버깅 포트 연결로 돌아오기로 했지만, 금전 이슈로 인해 다른 주제로 돌아왔습니다! (임베디드 해킹은 현질 빨…💸)
펌웨어를 획득하고 파일 시스템까지 확인했으면 이제 취약점을 찾기 위해 즐거운 분석을 할 차례입니다.
그러나… 정적 분석으로만 취약점을 찾는다는 것은 썩 유쾌한 상황은 아니죠. 포너블할 때도 gdb는 보는데, 언제까지 IDA만 쳐다보고 있을 겁니까.. 😠
그렇기에 인간은 언제나 방법을 만들어 놓았습니다. 바로 에뮬레이팅이죠!
1. 시뮬레이션(Simulation) vs 에뮬레이션(Emulation)
시뮬레이션과 에뮬레이션은 구축 과정에서 비슷한 부분이 많이 있기 때문에, 간혹 구분이 어려울 수 있습니다. 가장 큰 차이점은 하고자 하는 목표에서 나뉩니다.
시뮬레이션의 주 목적은 프로그램 또는 시스템이 해당 환경이나 상황에서 기본/특정 동작이 가능한지, 예행 연습을 위해 테스트를 해보는 성격이 강합니다. 그래서 종종 모든 환경과 상황을 구축하는 것이 아닌, 필수 동작이 가능한 최소한만 구축하고 세부 기능까지는 구현하지 않는 경우가 있습니다. 그리고 환경 구성 시, 실제 하드웨어로 환경을 맞추는 경우도 있습니다.
쉽게 비유하자면, 시뮬레이션은 다양한 시뮬레이터 게임을 생각하면 좋습니다! 시뮬레이터 게임에서는 모든 기능을 완벽하게 일치 시켜 구현하지 않은 경우도 많습니다. 그러나 시뮬레이터는 한 번 경험하고 연습한다는 것이 주목적으로 만들어져 있습니다. 🕹️
에뮬레이션의 주 목적은 프로그램 또는 시스템이 다른 환경에서 구동 시키려는 성격이 강합니다. 기존 하드웨어 장비와 체계가 갖추지 못한 상태에서 동작 시키려는 경우가 많기 때문에, 하드웨어 작업 역시 소프트웨어로 모방하는 것이 중요합니다. 또한, 대부분의 세부 기능까지 사용하려는 것 역시 주목적이므로 거의 모든 기능을 구현하는 경우가 많습니다.
에뮬레이션은 닌텐도/안드로이드 에뮬레이터를 생각하시면 편합니다! 닌텐도/안드로이드의 에뮬레이터의 주목적은 PC 환경에서 닌텐도와 안드로이드 게임을 즐기는 것입니다. 그렇기 때문에 게임의 모든 기능이 잘 돌아가도록 설계되어 있습니다. 📱
둘을 엮어서 생각하면 아래 사진처럼 생각하시면 좋을 것 같습니다!
다시 돌아와서, 임베디드 해킹에서는 획득한 펌웨어를 동적으로 분석하는 것이 주목적입니다. 임베디드 장비의 경우 여러 센서와 하드웨어로 동작을 하기 때문에, 관련 하드웨어 의존성이 충족되지 않으면 동작하지 않는 경우가 많습니다. 또한, 임베디드 시스템은 RISC 아키텍처를 사용하는 경우가 많은데, 이는 주 분석 환경의 CISC 아키텍처와 다른 환경에서 구동을 시켜야 하는 상황입니다. 그리고 장비의 모든 기능을 동적으로 분석해야 하기 때문에, 대부분의 세부 기능까지 실행 가능해야 합니다. 👷🏻
따라서, 에뮬레이션 관점에서 펌웨어를 바라보고 관련 환경을 구축해야 합니다. 실제로 임베디드 해킹 분야의 다른 글들 또한 펌웨어 에뮬레이팅으로 작성된 글이 많은 것이 이를 증명한다고 생각합니다!
2. 펌웨어 분석
펌웨어 에뮬레이팅을 하기 위해서는 해당 펌웨어가 어떤 환경에서 구축되고 동작 되는지 분석하는 것이 우선입니다. ☝🏻
binwalk로 펌웨어에서 분석할 수 있는 정보는 크게 아래와 같습니다. 3️⃣
- 아키텍처
- 커널
- 루트 파일 시스템
binwalk를 통해 예제 펌웨어의 아키텍처와 커널 등의 정보를 알아낼 수 있습니다.
binwalk firmware.bin
-A
옵션으로 파일의 아키텍처 정보를 더 상세히 볼 수 있습니다. 🔍
-e
옵션으로 분석한 영역들의 파일들을 추출합니다.
binwalk로 추출한 파일 명이 숫자로 되어 있는데, 이는 각 영역마다 구분해서 따로 저장하기 때문입니다. binwalk 명령으로 확인만 파일들의 주소를 참고하면 어떤 파일인지 확인할 수 있습니다.
binwalk -e firmware.bin
binwalk -A kernel
임베디드 환경에서는 ARM, MIPS 등과 같은 RISC 아키텍처를 많이 사용합니다. 그러나 ARM, MIPS도 엔디안에 따라 명칭에 차이가 있습니다. 🥚
mips는 기본적으로 빅 엔디안을 지원합니다. mipsel은 리틀 엔디안을 지원합니다. 이런 명칭의 차이의 유의하면 되고, 이는 binwalk에서 어떤 아키텍처를 사용하는 지 잘 출력해주기 때문에 확인만 하면 됩니다.
3. QEMU
펌웨어 정보까지 확인하였다면, 이제 펌웨어를 에뮬레이팅할 차례입니다. 펌웨어는 QEMU 가상 머신 위에 올려서 동작 시킬 수 있습니다. 💨
QEMU는 가상화 소프트웨어로, 빠른 에뮬레이션 환경을 구축할 때 자주 사용됩니다. 옵션으로 관련 커널, 이미지 등의 파일을 지정할 수 있습니다. 설치는 apt로 가능합니다.
공유기 펌웨어의 경우 보통 펌웨어 이외의 특별한 의존 하드웨어나 센서가 없는 경우가 많기 때문에, 관련 커널 및 이미지를 맞춘다면 바로 실행할 수 있습니다. 아래 링크를 통해서 해당하는 아키텍처의 파일들을 받을 수 있습니다. 💾
https://people.debian.org/~aurel32/qemu/
관련 파일을 수동으로 맞추고 네트워크 세팅 후 구동에 성공하면 아래처럼 공유기 페이지를 접근할 수 있고, 실제 루트 파일 시스템에 존재하는 대부분의 기능을 사용할 수 있습니다. 🌐
출처: Bach`s Blog
4. FirmAE
QEMU는 직접 네트워크 세팅과 관련 파일을 손수 맞추어야 하기 때문에 다소 불편한 부분이 많습니다.
하지만, 인간은 또 방법을 만들어 놓았습니다! 이런 에뮬레이팅을 보다 손쉽게 도와주는 도구가 있으니…
이 글의 주제인 FirmAE입니다! 🥁
https://github.com/pr0v3rbs/FirmAE
FirmAE는 KAIST SysSec Lab에서 제작한 펌웨어 에뮬레이팅 자동화 도구입니다! 연구팀은 공유기와 IP 카메라 펌웨어 이미지들을 대상으로 테스트를 하여 보다 손쉽게 에뮬레이팅을 도와주는 도구를 제작했습니다. FirmAE는 QEMU와 Binwalk 기반으로 제작되었습니다. 🔨
github에서 설치 및 에뮬레이팅을 할 수 있습니다.
# 다운로드 및 세팅
sudo apt-get install -y bc fdisk qemu qemu-system-mips64 python3-psycopg2
git clone --recursive https://github.com/pr0v3rbs/FirmAE
cd ./FirmAE
./download.sh
./install.sh
./init.sh
# FirmAE/firmwares 디렉토리에 펌웨어 이동
sudo ./run.sh -c VENDOR ./firmwares/
sudo ./run.sh -d VENDOR ./firmwares/
FirmAE로 예제 공유기 펌웨어를 에뮬레이팅 시키면, 아래처럼 공유기 페이지에 접근할 수 있습니다! 에뮬레이팅 과정에서 시간이 꽤나 많이 소요되니, 인내심을 가지고 기다리면 됩니다. 평균 2-30분(!) 정도 소요된다고 생각하시면 됩니다. ☕
그러나 FirmAE는 옵션에도 알 수 있듯이, 연구팀이 기존에 테스트 시켜 놓은 유명 회사의 공유기와 IP 카메라 제품 및 모델을 기준으로 제작이 되었습니다. 그렇기 때문에, 소수의 특정 제품이나 다른 임베디드 및 IoT 기기에는 에뮬레이팅이 잘 안되는 경우가 종종 있습니다. 그리고 gdbserver 기능 또한 제공되는데, 이 역시 잘 동작하지 않는 경우가 많습니다. 🥲
다음 part2에서는 FirmAE의 내부 구성과 동작을 분석하고, 다른 환경 및 파일에서도 잘 동작하고, 제공하는 다양한 기능을 잘 활용하여 펌웨어를 에뮬레이팅하는 글로 찾아오겠습니다! 🤙🏻
감사합니다!
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.