トリコロールな猫/セキュリティ

思いついたことをぼちぼち書いてます。

pwnable.tw攻略のためのDockerイメージ作り〜orw編

pwnable.twの「orw」のDockerイメージについて。write-upは以下。

security.nekotricolor.com

Dockerfile

前回はいろんなことをやったのでruby環境をrbenvから作りましたが、今回は難しいことはしていないのでごくごくシンプルにしました。なお、orwはlibc6-i386が入っていないと動かないようなのでそこだけ注意。また、シェルコード作成に使うnasmも入れています。

Dockerfile.orwという名前で以下を作成します。

FROM ubuntu:18.04
RUN apt-get update && apt-get upgrade -y

# basic tools
RUN apt-get install -y \
    git \
    gdb \
    file \
    vim \
    netcat

# dev tools
RUN apt-get install -y \
    build-essential \
    libssl-dev \
    libreadline-dev \
    zlib1g-dev \
    curl \
    wget \
    ruby \
    ruby-dev

RUN apt-get install -y \
     nasm

RUN apt-get install -y \
     libc6-i386

イメージを作成する

pwnabletwという名前で、タグを「orw」としました。

% docker build -f Dockerfile.orw -t pwnabletw:orw .

orwを実行するシェルスクリプトを作成する

ホストOS上のどこか(ここでは/Users/nekotricolor/share/orw)に、start.shとして以下のシェルスクリプトを作成します。
/root/share/orw/orwは問題のバイナリファイルです。

while true; do
nc -l -p 10001 -e /root/share/orw/orw;
done

Dockerコンテナを実行する

プロセスにアタッチできるようにするオプションをつけ、/Users/nekotricolor/shareを/root/shareにマウントしつつ、コンテナを実行します。

% docker run --rm -it --cap-add=SYS_PTRACE --name pwnabletw -v /Users/nekotricolor/share:/root/share --security-opt seccomp=unconfined pwnabletw:orw
root@f71b17310dff:/# 

コンテナ上でorwを実行するシェルスクリプトを実行する

/Users/nekotricolor/shareを/root/shareにマウントしたので、先ほど作ったstart.shはコンテナ上でも使えるようになっています。これを実行すると、10001番ポートがListen状態になり、接続するとorwが実行されます。

root@f71b17310dff:/# /bin/sh /root/share/orw/start.sh

コンテナに入り、10001番ポートに接続してみる

ホストOSの別のターミナルからコンテナ内に入ります。上記のroot@以下がコンテナのIDです。

% docker exec -it f71b17310dff bash

ncコマンドで10001番ポートに接続してみます。

root@f71b17310dff:/# nc localhost 10001
Give my your shellcode: 

これで、問題を解く環境が整いました。