Linux应急响应手册-1

0x0-整体流程

0x1—挖矿事件应急响应处置方法

1.发掘寻找恶意域名(矿池地址)

多沙箱检测,确保结果。

2.获取异常进程 pid

  • cpu 占用
    • top -c -o %cpu
      • -c 参数显示进程的命令行参数
    • ps -eo pid ,ppid,%mem,%cpu,cmd --sort =-%cpu | head -n 5
      • 列出 cpu 占用前 5 的进程信息
  • 内存占用
    • top -c -o %MEM
      • -c 参数显示进程的命令参数
    • ps -eo pid ,ppid,%mem,%cpu,cmd --sort =-%mem | head -n 5
      • 列出 内存占用前 5 的进程信息
  • 网络占用

网络占用需借助第三方软件,之后使用 root 权限执行

Ubuntu/Debian 安装:

  • sudo apt install nethogs
    Centos/RHEL 安装:
  • sudo yum -y install epel-release
  • sudo yum -y install nethogs
  • 安装过程中若出现依赖问题,可使用 - f 参数修复安装
    安装完成之后执行:
    • sudo nethogs
    • sudo jnettop
  • nethogsjnettop 均可使用 --help 配合管道符grephead 根据回显的提示给出相应的参数查看相关网络占用信息。

3.寻找恶意文件

  • 经过上述步骤,基本上可以获取到异常占用进程 pid 或者与之相关的恶意执行命令和相关参数信息。
    • 根据进程名字或者部分字符串获取 pid
pidof ‘name’
ps -aux | grep ‘name’
ps -ef | grep ‘name’ | grep -v grep | awk ‘{print $2}’
pgrep -f ‘name’
  • 根据 pid 获取程序的详细信息:
lsof -p pid
pwdx pid

pwdx—— 获取该 pid 的进程启动的时候的目录;注意,该命令打印出的结果并不一定就是恶意程序的所在路径,只是启动恶意程序的路径;

cat /proc/pid/maps
ls -lah /proc/pid/exe
systemctl status pid #获取该 pid 进程的详细 status 信息

Ps:有些时候,无法通过 ps,top 等命令根据 pid 进行查询,可能是因为攻击者将 /proc/pid/ 进行了隐藏,具体的手段(猜测) 应该是通过以下方式实现的

mkdir .hidden
mount -o bind .hidden /proc/PID

# 切勿乱用,仅作手段实现方式猜测处理;Debian 系列的测试成功,centos 测试不成功。

# 若在实际环境中遇到被隐藏的 pid 可以使用下述方法查看被隐藏的pid信息

# 查看方法
cat /proc/$$/mountinfo #查看被隐藏的挂载信息
  • 根据 pid 查看由进程起的线程
ps H -T -p pid
ps -Lf pid

# 结果如下图所示

其中 SPID 就是线程 ID,而 CMD 一栏则显示了线程名称

top -H -p pid
#-H选项可以显示线程

htop
#htop工具Linnx工具默认未安装,该命令做作用于top命令功能相同,不过显示的信息更为全面,可以更加直观的展示线程

pstree -agplU
#pstree命令,十分推荐;以树形式详细、全面的展示进程与线程之间的关系。

4.确认恶意程序/进程的运行时间

  • 查看程序运行时间 ps -eo pid,lstart,etime,cmd | grep <pid>

上图表示 pid 为 1292 的进程是在 2022 年 4 月 28 日 13:32:20 被创建的。已经运行了 30 分零 2 秒,具体执行的命令行为 /usr/sbin/sshd -D

  • 与找到的恶意文件创建时间做对比 stat xxxx.sh

  • 查看恶意文件属性: ls -la xxx.sh

该部分是为了验证定位到的文件是否为当前恶意程序的恶意文件,增加此对比,可能会发现一些之前没能发现蛛丝马迹

5.处理异常的进程

  • 恶意文件样本采样
scp -P 4588 remote@RHOST_address:/file/to/patch/file /home/your/file/to/path

#scp命令,-P指定ssh端口,从远程服务器(被攻击主机remote@RHOST_address)将恶意文件样本(file/to/patch/file)下载到本地(/home/your/file/to/path)
#命令中的路径需要根据实际情况来写。

或者使用finalshell、xshell等集成工具完成恶意文件样本采样。也可使用python、php等程序发起http服务。

根据信息安全工程师习惯或者业主要求/环境要求,灵活使用。

  • 恶意样本分析溯源
在线分析平台
PCHunter 哈勃 奇安信云沙箱
Virustotal 魔盾 微步云沙箱
jotti HYBRID 安恒威胁分析平台
scanvir 大圣云沙箱检测系统 360 威胁分析平台
  • 寻找病毒 /类似病毒分析报告
病毒分析报告平台
安全客 绿盟科技
Freebuf 安恒分析平台
深信服安全响应以及 EDR 知识赋能平台 火绒安全最新资讯
  • 恶意进程查杀
ps ajfx
pstree | grep ‘pid\name’
systemctl status <pid|name|>
# 大部分恶意文件都会存在守护进程和子进程
# 可使用ps或者直接使用pstree | grep 命令查看相关进程的进程树结构。

# 如果没有子进程可以直接使用
kill -9 pid
# 这样会直接杀掉指定的进程,但是,由这个进程产生或者由其父进程产生的子进程不会被杀。

# 如果杀掉了指定进程后,在top中发现进程起了新的子进程,就需要使用如下命令
kill -9 -pid
# 注意,这里的pid前有一个-,表示杀掉这一整个进程组
  • 进程组 ID & 会话ID

  • 在 Linux 中,常见的、关注更多的是 pid 和 ppid;

  • 对于 PGID 和 SID 接触的应该不多,简单解释一下 PGID 和 SID。

  • 当程序运行起来后,会产生一个主进程,并且分配一个进程 ID (PID),如果在运行期间,主进程又起了其他的进程,那么这个其他进程就是该主进程的子进程,同时会分配相应的进程 ID,并且设置其 PPID 的值为父进程的 PID

  • 而此时,父进程和其所有生成的子进程就会形成一个进程组,并且会被分配一个进程组 ID

  • 那什么又是会话 ID 呢?例如:当我们通过 ssh 连接远程服务器时,会获取到一个会话,同时会被分配一个会话 ID,而此时,由该会话发起的所有进程的会话 ID 都是一样的。(类似数据库一样,登录之后的所有行为,都被记录在同一张表中,如果要查询该会话所有记录,只需要select * form table_name where PGID = xxxx 即可查询该会话中的所有进程记录

  • 由上所述,如果挖矿程序有调用子进程,那么一定要以进程组为单位全部杀掉 。

  • 守护进程

    • 恶意文件为了保证自身的稳定持续运行,通常都会为程序设置一个守护进程。而杀掉守护进程和杀掉普通进程并没有什么区别,直接一起杀掉就可以。
  • 线程查杀

    • 在 Linux 中,线程的概念,其实就是轻量级的进程
    • 一些恶意程序将恶意代码做到了线程级别,也就是说,恶意程序宛若寄生虫一般附在了现有生产环境中的正常生产进程中,做成了一个线程;
    • 以目前的技术手段来说,直接查杀一个正常业务进程中的线程风险很大;有很大的概率会把正常的业务进程搞崩。
    • 如果真的遇到了线程级别的恶意程序,查杀之前一定需要和业主客户沟通确认并明确风险之后在进行操作。
    • 杀线程的方法和杀进程一样:
ps -T -p pid
ps -aLF pid

# 根据pid查看由进程起的线程

其中 SPID 就是线程 ID,而 CMD 栏,则显示了线程名称。

# 除了ps命令之外,还有其他命令也可查看线程
top -H -p pid
# -H选项可以显示线程

htop
# 默认未安装,可以较为全面的展示线程
#Debian/Kali可使用 sudo apt-get install htop安装

pstree -agplU
# 推荐,以树形结构展示进程和线程之间的关系

ps -eLFa
# 查看全部的线程

6.删除恶意文件

  • 通过上述操作,我们已经定位到了文件具体位置并且杀掉了恶意程序,接下来就是删除恶意文件,当然在删除过程可能中会遇到一些阻力,常见的分为以下几种:
  • 文件占用:
# 使用sudo rm -rf path/to/file 删除失败,提示进程被占用,可以使用以下方法排查:

lsof eval.sh
# 如果存在进程占用,那么占用进程极大概率也是恶意程序,按照上述操作步骤进行查看排查。

a和i属性导致文件不可删除
# a属性-文件只能增加内容,不能修改之前的文件,不能删除文件
# i属性-文件内容不能改变,文件不能删除

# 解决办法-可以使用以下命令
chattr -a
chattr -i

# 具体可以参考https://www.cnblogs.com/kzang/articles/2673790.html

具体可以参考linux 文件属性与权限 - kzangv - 博客园

  • 奇奇怪怪的名字导致无法删除:
    从 Windos 向 Linux 传输的文件或者攻击者恶意制作的文件,会存在文件名乱码的情况,无法直接通过乱码的文件名进行删除,可以使用 inode 来确定文件名,之后删除
  • a、b 解决办法
    • 查看 inode 值:ls -li eval.sh
john@john:~/temp$ ls -li evil.sh 
12327526 -rw-r--r-- 1 john john 0 3月 7 10:21 evil.sh
john@john:~/temp$
  • 删除文件
# 以inode值查找删除。(以上图12327526为例子)
find ./* -inum 12327526 -delete
find ./ -inum 12327526 -exec rm{} \;
find ./ -inum 12327526 -exec rm -i {} \;
# 会提示确认是否删除

find ./ -inum 12327526 -exec rm -f {} \;
# 不会进行确认,直接强制删除

find ./ -inum 12327526 | xargs rm -f
rm ‘find ./* -inum 12327526’
  • 具体可参考:

linux连个文件都删除不了,什么鬼! - 烟雨星空 - 博客园

linux下利用inode删除指定文件文件 - 天生帅才 - 博客园

  • 目录挂载导致无法删除以及相关解决办法

有些时候,当目录中没有文件,但是依然无法删除的时候,会显示 Device or resource busy
但是使用 lsof 进行查看,又发现并没有资源占用,此时需要考虑可能目录存在挂载点导致。

此时需要先将挂载取消,之后再删除该目录

sudo lsblk -a

# 查看挂载情况,结果示例👇——————👇

  • 注意:/dev/sdb1 是演示机终端的情况,真实情况需要根据实际的情况进行更改,不可直接无脑复制该命令卸载。
  • 解决办法👇—————👇
sudo umount /dev/sdb1

# 注意:/dev/sdb1是演示主机终端的情况,需要按照实际情况进行更改
# 执行完毕之后,再次使用sudo lsblk -a查看挂载情况。挂载点消失之后执行

sudo rm -rf mount_point/ # 文件名是以上图为例,真实情况需要根据实际情况来写文件名

  • 经过上述一套组合拳,基本可以解决 99%的难以删除的恶意文件。
  • 若在删除过程中发现了 rm 命令无响应,可能是命令被污染;
  • 解决办法:查看 /.bashrc 和/.zshrc 中是否被写入了 命令别名,使用 vim 打开配置文件,搜索/alias rm= 查找是否存在别名命令。
  • 若未发现自定义命令,可直接复制整个纯净 linux 系统/usr/bin/rm & /usr/bin/chmod 目录覆盖问题主机同目录文件。

7.安全事件应急善后处理工作

  • 经过上述全部的流程,已经完成了一次挖矿事件的处置。接下来就是事件善后处理、检查工作。
  • 善后处理包括检查此主机是否有其他类型的被攻击痕迹,同网络下其他主机是否有被攻击的痕迹等;
  • 将所有采集到的文件样本、进程、线程信息的截图留存,出具完整的应急事件响应报告。

整个安全事件善后处理工作包含的方面很多,将会单独写一篇安全事件善后处理工作细则出来,当我们应急响应工作完成之后,可根据《安全事件应急善后处理工作》继续进行全面、细致的检查。