pwnable.twの「orw」のDockerイメージについて。write-upは以下。
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:
これで、問題を解く環境が整いました。