Linux应急响应手册-2

0x0-整体流程

0x2— 远控后门事件应急处置方法

1.事件告警来源

  • 木马远控后门事件通常会在 EDR 或者态势感知系统中获得相关告警信息。

1.1 通过 EDR 获取到告警事件

  • 通过 EDR 获取到的紧急事件,可以直接定位到恶意文件以及文件路径。
  • 通过文件寻找相关恶意进程。
  • 根据文件查找 pid:
    • lsof | grep evil.sh
    • lsof /root/evil.sh # 需要指定路径,只指定字符无法直接查询到相关信息
    • fuser /root/evil.sh # 该命令需要在 root 权限下执行,否则结果会为空,命令前加 sudo 也可能显示为空。

1.2 通过态势感知获取到告警事件

  • 通过态势感知获取到的紧急事件,是可以根据五元组进行详细查询的。
  • 根据态感报警信息,可得到外连 IP+端口
  • 根据目的 IP 和端口查找 pid
    • netstat -pantu | grep 11.11.11.11 # grep 后面要根据真实情况填写实际 IP 而非演示地址 11.11.11.11
    • netstat -pantu | grep 65535 # grep 后面要根据真实情况填写实际端口而非演示端口 65535
    • lsof -i:65535
  • 根据本机 IP 和端口查找 pid
    • netstat -pantu | grep 65535
    • lsof -i:65535

若根据五元组信息无法查询到相关 pid,可能是因为攻击者使用了隐藏 C&C 的技术,需要有针对性的进行排查,该方面涉及过多,具体排查方法将会单独写一份《C&C 隐藏技术的对抗》

2.查找进程相关信息

  • 查找进程相关的文件

    • lsof -p pid # 需要 root 权限下执行
    • pwdx pid
  • 根据 pid 获取程序的详细信息。

    • lsof -p pid
    • pwdx pid 获取该 pid 进程的启动时候的目录,并不一定是恶意文件所在的路径,只是启动恶意文件的路径(挖矿事件应急中已经提及过,暂将之称为触发路径)
    • systemctl status pid #获取该 pid 进程的 status 信息
    • cat /proc/pid/maps
    • ls /proc/pid/exe
  • 有些时候,无法通过 ps,top 等命令根据 pid 进行查询,可能是因为攻击者将 /proc/pid/ 进行了隐藏,具体的手段(猜测) 应该是通过以下方式实现的:

  • mkdir .hidden

  • mount -o bind .hidden /proc/PID

  • 此种情况可使用cat /proc/$$/mountinfo来查看挂载信息

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

    • ps H -T -p pid
    • ps -Lf pid

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

  • top -H -p pid # -H 选项可以显示线程
  • htop(默认未安装),该工具可以更直观的展示线程(类似 windows 的任务管理器)
  • pstree -agplU # 推荐,非常全面且详细的展示进程与线程之间的关系

3.确认恶意程序运行时间

  • 查看程序运行时间
    • ps -ef pid,lstart,etime,cmd | grep <pid> # 尖括号不用写

  • 上图的命令执行结果表示:pid 为1292的进程是在 2022年 4 月 28 日 13:32:20被创建的,已经运行了30分钟零2秒,具体的执行命令为/usr/sbin/sshd -D
  • 与找到的恶意文件创建时间做对比
    • stat xxx.sh

  • ls -la xxx.sh

alt text

这个部分更多是为了验证发现的文件是否为当前程序的恶意文件,增加这个对比,可能会发现一些之前没有发现的蛛丝马迹

3.处理异常进程

如果无子进程,直接使用 - kill -9 pid 这样会直接杀死指定进程,但是,由这个进程产生的子进程不会被杀死
如果进程起子进程,需要使用一下命令

  • kill -9 -pid 注意,这里pid前有个减号,表示杀掉这个进程组

需要注意的是, kill -9 -PGID 配合 sudo 使用时,需要将命令修改为以下格式

sudo kill -9 -- -PGID

也可以使用 pkill 来完成

sudo pkill -g PGID   # 进程组前没有横杠

进程组ID & 会话ID 平时我们关注的更多是PIDPPID,对于PGIDSID接触较少,简单介绍一下 使用 ps -w ajfx 可以看到具体的PPIDPIDPGIDSID 信息


程序运行起来后,会产生一个主线程,并且分配一个进程ID(pid),如果在运行期间起其他进程,那么这个其他进程就是子进程,同时分配相应的进程ID,并设置其PPID的值为父进程的pid 此时呢,父进程和所有生成的子进程会组合成一个进程组,并且分配一个进程组ID; 那什么叫做会话ID?,其实也很容易理解,我们通过ssh 链接到服务器,就会获取一个会话,分配一个会话ID,此时我们起的进程的会话ID都是一样的 所以,如果挖矿程序有调用子进程,那么就需要以进程组为单位杀死

  • 守护进程(daemon)

    挖矿病毒为了保障挖矿程序的运行,通常会为挖矿程序设置守护进程,杀死守护进程与杀死普通进程并无区别,更详细的内容已经总结到 Linux守护进程 | 应急响应 这篇文章

  • 线程查杀

    很多木马病毒将恶意代码执行做到了线程级别,也就是说附到了现有正常业务的进程中,做一个线程,目前无法单独查杀一个进程中的某个线程。

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

    • ps -w -T -p pid
    • ps -w -aLf pid

      其中SPID就是线程ID,而CMD栏则显示了线程名称
  • top -H -p pid -H 选项可以显示线程

    • htop (默认未安装),可以较为全面的展示线程
    • pstree -agplU 推荐,非常全面展示进程与线程间的关系
    • 可以在后面直接加 pid 的值,例如 pstree -agplU 709 ,查看指定 pid 的进程与线程的关系
  • 查看全部的线程

    • ps -w -eLFa

4.删除恶意文件

通过进程pid以及/proc/ ,我们已经发现了定位到了文件的具体位置,接下来就是删除恶意文件

  • 查看文件占用 lsof eval.sh 如果存在进程占用,那么占用进程也可能是恶意进程,需要按照之前的步骤进行查看

    • a 和 i 属性导致文件不可删除
    • a属性 文件只能增加内容,不能修改之前的文件,不能删除文件
    • i属性 内容不能改变,文件不能删除 可以使用 chattr -achattr -i
    • 具体可以参考 https://www.cnblogs.com/kzang/articles/2673790.html
  • 奇怪文件名导致文件不可删除 > 在windows向linux传输的文件或者攻击者恶意制造的文件,很多会有文件名乱码,无法直接通过乱码的文件名进行删除,可以使用inode来确定文件名,之后删除

    • 使用 inode 进行删除
    • 查看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$
  • 删除文件

    • 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

参考文章
https://www.cnblogs.com/starry-skys/p/12970463.html
https://www.cnblogs.com/tssc/p/7574432.html

  • 目录挂载导致无法删除

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

    此时需要先将挂载取消,之后再删除该文件夹

    sudo lsblk -a #查看挂载情况

    sudo umount /dev/sdb1 #取消挂载

    /dev/sdb1 是演示电脑的情况,需要按照实际情况更改

    这样就成功删除了

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

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

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

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