Room: Wonderland
Difficulty: Medium
Show: Free
CTF形式でマシン攻略しフラグを取得するタイプのRoomになります。
列挙
nmapを実行したところ、22/tcp(ssh)と80/tcp(http)が稼働していることがわかりました。
nmap -v -Pn -T4 -sV -sC --version-all -A --osscan-guess 10.10.227.248
22/tcp(ssh)はひとまず置いておいて、80/tcp(http)にアクセスしてみると以下のページが出力されました。
残念ながら、当該ページ上ではexploitにつながりそうな情報は得られなかったので、続いてdirbusterを用いて隠しファイルやディレクトリがないか確認しました。
再帰探索できるように設定して実行すると、rabbitのアルファベット毎にディレクトリが存在することがわかりました。
どうやら、各ディレクトリで会話形式になっているようです。
最後のhttp://10.10.227.248/r/a/b/b/i/t/
までたどり着きましたが、ページ上だけだと有用な情報が得られず、ディレクトリ名も相まってrabbit hole(罠)にハマってしまったのかと考えました。
ただ、その後なんとなくソースコードを見ていたところ、ページ上には表示されない怪しい箇所を見つけました。
コロンで区切られており、なんとなくユーザ名とパスワードに見えたのでssh接続を行うとユーザ権限のシェルを取得することができました。
また、その後user.txtを探し回ったところ、なぜか/home/aliceにはroot.txtがあり、/rootにuser.txtがありました。
権限昇格
/homeを覗いてみるとroot以外に4ユーザ分いることがわかったので、いくつかのユーザを乗り継ぎつつrootへ行く必要があるのだろうと想像しました。
権限昇格①
/home/aliceを探索するとroot.txt以外に現権限でも実行できる怪しげなpythonファイル「walrus_and_the_carpenter.py」を見つけました。
また、sudo -l
を実行し、aliceに与えられている権限を確認したところ、rabbitの権限で先ほど見つけた「walrus_and_the_carpenter.py」を実行できることがわかりました。
ただ、単純に実行してみたところ、いくつかの文章が表示されるだけだったので、もう少々手を加える必要がありそうです。
ソースコードを確認してみました。
どうやらプログラム自体は「walrus_and_the_carpenter」の詩からいくつかのランダム行を抜き出すもののようで、1行目でrandomというモジュールをインポートしていることがわかりました。
randomモジュールは、定義されたpythonパスの1つにありますが、pythonが優先度の高いディレクトリで同じ名前のモジュールを見つけると、「正当な」モジュールではなく、そのモジュールをインポートします。
したがって、「walrus_and_the_carpenter.py」の同じディレクトリ内で/ bin/bashを実行する「random.py」スクリプトを作成しようとすると、おそらく、「walrus_and_the_carpenter.py」が定義されたpythonモジュールの代わりにこのモジュールを呼び出します。
そして、その「random.py」を細工することによって実行権限である「rabbit」のシェルを手に入れることが出来るはずです。
予想通り、rabbit権限のシェルを取得できました。
権限昇格②
続いて、取得したrabbitシェルで探索を行ったところ、rabbitのホームディレクトリにて怪しげなSUID付きバイナリファイル「teaParty」を見つけました。
ただ、実行するだけでは内部でどういった仕組みになっているかわからなかったため、strings
コマンドを用いて分析を行うことにしました。
残念ながら、対象マシンではstrings
コマンドを使用することが出来なかったため、対象ファイルを自身のkaliへ移動させて手元のマシンで分析を行います。
上図は一部を切り取ったものですが、内部ではecho
コマンドとdate
コマンドを使用しているようです。
ここでdate
コマンドに注目してみると、echo
コマンドは絶対パスで指定されているのにもかかわらず、こちらは絶対パスで指定されていません。
そのため、「正当な」パスに存在するdate
バイナリファイルを使用せず、こちらで用意したバイナリファイルを使用することが出来そうです。また、仮にこのバイナリファイルが/bin/bashを取得するものであった場合、権限昇格に使用できそうな気がします。
上図の通り、まずは/bin/bashを取得するためのdate
ファイルを作成します。
その後、chmod +x date
により、実行権限を付与します。
そして最後に「teaParty」を実行して、偽のdate
を使用させるために、システムが使用するパス($PATH)に偽のdate
ファイルが存在する/home/rabbitを追記します。
※ここでは本来のdate
バイナリがある/binよりも先にシステムに参照されるように追記する必要があります。
【修正前のPATH】
【修正後のPATH】
準備ができたので「teaParty」を実行します。
無事、権限昇格に成功し、「hatter」権限のシェルを手に入れることができました。
権限昇格③
ひとまず/home/hatterを確認してみると、「password.txt」というファイルがあったのでsu hatter
を行います。
色々と探索しましたが、残念ながら有用な情報が得られなかったため、linpeasを使用して列挙することにしました。
自身のマシンから送り、実行権限を付与して実行します。
実行した結果を確認したところ、capabilitiesの設定不備があるようで、/usr/bin/perlにcap_setuidのcapabilityが付与されていることがわかりました。
これを悪用したら権限昇格ができそうです。
CAP_SETUID
プロセスの UID に対する任意の操作 (setuid(2), setreuid(2), setresuid(2),
setfsuid(2)) を行う。 UNIX ドメインソケット経由でソケットの資格情報 (credential)
を渡す際に 偽の UID を渡すことができる。 ユーザー名前空間にユーザー ID マッピングを
書き込むことができる (user_namespaces(7) 参照)。
http://manpages.ubuntu.com/manpages/bionic/ja/man7/capabilities.7.html
こちらのサイトを参考にし、権限昇格を試みたところ、無事、rootを取得することが出来ました。