Linux攻击排查
1. 入侵排查思路
1.1 账号安全
//查看用户信息passwd文件 是否有恶意的用户
[root@master ~]
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
//影子文件
[root@master ~]
root:$6$KMaK//2Hp2$rrKd0MQA.8cCqzv0SEOkM3nq3qlhoYeSw2LLQtDdBL0Wy2qNXITg8kiiztre/WrTsn/ropx6aI5UdzW.mG613.:19144:0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::
sync:*:18353:0:99999:7:::
shutdown:*:18353:0:99999:7:::
halt:*:18353:0:99999:7:::
mail:*:18353:0:99999:7:::
operator:*:18353:0:99999:7:::
games:*:18353:0:99999:7:::
ftp:*:18353:0:99999:7:::
nobody:*:18353:0:99999:7:::
systemd-network:!!:19108::::::
dbus:!!:19108::::::
polkitd:!!:19108::::::
sshd:!!:19108::::::
postfix:!!:19108::::::
chrony:!!:19108::::::
nscd:!!:19108::::::
tcpdump:!!:19108::::::
//who 查看当前登录用户(tty 本地登陆 pts 远程登录)
[root@master ~]
root pts/0 2022-06-23 10:13 (59.172.xxx.xxx)
//uptime 最近登入多久,多少用户,负载状态
[root@master ~]
15:57:58 up 15 days, 6:00, 1 user, load average: 0.51, 0.26, 0.25
//w 查看系统信息,知道某一刻用户的行为
[root@master ~]
16:02:14 up 15 days, 6:04, 1 user, load average: 0.63, 0.35, 0.28
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 59.172.xxx.xxx 10:13 6.00s 0.13s 0.00s w
入侵排查
1、查询特权用户特权用户(uid 为0)
[root@master ~]
root
2、查询可以远程登录的帐号信息
[root@master ~]
3、除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限
[root@master ~]
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
4、禁用或删除多余及可疑的帐号
usermod -L user 禁用帐号,帐号无法登录,/etc/shadow 第二栏为 ! 开头
userdel user 删除 user 用户
userdel -r user 将删除 user 用户,并且将 /home 目录下的 user 目录一并删除
1.2 历史命令
1. 查看历史命令
[root@master ~]
历史命令都保存在~目录下的.bash_history
2. 更改历史命令保存的格式
[root@node2 ~]
> USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
> if [ "$USER_IP" = "" ]
> then
> USER_IP=`hostname`
> fi
> export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
> shopt -s histappend
> export PROMPT_COMMAND="history -a"
> EOF
[root@node2 ~]
[root@node2 ~]
1 2022-06-09 11:21:45 59.172.208.226 root ss -antl
2 2022-06-09 11:26:01 59.172.208.226 root ss -antlp
3 2022-06-09 11:28:17 59.172.208.226 root systemctl status firewalld
4 2022-06-09 11:29:56 59.172.208.226 root ss -antl
5 2022-06-09 11:32:33 59.172.208.226 root docker ps
6 2022-06-09 11:32:43 59.172.208.226 root docker image
7 2022-06-09 11:32:47 59.172.208.226 root docker images
8 2022-06-09 11:33:02 59.172.208.226 root ss -antl
3. history -c 清除历史记录日志
1.3 检查端口
[root@node2 ~]
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.1:10248 *:* users:(("kubelet",pid=2657,fd=33))
LISTEN 0 128 127.0.0.1:10249 *:* users:(("kube-proxy",pid=7696,fd=13))
LISTEN 0 128 127.0.0.1:33293 *:* users:(("kubelet",pid=2657,fd=11))
LISTEN 0 128 *:30001 *:* users:(("kube-proxy",pid=7696,fd=15))
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1179,fd=3))
LISTEN 0 128 *:31000 *:* users:(("kube-proxy",pid=7696,fd=14))
LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=1146,fd=13))
LISTEN 0 128 [::]:10250 [::]:* users:(("kubelet",pid=2657,fd=28))
LISTEN 0 128 [::]:781 [::]:* users:(("bcm-agent",pid=24037,fd=8))
LISTEN 0 128 [::]:10256 [::]:* users:(("kube-proxy",pid=7696,fd=10))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1179,fd=4))
LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=1146,fd=14))
//查看pid对应的进程文件
ls -l /proc/$(ss -antlp | grep 10250 | awk '{print $6}' | awk -F, '{print $2}' | awk -F= '{print $2}')/exe
lrwxrwxrwx 1 root root 0 Jun 6 14:33 /proc/2657/exe -> /usr/bin/kubelet
1.4 检查异常进程
[root@node2 ~]
root 2657 1.6 2.6 1084468 54952 ? Ssl Jun06 411:10 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.2 --node-ip=xxx.xxx.xxx.xxx
1.5 检查卡机启动项
运行级别 | 含义 |
---|
0 | 关机 | 1 | 单用户模式,可以想象为windows的安全模式,主要用于系统修复 | 2 | 不完全的命令行模式,不含NFS服务 | 3 | 完全的命令行模式,就是标准字符界面 | 4 | 系统保留 | 5 | 图形模式 | 6 | 重启动 |
查看运行状态runlevel
// 系统开机后进入那个级别运行
[root@node2 ~]
> id=3: initdefault
> EOF
//开机启动的配置文件
[root@node2 ~]
rc0.d/ rc2.d/ rc4.d/ rc6.d/ rc.local
rc1.d/ rc3.d/ rc5.d/ rc.d/
[root@node2 ~]
docker.sh
[root@node2 ~]
入侵排查
//检查启动项文件
[root@node2 ~]
[root@node2 ~]
[root@node2 ~]
1.6 检查定时任务
[linux下crontab与anacrontab的使用 ]
crond 常用参数
-e | 编辑任务 |
---|
-l | 列出任务 | -r | 删除任务 | -u | 指定用户名字 | –help | 显示帮助信息 |
anacron 异步定时
-f | 强制执行作业,忽略时间戳 |
---|
-u | 只将作业的时间戳更新到当前日期,但不运行任何操作 | -s | 序列化作业的执行,在前一个作业完成之前,anacron不会启动新作业 | -d | 在此模式下,anacron将信息性消息输出到标准错误和syslog,作业的输出像往常一样通过邮件发送 | -q | 禁止将消息显示为标准错误,仅适用于-d参数结合使用 |
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45 <--随机给予最大延迟时间,单位是分钟
START_HOURS_RANGE=3-22 <--延迟多少个小时内应该要执行的任务时间
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
RANDOM_DELAY 定义的是最大随机延迟,也就是说cron.daily 任务如果超过1天没有执行,并不会马上执行,而是先延迟强制延迟时间之后,再延迟随机延迟时间之后再执行命令。START_HOURS_RANGE 定义anacron 的执行时间范围,anacron 只会在这个时间范围之内执行。period in days 执行周期;最小 1 天,也可以 3 天,5 天,一个星期(7 天)乃至一个月(月份不能确定有多少天,所以用@monthly 代替)。delay in minutes 延迟多长时间执行,以分钟为单位。为了避免多个任务在同一时间执行而造成服务器繁忙,所以应该错峰执行。job-identifier 任务的唯一标识。它用来创建文件记录任务执行的时间,通常创建在/var/spool/anacron/ 目录中。command 真正执行的命令。
入侵排查
/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/*
[root@node2 ~]
*** /etc/cron.daily/: directory ***
[root@node2 ~]
[root@node2 ~]
::::::::::::::
/etc/cron.daily/logrotate
::::::::::::::
::::::::::::::
/etc/cron.daily/man-db.cron
::::::::::::::
if [ -e /etc/sysconfig/man-db ]; then
. /etc/sysconfig/man-db
fi
if [ "$CRON" = "no" ]; then
exit 0
fi
renice +19 -p $$ >/dev/null 2>&1
ionice -c3 -p $$ >/dev/null 2>&1
LOCKFILE=/var/lock/man-db.lock
[[ -f $LOCKFILE ]] && exit 0
trap "{ rm -f $LOCKFILE ; exit 0; }" EXIT
touch $LOCKFILE
mandb $OPTS
exit 0
::::::::::::::
/etc/cron.daily/mlocate
::::::::::::::
nodevs=$(awk '$1 == "nodev" && $2 != "rootfs" && $2 != "zfs" { print $2 }' < /pro
c/filesystems)
renice +19 -p $$ >/dev/null 2>&1
ionice -c2 -n7 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "$nodevs"
::::::::::::::
/etc/cron.daily/rhsmd
::::::::::::::
config=$(grep -iE "^processTimeout" /etc/rhsm/rhsm.conf | grep -Po "[0-9]+")
if [ -n "$config" ]; then
rhsmd_timeout=$config
else
rhsmd_timeout=300
fi
/usr/libexec/rhsmd -s &
sleep $rhsmd_timeout;
1.7 检查服务
服务自启动
chkconfig [--level 运行级别] [独立服务名] [on|off]
chkconfig –level 2345 httpd on 开启自启动
chkconfig httpd on (默认level是2345)
入侵排查
1、查询已安装的服务:
RPM 包安装的服务
chkconfig --list 查看服务自启动状态,可以看到所有的RPM包安装的服务
ps aux | grep crond 查看当前服务
系统在3与5级别下的启动项
中文环境
chkconfig --list | grep "3:启用\|5:启用"
英文环境
chkconfig --list | grep "3:on\|5:on"
源码包安装的服务
查看服务安装位置 ,一般是在/user/local/
systemctl httpd start
搜索/etc/rc.d/init.d/ 查看是否存在
1.8 检查异常文件
-
查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件夹,以“…”为名的文件夹具有隐藏属性 -
得到发现WEBSHELL、远控木马的创建时间,如何找出同一时间范围内创建的文件?可以使用find命令来查找,如 find /opt -iname “*” -atime 1 -type f 找出 /opt 下一天前访问过的文件 -
针对可疑文件可以使用 stat 进行创建修改时间。
1.9 系统日志
日志文件 | 说明 |
---|
/var/log/cron | 记录了系统定时任务相关的日志 | /var/log/cups | 记录打印信息的日志 | /var/log/dmesg | 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息 | /var/log/mailog | 记录邮件信息 | /var/log/message | 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件 | /var/log/btmp | 记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看 | /var/log/lastlog | 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看 | /var/log/wtmp | 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看 | /var/log/utmp | 记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询 |
日志分析小技巧
1、定位有多少IP在爆破主机的root帐号:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
定位有哪些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
爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr
2、登录成功的IP有哪些:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
3、增加一个用户kali日志:
Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
4、删除用户kali日志:
Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
5、su切换用户:
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)
sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
5、su切换用户:
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)
sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
参考
|