pwnable.twの「start」をやってみたんですよ。
母艦であるMBAが不安定でいつまたmacOSを再インストールすることになるか分からないので、以下のサイトを参考にDockerでイメージを作っておくことにしました。
Dockerfile
gdbやfileコマンド、vimなどの基本的なツールのほか、exploitコードを書くための環境もインストール。セキュリティといえばPythonですが、私はRubyistなのでRuby環境です。こちらを参考にさせていただきました。
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:
これで、問題を解く環境が整いました。