明天就要护网面试了,有点紧张;所以写几篇日志分析缓解一下压力,顺便巩固一下背的知识;
如果这次面试过了的话,无偿把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}