write-up hatena/intern-2020-docker-quiz

はてなさんがインターン向けのクイズを出してます。解き終えた記念エントリです。

以下当然ネタバレです

解答までの尺稼ぎのために解けたときの tw でもはっておく。

それぞれの問題に対応するFLAGを入力していく形式。

Q1 書いてあるとおりに。こういうとりあえずやればできるのから始まるのも含めてCTFっぽいですね。

Q2 普通に渡すだけ。毎回 image 名の後に -- をいれて怒られてしまうの僕だけですか?

Q3 docker inspect でみる

Q4 docker exec で cat すればいいなと思いつつ、ホストにコピーせよと言われているので、 docker run --volume $(pwd)/sh_exec.sh:/app/docker_quiz --volume $(pwd):/tmp/foo run ... してから cp した。 sh_exec.sh は ↓ で chmod +x しておく。

#!/bin/sh

exec bash

--entrypoint /bin/bash でよかったんだけどオプション名を typo して動かなかったので雑に代用した。ていうか Q3 でフルパス見せたのこれへの布石だと思っていた。しかしあとで docker_quiz -hintを見たら docker cp と言われてそんなんあったねとなった。

Q5 シェルの起動は Q4 でできてるので終わり

Q6 trivy 知らんかったのでググって出てきたやつのインストール手順に従う。従う前に、めんどくさって思ったのでCVE一覧とかを出てきた python --version とかでググってみるが全部はずれ。ちぇっ。

image に対して検査できるのを知らず、コンテナ内にインストールしてた。ちなみにこういうときには sudo 関連で困ったりする。特に実行ユーザーが nobody だし。しかしコンテナに入るときに docker exec -uroot -it $contianer_id などとすれば root で入ることができてゴニョゴニョすることが可能である。君も本番のコンテナに exec するときに勝手に vim をインストールしよう!(たぶん怒られます)

github.com

さて、それはそれとして trivy fs をコンテナ内部でやってもなんかうまくいかなかった。 trivy image をコンテナ内でかけておしまい。

Q7 全然わからんかったのでとりあえず strings をかけてみるが全然だめ。ていうかFLAGの中身が2つしか出てこない。 docker_quiz.go.enc の存在には気づいたので、とりあえず vim で開いて眺める。冒頭の Salted__ は openssl の encrypt 結果っぽい(ググった)。

適当に出てきたSOを見ながら復元しようとするが、アルゴリズムもパスワードもわからないのでうーんという感じ。

stackoverflow.com

go tool objdump をしてしばらく眺めてみるが verify という関数でなんかしてそうなのはわかるがよくわからない。

諦めかけたところで、そういえばQ2のときに -hint ってあったなと思って中身を見ると docker history を使えとのこと。ほう。叩いてみるとたしかに履歴に残ってそうだ。このイメージは enc + password をもってきてそれから go ファイルを復元してからビルドしてることがわかる。パスワードファイルが履歴に残っているので、そのレイヤーを復活させればよい。これまた雑に docker history resurrection とかでググると以下の記事がヒット。

Looking inside Container Imagessreeninet.wordpress.com

これに従って docker save した tar の中身をあさっていくと該当ファイルを tar の中に発見。ファイルをコンテナ内で復元して同じコマンド叩いてソースを出したらあとはそれを復元するスクリプトを書いておしまい。

感想としては docker 普段から使ってるとやるよね〜みたいな感じの操作 Q1 から Q5 まで。Q6の trivy は知らなかった。Q7 は history にいろいろ情報が残るのは知ってたけどそれを実際に取り出すのを追えてよかった。教育的な題材ですね。よく考えたら頻出のセキュリティ知識だし history にあたってみるってのはヒントなしでもできたかもなー。

ちなみに記事を書こうかなとおもったきっかけは -uroot の件でした。

大変おもしろかったです。