freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

Linux日志分析与中间件分析:一篇实用的应急响应教程[四]
zero1234 2025-02-27 09:47:49 59784
所属地 广东省

前言

相信各个师傅都收到了消息,今年的护网将是常态化护网,周期非常的长。在这几天,已经有各大厂商开始陆续的收集简历了吧,相信以护网的薪酬,大家都想分一杯羹。那么我们学会应急响应是必不可少的!让我们也马上卷起来吧!

引用文献

应急响应篇之Linux日志分析_哔哩哔哩_bilibili

正式开始

知识点一:明确Linux的日志存储位置

根据版本的不同,存储日志的地方也就不同

/var/log/

Ubuntu以及Debian下可以查看auth.log日志文件/var/log/auth.log

redhat以及Centos下可以查看secure日志文件/var/log/secure.log

该日志文件记录了所有与用户认证、权限管理相关的活动,例如:登录成功、失败,记录用户名、来源 IP、时间戳及认证方式。

通过:uname -a 可以查看出版本信息,直接丢到AI里问就好了

知识点二:如何对日志进行排查?

1740617390_67bfb6aeaa391109ce760.png!small?1740617351818

我们以Debian系统为例

这些gz的文件,其实就是被打包的日志文件。原因在于日志过了一段时间或者存储满后就会将一段时间的日志打包,保证存储空间。

gunzip -d auth.log*  -- 解压所有名称前是auth.log匹配的日志

cat auth.log*  -- 查看你所有与auth.log匹配的日志


以我们要寻找登录失败的IP为例:

Failed 是失败的字段,所以我们可以使用

cat auth.log* | grep "Failed"

1740617564_67bfb75c8df1937e6a07a.png!small?1740617525817

筛选出所有含有Failed的日志信息,从而去进行排查

但这里有一个问题,在日志量大的时候,就没办法这样查了。

因为命令框中显示的字符有限,所以我们要换一种方式统计所有IP登录失败的次数

方式一:

日志文件拿下来,然后保存到execl,数据->分裂->分割符号为空格->分割完成后,直接筛选

1740617607_67bfb787e612e1e446395.png!small?1740617569740

但是这样十分的不专业~

方式二:

cat auth.log* | grep "Failed" | awk -F " " '{print $11}' | uniq -c

1740617633_67bfb7a15b7155f5cb826.png!small?1740617594705

这样就要优雅许多

cat auth.log* | grep "Failed" 就不用介绍了

awk -F " " '{print $11}' 你可以理解为格式化进行统计awk -F为固定格式," "这里的双引号是分割符号的意思

1740617564_67bfb75c8df1937e6a07a.png!small

以该图的第一行为例:

如果你双引号内填的是"空格",那么这些输出的行就会被分为:Jan、21、09:48:34... 这样的一列一列

一共有14列

如果你双引号内填的是09,那么这些输出的行就会被分为Jan 21 09、:48:34 yeqiu-virtual... 这样的两列。

'{print $11}'呢?

更好理解,我们以空格分为了14列,然后表示我们输出第11列的内容,11列正好是IP地址

awk -F " " '{print $11}',总结就是以空格为分割,输出第一列的内容。

当然我这里的图和IP没有关系,只是做一个类比~

uniq -c 作用简单,就是用来统计次数,| 就是命令执行的分隔符号,管道符。

这样就可以成功的快速统计了~


但是这样可能会有bug,建议使用sort 命令进行一个排序。

什么bug呢?换一张有IP的图给你们看看(这不算是bug,有兴趣去了解一下uniq -c的统计机制就明白了)

1740618130_67bfb992a3014af4be523.png!small?1740618092288

使用 cat auth.log* | grep "Failed" | awk -F " " '{print $3}' | sort | uniq -c 就可以很好的避免这个问题

如果我们想同时看两个内容呢?

grep -e 逻辑符号或的意思

cat auth.log* | grep -e "Failed" -e "Accepted"

1740618204_67bfb9dcbc278ab175f19.png!small?1740618166448

如果不想看某个字符的结果呢?

cat auth.log* | grep -v -e "Failed" -e "Accepted"

加上-v就是不显示什么内容。这里就是不显示含有Failed的日志信息。

grep -i呢?这个就是不区分大小写,例如:cat auth.log* |grep "failed"

1740618787_67bfbc235bc0e3d80c767.png!small?1740618748526

cat auth.log* |grep -i "failed"

1740618788_67bfbc24ca5f814c6ecc5.png!small?1740618750182

加上-n,就会输出行号:grep -n

加上-a,   就可以看到二进制文件了: grep -a

加上-A 5 ,就可以看上下文,-A是看命中后的五条,-B是看命中前的五条,-C是看上下五条

1740618804_67bfbc34bb986ea846458.png!small?1740618766336


还可以进行多个匹配,例如想看35448的端口,且是Failed

方式一:cat auth.log* | grep "Failed" | grep "35448"

方式二:cat auth.log* | grep -E "Failed.*35448"   这里-E表示正则表达

1740618824_67bfbc48536060d0306e1.png!small?1740618785853


知识点三:日志排查条件表达式

上个知识点说了cat auth.log* | grep "Failed" | awk -F " " '{print $11}' | sort| uniq -c这样的一个语句

是将匹配Failed字符的日志给输出出来,但这样会有一个问题:

1740618896_67bfbc907667512bc693a.png!small?1740618858494

你看,这种信息,它不带IP,但是它也含有Failed,所以也会被输出出来

1740618942_67bfbcbe7b4b89ac48795.png!small?1740618903706

如果我们想只显示IP呢,可以加上条件表达式

cat auth.log* | grep "Failed" | awk -F " " '$6=="Failed"{print $11}' | sort| uniq -c '$6=="Failed"{print $11}'

这段条件很简单,'$6=="Failed"{print $11}',意义:第六行要等于Failed才输出第十一行的IP

这样就避免了其他的输出

1740618998_67bfbcf6486239981e2c6.png!small?1740618959461


还可以补充一个姿势:查看用户通过 sudo 执行的命令,也可以用我们上面的方式构造语句

sudo grep "COMMAND" /var/log/auth.log


知识点四:通过命令行日志进行排查

首先要明确存储的位置

1740619131_67bfbd7be4b6dd81dc46a.png!small?1740619093065

那么我们就试试history:

1740619149_67bfbd8db21d6dbd937cb.png!small?1740619111229

这里就记录着我们刚刚输入的各种命令。

查看/home/yeqiu/.bash_history中的记录

1740619171_67bfbda3cdeaebf469bd2.png!small?1740619133304

但这个文件有个特殊的地方。我现在输入一个su root试试,记住这个记录到exit命令。

1740619213_67bfbdcd9ce22e08cf279.png!small?1740619177417

然后在看我们的日志文件:cat /home/yeqiu/.bash_history

1740619227_67bfbddbaf32b28a19db5.png!small?1740619189069

诶,为什么没有记录su root呢???因为这个窗口对话还没有结束,只有我们关闭窗口或者输入exit退出会话,文件才会自动的进行一个记录

管理员的操作日志和普通账号操作日志存放位置又不一样了:

cat /root/.bash_history                    -- 查看管理员账户的会话记录

bash_history                                    -- 查看当前用户的会话记录

cat /home/普通用户/.bash_history -- 查看普通用户的会话记录

history -c                                         --只会清空当前的记录

rm -rf /root/.bash_history                --才会删除当前日志的所有记录


这里有一个好用的命令:

sudo find /home -maxdepth 2 -name ".bash_history" -exec cat {} \;

直接遍历所有用户的日志记录


知识点五:其他日志信息的补充

apt-get 的命令记录日志,主要记录的就是

1740619399_67bfbe8737189905dc6c8.png!small?1740619360512

1740619406_67bfbe8e1da4de3ceb1a5.png!small?1740619368479

可以看到具体下载了什么,哪个用户下载的,什么时间下载的。


记录登录失败的日志

1740619430_67bfbea6d4c5ec16f07d7.png!small?1740619392427

1740619430_67bfbea6d09b6d252ad59.png!small?1740619392428

要通过last -f 去查看,否则查看不了,应该是二进制文件。。


Mysql日志

1740619451_67bfbebb79ba48c4bb43d.png!small?1740619413232


知识点六:如何排查中间件?如何排查中间件的日志?

apache的日志我们很好找

1740619972_67bfc0c41e8a8ede9516b.png!small?1740619933417


但是如果是tomcat的日志呢?

1740619991_67bfc0d7b7f2c5f0de856.png!small?1740619953823

我们就需要先找到进程中在运行的tomcat的相关字段。

这条命令适用于一切当前在运行的文件,只有在运行才能通过ps -ef看到它的进程,从而进行筛选。

也就是说ps -ef中如果没有,说明没有在运行

当然如果说 ps -ef命令被替换了,就另说了~

按照这些信息就能找到文件夹

1740620148_67bfc174852cabe4bffca.png!small?1740620109864

我们比较关注的是:站点配置文件、中间件配置文件

所以先不看日志

中间件配置文件

1740620204_67bfc1acefc6efc89580f.png!small?1740620166375

1740620257_67bfc1e1e0a88d9c7dacd.png!small?1740620219895

1740620262_67bfc1e6966431bd0b1d8.png!small?1740620224375


站点配置文件

1740620274_67bfc1f25b0a1793999aa.png!small?1740620235816

1740620277_67bfc1f5bc7541a98731f.png!small?1740620239000


日志文件

根据刚刚配置文件的信息,就能知道日志文件放在哪里了

1740620290_67bfc2025ff289f15e9d4.png!small?1740620251824

这里写到了directory="logs",倒数第八行

1740620296_67bfc2083875224939b90.png!small?1740620257560

1740620329_67bfc229a32ea088e3950.png!small?1740620290926

这类日志中记录的是具体的访问信息,我们一般也只排查该日志

我们以刚刚看到的配置文件,与日志相对的看

1740620356_67bfc2448cfdba8754fb3.png!small?1740620319579

根据刚刚的配置文件,将pattern信息和他一样对应着看,一共有7个字段,每个字段分别代表不同的意思,就可以快速的锁定我们需要的信息了。

%b 代表响应数据包的大小


如何统计呢???

我们可以统计ip次数嘛

cat localhost_access_log.20* | awk -F " " '{print $1}' | sort | uniq -c

1740620438_67bfc296b8d0c0d37d5b6.png!small?1740620400307

这样不就很直观了

后期再用命令,去查看这些ip的行为

就可以知道了哪个是攻击者的ip了

grep "192.168.43.100" -Rn *   -R 是递归搜索子目录,-n 显示行号

1740620452_67bfc2a47f3859408afb7.png!small?1740620413660

这样就可以查看这个ip 在哪个文件出现的比较多

当然也可以自己参考上面的构造,构造一个筛选ip的就好了

1740620461_67bfc2ad973ba87e4d2d6.png!small?1740620423132

这样格式有了,就可以统计这个ip在哪个日志文件出现的次数最多~

问题一:攻击者用扫描器对WEB站带你进行了扫描,需要你提供攻击者什么时候开始扫描。

首先明确攻击者的扫描特征:高并发,时间没有断过

1740620503_67bfc2d7a4328e5f38485.png!small?1740620466300

通过时间去进行一个定位,每分钟扫描多少次

1740620513_67bfc2e19218094a9a92d.png!small?1740620475585

这里肯定是输出第四行啦

1740620530_67bfc2f2841163adf391e.png!small?1740620492016

根据这个我们使用

cat localhost_access_log.2018-11-15.txt | grep 192.168.43.101 | awk -F " " '{print $4}' | cut -c 14-18

cut -c 是什么作用。

是分割的作用,例如:09:12:32 将第14个字符:0,与第18个字符2做一个分割。

值得注意的是前面的不包含,后面的包含

1740620552_67bfc308b765f24f23a42.png!small?1740620513905

这样就把时间给提取出来了,再用uniq -c 一统计,是不是就知道什么时间段的攻击次数最多了

1740620567_67bfc317e83ffd167bd88.png!small?1740620529296

举一反三:

1740620671_67bfc37f92d5f7fb702d6.png!small?1740620633002

1.  这里分析POST是干嘛?是找爆破密码的时间。

2.  -i    SELECT 这是为了分析sql注入。

好了到这里本章内容就结束了~

姿势总结

通用类

uname -a -->查看内核详细信息

为了防止命令被篡改,建议上传busybox,这就是一个linux的命令箱子

which top -->查询软件、命令具体位置,仅限制自带的就是那种环境变量配置的

file 命令,可以查看命令、软件具体属性,能够识别是否被替换了。file + 命令名称

gerp "apache.tar.gz" -Rn .  全局寻找某个文件位置


grep -r '/bin/bash' .   遍历当前目录下,含有/bin/bash的文件


进程类

top

实时查看进程,CPU占用

ps -ef

查看进程信息

ps -efww

ps -ef I grep mysql

可以看到具体信息,cmd命令信息

可以单独查看mysql的信息

lsof

lsof -p 进程号

列举所有打开的资源

可以查看某个进程号的具体信息

kill -9

进程号 --》删除进程


网络信息类

netstat -pantu 和windows的netstat -ano效果一样

netstat -pantu | grep "ESTABLISHED"


恶意用户排查类


cat /etc/passwd -->查看所有用户信息

1 用户名

2 密码 -> X代替了,现在

3 uid 系统内核分配权限的时候,根据UID来进行分配的

4  主组 ID

5 用户的描述信息

6 用户的家目录

7 用户的解释器


awk -F: '$3==0 {print $1}' /etc/passwd 检查UID为0的用户。

grep -E '/nologin|/false' /etc/passwd。列出使用不可登录 Shell 的用户

awk -F: 'length($2)==0 {print $1}' /etc/shadow。检查密码字段为空或无效的用户


环境变量排查

cat /etc/profile

cat /etc/bash.bashrc -- 是全局的Bash配置文件

cat /etc/bash.bashrc | grep -E "alias|function|export"

# 检查可疑别名或环境变量

stat /etc/bash.bashrc

# 查看修改时间是否异常

md5sum /etc/bash.bashrc

# 对比已知正常版本的哈希值



/etc/profile -- 所有用户登录下

/root/.profile -- 只有root用户

/user/.profile -- 只有user用户

/用户名/bash.bashrc


服务排查

gerp "apache.tar.gz" -Rn .

通过启动的服务名进行一个排查,直接根目录下开始寻找。


排查/lib/systemd/systerm的文件

优先级高于系统默认的单元文件目录(如 /usr/lib/systemd/system),允许自定义配置覆盖默认行为。



# 查找非系统默认的单元文件

find /etc/systemd/system -name "*.service" -type f -exec ls -l {} \;

# 对比系统默认目录

diff /usr/lib/systemd/system/sshd.service /etc/systemd/system/sshd.service


计划任务排查&配置文件

crontab -l

显示当前的用户的计划任务

在/var/spool/cron/crontabs目录下

cat root

cat /etc/crontab

计划任务其中一个

cd etc/cr

->使用Tab键补全,即可看到,各种的计划任务都要排查

/lib/systemd/system/etc/rc.local

有一些版本会开启,有一些不开,要排查


目录/etc/systemd/system 查看自启动服务的相关配置文件


恶意文件排查

find /usr/bin -perm -4000 -type f,排查权限文件。


系统核心命令目录,常存放高权限工具(如 mount、umount)

find /bin -perm -4000 -type f

​**/sbin**​        系统管理命令目录,可能包含特权工具(如 fdisk、iptables)

find /sbin -perm -4000 -type f

​**/usr/sbin**​        类似 /sbin,存放管理员工具(如 useradd、visudo)

find /usr/sbin -perm -4000 -type f

​**/tmp**​        临时文件目录,攻击者可能在此植入恶意 SUID 文件

find /tmp -perm -4000 -type f

​**/dev/shm**​        共享内存目录,攻击者可能利用其可写性隐藏 SUID 后门

find /dev/shm -perm -4000 -type f

​**/var/www**​        Web 根目录,需检查是否有非预期的可执行文件被赋予 SUID 权限find /var/www -perm -4000 -type f



Find

find . -type f -newermt "2025-01-01 16:00" -a -not -newermt "2025-02-25 16:05"

find + 目录 + -type f -newermt 找寻的开始时间 -a -not -newermt 找寻的截止时间


日志类

在Ubuntu以及Debian下可以查看auth.log日志文件

在redhat以及Centos下可以查看secure日志文件


1.通过 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS/RHEL)查看用户通过 sudo 执行的命令:

sudo grep "COMMAND" /var/log/auth.log

该日志的记录信息为:

​成功登录:记录用户通过 SSH、本地终端等方式成功登录的详细信息,包括时间戳、登录方式(如密码或密钥认证)、来源 IP 和用户账号,关键字如:Accepted

失败登录:包括密码错误、无效用户等失败尝试,常用于检测暴力破解攻击。关键词如 Failed password 或 authentication failure

sudo 命令使用:记录用户通过 sudo 执行特权命令的行为,包括执行时间和具体命令。关键字:sudo


这里以:Ubuntu为例子

gunzip -d auth.log*


cat auth.log*  -- 查看你所有的auth.log的日志,这个是关于系统的登录的日志,爆破的日志


登录失败的所有IP

cat auth.log* | grep "Failed"

cat auth.log* | grep "Failed" | awk -F " " '{print $11}' | uniq -c


可以进行所有的一个排序

cat auth.log* | grep "Failed" | awk -F " " '{print $3}' | sort | uniq -c

cat auth.log* | grep -e "Failed" -e "Accepted"


grep

加上-v就是不显示什么内容。

还有-i,这个就是不区分大小写,例如:cat auth.log* |grep "failed"

加上-n,就会输出行号:grep -n

加上-a,   就可以看到二进制文件了: grep -a

加上-A 5 ,就可以看上下文,-A是看命中后的五条,-B是看命中前的五条,-C是看上下五条

例如想看35448的端口,且是Failed

方式一:cat auth.log* | grep "Failed" | grep "35448"

加上-c,可以帮忙统计次数


条件

cat auth.log* | grep "Failed" | awk -F " " '$6=="Failed"{print $11}' | sort | uniq -c

可以指定搜索Faild--》grep "Failed",然后且第六行要匹配Failed--》$6=="Failed"


命令行日志

/home/yeqiu/.bash_history中的记录,

cat /root/.bash_history -- 查看管理员账户的会话记录

bash_history -- 查看当前用户的会话记录

cat /home/普通用户/.bash_history -- 查看普通用户的会话记录


其他日志补充

history.log -- > 这个看apt install的日志

btmp --> 看登录失败的日志

查看btmp日志需要使用:last -f btmp


中间件日志

ps -ef | grep tomcat 查找中间件的位置


统计爆破日志,要先进入到中间件的文件当中

cat localhost_access_log.20* | awk -F " " '{print $1}' | sort | uniq -c

grep "192.168.43.100" -Rn *   -R 是递归搜索子目录,-n 显示行号

cat localhost_access_log.2018-11-15.txt | grep 192.168.43.101 | awk -F " " '{print $4}' | cut -c 14-18


Docker提权

user@ip-10-0-10-5:/tmp$ id

uid=1000(user) gid=1000(user) groups=1000(user),1001(docker)

user@ip-10-0-10-5:/tmp$ ps -aux |grep docker

root       491  0.0  3.4 1439544 70632 ?       Ssl  07:06   0:00 /usr/bin/dockerd


docker run -v /:/mnt -it alpine

chroot /mnt bash


Weblinux查杀

find ./ -name "*.php" | xargs grep "eval(" 提取出有危险函数的格式

打包当前文件下的目录


tar -czvf src.tar.gz ./*

总结

本篇文章所说的都是技巧,这些技巧都是通用的。但要明确我们的步骤

1.确定操作系统

2.确定要排查的文件位置

3.构造合适的语句进行筛查

最后祝大家天天开心、快快乐乐~

免责声明

  • 本文所包含的内容仅用于教育和研究目的,旨在提高信息安全意识,帮助用户了解网络安全防护的重要性。

  • 文章中提及的任何渗透测试技巧、工具或方法,仅供合法授权的安全研究和测试使用。在进行任何渗透测试或安全测试之前,请确保您已获得相关系统或网络所有者的明确授权。

  • 本文作者不对任何因使用文章内容而导致的非法活动、损害或其他不良后果承担任何责任。读者在实施任何技术之前应确保遵守所有适用的法律法规。

  • 本文内容不支持或鼓励任何形式的恶意攻击、未授权的入侵或网络犯罪。

  • 本文内容仅限于教育用途,不得以任何方式用于未经授权的网络安全攻击或破坏行为。


# 应急响应 # 安全应急响应 # 应急响应检测阶段
本文为 zero1234 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
zero1234 LV.4
希望大家每天都开开心心,快快乐乐,坚持学习网络安全~
  • 30 文章数
  • 50 关注者
红队APT基础 | 钓鱼邮件的制作与SPF绕过(一)
2025-04-14
SQL注入绕waf姿势:sleep被过滤了怎么办?
2025-04-10
渗透测试基础|信息收集——框架识别&框架漏洞利用
2025-04-07
文章目录