Linux入侵排查
一、入侵排查思路
1.1、账户安全
用户信息文件 /etc/passwd
cat /etc/passwd |
解释:
- account:password:UID:GID:GECOS:directory:shell
- 用户名:密码(x代表占位符,表示该密码在/etc/shadow中):用户ID:组:ID:用户说明:家目录:登录之后的shell
- root:x:0:0:root:/root:/usr/bin/zsh
- 用户名root,x表示密码存在,0表示用户ID,0表示组ID,root用来描述用户,/root表示用户的家目录,/usr/bin/zsh表示登录后shell的位置
/etc/passwd 是任何人都能够查看的,但是只有root用户可以更改
/usr/sbin/nologin 代表用户是无法通过远程登录界面以及ssh远程登录,也无法通过su命令进行用户切换,简而言之就是不能登录使用,使用来其他服务其他程序。
只有root用户的家目录在/root ,其他可登录的普通用户的家目录一般都在/home/用户名,特殊的无法登录用户,如apache服务用户名www-data,家目录在/var/www
/bin/zsh ,/bin/bash,/bin/sh都是常见的登录shell,也会见到带/usr前缀的目录,例如:/user/bin/bash
排查思路:是否存在可疑用户,是否存在除了root外其他uid=0的用户
1.2、用户影子文件
cat /etc/shadow |
解释:
- 用户名:加密密码:密码最后一次修改的日期,两次密码的修改时间的间隔:密码有效期:密码修改到期到的警告天数:密码过期过之后的宽限天数:账号失效时间:保留
- /etc/shadow仅root用户可读写
- $y$j9T$glYiQhCWNL.Q9sL/M5cXO/$J6qRnOUQXn.6Hv7LzmJjToyraoKBL8wmq52l8a4Y7ND是加密后的密码,目前不可逆向破解
- 密码有效期、密码修改到期的警告天数等策略可以为空,或默认9999(无限制)
- /etc/shadow并不是用户配置文件,如果仅把后门用户插入到此文件是是无法生效的
1.3、排查命令
详细解释查看Linux基线排查文章
- 查询特权用户(UID为0)
awk -F: '($3==0){print$1}' /etc/passwd |
- 除了root用户之外,是否还有其他未知的账号存在sudo权限
more /etc/sudoers |grep -v "^#\|^$" |grep "ALL=(ALL" |
禁用或删除多余及可疑的账号
- usermod - L user 禁用账号,账号无法登录,/etc/shadow第二栏为!开头
- userdel user 删除user用户
- userdel -r user 将删除user用户,并且将/home目录下的user目录一并删除
常见命令
who 当前登录的用户(tty本地登录,pts远程登录)
w 查看系统信息,想知道某一时刻用户的行为
uptime 查看登录多久、多少用户、负载
二、历史命令
- Linux系统里,执行过命令的用户会在自己的家目录下,生成相应的历史命令记录文件如.bash_history、.zsh_history 、.sh_history
- 打开各帐号目录下的 .bash_history 、.zsh_history,查看帐号的历史命令
cat /root/.*_history | more |
cat /home/*/.*_history | more |
- 主要分析当前是否账号执行恶意操作
- 当安全事件发生的时候,就可以通过查看每个用户所执行过的命令,来分析该用户是否有执行恶意命令,如果发现哪个用户执行过恶意命令,那么我们就可以锁定这个线索,去做下一步的排查
三、异常端口与进程
3.1、检查端口
使用netstat网络连接命令,查看服务器是否有未被授权的端口被监听,分析可疑端口,IP、PID
检查服务器是否存在恶意进程,恶意进程往往会开启监听端口,与外部控制机器进行连接
netstat -anltup | more
a:表示所有状态连接,n:十进制数字显示IPv4地址、l:显示监听连接、t:显示TCP协议、u:显示UDP协议、p显示PID
Proto:表示网络协议,如TCP或UDP。
Recv-Q:表示接收队列中的数据包数量,Send-Q:表示发送队列中的数据包数量
Local Address:表示本地地址(IP地址和端口号),格式为”IP地址:端口号”。
127.0.0.1 代表端口只监听在本地,其他机器无法连接
192.168.80.129 代表端口只监听在192.168.80.129 IP(eth0网卡)上,只有能访问到192.168.80.129 的机器(如192.168.80.x 网段下的其他局域网计算机)才能访问
0.0.0.0 代表端口监听在所有的接口IP上,表明所有IPv4地址计算机均可访问(当然前提是目标能连通该计算机)
:::等价于 0.0.0.0 ,他是IPv6地址
Foreign Address:表示远程地址(IP地址和端口号),格式同样为”IP地址:端口号”。
如果以”-“或”::”开头,则表示没有远程地址(即尚未建立或已断开连接)。
State:表示连接状态,通常包括已建立(ESTABLISHED)、监听(LISTEN)、等待(WAIT)、关闭等。
PID/Program name:表示与网络连接相关联的进程的ID和名称。有些时候可能显示进程的ID而不显示进程的名称。
3.2、排查思路
- 发现可疑IP,上报或检测威胁情报 , 确认后停止进程 kill -9 PID
- 发现可以连接进程,ls -l /proc/PID/exe 或 file /proc/PID/exe 查看进程具体运行的文件路径 ,如果发现是病毒文件,及时上报并进行留存与删除。
netstat -anltup | more |
file /proc/19411/exe |
3.3、检查异常进程
ps aux |
- 解释
- USER:表示进程所属的用户。
- PID:表示进程的ID(即进程号)。
- %CPU:表示进程使用的CPU资源百分比。
- %MEM:表示进程使用的内存资源百分比。
- VSZ:表示进程的虚拟内存大小(以KB为单位)。
- RSS:表示进程的实际内存大小(以KB为单位)。
- TTY:表示进程关联的TTY设备。
- STAT:表示进程的状态,通常包括运行(R)、睡眠(S)、停止(T)、僵死(Z)等。
- START:表示进程的启动时间。
- TIME:表示进程的累计CPU占用时间。
- COMMAND:表示进程的命令名称和参数。
实时查看
top |
按q退出
- 运行以上命令,如果发现有名称不断变化的非授权进程占用大量系统CPU或内存资源时,则可能为恶意程序
- 确认该进程为恶意进程后,可以使用 kill -9 进程PID 命令结束,或使用防火墙限制进程外联
四、开机启动项
- linux 系统运行级别
运行级别 | 含义 |
---|---|
0 | 关机 |
1 | 单用户模式,可以想象为windows的安全模式,主要用于系统修复 |
2 | 不完全的命令行模式,不含NFS服务 |
3 | 完全的命令行模式,就是标准字符界面 |
4 | 系统保留 |
5 | 图形模式 |
6 | 重新启动 |
- 恶意程序往往会添加在系统的启动项,在用户关机重启后再次运行
- 添加服务开机自启动
- update-rc.d ssh enable
- 关闭服务开机自启动
- update-rc.d ssh disable
- 了解/etc/rc*.d目录
- ls -l /etc/ |grep rc
在UNIX和UNIX-like操作系统中,/etc/rc是一个目录,用于存放系统启动过程中需要执行的脚本文件。其中包含了一些不同级别的文件夹,每个文件夹代表了不同的运行级别(runlevel)或者系统状态。以下是通常在/etc/rc目录中找到的文件夹:
rc0.d | 用于关机时的脚本。例如,关闭各个服务、卸载文件系统等 |
---|---|
rc1.d | 单用户模式时所执行的脚本。也叫进入恢复模式,用于修复系统问题 |
rc2.d | 多用户文本模式下运行的脚本。该级别下一般不含图形界面 |
rc3.d | 完全的多用户文本模式下运行的脚本 |
rc4.d | 未使用,可以根据需求自定义 |
rc5.d | 多用户图形模式下运行的脚本。系统启动后,会进入图形用户界面桌面环境 |
rc6.d | 用于重新启动时执行的脚本。例如,启动一些必备服务 |
rcS.d | 目录中的脚本文件在系统启动进入单用户模式时自动运行,用于配置系统的初始化任务和适应单用户环境所需的必要设置 |
在每个运行级别文件夹中,以特定的顺序执行脚本文件。文件名以字母”K”或”S”开头,加上两位数字。
- 以”S”开头的脚本用于启动服务
- 而以”K”开头的脚本用于停止服务
这些脚本文件会在系统启动和关机过程中自动运行,并根据各个级别的需求来启动或停止相应的服务。
ls -l /etc/rc*.d |
默认情况下,update-rc.d ssh enable将SSH服务添加到运行级别为2、3、4和5的文件夹中,也就是在/etc/rc2.d、/etc/rc3.d、/etc/rc4.d和/etc/rc5.d目录中创建符号链接,链接到与SSH服务相关的启动脚本。这些目录代表多用户文本模式和多用户图形模式的运行级别, 作用是在系统启动时自动启动SSH服务,并在运行级别切换时自动重新启动。
五、定时任务
基本命令
crontab -l 列出某个用户cron服务的详细内容
crontab -r 删除每个用户cront任务(谨慎:删除所有的计划任务)
crontab -e 使用编辑器编辑当前crotab文件
进入cron文件目录,是否存在非法定时任务脚本
- 重点关注以下目录是否存在恶意脚本
/var/spool/cron/* |
- 如果发现不认识的计划任务,可以定位脚本确认是否时正常业务脚本
- 如果是非正常业务脚本,直接注释任务内容或删除脚本
六、第三方软件漏洞
- 及时升级修复应用程序漏洞‘
- 检查说明:机器被入侵,部分原因是系统使用的应用程序软件版本较老,存在较多的漏洞没有修复,导致可以被利用
- 解决方法:用户可以通过软件官方发布的安全通告,通过yum、 apt 等方式进行直接升级修复
- apt update
- apt upgrade ssh (!这个命令慎用,一般不需要更新软件,且更新软件相关依赖也会同步更新,可能导致系统错误
七、检查异常文件
查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件,以”,“为名的文件夹具有隐藏属性
得到发现WEBSHELL、远程木马的创建时间,如何找出同一时间范围内创建的文件?
- 可以使用find命令来查找,如find /opt -iname”*“ -atime 1 -type f找出/opt下一天前访问的文件
find /opt -iname "*" -atime 1 -type f |
八、检查系统日志
日志默认存放位置 :/var/log/
查看日志配置情况:more /etc/rsyslog.conf
日志文件 | 说明 |
---|---|
/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等命令来查询 |
/var/log/secure | 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
九、Linux杀毒软件
- Clamav
- ClamAV的官方下载地址为:http://www.clamav.net/download.html
- 安装ClamAV:
apt install clamav |