Linux取证溯源
本文是针对应急响应中linux排查思路做一个固化(其实是在客户现场发呆😐也不好),方便自己能够快速排查linux中的问题,溯源攻击方法。主要包含(系统、网络、进程、启动项、服务、文件痕迹等信息)其中还有内存分析,日志分析,流量分析等,新开文章进行总结。
易丢失数据
系统信息
1 | 真实时间 |
网络连接
1 | yum install net-tools [On CentOS/RHEL] |
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 | ps -ef |
- -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 | systemctl status [pid] |
提取为实际运行程序的符号链接
1 | cp /proc/[pid]/exe 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权限
关于 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 | usermod -L user 禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头 |
服务信息
服务自启动
1 | chkconfig --list |
数字 | 描述 |
---|---|
1 | 单用户模式 |
2 | 无网络连接的多用户命令行模式 |
3 | 有网络连接的多用户命令行模式 |
4 | 表示不可用 |
5 | 带图形界面的多用户模式 |
6 | 表示重新启动 |
查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。
/etc/init.d
目录
init.d目录中的脚本都是以服务的形式启动的,系统在执行init.d目录中的服务脚本时,会分别单独为每个服务脚本启动一个非登录非交互式shell来始终在后台运行服务脚本一直到用户退出登录,关闭系统.
/etc/rc.d/rc.local
目录
系统初始化级别脚本运行之后再执行的,因此可以安全地在里面添加你想在系统启动之后执行的脚本
1 | systemctl list-unit-files --type=service |grep enabled |
1 | service --status-all |
非易丢失数据
启动项
1 | systemctl list-unit-files |
左边是服务名称,右边是状态,enabled是开机启动,disabled是开机不启动 供应商预设(VENDOR PRESET)
开启启动配置文件
1 | /etc/rc.local |
当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在
/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 | ls /etc/cron* |
历史命令
1 | history |
保存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 | stat 1.sh |
时间 | 名称 | 中文 | 描述 |
---|---|---|---|
atime | Access | 最近访问时间 | 最后一次访问文件(读取或执行)的时间 |
mtime | Modify | 最近修改时间 | 最后一次修改文件(内容)或者目录(内容)的时间 |
ctime | Change | 最近变化时间 | 最后一次改变文件(属性或权限)或者目录(属性或权限)的时间 |
- 当读取文件时,atime改变,mtime和ctime不变
- 当修改文件时,atime,mtime,ctime都会改变
- 修改文件属性时,ctime改变,atime,mtime不变
- more,less,cat,nl,tail,tac等命令会更改atime
- ls,stat命令不会修改atime
- 通过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 |
日志
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 | tar zxvf chkrootkit.tar.gz |
执行
1 | ./chkrootkit |
出现INFECTED就说明系统可能有问题了
1 | ./chkrootkit | grep INFECTED |
这里是个误报,
/tmp
目录下存在可执行文件
rootkithunter
RKHunter是专业检测系统是否感染rootkit的工具,通过执行一系列脚本来确定服务器是否感染rootkit。RKHunter可以做到:
- MD5校验测试, 检测任何文件是否改动.
- 检测rootkits使用的二进制和系统工具文件.
- 检测特洛伊木马程序的特征码.
- 检测大多常用程序的文件异常属性.
- 执行一些系统相关的测试 - 因为rootkit hunter可支持多个系统平台.
- 扫描任何混杂模式下的接口和后门程序常用的端口.
- 检测如/etc/rc.d/目录下的所有配置文件, 日志文件, 任何异常的隐藏文件等等. 例如, 在检测/dev/.udev和/etc/.pwd.lock文件时候, 我的系统被警告.
- 对一些使用常用端口的应用程序进行版本测试. 如: 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 | tar -zxvf rkhunter-1.4.6.tar.gz |
执行
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 | tar -czvf var_log.tar.gz /var/log |
打包数据库数据
1 | 停止 |
病毒查杀
Clamav
1 | 更新病毒库 |
webshell查杀
安全检测脚本
https://github.com/grayddq/GScan