玄机——Apache和Linux日志分析

明天就要护网面试了,有点紧张;所以写几篇日志分析缓解一下压力,顺便巩固一下背的知识;
如果这次面试过了的话,无偿把HVV面试题奉献出来(用了我很大精力整理的)


Apache日志分析

题目:
1、提交当天访问次数最多的IP,即黑客IP:
2、黑客使用的浏览器指纹是什么,提交指纹的md5:
3、查看包含index.php页面被访问的次数,提交次数:
4、查看黑客IP访问了多少次,提交次数:
5、查看2023年8月03日8时这一个小时内有多少IP访问,提交次数:

提交当天访问次数最多的IP,即黑客IP:

思路:一般情况下应急响应都是先查看系统日志,看进行了什么类型的攻击了解更多的信息后才能采取措施防护;

常用的日志位置:(Linux下所有日志都位于 /var/log 下)
(1)Apache日志:/var/log/apache2/access.log
(2)SSH远程连接日志:/var/log/auth.log
(3) 系统启动后的信息和错误日志:/var/log/message
(4)与安全相关的日志信息:/var/log/secure
(5)永久记录每个用户登录、注销及系统的启动、停机的事件:/var/log/wtmp


所以我们先把日志导出来进行查看:(可以看这篇文章——心疼金币)

cd /var/log/apache2
ls -alt  # 查看有哪些目录存在

在这里插入图片描述
然后查看access.log进行分析:
这里可以看到有很多日志记录,根本看不完:
在这里插入图片描述
所以要使用命令来过滤得到我们需要的信息:

awk '{print $1}' /var/log/apache2/access.log.1 | uniq -c | sort -n

命令解释:
(1)因为这里的日志格式符合默认访问日志格式(CLF):

客户端IP - 访问用户 [时间] “请求方法 请求路径 HTTP版本” 状态码 响应大小 “Referer” “User-Agent”
对照
192.168.1.1 - - [28/May/2025:10:00:00 +0800] “GET /index.html HTTP/1.1” 200 1234 “https://example.com/” “Mozilla/5.0 (Windows)”


字段说明
$1:客户端 IP(192.168.1.1)
$2: -(预留的身份验证信息,通常为 -)
$3: -(用户 ID,通常为 -)
$4:时间(方括号内的内容,需进一步解析)
$5:请求行(包含方法、路径、协议,用双引号包裹,需用awk的FS或FPAT调整字段分隔符)
后续字段:状态码、响应大小等。


awk '{print $1}':表示打印第一个数据,那么对应的就是IP地址;

(2)/var/log/apache2/access.log.1则表示要排除文件的目录
(3)uniq -c用于去除文本中相邻的重复行,前缀显示该行在输入中出现的次数
(4)sort -n表示用于对文本进行排序。

结果显示:
在这里插入图片描述
所以结果:

flag{192.168.200.2}

黑客使用的浏览器指纹是什么,提交指纹的md5:

根据上述分析,我们已经得知了攻击者的IP,所以可以查看所有包含有攻击者IP的日志

命令:

cat ./access.log.1 |grep 192.168.200.2 |more

在这里插入图片描述
可以看到几乎所有的结果都是这个结果(火狐浏览器的Mozilla)

“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36”

将这个信息找个在线网站进行md5加密:(不带 “ ”
在这里插入图片描述
结果:

flag{2d6330f380f44ac20f3a02eed0958f66}

查看包含index.php页面被访问的次数,提交次数:

包含index.php这个关键词,那么在我们的命令加上去就行;

命令:

cat access.log.1 | grep "index.php" | wc -l

得到结果32,输入但是不正确?
在这里插入图片描述

去网上看看别人做题后总结了两点:

(1)使用的是cat命令,必须是/index.php,因为这样表示当前目录下的index.php,不然的话假如/root目录也有呢? (2)注意筛选的时候不要直接 grep ‘index.php’,因为黑客可能在访问的时候访问的index.php前缀还有,比如xxxindex.php这种也能筛选出来,这样的话你的index.php访问次数就不准确了,所以我们应该加一个字符限制就是反斜杠 /

所以正确的命令:二选一均可

cat access.log.1 | grep "/index.php" | wc -l
grep -Ea '/index.php' /var/log/apache2/access.log.1 | wc -l #wc是计算行数的

在这里插入图片描述

命令解释:
(1)Ea 作用:E允许使用扩展正则表达式,a强制 grep 将输入文件(即使是二进制格式)当作文本文件处理
(2) wc 是计算行数的

flag{27}

查看黑客IP访问了多少次,提交次数:

命令更简单了,直接统计

cat access.log.1 |grep "192.168.200.2" |wc -l

结果为6556,又不对?

在这里插入图片描述
在这里插入图片描述

为了匹配更加精确: --------------wtf O.o?
(这里有一个坑,我们在过滤的时候记得精准一下,ip后面的两个横杠记得加上去筛选- -,否则一些日志记录中也会命中你的规则,那就可能统计的数量不精准)

cat ./access.log.1 |grep "192.168.200.2 - -"|wc -l

在这里插入图片描述
所以:

flag{6555}

查看2023年8月03日8时这一个小时内有多少IP访问,提交次数:

根据上面的日志格式,我们需要过滤出包含:03/Aug/2023:08的日志记录,所以还是使用grep命令以及awk;

cat ./access.log.1 | grep "03/Aug/2023:08:" | awk '{print $1}' | sort -nr| uniq -c |wc -l
grep -Ea "^[0-9]+.*+03/Aug/2023:[08|09]" /var/log/apache2/access.log.1 | awk '{print $1}' | uniq -c | wc -l

在这里插入图片描述
命令解释:
第二条命令的Ea 就发挥作用了,用到了正则表达式,可以让过滤结果更精准;
当然第一条命令也是可以的;

flag{5}

应急响应-Linux日志分析

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

有多少IP在爆破主机ssh的root帐号,如果有多个使用","分割

这里我们上面也说过,ssh的日志存放位置为:/var/log/auth.log.1
.1 表示这个备份文件,查看/var/log/auth.log 也是可以的

所以我们输入命令,进入到日志进行过滤:
还是要回顾一下日志的标准格式:

字段说明:  
客户端 IP(192.168.1.1)  
-(预留的身份验证信息,通常为 -)  
-(用户 ID,通常为 -) 
时间(方括号内的内容,需进一步解析)  
请求行(包含方法、路径、协议,用双引号包裹,需用awk的FS或FPAT调整字段分隔符) 
后续字段:状态码、响应大小等。

进入日志后,我们观察到这些关键字(方便后续的过滤):
在这里插入图片描述
在这里插入图片描述
而一般来说攻击者爆破,结果都是以失败居多,所以我们简单的使用Failed password为关键词即可;

所以命令为:

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

在这里插入图片描述
命令解释:
(1)cat auth.log.1:用于显示 auth.log.1 文件的内容。
(2)grep -a "Failed password for root":查找所有包含"Failed password for root"的行,这些行表示尝试登录root用户的失败尝试。
(3)awk '{print $11}': {print $11} 表示打印每行的第11个字段。假设日志格式为标准格式,第11个字段通常是IP地址。
(4)uniq -c用于去除文本中相邻的重复行,前缀显示该行在输入中出现的次数
(5)sort表示用于对文本进行排序。

但是根据显示的结果输出结果不对,试了几次发现要从小到大排序,所以提交的时候:

flag{192.168.200.2,192.168.200.31,192.168.200.32}

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

爆破成功的字段是“Accepted”,或者将上面爆破的IP一个一个试
毕竟我们不知道哪个才是真的在这里插入图片描述

关于连接失败/成功的关键词是什么不知道的话没关系,今天看到了不就知道了吗?

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

在这里插入图片描述
所以结果为:

flag{192.168.200.2}

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

什么是爆破用户名字典?

一般是指:当黑客实施暴力破解攻击时,会借助自动化工具,针对一个预先准备好的用户名集合展开攻击。他们会批量尝试这些用户名,并搭配常见密码、默认密码或其他推测出的密码组合,试图获取系统的有效登录凭证

命令:
这里用到了perl语言,没搞懂,不解释,原理肯定就是那样然后这样:

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

命令解释:
perl -e ‘while($_=<>){ /for(.*?) from/; print “$1\n”;}’

(1)perl -e:执行单行 Perl 脚本。
(2)while($_=<>){…}:逐行读取输入内容。
(3)/for(.?) from/:正则表达式,匹配for和from之间的任意字符(非贪婪模式),通常是用户名。
(4)print “$1\n”;:输出匹配到的用户名(即正则表达式中的第一个捕获组(.
?))。

结果为:
在这里插入图片描述

flag{user,hello,root,test3,test2,test1}

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

怎么看着有点熟悉不是?只不过是过滤192.168.200.2这个账号登录成功之前爆破了多少次

直接上代码:

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

在这里插入图片描述
与之前一样的结果;

flag{4}

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

由于我们现在已经知道了auth.log文件能够记录系统账户活动,那我们直接grep该文件即可,添加用户的命令是new user
那这里我们肯定就是找新建用户,因为题目也已经说明了.黑客登陆主机后新建了一个后门用户;

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

在这里插入图片描述
因此:

flag{test2}