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

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

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

pwnable.twの「start」をやってみたんですよ。

security.nekotricolor.com

母艦であるMBAが不安定でいつまたmacOSを再インストールすることになるか分からないので、以下のサイトを参考にDockerでイメージを作っておくことにしました。

github.com

Dockerfile

gdbやfileコマンド、vimなどの基本的なツールのほか、exploitコードを書くための環境もインストール。セキュリティといえばPythonですが、私はRubyistなのでRuby環境です。こちらを参考にさせていただきました。

qiita.com

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

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
ENV RUBY_VERSION 2.7.0

# Install rbenv
RUN git clone https://github.com/rbenv/rbenv.git ~/.rbenv && \
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc && \
    echo 'eval "$(rbenv init -)"' >> ~/.bashrc

ENV PATH /root/.rbenv/shims:/root/.rbenv/bin:$PATH

# Install ruby-build & ruby
RUN git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build && \
    ~/.rbenv/bin/rbenv install $RUBY_VERSION && \
    ~/.rbenv/bin/rbenv global $RUBY_VERSION

# Initiarize ruby encording
ENV RUBYOPT -EUTF-8

# Install bundler
RUN ~/.rbenv/bin/rbenv exec gem install bundler -v 2.0

イメージを作成する

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

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

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

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

while true; do
nc -l -p 10000 -e /root/share/start;
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:start
root@d84a9d6a6d47:/# 

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

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

root@d84a9d6a6d47:/# /bin/sh /root/share/start.sh

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

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

% docker exec -it d84a9d6a6d47 bash

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

root@d84a9d6a6d47:/# nc localhost 10000
Let's start the CTF:

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