QEMU, 펌웨어를 이용한 가상 공유기 환경 구축 (MIPS)
- 임베디드
- 2020. 2. 24. 03:03
QEMU 에뮬레이터와 QEMU에 가상으로 실행시키고 싶은 공유기 펌웨어를 사용해 가상 공유기 환경을 구축하고 실행시켜보려고 한다. 구축 환경은 우분투 x64이고 펌웨어는 제조사 웹사이트에 공개된 펌웨어를 다운로드, 파일시스템은 MIPS로 사용했다.
- 환경 : Ubuntu x64
- 펌웨어 : 제조사 웹사이트에 공개된 구버전 펌웨어
- 파일시스템 : MIPS
QEMU 설치
QEMU는 apt-get으로 쉽게 설치할 수 있다. 처음엔 qemu를 설치해야 하는 것인지 아니면 mips이기 때문에 qemu-system-mips64를 설치해야 할지 고민했는데 qemu를 설치하면 mips64도 같이 설치되는 듯 했다.
QEMU squeeze/wheezy mips 이미지 다운로드
QEMU를 설치했으면 이제 QEMU squeeze/wheezy mips 이미지를 다운로드 받아야 한다. 아래 사이트에서 다운받을 수 있다.
QEMU squeeze/wheezy 이미지 다운로드 사이트
mips 말고도 여러가지가 많아보이는데 이 중 arm도 나중에 사용해보고 포스팅할 예정이다. 지금은 mips 이미지를 다운로드 받아야 하므로 mips 디렉토리로 들어가준다.
그리고 여기서 debian_~.qcow2 중에 하나를 다운받고 vmlinux~-malta 중에 하나를 다운받아 총 2개의 파일을 다운받아야 하는데 어떤 파일을 받아야 할지 난감해진다. 제일 정확한 방법은 하단의 'To use this image, you need to install QEMU 1.1.0 (or later). Start QEMU' 이 부분을 참고하는 것이다.
친절하게 설명되어 있듯이, x32는 빨간색 파일을 다운로드받고 x64는 파란색 파일을 다운로드받으면 된다. 사실 squeeze와 wheezy의 명확한 차이는 모르겠어서 나는 wheezy로 다운받아 주었다. 또한 qemu-system-mips로 시작하는 아래의 명령어는 케뮤를 구동시키기 위해 필요한 명령어이기 때문에 잘 복사해둔다.
x32 -> vmlinux-3.2.0-4-4kc-malta / debian_wheezy_mips_standard.qcow2
x64 -> vmlinux-3.2.0-4-5kc-malta / debian_wheezy_mips_standard.qcow2
위에서 받아야 할 파일을 정했으면 wget으로 다운받아준다.
QEMU 구동 확인 및 로그인
필요한 파일도 다운받았으니 이제 QEMU 구동이 잘 되는지 확인해보자. 위에서 확인한 명령어를 그대로 입력해주면 다음과 같이 QEMU가 실행되는 것을 볼 수 있다.
qemu-system-mips64 -M malta -kernel vmlinux-3.2.0-4-5kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"
초기 로그인은 root/root로 하면 된다.
호스트<->게스트(QEMU) 연결
하지만 단순히 구동만 시켜서는 공유기를 올릴 수 없기 때문에 호스트와 게스트(QEMU)를 연결시켜주는 작업이 필요하다. IP를 설정해주는 방법도 있고 ssh를 열어두는 방법도 있는데 나는 ssh를 열어두는 방식을 사용했다. ssh 통신을 위해 위에서 구동시킬 때 사용한 명령어 뒤에 '-redir tcp:2022::22'를 붙여준다(당연하게도 여기서 2022는 내가 임의로 준 포트번호이다). 추가로 웹접속을 위해 '-redir tcp:2080::80'으로 80포트도 redir 시켜준다.
qemu-system-mips64 -M malta -kernel vmlinux-3.2.0-4-5kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -redir tcp:2022::22 -redir tcp:2080::80
해당 redir 옵션은 케뮤 안에서 ssh를 열기 위한 것으로 호스트의 2022 포트를 케뮤의 22포트로 연결시킨다는 뜻이다. 이것은 곧 케뮤에서 22포트를 해당 명령으로 열어두었기 때문에 호스트에서 2022포트로 접속하면 케뮤의 22포트로 접속된다는 뜻이다. 따라서 'ssh -p 2022 localhost'를 호스트에서 사용하면 아래와 같이 케뮤로 접속할 수 있다.
파일시스템 전송
케뮤도 구동시켰고 연결도 시켰으니 이제 펌웨어에서 추출한 파일시스템을 케뮤에 올려야 한다. 펌웨어에서 fmk든 binwalk든 등 툴을 사용해 추출한 파일시스템을 케뮤에 전송하기 위해 압축해준다. 파일시스템 전송은 scp명령어를 사용해서 진행했고 케뮤에서 ls로 확인해보면 압축파일이 잘 전송됐음을 알 수 있다.
scp -P [포트] [파일시스템압축파일] root@[IP]:[저장할장소]
그리고 앞으로의 과정은 케뮤가 너무 느려서...... 호스트 터미널에서 ssh 연결을 통해 케뮤에 접속해서 진행하도록 한다. 압축한 파일을 전송했으니 케뮤에 접속해서 (혹은 케뮤에서) 파일시스템 압축을 풀어준다.
chroot 설정 및 default, cgibin 복사
이제 default 안에 있는 파일들을 tmp 폴더로 복사해준다.
tmp 폴더로 복사를 왜하는지 모르겠어서 안하고 해봤는데 안하니까 나중에 웹서비스 실행을 위해 httpd를 실행시킬 때 아래와 같이 default의 var 디렉토리와 관련한 aborting이 있다고 뜨며 웹 접속이 안되는 것을 확인했다. 실행권한 때문인가...
그리고 해당 디렉토리를 root로 인식시키기 위한 chroot 명령을 수행해준 후 웹페지이지 접속을 위한 cgibin의 파일들을 아래와 같이 복사해준다.
chroot . ./bin/sh
mkdir /home/httpd/192.168.0.1/sess-bin
cp -r cgibin/* /home/httpd/192.168.0.1/sess-bin
cp -r cgibin/* /bin/login-cgi
cgibin 디렉토리의 파일들을 복사해주지 않으면 cgi 파일을 못찾기 때문에 아래와 같이 웹접속이 안된다.
관리자 페이지 접속
위 캡쳐이미지에도 나와있듯이 './sbin/httpd'로 웹서비스를 구동시켜준다. 그리고 모든 설정이 끝났으므로 이제 localhost:2080 으로 접속하면 아래와 같은 관리자 로그인 페이지를 확인할 수 있다(사실 누구나 다 아는데 굳이 가리는게 의미가 있는 것인지는 모르겠다)
이로써 가상 에뮬레이터인 QEMU에 펌웨어 파일시스템을 올려 가상으로 공유기를 구동시켜보았다. 다음 포스팅에서는 ARM 아키텍쳐를 사용하는 펌웨어를 구해서 올려보려고 한다.
'임베디드' 카테고리의 다른 글
UART 해킹, 래빗(rabbit) 사용해서 쉘 획득하기 (2) | 2020.03.03 |
---|---|
binwalk -e 에러, 'sasquatch -p 1 -le -d '%%squashfs-root%%' (0) | 2020.03.01 |
바이너리 디핑 플러그인, bindiff를 사용한 펌웨어 패치 분석 (0) | 2020.02.21 |
펌웨어 분석을 위한 binwalk, fmk 사용법 (0) | 2020.02.18 |