[경험공유] Firmware 분석 :) :: YPrefer's Develop&Security

필자가 경험한 펌웨어 분석경험을 흐름대로 정리한 것이다.

어떤 제품인지는 보안상 적을 수 없지만, 이런 식으로 한다는 느낌적인 느낌을 남겨놓으려고 정리한다.


펌웨어 분석

<!--[if !supportLists]-->    <!--[endif]-->펌웨어 파일을 확인할 수 있는 도구 : Firmware mod kit, binwalk

펌웨어를 웹에서 다운받거나, Flash memory에서 덤프하는 방법으로 얻어낸다. 필자의 경우 점검이라 제공을 받았다.

Root:~#Binwalk –e rootfs2.2.0release를 하면 cramfs파일이 나오고,

cramfs 7zip으로 풀리기도 하고 mount-t type cramfs로 마운트하여 내용을 확인할 수 도 있다.

, firmware mode kit의 기능중에 uncram하는 기능이 있어 이를 통해 확인할 수 도 있다.

이렇게 나온 cramfs파일은 Root:~#file cramfs하면, Linux Compressed Rom File System data인인 것을 확인할 수 있다.

풀린 파일의 etc/shadow파일을 확인하면 hdd에 링크되어 있는 것을 확인할 수 있고,

Hdd를 풀기위해 타입을 확인해야 하는데 etc/fstab을 확인하면, 타입을 yaffs2타입인 것을 확인할 수 있다.

Hdd.2.8.2.release unyaffbinwalk로 풀면 shadow file의 내용을 확인할 수 있고, john the ripper를 이용해 root 의 패스워드를 얻을 수 있다.

<!--[if !supportLists]-->    <!--[endif]-->Nmap을 이용해 월 패드를 포트스캔하여 현재 서비스중인 포트들을 확인하고펌웨어의 바이너리 파일중 bind, listen, accept등 소켓통신시 사용되는 함수를 쓰는 바이너리 파일을 찾는다.

이 바이너리 파일들을 IDA를 이용해 리버싱 하여, 포트에 맞는 바이너리 파일을 찾아낸다.

그중 펌웨어 업데이트를 수행하는 바이너리를 찾아내고 업데이트 서버의 id/pwd를 알게 되면, 

telnet을 서비스하게 변조한 펌웨어로 업로드하는 명령을 내려, telnet을 서비스하도록 만들어 외부에서 접속이 가능하다.

 

 ARM환경구축

<!--[if !supportLists]-->    <!--[endif]-->구축에 사용한 도구 : QEMU, gdb, strace, ida

QEMU 에뮬레이터를 이용해 ARM OS를 올릴 수 있어 동적 디버깅을 시도해볼 수 있다.

https://people.debian.org/~aurel32/qemu/armel/ 에서 qemu를 다운받아 실행하고, proxy setting을 해주어 apt-get으로 update 

build-essential, gdb, strace를 설치한다.

qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4versatile -initrd initrd.img-3.20-4-versatile -hda debian_wheezy_armel_standard.qcow2 -append "root=/dev/sda1" -redir tcp:2222::22

위와 같이 qemu를 실행하면 2222번 포트로 qemu ssh서비스를 붙을수 있어 scp로 파일전송이 용이하다.

<!--[if !supportLists]-->    <!--[endif]-->lsdaemon프로그램을 qemu로 옮기고, ldd를 이용해 ASLR이 적용된 OS라면

sysctl -w kernel.randomize_va_space=0를 적어 ASLR기능을 끄고, strace로 확인하면 관련라이브러리가 없음을 알수 있고, 관련라이브러리를 펌웨어에서 찾아 넣어주고 없는 파일을 touch로 빈파일을 만들어준다.

그러면 정상실행이 되지만 app_init에서 죽는 것을 확인할 수 있는데, 이것을 확인하기 위해, gdb로 따라가서 확인하면 daemon(0,0)에서 죽는 것을 알 수 있고 이 부분의 코드를 NOP으로 코드패치를 한다.

ld --verbose ./lsdaemon | grep SEGMENT_START 를 실행하면 baseaddress를 얻어낼 수 있다.

이를 통해 ida에서 edit->segment->rebaseprogram에서 baseaddress를 설정해주면,

실행 중인 주소와, ida의 주소값을 맞춰줄 수 있다.

이때 코드패치는 IDA hexview에서 F2를 누르고 apply를 해주면, 코드패치가 된다. 코드패치된 파일을 다시 넣어주고 실행하면 hostname을 불러오는 곳에서 죽고, hostname을 펌웨어의 것과 맞추어 주어 실행하고, strace로 에러를 제거해주는 방법을 반복해서 구축하여 동적디버깅을 실시한다

+ Recent posts