本文是针对应急响应中linux排查思路做一个固化(其实是在客户现场发呆😐也不好),方便自己能够快速排查linux中的问题,溯源攻击方法。主要包含(系统、网络、进程、启动项、服务、文件痕迹等信息)其中还有内存分析,日志分析,流量分析等,新开文章进行总结。

易丢失数据

系统信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 真实时间
date -R

# 查看Linux内核版本
uname -a

# 列出目前与过去登录系统的用户相关信息
last

# 观察硬盘实体使用情况
fdisk -l

# 查看挂载
mount

# 查看内存
more /proc/meminfo > memoryinfo.log

# 查看mac地址信息
cat /etc/udev/rules.d/70-persistent-net.rules

# CPU基础信息
lscpu

网络连接

1
2
3
4
yum install net-tools     [On CentOS/RHEL]
apt install net-tools [On Debian/Ubuntu]
zypper install net-tools [On OpenSuse]
pacman -S netstat-nat [On Arch Linux]
1
netstat -anp
  • -a 显示所有
  • -t 仅显示tcp
  • -u 仅显示udp
  • -n 拒绝显示别名,直接使用ip地址
  • -l 仅列出监听状态的服务
  • -p 显示建立相关链接的程序名
  • -r 路由信息,路由表
  • -e 扩展信息,例如uid
  • -s 按各个协议进行统计
1
netstat -antlp | more

进程对应可执行程序

1
ls -alt /proc/[PID]

进程打开文件

1
lsof -p [PID]

获取socket统计信息

1
ss -s

端口信息

1
lsof -i:端口号

查看端口占用

进程数据

1
2
3
4
ps -ef
top
ps aux > ps.log
ps aux | grep pid
  • -e 显示环境变量
  • -f 显示程序间的关系
  • -aux 显示所有包含其他使用者的进程

处理恶意进程

kill -9 [PID] 结束进程

rm -rf [filename] 删除文件

如果root用户都无法删除

lsatter filename 查看文件属性

chattr -i [filename] 移除i属性

查看隐藏进程

1
ps -ef | awk '{print}' | sort -n | uniq >1
1
ls /proc | sort -n | uniq >2
1
diff 1 2

依照进程号查看拉起服务

1
2
systemctl status [pid]
cat /proc/[pid]/stat #第四列的值是父进程pid

提取为实际运行程序的符号链接

1
2
cp /proc/[pid]/exe xxx
md5sum xxx

用户信息

查看系统所有用户

1
cat /etc/passwd

用户名:密码: 用户id: 用户组id: 注释: 用户组目录: 默认登录shell

1
cat/etc/shadow
1
more /etc/shadow | cut -d : -f 1

用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留

查看超级权限账户&&可登录(uid 为0)

1
awk -F: '{if($3==0) print $1}' /etc/passwd

查看可以远程登录的帐号信息

1
awk '/\$1|\$6/{print $1}' /etc/shadow

查看sudo权限账号

1
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"

除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限

image-20211116203048581

关于 root 和 wheel:在 Linux 中创建管理员账号(root 权限)的正确方式

错误的登录信息

lastb

用户最后登录信息

lastlog | more

用户最近登录信息

last

/var/log/wtmp 存储成功登录信息

/var/log/btmp 存储失败登录信息

/var/log/utmp 存储当前正在登录信息

当前登录用户

本地登录以及通过SSH登录的账户信息和用户信息

who或者w

两者的区别在于,w 命令除了能知道目前已登陆的用户信息,还可以知道每个用户执行任务的情况。

uptime : 查看登陆多久、多少用户,负载

uptime -p tty1

空口令账户

1
awk -F: 'length($2)==0 {print$1}' /etc/passwd

处理可疑账号

1
2
3
usermod -L user    禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头
userdel user 删除user用户
userdel -r user 将删除user用户,并且将/home目录下的user目录一并删除

服务信息

服务自启动

1
chkconfig --list 
数字 描述
1 单用户模式
2 无网络连接的多用户命令行模式
3 有网络连接的多用户命令行模式
4 表示不可用
5 带图形界面的多用户模式
6 表示重新启动

查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。

/etc/init.d目录

init.d目录中的脚本都是以服务的形式启动的,系统在执行init.d目录中的服务脚本时,会分别单独为每个服务脚本启动一个非登录非交互式shell来始终在后台运行服务脚本一直到用户退出登录,关闭系统.

/etc/rc.d/rc.local目录

系统初始化级别脚本运行之后再执行的,因此可以安全地在里面添加你想在系统启动之后执行的脚本

详见Linux之init.d、rc.d文件夹说明

1
systemctl list-unit-files --type=service |grep enabled
1
service --status-all

非易丢失数据

启动项

1
systemctl list-unit-files

image-20211116191459348

左边是服务名称,右边是状态,enabled是开机启动,disabled是开机不启动 供应商预设(VENDOR PRESET)

开启启动配置文件

1
2
/etc/rc.local
/etc/rc.d/rc[0~6].d

当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在/etc/init.d目录下,然后在/etc/rc.d/rc*.d中建立软链接即可

1
cat /etc/rc.local
1
ls -alt /etc/init.d
1
cat /etc/init.d/rc.local
1
cd /etc/rc.d/rc[0~6]

计划任务

crontab

crontab -l 列出某个用户cron服务的详细内容

默认编写的crontab文件会保存在 (/var/spool/cron/用户名 例如: /var/spool/cron/root)

crontab -u root -l

crontab -r 删除每个用户cront任务(谨慎:删除所有的计划任务)

crontab -e 使用编辑器编辑当前的crontab文件

1
more /etc/cron.daily/*  查看目录下所有文件

etc目录下的任务计划文件

1
2
3
4
5
6
7
8
9
10
11
ls /etc/cron*
常见文件夹
/etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/*
/etc/anacrontab
/var/spool/anacron/*
/var/spool/cron/*

历史命令

1
2
3
history
cat /用户家目录/.bash_history
cat .bash_history >> history.txt

保存1万条命令

1
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile

异常文件

敏感目录

查看敏感目录(临时目录 /tmp,命令目录/usr/bin/ /usr/sbin,网站目录等)

~/.ssh /etc/ssh 经常作为后门配置路径

时间点

find命令:指定目录下查找文件

参数

1
b/d/c/p/l/f

块设备/目录/字符设备/管道/符号链接/普通文件

-n:n天之内

+n:n天以前

-mtime:更改时间

-atime:访问时间

-ctime:创建时间

查找一天内新增的shell文件

1
sudo find / -ctime 0 -name "*.sh"

stat查看文件时间点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ stat 1.sh
File: ‘1.sh’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 51317256 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ dropann) Gid: ( 1000/ dropann)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2021-05-15 19:08:23.215045535 +0800
Modify: 2021-05-15 19:08:23.215045535 +0800
Change: 2021-05-15 19:08:23.215045535 +0800
Birth: -

Device: fd00h/64768d:文件所在设备号,分别以十六进制和十进制显示
Inode: 51317256:文件节点号
Links: 1:硬链接数
Access: (0664/-rw-rw-r--):访问权限
Uid:所有者ID与名称
Gid:所有者用户组ID与名称
Access:最后访问时间
Modify:最后修改时间
Change:最后状态改变时间
Birth -:无法获知文件创建时间。注意:Linux下的文件未存储文件创建时间
时间 名称 中文 描述
atime Access 最近访问时间 最后一次访问文件(读取或执行)的时间
mtime Modify 最近修改时间 最后一次修改文件(内容)或者目录(内容)的时间
ctime Change 最近变化时间 最后一次改变文件(属性或权限)或者目录(属性或权限)的时间
  1. 当读取文件时,atime改变,mtime和ctime不变
  2. 当修改文件时,atime,mtime,ctime都会改变
  3. 修改文件属性时,ctime改变,atime,mtime不变
  4. more,less,cat,nl,tail,tac等命令会更改atime
  5. ls,stat命令不会修改atime
  6. 通过chmod,chown修改文件属性,会更新ctime。touch则会更改atime,ctime,mtime

查看特定文件夹一天前访问的文件

1
find /opt -iname "*" -atime 1 -type f

特殊文件

权限特殊如777

1
sudo find /tmp -perm 777

文件类型+文件中关键字(查webshell)

xargs egrep+关键字

1
sudo find /var/www/ -name "*.php" | xargs egrep 'assert|phpspy|eval'

https://github.com/he1m4n6a/findWebshell

系统命令是否被替换:查看命令目录的相关系统命令的修改时间,文件大小从而判断是否被修改。

ls -alt /bin 修改时间

ls -alh /bin 文件大小

防火墙规则

1
iptables -L

日志

Linux日志

Rookit数据排查

命令:rootkithunter chkrootkit

chkrootkit

官网地址

下载源码:

1
cd /usr/local/
1
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz

安装编译工具包

1
yum install gcc gcc-c++ make glibc-static

安装

1
2
3
tar zxvf chkrootkit.tar.gz
cd chkrootkit-0.52
make sense

执行

1
./chkrootkit

出现INFECTED就说明系统可能有问题了

1
./chkrootkit | grep INFECTED

image-20211117111158425

这里是个误报,/tmp目录下存在可执行文件

Linux下如何查找可执行文件

rootkithunter

RKHunter是专业检测系统是否感染rootkit的工具,通过执行一系列脚本来确定服务器是否感染rootkit。RKHunter可以做到:

  1. MD5校验测试, 检测任何文件是否改动.
  2. 检测rootkits使用的二进制和系统工具文件.
  3. 检测特洛伊木马程序的特征码.
  4. 检测大多常用程序的文件异常属性.
  5. 执行一些系统相关的测试 - 因为rootkit hunter可支持多个系统平台.
  6. 扫描任何混杂模式下的接口和后门程序常用的端口.
  7. 检测如/etc/rc.d/目录下的所有配置文件, 日志文件, 任何异常的隐藏文件等等. 例如, 在检测/dev/.udev和/etc/.pwd.lock文件时候, 我的系统被警告.
  8. 对一些使用常用端口的应用程序进行版本测试. 如: Apache Web Server, Procmail等.

官网地址

下载源码:

1
wget https://onboardcloud.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz --no-check-certificate

安装:

1
2
3
tar -zxvf rkhunter-1.4.6.tar.gz
cd rkhunter-1.4.6
./installer.sh --install

执行

1
rkhunter -c

程序自动执行不用每个部分Enter继续

1
rkhunter --check --sk | grep Warning

在线更新

1
rkhunter --update

打包数据

打包网站数据

1
tar -cvf test.tar `find . -type f -name "*.jsp*"`

打包文件名中包含jsp的文件

1
tar -czvf test1.tar.gz /aaa/

打包日志数

1
2
3
tar -czvf var_log.tar.gz /var/log
last > last.log
netstat -an > netstat.log

打包数据库数据

1
2
3
4
5
6
7
停止
systemctl stop mysqld
备份
mysqldump -u root -p 数据库密码 数据库名称 > 具体备份路径
mysqldump -u root -p mysite > /var/databakup/mysite.sql
压缩
tar -czvf mydql_data.tar.gz /var/lib/mysql/

病毒查杀

Clamav

官方地址下载

操作手册

在CentOS 7上安装ClamAV

1
2
3
4
5
6
7
8
9
10
11
12
#更新病毒库
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

webshell查杀

河马webshell查杀

安全检测脚本

https://github.com/grayddq/GScan

https://github.com/ppabc/security_check

https://github.com/T0xst/linux