write-up hatena/intern-2020-docker-quiz
はてなさんがインターン向けのクイズを出してます。解き終えた記念エントリです。
二時間目コンテナの講義ではDocker Quizが出題。君は、すべて解くことができるか?
— hatenatech@はてなの技術情報アカウント (@hatenatech) 2020年9月7日
$ docker run --rm -i hatena/intern-2020-docker-quiz #hatenaintern2020
以下当然ネタバレです
解答までの尺稼ぎのために解けたときの tw でもはっておく。
最後だけヒント見ちゃった pic.twitter.com/mzq6jXxc8u
— はくどー (@HKDnet) 2020年9月9日
それぞれの問題に対応する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 をインストールしよう!(たぶん怒られます)
さて、それはそれとして trivy fs
をコンテナ内部でやってもなんかうまくいかなかった。 trivy image
をコンテナ内でかけておしまい。
Q7 全然わからんかったのでとりあえず strings
をかけてみるが全然だめ。ていうかFLAGの中身が2つしか出てこない。 docker_quiz.go.enc
の存在には気づいたので、とりあえず vim で開いて眺める。冒頭の Salted__
は openssl の encrypt 結果っぽい(ググった)。
適当に出てきたSOを見ながら復元しようとするが、アルゴリズムもパスワードもわからないのでうーんという感じ。
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
の件でした。
大変おもしろかったです。