linux应急响应

  • 敏感目录文件分析类/tmp目录,命令目录 /usr/bin /usr/sbin等

-a 显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为隐藏,不会列出); -C 多列显示输出结果。这是默认选项; -l 以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等; -t 用文件和目录的更改时间排序;

ls –alt /tmp/
  • 查看开机自启动项
ls -alt  /etc/init.d/
         /etc/rc.local 

/etc/init.d 是 /etc/rc.d/init.d 的软链接

  • 时间排序查看当前目录
ls -alt | head -n 10  当前目录最近十个修改的

针对可疑文件可以使用stat进行创建修改时间、访问时间的详细查看

stat /etc/passwd
(1)Access Time:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间。
(2)Modify Time:简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个时间。 
(3)Change Time:简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例如文件的链接数,大小,权限,Blocks数。
  • 查看命令执行记录
cat /root/.bash_history
  • 查看系统用户信息文件

在/etc/passwd中查找命令解释程序不是nologin的用户,然后再到这些用户的用户主目录里,找到bash_history,去查看这个用户有没执行过恶意命令

  • 查看新增文件

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 ./ -mtime +0 -name "*.php"查找24小时前被修改的php文件
find / -ctime 2 查看72小时内新增的文件

tail -f /var/log/nps.log查看文件新增加的内容

grep正则查找

  • 查找特殊权限的文件
5find / -perm 777 | more
  • 隐藏的文件(.开头的文件具有隐藏的属性)
ls -ar | grep "^\."
  • top指令实时动态查看系统整体运行状况60698a913651002be006d71f7a901ea0

如果未发现异常可能是攻击者使⽤了 mount bind、动态链接器劫持、替换操作系统命令等⼿法对进程进⾏了隐藏,可以使用busybox执行top命令

  • netstat 分析可疑端口、可疑IP、可疑PID及程序进程
-a 	显示所有连线中的Socket。 
-n  直接使用IP地址,而不通过域名服务器。
-t 	显示TCP传输协议的连线状况。
-u  显示UDP传输协议的连线状况。
-v  显示指令执行过程。
-p  显示正在使用Socket的程序识别码和程序名称。
-s  显示网络工作信息统计表。
netstat –antlp | more
a) "Recv-Q"和"Send-Q"指的是接收队列和发送队列。
b) Proto显示连接使用的协议;RefCnt表示连接到本套接口上的进程号;Types显示套接口的类型;State显示套接口当前的状态;Path表示连接到套接口的其它进程使用的路径名。
c)  套接口类型:
-t	TCP
-u 	UDP
-raw   RAW类型
--unix  UNIX域类型
--ax25  AX25类型
--ipx    ipx类型
--netrom  netrom类型
d)状态说明:
LISTENING    侦听状态
ESTABLISHED  建立连接
CLOSE_WAIT   对方主动关闭连接或网络异常导致连接中断
  • 根据netstat定位出的pid使用ps命令分析进程
-a  	代表 all。同时加上x参数会显示没有控制终端的进程
-aux  	显示所有包含其他使用者的行程(ps -aux --sort -pcpu | less根据cpt使用率进行排序)
-C 	  	显示某的进程的信息
-axjf   以树形结构显示进程
-e  	显示所有进程。和 -A 相同。
-f	  	额外全格式
-t 		ttylist by tty 	显示终端ID在ttylist列表中的进程
ps aux |grep 40634使用ps命令查看对应进程信息及所在位置
lsof -i:1677 查看指定端口对应的程序

木马处置时最好先暂停进程,避免守护进程通过重新下载或者从隐藏路径拷贝木马文件并执行的方式,来恢复木马进程

kill -STOP <PID>
ps aux |grep -T #查看已经暂停的进程
  • 查看系统命令是否被替换
ls -alt /usr/bin | head -10
ls -al /bin /usr/bin /usr/sbin/ /sbin/ | grep "Jan 15"
如果日期数字<10,中间需要两个空格。比如1月1日,grep “Jan 1”

如果 lsps 出现在最近修改列表中,而你近期并未更新系统,那就高度可疑

//centos
rpm -Vf /usr/bin/*来判断系统命令是否被修改
#S 关键字代表文件大小发生了变化
#5 关键字代表文件的 md5 值发生了变化
#T 代表文件时间发生了变化

for cmd in ls cat ps grep find netstat ss top id whoami sudo; do pkg=$(dpkg -S /usr/bin/$cmd /bin/$cmd 2>/dev/null | head -n1); if [ -z "$pkg" ]; then echo "❗ Suspicious: $cmd (not owned by any package)"; else echo "OK: $cmd ← ${pkg%%:*}"; fi; done   //ubuntu和debian

发现确实被修改了,直接删除被修改过的命令文件,从backup文件夹里面复制提前备份好的命令文件。

file /usr/bin/ps判断一个文件的真实类型
strings /usr/bin/ps提取长度 ≥4 的可打印 ASCII 字符串。
# 查看真实指向
readlink -f /usr/bin/ps

# 检查目标文件内容
file /tmp/.ps.bin
strings /tmp/.ps.bin | head -20   # 查看可读字符串(可能含IP、域名、shell命令)
hexdump -C /tmp/.ps.bin | head -20  # 十六进制查看
  • 隐藏进程查看

在Linux系统中,/proc文件系统是一个虚拟文件系统,它包含了运行中的进程的信息。每个进程在/proc下都有一个以其进程ID(PID)命名的目录,例如/proc/8888。这个目录下包含了许多文件,这些文件提供了关于进程的详细信息,如命令行参数、环境变量、内存使用情况等。ps和netstat等命令通常通过遍历/proc下的目录来获取系统进程的信息,如果某个进程的/proc/pid目录被隐藏或修改,那么上述命令可能无法正确显示该进程的信息,从而达到隐藏进程的目的。通过挂载操作,可以将/proc/pid目录挂载到另一个位置,从而隐藏原始的进程信息。

例如隐藏bash进程:

首先创建空目录:

【mkdir -p /tmp/.hide】

挂载空目录到对应的/proc/PID下:

【mount -o bind /tmp/.hide /proc/291876】

排查方法

cat /proc/$$/mountinfo
umount /proc/291876修复
# 找出在 /proc 中有、但 ps 看不到的 PID → 可疑隐藏进程。可以检测mount挂载
comm -23 <(ls /proc | grep -E '^[0-9]+$' | sort -n) <(ps -eo pid --no-headers | tr -d ' ' | sort -n)
  • 查看分析history,寻找有没有

a) wget 远程某主机(域名&IP)的远控文件; b) 尝试连接内网某主机(ssh scp),便于分析攻击者意图; c) 打包某敏感数据或代码,tar zip 类命令 d) 对系统进行配置,包括命令修改、远控木马类,可找到攻击者关联信息…

cat /root/.bash_history
  • 查看分析用户相关
cat /etc/passwd | grep -E "/bin/bash$"查看能够登录的帐号
awk -F: '{if($3==0)print $1}' /etc/passwd查看UID为0的帐号(超级用户)
  • 查看分析计划任务
crontab -u  <-l, -r, -e>

-u 指定一个用户
-l 列出某个用户的任务计划
-r 删除某个用户的任务
-e 编辑某个用户的任务(编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件)

查看etc目录任务计划相关文件,

ls /etc/cron*
grep 关键字 /etc/cron.*/*

查看木马的守护程序计划任务

20240830140548-e6cd2480-6695-1

查看at计划任务

atq        一次性计划任务(只执行一次)
  • 查看linux开机启动程序

cat /etc/rc.local

ls –alt /etc/init.d/

  • 查看系统用户登录信息
lastlog查看系统用户登录信息
last显示最近登录信息
sudo lastb查看登录失败尝试
  • 查看环境变量
echo $PATH 
分析有无敏感可疑信息
/tmp, /var/tmp ✅ 高危 临时目录,通常可写,绝不应出现在 PATH
../ ✅ 极高危 当前目录,极易被利用
  • 查看ssh相关目录有无可疑的公钥存在

Redis(6379) 未授权恶意入侵,即可直接通过redis到目标主机导入公钥; 目录: /etc/ssh ./.ssh/

ls -l /etc/ssh/ 系统ssh配置
# 检查 root 用户
ls -la /root/.ssh/

# 检查普通用户(如 ubuntu, www-data)
ls -la /home/ubuntu/.ssh/
ls -la /home/www-data/.ssh/
  • 动态链接库检查

/etc/ld.so.preload是glibc 动态链接器(ld-linux.so)的全局预加载配置文件。系统中所有通过动态链接运行的程序(几乎所有的命令如 lspsssh 等),在启动时都会自动加载该文件中指定的 .so 共享库。

使用 静态工具 避免被 hook 干扰:

# 检查 preload 文件是否存在及内容(一般不存在)
busybox cat /etc/ld.so.preload
# 示例输出:
# /lib64/libupload.so
# 检查该 .so 文件是否存在
busybox ls -l /lib64/libupload.so
# 查看文件类型(是否为 ELF 共享库)
busybox file /lib64/libupload.so

处置

# 1. 删除 preload 配置(阻止新进程加载)
rm -f /etc/ld.so.preload

# 2. 删除恶意动态链接库
rm -f /lib64/libupload.so
  • 系统配置环境检查

/etc/sysctl.conf是 Linux 系统的 内核参数配置文件系统启动时会自动加载其中的设置,用于调整内核行为(如网络、内存、安全等)

典型恶意配置:vm.nr_hugepages = 4096这部分内存无法被释放,即使重启后也会重新分配

cat /etc/sysctl.conf
grep -i "hugepages" /etc/sysctl.conf

通过分析web日志,来找到黑客的webshell文件。直接分析web日志的最直接方式就是通过web日志中的特征来判断是否存在恶意的webshell后门,比如上面列表展示的这些常见webshell会传递的get参数。常见webshell后门日志特征如下:

Darkblade:goaction=login
    JspSpy:o=login
    PhpSpy:action=phpinfo
    Regeorg: cmd=connect
Other:cmd=
  • 常用日志文件

  • 日志文件 CentOS / RHEL / Rocky Ubuntu / Debian
    认证日志 /var/log/secure /var/log/auth.log
    系统综合日志 /var/log/messages /var/log/syslog
    用户登录成功记录 /var/log/wtmp 同样是 /var/log/wtmp(但需用命令读)
    失败登录记录 /var/log/faillog(较少用) /var/log/btmp

SSH登录尝试会记录在 /var/log/auth.log.1

注意/var/log/wtmp文件是二进制文件,通过last等指令查看

  • 定位有多少IP在爆破主机的root帐号
grep "Failed password for root" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20
grep "Accepted password for root" /var/log/auth.log登录成功的root

grep "Failed password for" /var/log/auth.log | \
  awk '{print $9}' | sort -u爆破失败的用户名字典
  
grep "Accepted" /var/log/auth.log | awk '{print $9 "@" $11}' | sort -u成功的用户名和ip
  • 中间件日志,数据库日志
/var/log/nginx/access.log    # 访问日志
/var/log/nginx/error.log     # 错误日志
/var/log/apache2/access.log
/var/log/apache2/error.log
/var/log/tomcat9/catalina.out        # 主日志(stdout/stderr)
/var/log/tomcat9/localhost_access_log.*.txt  # 访问日志(需启用)
/var/log/mysql/error.log

iptables防火墙网络隔离 用到的命令

# 允许维护人员的ip访问
iptables -I INPUT -s xx.xxx.xx.xx -p tcp -j ACCEPT 
# 禁止流量进来
iptables -A INPUT -p tcp -j DROP
# 禁止流量出去
iptables -A OUTPUT -p tcp -j DROP
#清除规则
iptables -F
kill 9 PID杀死进程
kill -STOP PID暂停进程
移除攻击者使用chattr +i /var/www/html/shell.php设为 不可删除、不可修改、不可重命名,即使你是 root
# 查看文件属性(i = immutable)
lsattr /var/www/html/
● -a:显示所有文件,包括以点号 (.) 开头的隐藏文件。
● -d:如果是目录,只显示目录本身的属性,而不是目录下的内容。
● -R:递归显示目录及其子目录中文件的属性。

解锁:chattr -i /path/to/malicious_file
删除 Webshell
rm -fv /tmp/.backdoor.php