TryHackMeのKenobiという部屋のWriteUp。

「Kenobi」について
TryHackMe上ではネットワーク系問題として取り扱われている。
基本的にStarWarsリスペクトを感じるが、問題の中身には関係ない…
攻略の手順
ポートスキャン
$nmap -sV -A -Pn -T4 10.10.67.246 -oN nmap_report_kenobi -vv
でポートスキャンを実行。

RPCを含め、いろいろなサービスが動いていることが分かった。
SMBのスキャン
ポート139とポート445では、Sambaが動いていた。
このSMBの445ポートをスキャンする。
スキャンにはnmapを使うことに。
$nmap -p 445 --script=smb-enum-shares.nse,smb-enum-users.nse 10.10.67.246

IPアドレスの後ろについているのがShare。
Shareのひとつに「anonymous」があることがわかった。
SMBへの接続
smbclientコマンドを使って、このShareに接続してみる。

どうやらlog.txtというファイルがあるよう。
smbclientで接続した後は、helpコマンドでコマンド一覧を表示できる。
catは搭載されていないが、代わりにmoreがあるのでlog.txtを閲覧してみる。
$smb:\>more "log.txt"
※ ” で囲わないといけないところに注意。

なになに…
/home/kenobi/.ssh/id_rsaに鍵がある。
/home/kenobi/.ssh/id_rsaにパブリック鍵がある。
等と書いてある。
どうもsshキーを生成したときの文章のよう。
そして、もう少し下に行くと

kenobiなるユーザー名、グループ名を発見。
いわゆるクレデンシャルをゲットしたということ。
いるかどうかわからないけれど、ウォークスルー上はlog.txtをダウンロードすることになっているので、smbclientからgetコマンドを使ってクライアント側のhomeディレクトリに保存しておく。

NFSへのスキャン
先ほどのnmapでのスキャン結果を確認すると、NFSが稼働している。
ただ、NFS自体は2049ポートで稼働しているものの、RPCが2049ポートへの入り口となっているようなので、その111ポートをスキャンする。

このスキャン結果から、/varというNFSがあることがわかった。
ちなみにnmapのスクリプトの探し方を解説すると、
1.nmapの公式にアクセス
2.CTRL+Fでサービス名など検索
3.スクリプトの内容を見る
でOK。
nmapの公式のスクリプトページはこちら。

次に、この/varディレクトリの中身を見てみる。
いったんマウントする。

mnt/kenobiというディレクトリをhome配下に作り、そこに/varをマウントした。
しかし、中にめぼしいデータはない。
FTPサーバへの接続
最初のnmapでのスキャン結果から、21ポートにFTPサービスがあるとわかっているので、まずはとりあえずつないでみる。

むむむ…認証するように怒られた。
FTPサーバからのデータ抜き取り
FTPの名前はproftpdで、バージョンも1.3.5とわかっているので、脆弱性情報を検索する。

4つの脆弱性情報があった。
このうち、一番下のものを調べてみる。
このサイトの記載内容を読んでみると、
「認証されていないユーザーが、mod_copyのモジュールのSITE CPFR/SITE CPTOを使えてしまう脆弱性」ということだった。
先ほど、NFSのドライブにsmbclientで接続したとき、log.txtには
/home/kenobi/.sshの下に鍵がある
と書いてあった。
このデータを取得してみる。
今回の脆弱性で許可されているコマンドは
SITE CPFR :コピー元のファイルを指定
SITE CPTO :コピー先を指定
という意味。
コピー元はSSHキーでいいとして、コピー先はどうするか?
おそらく答えは一つだけで、それはNFSの/var。
やってみる。

/var直下に奥には権限が足りないよう。
先ほどマウントした/varの権限関係を確認してみる。

これを見ると、tmpディレクトリは、その他ユーザーにも書き込み権限があることがわかる。
それを踏まえてFTPコマンドを再実行。

そして、マウントした/varを見に行く。

ローカル権限の取得
ということで、このキーを使ってSSH接続。ユーザー名はもちろんkenobi。

これでkenobiのローカル権限をゲットした。
ROOT権限の取得
まずはいつものSUID特権狙い。

/usr/bin/menuというよくわからないコマンドにパスが通っている模様。
実行してみる。

どこかから手に入れたHTTPレスポンスをそのまま表示しているよう。
次に、ウォークスルーに従ってStringsをしてみる。

curl -I localhostという文字列が見えるが、これがmenuで1をタイプしたときの動きぽい。ターミナルで同じコマンドを打った時と同じレスポンスだったから。
次に、このcurlに中間者攻撃?をしかける。

何をやっているのか一言でいうと、menuというプログラムが使っているcurlコマンドを別のcurlファイルに置き換えて特権を取ったということ。
順番に説明すると、
1.curlというファイルを作り、中身を”/bin/sh”にする
2.curlというファイルの権限を777にして、無敵状態にする
3.curlを保存しているディレクトリ(今回は/home/kenobi)を環境変数PATHに追加する(これで、curlのパスをわざわざ指定しなくても、curlと打つだけで実行できるようになった)
4.menuを起動し、curlコマンドを使わせる
5.本来はHTTPリクエストを飛ばすcurlコマンドだが、先ほどつくったcurlファイルが呼び出される
(menuはSUIDがついており、root権限で稼働するので、自然とcurlもroot権限で動かされる)
6.curlファイルの中身はシェルを起動するというもの
7.root権限でシェルが起動
ということ。
これで攻略終わり。
まとめ
ひとつだけ文句が言えるのなら、StarWarsへのワクワク感を返してほしい。
コメント