前言

近期的一些事,我们若在 Linux 系统下遇到一些“黑客”的攻击,往往会追溯攻击者的操作,掌握攻击者的攻击方式,故需要检索相关日志;得益于 Linux 系统强大的日志功能,可以保存系统上的几乎所有操作记录,并可以从中检索出我们需要的信息。

故本文就带大家了解下相关日志分析技巧,此处演示系统为 RH 系的 CentOS 系统,Debian 系系统可能部分命令不太适用。

日志文件简介

在 Linux 系统下,日志默认存放位置目录为:/var/log/

系统日志配置文件:/etc/rsyslog.conf

相关文件关系如下表:

日志文件文件说明
/var/log/cron记录了系统定时任务相关的日志。
/var/log/cups记录打印信息的日志。
/var/log/dmesg记录了系统在开机时内核自检的信息,也可以使用 dmesg 命令直接查看内核自检信息。
/var/log/mailog记录邮件信息。
/var/log/message记录系统重要信息的日志。这个日志文件中会记录 Linux 系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件。
/var/log/btmp记录错误登录日志,这个文件是二进制文件,不能直接 vim 查看,而要使用 lastb 命令查看。
/var/log/lastlog记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接 vim ,而要使用 lastlog 命令查看。
/var/log/wtmp永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接 vim ,而需要使用 last 命令来查看。
/var/run/utmp记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接 vim ,而要使用 wwhousers等命令来查询。
/var/log/secure记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如 SSH 登录,su 切换用户,sudo 授权,甚至添加用户和修改用户密码都会记录在这个日志文件中。

比较重要的几个日志:

  • 登录失败记录: /var/log/btmp ,对应命令:lastb
  • 最后一次登录: /var/log/lastlog ,对应命令:lastlog
  • 登录成功记录: /var/log/wtmp ,对应命令:last
  • 登录日志记录: /var/log/secure
  • 目前登录用户信息:/var/run/utmp ,对应命令:wwhousers
  • 历史命令记录:history ,其中仅清理当前用户: history -c
last 系列相关命令更多用法可参考文章:https://linux.isisy.com/list.html#!kw=last

日志分析技巧

以下需要一些常用的 SHELL 命令了,例如:grepsedawkfindnetstat

日志查找技巧

1、显示文件的前后几行

我们可通过 Linux 下的 grep 命令相关参数控制检索上下文:

# 显示 file 文件里匹配 foo 字串的行以及上下 5 行
grep -C 5 foo file

# 显示 foo 及前 5 行
grep -B 5 foo file

# 显示 foo 及后 5 行
grep -A 5 foo file

2、查找含有摸字符串的所有文件

grep -rn "hello,world!"

其中,相关参数如下:

  • -r :递归查找
  • -n :显示行号
  • -R :查找所有文件,包含子目录
  • -i :忽略大小写
  • 命令若不指定文件,则表示当前目录下的所有文件,也可指定相关文件
grep 命令更多用法可参考文章:https://linux.isisy.com/c/grep.html

3、显示一个文件某几行

例如文件从第 5 行开始,显示 10 行,即显示 5-14 行

cat input_file | tail -n +5 | head -n 10

如图:

2023-05-31-21.05.10.png

4、查找文件

例如,在 /var 目录下查找 secure 文件:

find /var -type f -name secure
find 命令更多用法可参考文章:https://linux.isisy.com/c/find.html

5、显示系统中有哪些账户

命令如下:

cat /etc/passwd | awk -F ':' '{print $1}'
  • -F :指定域分隔符
  • $0$1$2 ……$n$0 则表示所有域, $1 表示第一个域, $n表示第 n 个域
awk 命令更多用法可参考文章:https://linux.isisy.com/c/awk.html

6、除 root 之外,是否还有其它特权用户( uid 为 0 ):

awk -F: '$3==0{print $1}' /etc/passwd

7、删除文件指定行内容

例如删除 .bash_history 文件中 10-20 行内容:

sed -i "10,20"d .bash_history
sed 命令更多用法可参考文章:https://linux.isisy.com/c/sed.html

日志分析技巧

日志查找,可以查一些敏感操作行为,例如 ssh 爆破等。

1、定位有多少 IP 在爆破主机的 root 帐号:

grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

2、定位哪些 IP 在爆破:

grep "Failed password" /var/log/secure | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" | uniq -c

3、爆破的用户名相关字典:

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

4、登陆成功的 IP 有哪些:

grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

5、登陆成功的日期、用户名、IP:

grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

6、增加用户的日志:

grep "useradd" /var/log/secure

7、删除用户的日志:

grep "userdel" /var/log/secure

8、su 切换用户日志如下:

May 31 21:36:25 centos su: pam_unix(su-l:session): session opened for user test by root(uid=0)

9、sudo 授权执行日志如下:

May 31 21:37:31 centos sudo:    root : TTY=pts/2 ; PWD=/root ; USER=root ; COMMAND=/bin/ls

10、软件安装日志文件 /var/log/yum.log ,检索该文件可查看软件安装相关记录:

[root@localhost ~]# head -5 /var/log/yum.log
Jan 11 16:51:30 Installed: xmlstarlet-1.6.1-1.el7.x86_64
Jan 18 16:55:31 Erased: libzip-devel-0.10.1-8.el7.x86_64
Jan 18 16:55:32 Erased: libzip-0.10.1-8.el7.x86_64
Jan 18 17:06:50 Installed: libzip-0.10.1-8.el7.x86_64
Jan 18 17:06:50 Installed: libzip-devel-0.10.1-8.el7.x86_64
[root@localhost ~]# 

11、根据端口列进程:

netstat -ntlp | grep ":80 " | awk '{print $7}' | tr '/' "\t"

其中,grep 命令后面为你需要检索的端口。

12、查找较多的 SYN 链接:

netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

其中,grep 命令后面也可为不同的链接,如:ESTABLISHEDCLOSE_WAIT

13、查看服务当前的并发连接数和 TCP 连接状态:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(key in S) print key,"\t",S[key]}'

Log4j2 应急措施

1、搜索 /var/log 目录下未压缩的文件在该目录下存在的攻击日志:

grep -E -I -i -r '\$\{jndi:(ldap[s]?|rmi|dns):/[^\n]+' /var/log

如下(可应用到具体的文件记录日志,如 WEB 服务记录日志,此处以 Modsecurity WAF 拦截的日志记录文件为例):

[root@tx3_yang ~]# grep -E -I -i -r '\$\{jndi:(ldap[s]?|rmi|dns):/[^\n]+' /var/log
/var/log/modsec_audit.log:If-Range: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#If-Range#}
/var/log/modsec_audit.log:If-Match: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#If-Match#}
/var/log/modsec_audit.log:Range: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#Range#}
/var/log/modsec_audit.log:Accept-Ranges: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#Accept-Ranges#}
/var/log/modsec_audit.log:Date: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#Date#}
/var/log/modsec_audit.log:Pragma: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#Pragma#}
/var/log/modsec_audit.log:Max-Forwards: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#Max-Forwards#}
/var/log/modsec_audit.log:Referer: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#Referer#}
/var/log/modsec_audit.log:Cookie: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#Cookie#}
/var/log/modsec_audit.log:Accept-Encoding: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#Accept-Encoding#}
/var/log/modsec_audit.log:Cache-Control: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#Cache-Control#}
/var/log/modsec_audit.log:Accept: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#Accept#}
/var/log/modsec_audit.log:From: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#From#}
/var/log/modsec_audit.log:User-Agent: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#User-Agent#}
/var/log/modsec_audit.log:If-None-Match: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#If-None-Match#}
/var/log/modsec_audit.log:Upgrade: ${jndi:ldap://xxx.xxx.xxx.xxx:62677/#Upgrade#}
……

2、搜索 /var/log 目录下压缩的文件在该目录下存在的攻击日志:

find /var/log -name \*.gz -print0 | xargs -0 zgrep -E -i '\$\{jndi:(ldap[s]?|rmi|dns):/[^\n]+'

3、搜索可能的用于 WAF 绕过的使用变量进行检查:

find /var/log/ -type f -exec sh -c "cat {} | sed -e 's/\${lower://'g | tr -d '}' | egrep -I -i 'jndi:(ldap[s]?|rmi|dns):'" \;

find /var/log/ -type f -exec sh -c "cat {} | sed -e 's/\${lower://'g | tr -d '}' | egrep -i 'jndi:(ldap[s]?|rmi|dns):'" \;

4、搜索压缩的文件可能的用于 WAF 绕过的使用变量进行检查:

find /var/log/ -name "*.log.gz" -type f -exec sh -c "zcat {} | sed -e 's/\${lower://'g | tr -d '}' | egrep -i 'jndi:(ldap[s]?|rmi|dns):'"  \;

5、Linux、Docker 容器内相关 jar 包排查:

find / -name "*.jar" -exec sh -c 'unzip -l "{}" | grep -i --color=always log4j-core-2..jar' {} \; 2>/dev/null

小结

这里的命令暂时更新到这,WEB 的记录日志排查此处就不再赘述,当遇到“黑客”攻击时,第一时间我们应冷静,切断所有可疑的外连行为,事后保留好当前系统下的相关日志文件,这是我们取证、分析攻击手段的关键。然后根据攻击手段逐步排查受影响的文件或配置,一步一步来,切勿操之过急。

End

本文标题:应急响应之-Linux日志分析

本文链接:https://www.isisy.com/1477.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

如果觉得我的文章对你有用,请随意赞赏