Linux 入侵排查

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

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

安装使用:
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查杀

网址:https://www.shellpub.com

安装使用:
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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注