1、文件排查
1.1 敏感目录文件
查看敏感目录文件,如 tmp目录、可执行程序目录/usr/bin ,/usr/sbin等
ls 用来显示目录列表
-a 显示所有档案及目录
-l 以长格式显示目录下的内容列表
-t 用文件和目录的更改时间排序
如: 查看tmp 目录下的文件 ls -alt /tmp
1.2 查看某个(可疑)文件是否被修改过
针对可以文件可以使用stat 进行创建修改时间、访问时间的详细查看,若修改时间距离时间日期接近,有线性关联,说明可以被篡改。
[root@beret-81 bin]# stat su
File: ‘su’
Size: 32128 Blocks: 64 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 274174 Links: 1
Access: (4755/-rwsr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-12-03 01:46:28.000000000 +0800
Modify: 2019-12-03 01:46:28.000000000 +0800
Change: 2020-02-13 08:53:18.721097527 +0800
1.3 查看历史命令记录文件
查看~/.bash_history 命令执行记录文件,主要分析是否有账户执行过恶意操作系统。每个用户都有历史记录文件,如果发现哪个用户执行过恶意文件,那么我们就可以锁定这个线索,进一步排查。
直接查看:
cat /root/.bash_history | more
进入用户目录下:
cat .bash_history >> history.txt
1.4 查看用户信息文件
查看/etc/passwd 用户信息文件,查找有没有攻击者创建的用户,或者存在异常的用户。主要查看第3、4列的用户标识号和组标识号,和倒数一二列的用户主目录和命令解析程序。然后结合history 文件的排查方法进行排查。
cat /etc/passwd
1.5 查看新增文件
使用find命令,在指定目录文件下查找新增文件
-type b/d/c/p/l/f 分别是指块设备、目录、字符设备、管道、符号链接、普通文件
-mtime -n +n 按文件更改时间来查找文件,-n 指n天以内,+n 指n天前
-atime -n +n 按文件访问时间来查找文件,-n 指n天以内,+n 指n天前
-ctime -n +n 按文件创建时间来查找文件,-n 指n天以内,+n 指n天前
例子:
find -type f -mtime -3 #最近3天修改过的文件
find -type f -ctime -3 #最近3天创建的文件
1.6 查看特殊权限的文件
查找777的权限的文件
find / *.jsp -perm 777
find / -perm 777 | more
1.7 查看隐藏、木马等文件
查看隐藏文件(以“.” 开头的具有隐藏属性的文件)
[root@beret-81 html]# ls -ar | grep "^\."
.test.php
..
.
查找根目录下所有.jsp后缀文件
find / -name *.jsp
查看根目录下后缀为.jsp .jspx文件,并从大到小排列
grep -nr -v "404" ./ | grep -E "\.jsp | \.jspx" | more
2、进程排查
netstat 用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机端口的网络连接情况。
用netstat 网络连接命令,分析可疑端口、可疑IP、可疑PID及程序进程
选项参数:
-a 显示所有连线中的Socket
-n 直接使用IP地址,而不通过域名服务器
-t 显示TCP 传输协议的连线状况
-u 显示UDP 传输协议的连线状况
-v 显示指令执行过程
-p 显示正在使用Socket 的程序识别码和程序名称
-s 显示网络工作信息统计表
2.1 检查异常端口
使用netstat 网络连接命令,分析可疑端口、IP、PID
netstat -antlp|more
查看下pid所对应的进程文件路径,
运行ls -l /proc/$PID/exe或file /proc/$PID/exe($PID 为对应的pid 号)
查看某个端口是哪个进程打开的
lsof -i:8080
2.2 检查异常进程
使用ps命令,分析进程。根据netstat 定位出pid ,使用ps命令,分析进程
ps aux | grep pid
ps -aux --sort -pcpu | less 根据cpu使用率进行排序
-a 代表all,同时加上x参数会显示没有控制终端的进程
-aux 显示所有包含其他使用者的行程
-C 显示某个进行的信息
-axjf 以树状结构显示进程
-e 显示所有进程。和-A相同
-f 额外全格式
-t ttylist by tty 显示终端ID在ttylist 列表中的进程
查看某个用户启动了什么进程
lsof -u root
查看隐藏进程
ps -ef | awk '{print $2}' | sort -n | uniq >1
ls /proc | sort -n | uniq >2
diff 1 2
查看进程cpu占比(动态任务,可实时查看最高cpu占有率)
top 命令是Linux系统常用的性能分析工具,能够实时显示系统中进程的资料占用状况,类似于Windows的任务管理器。
top
3、系统信息排查
3.1 账号安全
基本使用:
1、用户信息文件/etc/passwd
root:x:0:0:root:/root:/bin/bash
account:password:UID:GID:GECOS:directory:shell
用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后shell
注意:无密码只允许本机登陆,远程不允许登陆
2、影子文件/etc/shadow
root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::
用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
who 查看当前登录用户(tty本地登陆 pts远程登录)
w 查看系统信息,想知道某一时刻用户的行为
uptime 查看登陆多久、多少用户,负载
入侵排查
1、查询特权用户特权用户(uid 为0)
[root@localhost ~]# awk -F: '$3==0{print $1}' /etc/passwd
2、查询可以远程登录的帐号信息
[root@localhost ~]# awk '/\$1|\$6/{print $1}' /etc/shadow
3、除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限
[root@localhost ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
4、禁用或删除多余及可疑的帐号
usermod -L user 禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头
userdel user 删除user用户
userdel -r user 将删除user用户,并且将/home目录下的user目录一并删除
3.2 查看系统用户登录信息
utmp 文件中保存的是当前正在系统中的用户信息
wtmp 文件中保存的是登录过本系统的用户信息
/var/log/wtmp 文件结构和 /var/run/utmp 文件结构一样,都是应用/usr/include/bits/utmp.h 中的strut utmp
使用lastlog 命令,查看系统中所有用户最近一次登录信息
[root@beret-81 profile.d]# lastlog
Username Port From Latest
root pts/1 213.85.70.71 Wed Mar 28 14:39:14 +0800 2020
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
使用lastb 命令,用于显示用户错误的登录列表
[root@beret-81 ~]# lastb | more
dbuser ssh:notty 106.13.112.221 Wed Mar 28 18:17 - 18:17 (00:00)
dbuser ssh:notty 106.13.112.221 Wed Mar 28 18:17 - 18:17 (00:00)
root ssh:notty 142.93.179.2 Wed Mar 28 18:17 - 18:17 (00:00)
polaris ssh:notty 188.165.56.214 Wed Mar 28 18:17 - 18:17 (00:00)
使用last 命令,显示用户最近登录信息(数据源为/var/log/wtmp, /var/log/btmp)
[root@beret-81 ~]# last | more
root pts/1 213.85.70.71 Wed Mar 28 14:39 still logged in
root pts/0 213.85.70.71 Wed Mar 28 09:01 - 15:45 (06:44)
root pts/0 213.85.70.71 Tue Mar 27 14:37 - 20:02 (05:24)
3.3 查看开机启动项
查看rc.local 文件(/etc/init.d/rc.local /etc/rc.local)
/etc/init.d 是 /etc/rc.d/init.d 的软链接
系统运行级别示意图:
运行级别 含义
0 关机
1 单用户模式,可以想象为windows的安全模式,主要用于系统修复
2 不完全的命令行模式,不含NFS服务
3 完全的命令行模式,就是标准字符界面
4 系统保留
5 图形模式
6 重启动
查看运行级别命令 runlevel
系统默认允许级别
vi /etc/inittab
id=3:initdefault 系统开机后直接进入哪个运行级别
开机启动配置文件
/etc/rc.local
/etc/rc.d/rc[0~6].d
入侵排查:
查看rc.local 文件(/etc/init.d/rc.local /etc/rc.local )
ls -alt /etc/init.d
more /etc/rc.local /etc/rc.d/rc[0~6].d
ls -l /etc/rc.d/rc3.d/
[root@beret-81 ~]# ls -alt /etc/init.d
lrwxrwxrwx. 1 root root 11 Aug 8 2018 /etc/init.d -> rc.d/init.d
3.4 查看定时任务
查找以下目录中是否存在恶意脚本
/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/*
例:
more /etc/cron.daily/* 查看目录下所有文件
通过crontab -l 查看当前的任务计划,是否有后门木马程序启动相关信息
crontab -u <-l,-r,-e>
-u,指定一个用户
-l 列出某个用户的任务计划
-r 删除某个用户的任务
-e 编辑某个用户的任务(编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件)
例:
crontab -u root -l
crontab -u xxx -l
3.5 检查服务
chkconfig 是管理系统服务的命令行工具,对开机启动的可疑程序进行更改:
设置service 启动信息:
chkconfig name on/off/reset
设置service 运行级别
chkconfig --level levels
入侵排查:
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/
service httpd start
搜索/etc/rc.d/init.d/ 查看是否存在
3.6 查看配置shell 配置文件
查看shell 的配置文件 .bashrc 和 .bash_profile 等文件是否有恶意的alias问题
使用命令查看shell 配置文件
cat .bashrc
cat .bash_profile
/etc/profile 该文件为系统的每个用户设置环境配置信息
/etc/profile.d 目录的配置文件中收集shell的设置
/etc/bashrc 为每一个运行bash shell 的用户执行此文件,当bash shell 被打开时,该文件被读取
.bash_profile 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次,默认情况下,它设置一些环境变量,执行用户的.bashrc 文件
.bashrc 该文件包含专用于你的bash shell 的bash 信息,当登录时以及每次打开新的shell时,该文件被读取
.bash_logout 当每次退出系统(退出bash shell),执行该文件
3.7 系统路径分析
系统路径分析,查看有无敏感可疑信息
[root@beret-81 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
3.8 指定信息检索
strings命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。 strings命令对识别随机对象文件很有用。
分析sshd 文件,是否包括IP信息
strings /usr/bin/.sshd | grep '[1-9]{1,3}.[1-9].{1,3}.'
查看ssh 相关目录有无可疑的公钥存在
Redis(6379) 未授权恶意入侵,即可直接通过redis 到目标主机导入公钥
目录:/etc/ssh ./.ssh/
4、日志排查
日志默认存放位置:/var/log/
日志配置位置:/etc/rsyslog.conf
4.1 常用日志文件
日志文件 说明
/var/log/cron 记录了系统定时任务相关的日志
/var/log/mailog 记录邮件信息
/var/log/auth.log 包含系统授权信息,包括用户登录和使用的权限机制等
/var/log/userlog 记录所有等级用户信息的日志
/var/log/vsftpd.log 记录Linux ftp 日志
/var/log/message 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/btmp 记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/wtmp 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
/var/run/utmp 记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询
/var/log/secure 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录
/var/log/faillog 记录系统登录不成功的账户信息,一般会被黑客删除。
4.2 Linux 日志分析
1、查看登录信息
查看用户最近登录信息
last -f /var/log/wtmp
查看当前登录系统和用户信息,可用who命令显示当中的内容
last -f /var/run/utmp
查看用户最后登录的信息
lastlog
查看登录失败的日志
lastb
strings /var/log/btmp
2、定位有多少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
3、登录成功的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}'
4、增加一个用户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
#grep "useradd" /var/log/secure
5、删除用户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'
# grep "userdel" /var/log/secure
6、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
Apache 日志分析
Apache 默认自动生成两个日志文件,访问日志access_log 和 error_log
1、查询访问量前十的IP地址:
cat access_log | cut -f 1 -d ' ' | sort | uniq -c | sort -k 1 -n -r | head -10
2、查询访问量前十的URL:
cat access_log | cut -f 7 -d ' ' | sort | uniq -c | sort -k 1 -n -r | head -10
3、统计访问量前十QPS的时间点:
cat access_log | cut -f 4 -d ' ' | sort | uniq -c | sort -k 1 -n -r | head -10
5、后门排查
5.1 Rootkit查杀
chkrootkit
安装使用:
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar zxvf chkrootkit.tar.gz
cd chkrootkit-0.53
make sense
#编译完成没有报错的话执行检查
./chkrootkit
rkhunter
网址:http://rkhunter.sourceforge.net
安装使用:
wget https://udomain.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz
tar -zxvf rkhunter-1.4.6.tar.gz
cd rkhunter-1.4.6
./installer.sh --install
rkhunter -c
5.2 病毒查杀
Clamav
网址:http://www.clamav.net/download.html
安装使用:
#安装
yum install -y clamav
#更新病毒库
freshclam
#扫描方法
clamscan -r /etc --max-dir-recursion=5 -l /root/etcclamav.log
clamscan -r /bin --max-dir-recursion=5 -l /root/binclamav.log
clamscan -r /usr --max-dir-recursion=5 -l /root/usrclamav.log
#扫描并杀毒
clamscan -r --remove /usr/bin/bsd-port
clamscan -r --remove /usr/bin/
clamscan -r --remove /usr/local/zabbix/sbin
#查看日志发现
cat /root/usrclamav.log |grep FOUND
5.3 webshell 查杀
手工排查webshell
webshell的排查可以通过文件、流量、日志三种方式进行分析,基于文件的命名特征和内容特征相对操作性较高,在入侵后应急过程中频率也比较高。
根据webshell 特征进行命令查找
find /var/www/html/ -type f -name '*.php' | xargs egrep 'assert|phpspy|c99sh|milw0rm|eval|\(gunerpress|\(base64_decoolcode|spider_bc|shell_exec|passthru|\)\$\_\POST\[eval\(str_rot13|.chr\(|\"\_R|file_put_contents\(\.\*\$_|base64_decode'
find /var/www/html/ -type f -name '*.php' | xargs grep 'eval' | more
河马webshell查杀
安装使用:
wget http://dl.shellpub.com/hm/latest/hm-linux-amd64.tgz?version=1.8.2
tar xvf hm-linux.tgz
#查看帮助
./hm -h
#查看版本
./hm version
#扫描后门
./hm scan 你的web目录,扫描完成之后结果会保存为result.csv文件,使用记事本或者excel打开查看
./hm deepscan 你的web目录,扫描时开启深度解码
#升级
./hm update
5.4 RPM check检查
系统完整性可以通过rpm自带的-Va来校验检查所有的rpm软件包,查看哪些命令是否被替换了:
rpm -Va > rpm.log
如果一切均校验正常将不会产生任何输出,如果有不一致的地方,就会显示出来,输出格式是8位长字符串,每个字符都用以表示文件与RPM数据库中一种属性的比较结果 ,如果是. (点) 则表示测试通过。
验证内容中的8个信息的具体内容如下:
S 文件大小是否改变
M 文件的类型或文件的权限(rwx)是否被改变
5 文件MD5校验是否改变(可以看成文件内容是否改变)
D 设备中,从代码是否改变
L 文件路径是否改变
U 文件的属主(所有者)是否改变
G 文件的属组是否改变
T 文件的修改时间是否改变
如果命令被替换了,如果还原回来:
文件提取还原案例:
rpm -qf /bin/ls 查询ls命令属于哪个软件包
mv /bin/ls /tmp 先把ls转移到tmp目录下,造成ls命令丢失的假象
rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls 提取rpm包中ls命令到当前目录的/bin/ls下
cp /root/bin/ls /bin/ 把ls命令复制到/bin/目录 修复文件丢失
5.5 linux 安全检查脚本
https://github.com/grayddq/GScan
https://github.com/cisp/LinuxEmergency
https://github.com/ppabc/security_check
https://github.com/T0xst/linux