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
