Linux 应急响应

Linux 应急响应

Linux库劫持

在很多挖矿病毒场景中,病毒为了达到隐藏自己的效果,都会留下预加载恶意动态链接库的后门,所以在你通过监测工具发现系统cpu占用很高,但是使用top、htop、ps命令又排查不到异常进程的时候,就有必要先确定是否存在恶意动态链接库,或者使用busybox进行排查。

关于动态链接库的排查参考:

http://dayouzi.xyz/%e5%ba%94%e6%80%a5%e5%93%8d%e5%ba%94%e4%b8%adlinux%e5%ba%93%e6%96%87%e4%bb%b6%e5%8a%ab%e6%8c%81/

系统日志排查

当前已经登录的用户

[[email protected] ~]# w
 17:01:27 up 1 day,  4:34,  1 user,  load average: 0.07, 0.13, 0.16
USER     TTY      FROM             [email protected]   IDLE   JCPU   PCPU WHAT
root     pts/0    183.216.233.222  17:01    7.00s  0.00s  0.00s w

#w 它可以展示当前登录用户信息,并且每个用户正在做什么。同时展示:系统已经运行多长时间,当前时间,和系统负载
USER - 登录用户名
TTY - 登录用户使用的终端名称
FROM - 来自登录用户的主机名或者 IP
[email protected] - 用户登录时间
IDLE - 从用户上次和终端交互到现在的时间,即空闲时间
JCPU - 依附于 tty 的所有进程的使用时间
PCPU - 用户当前进程的使用时间。当前进程名称显示在 WHAT
WHAT - 用户当前进程和选项、参数

所有用户最近一次登录

lastlog 命令 用于显示系统中所有用户最近一次登录信息。

 lastlog |grep -v "Never logged in"  #过滤没有登录过的用户。

lastlog 文件在每次有用户登录时被查询。可以使用 lastlog 命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog 的内容。它根据 UID 排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog 显示Never logged。注意需要以 root 身份运行该命令。

历史登录用户及登录失败用户

last 可以查看所有成功登录到系统的用户记录,lastb 查看登录成功和失败的用户记录。

last : 读取/var/log/wtmp 的文件,并把该给文件的内容记录的登录系统的用户名单全部显示出来。

lastb : 读取/var/log/btmp 的文件,并把该文件内容记录的登入系统失败的用户名单,全部显示出来。

last -n 5       #查看最近 5 个登录的用户。
last -a -n 5    #-a 参数把 ip 列放在最后一行
#-d ip转换为主机名。获取登录到系统的用户所使用的的主机名,如果目标适用的服务器绑定了域名,该参数有可能获取到目标域名
last -a -d |awk -F' ' '{print $1 "\t" $NF}'   

注:awk 命令可以帮我们取出我们想要的列

-F 指定分隔符,每列之间使用空格分隔,print 打印

$1 第一列

$NF 打印最后一列

"\t"添加 tab 符分隔 , 一般是 4 个空格。

# 登录系统的用户和 ip 进行排序计数,去掉-d 参数,因为找不到主机名的地址会显示 error.arpa
last -a |awk -F' ' '{ print $1 "\t" $NF}' |sort |uniq -c |sort -nr
lastb -a |awk -F' ' '{ print $1 "\t" $NF}' |sort |uniq -c |sort -nr #查看所有登录记录包含失败
lastb -a |awk '{print $NF}' |sort |uniq -c |sort -nr              #只取 ip 地址进行统计。

image-20220514172738371

SSH 登录日志分析

系统用户登录都会在/var/log/secure 日志文件中记录。但是这个日志文件会被系统自动7天分割一次。

ll -ld /var/log/secure*

通过通配符查看所有 secure 文件中登录失败的记录。

grep Failed /var/log/secure
grep Failed /var/log/secure* |awk -F' ' '{print $9 "\t" $11}'         #上面信息很乱,取出第九列和第十一列。

image-20220514180411828

这里有一些意料之外的记录,这是攻击者错误配置登录导致的。可以通过 grep-v 去掉这些记录。但是这种乱搞的人的 ip 地址我们要单独过滤一下。

grep Failed /var/log/secure* |grep invalid |awk -F' ' '{print $13}'

# 过滤用户名+登录失败的 IP
grep Failed /var/log/secure* |grep -v "invalid"|grep -v "release" |awk -F' ' '{print $9 "\t" $11}' |sort |uniq -c | sort -nr

# 查看登录成功的 ip
grep "Accepted " /var/log/secure* | awk '{print $11}' | sort | uniq -c | sort -nr | more

查看系统历史命令

系统历史命令一般保存在用户家目录.bash_history 文件中

[[email protected] ~]#  find / -name .bash_history
/home/lighthouse/.bash_history
/root/.bash_history

查看当前用户的历史命令:

history

历史命令会很多使用的时候多配合其他命令一起使用,比如 more 或 grep。如果某个用户被黑客登录过了就一定要查看该用户的所有历史命令信息。重点关注黑客修改了了哪些文件。

另外默认的历史命令中仅仅记录历史命令,并不会记录额外的信息帮助我们分析。

自定义历史命令输出格式:添加一下配置到/etc/profile

vim /etc/profile            #追加以下内容
#记录登陆者 IP 地址 who 命令可以查看当前登录信息。
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
#日志文件存放路径。
HISTDIR=/var/log/history
#设置日期
DT=`date +%Y-%m-%d`
#判断用户 IP 地址如果不存在或者为.则用户 IP 用本机主机名代替。
if [ -z $USER_IP ]
then
USER_IP=`hostname`
fi
pdf="."
if [[ ! $USER_IP == *${pdf}* ]]
then
USER_IP=`hostname`
fi
#判断日志文件路径是否存在,如果不存在则创建并添加权限。
if [ ! -d $HISTDIR ]
then
mkdir -p $HISTDIR
chmod 773 $HISTDIR
fi
#创建对应日期的日志文件
if [ ! -d $HISTDIR/${DT} ]
then
mkdir -p $HISTDIR/${DT}
chmod 773 $HISTDIR/${DT}
fi
#指定日志存放数量的总数
export HISTFILESIZE=10000
#配置 history 命令输出的总数
export HISTSIZE=10000
#配置文件具体时间
DT2=`date +%Y%m%d_%H:%M:%S`
#拼接文件名/var/log/history/日期 2021-09-08 /当前用户名@用户 ip_当前时间
#DT1 是日期 DT2 是准确到秒的准确时间。
export HISTFILE="$HISTDIR/${DT}/${LOGNAME}@${USER_IP}_$DT2"
#设置历史命令中的时间戳,history 命令有效,文件中显示时间戳。
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S $"
 source /etc/profile            #重新加载配置文件。

查看历史命令,已经带了时间戳信息。

[[email protected] ~]# history 3
  397  2022-05-14 18:18:43 $history -n 5
  398  2022-05-14 18:18:56 $history 5
  399  2022-05-14 18:19:02 $history 3

将本次登录的命令写入命令历史文件中,命令不是使用了就立即写入到文件中的,会现在缓存中,用户退出登录时会自动写入文件,-w 命令可以立即写入,-c 命令可以清除当前缓存中的命令。

history -w

查看文件信息

[[email protected] ~]# ll /var/log/history/2022-05-14/root\@183.216.233.222_20220514_18\:18\:30
-rw------- 1 root root 11696 May 14 18:22 /var/log/history/2022-05-14/[email protected]_20220514_18:18:30

文件名中记录了用户名-ip-时间。文件内容中记录了详细的命令以及命令执行的时间戳。

[[email protected] ~]# tail -f /var/log/history/2022-05-14/root\@183.216.233.222_20220514_18\:18\:30

#1652523510
source /etc/profile
#1652523523
history -n 5
#1652523536
history 5
#1652523542
history 3
#1652523720
history -w

常用系统日志说明

/var/log/message                #包括整体系统信息
/var/log/auth.log               #包含系统授权信息,包括用户登录和使用的权限机制等
/var/log/userlog                #记录所有等级用户信息的日志
/var/log/cron                   #记录 crontab 命令是否被正确的执行
/var/log/vsftpd.log             #记录 Linux FTP 日志
/var/log/lastlog                #记录登录的用户,可以使用命令 lastlog 查看
/var/log/secure                 #记录大多数应用输入的账号与密码,登录成功与否
/var/log/wtmp                   #记录登录成功的账户信息,等同于命令 last
/var/log/btmp                   #记录登入失败的用户名单,等同于命令 lastb
/var/log/faillog                #记录登录不成功的账号信息,一般会被黑客删除

启动项检查

系统运行级别:/etc/inittab

运行级别    含义
0   系统停机模式,默认运行级别不能设置为0,否则不能正常启动,机器关闭
1   单用户模式,root权限用于系统维护,禁止远程登录
2   多用户模式,没有NFS网络的支持
3   完整的多用户文本模式,有NFS,登录后进入控制台命令行模式
4   系统未调用
5   图形化模式,登录后进入图形GUI模式
6   重启模式,默认不设置,否则无法正常启动

/etc/Rc.D/Rc*.D

主要是执行不同运行环境下的自启动脚本

more /etc/rc.d/rc[0-6].d

/etc/Rc.Local

用户自定义开机启动项

cat /etc/rc.local

自启动服务项检查

Chkconfig

chkconfig –list         #查看服务自启动状态,可以看到所有的RPM包安装的服务

检查Rpm包完整性

rpm -qaV
S=大小改变
M=权限改变
5=MD5改变
L=连接改变
D=设备改变
U=用户改变
G=组改变
T=日期和时间改变
missing=文件丢失

计划任务日志分析

一次性计划任务:At

  • 文件执行目录:/var/spool/at
  • 允许执行at用户文件:/etc/at.allow
  • 查看任务:at -l

重复性计划:Crontab

所有执行过的计划任务都会存在在/var/log/cron 文件中。

查看所有执行过的计划任务。

cat /var/log/cron* |awk -F':' '{print $NF}' |grep CMD |sort|uniq -c |sort -rn

查看所有用户的计划任务

cat /etc/passwd | cut -f 1 -d : |xargs -i crontab -l -u {}

也可以直接查看/var/spool/cron/下的文件内容,所有用户级别的计划任务,都在这里有文件

ls /var/spool/cron/
cat /var/spool/cron/root

以上是用户级别的系统任务。系统级别的计划任务只能排查配置文件中的内容。

find /etc/cron* -type f                     #查看系统级别的计划任务文件名
#系统定时任务执行文件/etc/crontab
shell:使用shell的路径
path:执行文件查找路径
mailto:错误告警路径
home:默认shell的主文件夹路径
#排查命令
crontab -l //查看当前用户的定时任务
crontab -l -u 用户名 //查看指定用户的定时任务
more /var/spool/cron/* //查看所有用户默认的coontab计划任务
#重复性的计划任务脚本路径
/var/spool/cron/*
/etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/
/etc/anacrontab
/var/spool/anacron/*
tips:使用more /etc/cron.daily/*查看目录下所有文件

计划任务执行日志

#查看/var/log/cron
more /var/log/cron

计划任务排查思路

对/etc/cron*下所有文件都生成 md5 值,并存一个 md5 值

#提前生成md5
find /etc/cron* -type f -exec md5sum {} \; > /usr/share/file_md5.v1

#发现服务器异常时,生成一个新的 MD5 值库
find /etc/cron* -type f -exec md5sum {} \; >/usr/share/file_md5.v2

#对比两个版本库。
diff /usr/share/file_md5.v1 /usr/share/file_md5.v2

系统用户检查

Linux 系统用户主要存放于/etc/passwd 文件和/etc/shadow 文件中当然还有一个组文件/etc/group。

head -n 1 /etc/passwd

注:/etc/passwd 文件存放的是用户的信息,由 6 个分号组成的 7 个信息,解释如下
(1):用户名。
(2):密码(已经加密)
(3):UID(用户标识),操作系统自己用的
(4):GID 组标识。
(5):用户全名或本地帐号
(6):开始目录
(7):登录使用的 Shell,就是对登录命令进行解析的工具。
重点在于 UID 和 GID,root 用户的用户表示为 0,如果一个普通用户的 UID 修改为 0,那么这个用户就成为了 root 用户。

1、修改用户 UID 为 0,伪装成 root 用户

test:x:0:1000::/home/xuegod:/bin/bash

2、使用空口令账户登录 Linux 系统

正常情况,没有密码,用户是登录不了 linux 的。下面模拟黑客以空口令方式登录系统。

(1)、设置 sshd 服务允许空口令帐号登录系统

vim /etc/ssh/sshd_config
改:#PermitEmptyPasswords no
为:PermitEmptyPasswords yes
systemctl restart sshd

(2)、创建空口令帐号

useradd test
passwd test
vim /etc/shadow                 #删除 test 密码信息,test 就成为空口令用户

(3)、测试空口令用户登录系统

ssh [email protected]           #直接回车就可以登录成功,不用输入密码

中间件日志

#分析的痛点:只能看到 GET 请求的请求操作,POST 请求看不到对服务器提交的内容
cat /www/wwwlogs/access_log |less

#查询访问网站次数最多的 10 个 IP 地址
cat /www/wwwlogs/access_log |cut -f 1 -d ' '|sort|uniq -c|sort -nr|head -10

#查看访问最多的 URI
cat /www/wwwlogs/access_log |cut -f 7 -d ' '|sort|uniq -c|sort -nr|head -10

#查看服务哪个时间段访问量最高
cat /www/wwwlogs/access_log |cut -f 4 -d ' '|sort|uniq -c|sort -nr|head -10

#通过日志快速定位到攻击者 ip 地址,攻击发起的时间,过滤出由攻击者 IP 发起的所有请求即可还原该用户的所有请求记录。
grep "1.1.1.1" /www/wwwlogs/access_log

通常日志文件在/var/log/httpd/access_log 目录下。具体可以看 apache 服务的配置文件中指定的日志文件路径。

Apache 日志字段说明:
字段名称 描述
远程主机 IP 表明是谁访问了网站
空白(E-mail) 为了避免用户的邮箱被垃圾邮件骚扰,第二项就用“-”取代了
空白(登录名) 用于记录浏览者进行身份验证时提供的名字
请求时间 用方括号包围,而且采用“公用日志格式”或者“标准英文格式”。 时间信息最后的“+0800”表示服务器所处时区位于 UTC 之后的 8 小时
方法 请求的方式:METHOD、GET、POST、HEAD 等
资源 请求的文件
协议 请求的协议:HTTP+版本号
状态码 请求的状态码
发送的字节数 表示发送给客户端的总字节数。它告诉我们传输是否被打断(该数值是否
和文件的大小相同)
Referer 从哪个页面链接过来的
User-Agent 使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等信息

文件变动检查

Linux 文件 3 个时间属性

atime access time 访问时间 文件中的数据库最后被访问的时间

mtime modify time 修改时间 文件内容被修改的最后时间

ctime change time 变化时间 文件的元数据发生变化。比如权限,所有者等

特别关注目录:

/tmp
/etc/init.d
/usr/bin
/user/sbin
#查看24小时内被修改过的php文件
find / -mtime 0 -name *.php
#查看24小时内修改过的可执行文件
find / -mtime 0 -executable -type f  #executable查当前用户具有执行权限的文件
或者:
#perm参数指是否设置了任何执行权限
find / -mtime 0 -perm /111 #适用GNU 4.5.12版本之后
find / -mtime 0 -perm +111 #使用GNU 4.5.12版本之前
#检查最近 1 天内被修改过的文件。
find /www/wwwroot/tonxin.top/ -name "*.php" -mtime -1
#注:0 表示 24 小时内修改过的,1 表示昨天修改过的,2 表示前天修改过的。
#查看 30 天内修改过的文件示例:-mtime -30

stat 命令可以查看文件详细信息。

stat /www/wwwroot/tonxin.top/index.php

# ls 命令默认查看的日期格式是英文的,如果想修改为 2022-05-14 这样的格式需要进行修改。
echo "export TIME_STYLE='+%Y/%m/%d %H:%M:%S'" >> /etc/profile
source /etc/profile

如果站点中修改的文件过多可以 find 时进行过滤。常见的过滤规则 eval system 一句话常用的关键词进行过滤即可(D盾分析好一点)。

find /www/wwwroot/ecshop.xueshenit.com/ -name "*.php" -mtime 0 |xargs grep "eval"
#多个关键词可以在 grep 条件中添加,添加方式如下:|或 需要\转义。
grep "eval\|system

把 webshell 和日志中入侵记录关联起来。

find /www/wwwroot/tonxin.top -name "*.php" -mtime 0 |xargs grep "eval" |awk -F":" '{print $1}'|xargs ls -l

-rw-r--r-- 1 www www 31 2021/09/14 11:39:34
/www/wwwroot/tonxin.top/.index.php

通过日期可以定位到日志中的操作。

grep "11:39:34" /www/wwwlogs/tonxin.top.log

47.241.121.65 - - [24/Sep/2021:11:39:34 +0800] "POST /user.php HTTP/1.1" 200 2

可以看到攻击者通过访问 user.php 文件生成了 vulnspy.php 一句话木马,所以我们可以判定user.php 文件存在漏洞。修复方案可以到对应的官网寻找修复补丁,或者百度搜索临时解决办法。

缺点:日志中可以看到是 POST 请求,日志是不保存 POST 中的 data 数据段的,所以看不到攻击细节,一般安全防火墙设备中会提供完整报文。

批量查找写入 webshell 的日志

find /www/wwwroot/ecshop.xueshenit.com/ -name "*.php" -mtime 0 |xargs grep "eval" |awk -F":" '{print $1}'|xargs ls -l|awk '{print $7}' |xargs -I {} grep {} /www/wwwlogs/tonxin.top.log

原理很简单,查找到文件之后通过 awk 取出文件名 ls -l +awk 取出文件日期,通过 grep 过滤日志中和 webshell 相同日期的记录。
查询到攻击者 IP 以及 webshell 之后就可以筛选对应的日志 , 攻击者 IP 并不是只会有一个。

查询所有访问一句话木马的日志

[[email protected] tonxin.top]# grep "index.php" /www/wwwlogs/tonxin.top.log
183.216.235.231 - - [29/Apr/2022:19:01:45 +0800] "POST /ant.php HTTP/2.0" 200 36 "https://upload.tonxin.top/Pass-01/index.php?action=show_code" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"
183.216.235.231 - - [29/Apr/2022:19:01:46 +0800] "POST /ant.php HTTP/2.0" 200 36 "https://upload.tonxin.top/Pass-01/index.php?action=show_code" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"

查询 IP 归属

https://ip.fm/?ip=183.216.235.231

image-20220514212302554

grep "183.216.235.231" /www/wwwlogs/tonxin.top.log  #查看该 ip 所有的记录

查询一定时间范围内被修改过的文件。多数情况下黑客并不是刚刚入侵到这台服务器的,有可能要追溯到很早,所以这个时候需要通过时间范围来检查系统文件。

find -mtime,这种查找的时间单位是天
精确到分钟呢?或者说按照时间戳去查找?这就需要使用"-newermt"参数
例:将/www/wwwroot/tonxin.top.log/目录下,2021-08-01 9:00 到 2021-09-15 21:00 时间段内修改或生成的文件显示出来。

参数中的 m 其实就表示 mtime,t 表示绝对时间,那同样还存在:-newerat、-newerct

find /www/wwwroot/tonxin.top.log/ -name "*.php" -newermt '2021-08-01 9:00' ! -newermt '2021-09-15 21:00' |xargs ls -l

已建立的网络连接

netstat -anutp
# -a 或--all:显示所有连线中的 Socket; -n 或--numeric:直接使用 ip 地址,而不通过域名服务器;
# -p 或--programs:显示正在使用 Socket 的程序识别码和程序名称;
# -t 或--tcp:显示 TCP 传输协议的连线状况;
# -u 或--udp:显示 UDP 传输协议的连线状况;

# LISTEN            本地服务侦听状态
# ESTABLISHED       已经建立链接双方正在通讯状态
# CLOSE_WAIT        对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成
# CLOSE_WAIT        此时我方要调用 close()来使得连接正确关闭
# TIME_WAIT         我方主动调用 close()断开连接,收到对方确认后状态变为TIME_WAIT
# SYN_SENT          半连接状态,原理同 SYN Flood 攻击
netstat -anutp |grep ESTABLISHED    #查看已经建立连接的会话。
netstat -anutp |grep 22
netstat -anutp |grep LISTEN         #查看本机处于监听的服务,查看黑客开放了哪些监听端口

Rootkit排查

针对很多对库劫持、进程、计划任务、启动项、病毒文件做了清理后,机器依旧存在cpu高占用等现象,可使用Rookit查杀工具进行进一步清理。

chkrookit

网址:http://www.chkrootkit.org

使用方法:
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar zvxf chkrootkit.tar.gz
cd chkrootkit-0.52
make sense #编译执行没有报错的话执行检查
./chkrootkit

rkhunter

网址:http://rkhunter.sourceforge.net

使用方法:
wget https://nchc.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.4/rkhunter-1.4.4.tar.gz
tar -zvxf rkhunter-1.4.4.tar.gz
cd rkhunter-1.4.4
./installer.sh --install
rkhunter -c

GScan 工具排查后门

下载地址:https://github.com/grayddq/GScan

工具检查项目:
1、主机信息获取
2、系统初始化 alias 检查
3、文件类安全扫描
 3.1、系统重要文件完整行扫描
 3.2、系统可执行文件安全扫描
 3.3、临时目录文件安全扫描
 3.4、用户目录文件扫描
 3.5、可疑隐藏文件扫描
4、各用户历史操作类
 4.1、境外 ip 操作类
 4.2、反弹 shell 类 5、进程类安全检测
 5.1、CUP 和内存使用异常进程排查
 5.2、隐藏进程安全扫描
 5.3、反弹 shell 类进程扫描
 5.4、恶意进程信息安全扫描
 5.5、进程对应可执行文件安全扫描
6、网络类安全检测
 6.1、境外 IP 链接扫描
 6.3、恶意特征链接扫描
 6.4、网卡混杂模式检测
7、后门类检测
 7.1、LD_PRELOAD 后门检测
 7.2、LD_AOUT_PRELOAD 后门检测
 7.3、LD_ELF_PRELOAD 后门检测
 7.4、LD_LIBRARY_PATH 后门检测
 7.5、ld.so.preload 后门检测
 7.6、PROMPT_COMMAND 后门检测
 7.7、Cron 后门检测
 7.8、Alias 后门
 7.9、SSH 后门检测
 7.10、SSH wrapper 后门检测
 7.11、inetd.conf 后门检测
 7.12、xinetd.conf 后门检测
 7.13、setUID 后门检测
 7.14、8 种系统启动项后门检测
8、账户类安全排查
 8.1、root 权限账户检测
 8.2、空口令账户检测
 8.3、sudoers 文件用户权限检测
 8.4、查看各账户下登录公钥
 8.5、账户密码文件权限检测
9、日志类安全分析
 9.1、secure 登陆日志
 9.2、wtmp 登陆日志
 9.3、utmp 登陆日志
 9.4、lastlog 登陆日志
10、安全配置类分析
 10.1、DNS 配置检测
 10.2、Iptables 防火墙配置检测
 10.3、hosts 配置检测
11、Rootkit 分析
 11.1、检查已知 rootkit 文件类特征
 11.2、检查已知 rootkit LKM 类特征
 11.3、检查已知恶意软件类特征检测
12.WebShell 类文件扫描
 12.1、WebShell 类文件扫描

使用方法

git clone https://github.com/grayddq/GScan.git
cd GScan
python GScan.py --help

Options:
 -h, --help show this help message and exit
 --version 当前程序版本
 Mode:
 GScan running mode options
 --overseas 境外模式,此参数将不进行境外 ip 的匹配
 --full 完全模式,此参数将启用完全扫描
 --debug 调试模式,进行程序的调试数据输出
 --dif 差异模式,比对上一次的结果,输出差异结果信息。
 --sug 排查建议,用于对异常点的手工排查建议
 --pro 处理方案,根据异常风险生成初步的处理方案
 Optimization:
 Optimization options
 --time=TIME 搜索指定时间内主机改动过的所有文件,demo: --time='2019-05-07
 00:00:00~2019-05-07 23:00:00'
 --job 添加定时任务,用于定时执行程序(默认每天零点执行一次)
 --hour=HOUR 定时任务,每 N 小时执行一次
 --log 打包当前系统的所有安全日志(暂不支持)

--pro 快速检查并给出初步处理方案,完整检查 --full 比较耗时间。

python GScan.py --pro

20220514214633

systemd-journald 服务分析系统日志

实验环境:本地 Centos 7 请勿在 vps 服务器上操作!!!

介绍

黑客入侵系统后一般会将系统日志清空,以达到清理痕迹的作用,如果日志被黑客清空我们就无法通过日志来分析黑客入侵系统后都做了哪些事情,/var/在很多情况下黑客在清理日志的时候都会忽略内存中的日志

持久化配置

由于日志默认存储在内存中,重启就会失效,如果想保存日志可以通过持久化配置将日志保存到本地。

#默认的配置文档中所有的参数都是默认值。
vim /etc/systemd/journald.conf

#新建一个配置文档,模板文件我们就不修改了。
mkdir /etc/systemd/journald.conf.d
vim /etc/systemd/journald.conf.d/99-prophet.conf

[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no

Storage 参数详解:
"volatile" 表示仅保存在内存中,也就是仅保存在/run/log/journal 目录中(将会被自动按需创建)。
"persistent" 表示优先保存在磁盘上, 也就优先保存在 /var/log/journal 目录中(将会被自动按
需创建), 但若失败(例如在系统启动早期"/var"尚未挂载), 则转而保存在 /run/log/journal 目录中
(将会被自动按需创建)。
"auto"(默认值) 与 "persistent" 类似, 但不自动创建 /var/log/journal 目录, 因此可以根据
该目录的存在与否决定日志的保存位置。
"none" 表示不保存任何日志(直接丢弃所有收集到的日志), 但日志转发(见下文)不受影响。 默认
值是 "auto

systemctl restart systemd-journald      #重启服务使配置文件生效

配置持久化后日志文件从临时文件目录/run/log/journal 保存至/var/log/journal 目录

ll /var/log/journal/                    #缺点:文件体积大,也容易被发现。

journalctl 查询日志

journalctl                  #直接查询,默认查询规则是从旧到新排序。
journalctl -r               #从新到旧排序使用-r 参数
journalctl -u sshd          #查看指定服务日志
tail -n 4 /var/log/secure   #对比系统日志文件
journalctl -f               #实时查看最新日志

问题:Centos 默认不记录系统命令
Ctrl+c 关闭实时窗口,配置系统日志记录系统命令。

配置文件中将 PROMPT_COMMAND 输出到系统日志中

vim /etc/bashrc
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: 
$(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
readonly PROMPT_COMMAND

构造消息日志过程:首先通过 history 1 取出当前执行的命来,$?获取该命令执行的返回值。通过logger -p local6.debug 自定义消息日志。
readonly PROMPT_COMMAND 设置为只读,防止被修改。
配置完成后重新打开终端窗口即可成效。
注:该配置也可配置到/etc/profile 中,两个位置都可以。

journalctl -f           #查看实时日志
Nov 05 16:50:19 127.0.0.1 root[10780]: root [10734]: 2021-11-05 16:50:19 $ifconfig [0]
#由于前面我们通过配置/etc/profile 对系统日志记录格式进行了自定义,所以这里获取到的信息会有2 个时间戳,如果觉得重复可以去除/etc/profile 中对历史命令的自定义。

#指定查询时间,日期格式必须是:YYYY-MM-DD HH:MM:SS
journalctl --since "2021-11-05 00:00:00" --until "2021-11-05 17:00:00"  

#指定输出格式,输出的时间更加精细,日志信息简洁。
journalctl -o short-precise

#输出详细信息,可信字段是指名称以下划线开头的字段。 这些字段由日志守护进程添加,客户端无法掌控这些字段的内容, 因此是"可信的"。详细信息中的字段都可以作为查询条件使用。
journalctl -o verbose

#通过可信字段查询指定用户的日志,可信字段必须带有下划线
journalctl _UID=0 -n 5

实战日志分析

#新建用户test
useradd test
echo "123456" | passwd --stdin test

#通过 test 用户登录
ssh [email protected]

#切换到 root 用户
su - root

#小伙子非常凶狠直接清空了日志
echo > /var/log/secure 
echo > /var/log/messages 
echo > /var/log/lastlog 
echo > /var/log/wtmp
echo > /var/log/btmp

image-20220514223613011

可以看到日志都被删除了无法得知黑客做了什么。

查看日志文件修改时间

cd /var/log/
stat secure

image-20220514223811987

得知文件是 22:34 被修改。

查询 22:34 前所有日志,避免误差,加一分钟 22:35,实战中前后信息都要看。查看文件时间只能确认这个时间内这个文件被修改了,并不是绝对时间。

journalctl --until "2022-05-14 22:35:00" -o short-precise

#可以看到黑客通在 192.168.1.53 通过 ssh 服务登录 xuegod 用户,su - root 切换到 root 用户清空了日志。

image-20220514224750059

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇