Setup Debian MIPS

2015-08-14

I recently participated in a CTF with a MIPS pwning challenge. A MIPS binary was provided for a service running remotely on a MIPS box. The challenge was to analyze the binary, figure out the security hole, and pop a shell on the remote service.

When analyzing binaries and writing exploits, it is often useful to be able to run the binary locally. A MIPS binary cannot run on an x86 machine, so an emulator must be used.

This article explains how to setup a Debian MIPS guest for running and debugging MIPS binaries on an Arch Linux host. A lot of this information was taken from my friend Zach Cutlip's blog.

Qemu

First, QEMU needs to be installed. This is the emulator that will allow us to emulate MIPS on x86.

(host)$ pacman -S qemu

Debian QEMU Guest Images

Debian QEMU guest images need to be downloaded or created from scratch. Creating from scratch is time consuming, so we will download premade images.

Here we download 32-bit MIPS Debian 7 images:

(host)$ wget 'https://people.debian.org/~aurel32/qemu/mips/debian_wheezy_mips_standard.qcow2'
(host)$ wget 'https://people.debian.org/~aurel32/qemu/mips/vmlinux-2.6.32-5-4kc-malta

The .qcow2 file is the filesystem for the MIPS guest system. A basic Debian installation has been done on this system.

The vmlinux file is the kernel.

Running the MIPS Guest

The MIPS guest can be run as follows:

(host)$ qemu-system-mips -nographic -M malta \
    -kernel ./vmlinux-3.2.0-4-4kc-malta \
    -hda ./debian_wheezy_mips_standard.qcow2 \
    -append "root=/dev/sda1 console=ttys0"

This will boot up the guest. It will take a long time to boot. It seems that boot messages from init don't get written to the screen, so it can appear to have frozen during boot. If you wait long enough (several minutes), you will eventually see a familiar user name prompt.

You will be able to login as the user root with password 'root'.

Setup the MIPS Guest

This is just a normal Debian machine, so you can do things like adding users and installing programs. I usually do something like the following. These commands are being run as root.

(mips)$ groupadd me
(mips)$ useradd -g me -G users,sudo -m me
(mips)$ apt-get update
(mips)$ apt-get install \
    sudo screen vim tree git gdb strace openssh-server
(mips)$ update-rc.d ssh enable

Networking

At this point, you should have your MIPS machine setup and working nicely. By default, QEMU sets up networking so that the guest MIPS machine can connect to your host, but your host cannot connect to your guest. Your guest also cannot use ICMP.

In order to make networking more convenient, most people recommend setting up bridged networking. However, this takes time to setup. One easy thing to do is to use remote forwarding with SSH.

On the MIPS guest, run the following command to connect to your host:

(mips)$ ssh -NR 2222:localhost:22 your-user-on-host@10.0.2.2

Now, on your host, you should have port 2222 open.

(host)$ netstat -lanp
Active Internet connections (servers and established)
Proto   Local Address   Foreign Address   State    PID/Program name
tcp     0.0.0.0:2222    0.0.0.0:*         LISTEN   21760/qemu-system-mips
...

You can connect to it using ssh in order to access your MIPS machine.

(host)$ ssh -p 2222 me@localhost

tags: security, linux