Linux应急响应手册-5

0x00 简介

持续性的挖矿、远控后门等可以通过直接排查发现,但是在实际工作中,很多恶意行为(访问恶意域名、连接恶意IP)只集中出现了几次,无法直接通过网络连接找到恶意进程及文件或者有些恶意程序处置结束后,无法确定是否已经清理完整
可以通过短时间/长时间网络监控来解决

0x01 确定目标域名或IP

如果目标域名或者IP是某一知名组织的,可以将该组织或者种类病毒的域名和IP都收集进行监控

0x02 修改域名解析记录

  • 修改恶意域名的解析记录目的主要有两个:

    • 阻断控制,防止二次伤害
    • 得到固定的IP解析记录,防止攻击者把域名下架或者改变解析到的IP
  • 修改域名解析记录有两个途径:

    • 在内网DNS服务器中集中修改(如果内网有DNS服务器)
    • 修改 hosts 文件 (推荐)
  • 以恶意域名 du.testjj.com 为例

    • 通过修改 /etc/hostsdu.testjj.com 解析IP修改为 123.123.123.123

0x03 设置监控程序

很多客户不允许在服务器上安装监控程序,但是对于可审计的脚本倒是可以在审计后执行,因此这里主要以脚本为主

  • Linux_Audit_Nop.sh

    #!/bin/bash
    while true
    do
    sleep 0.1
    pids=$(netstat -pantu | grep 123.123.123.123 | awk -F "/" '{print $1}' | awk -F " " '{print $NF}' | sort | uniq)
    for one_pid in $pids
    do
    if [ $one_pid == "-" ]; then
    continue
    fi

    echo "" >> $(pwd)/Audit_results.txt
    echo "[ lsof -p $one_pid ]" >> $(pwd)/Audit_results.txt
    lsof -p $one_pid >> $(pwd)/Audit_results.txt
    echo "" >> $(pwd)/Audit_results.txt
    echo "[ cat /proc/$one_pid/maps ]" >> $(pwd)/Audit_results.txt
    cat /proc/$one_pid/maps >> $(pwd)/Audit_results.txt
    echo "" >> $(pwd)/Audit_results.txt
    echo "[ ls -al /proc/$one_pid/exe ]" >> $(pwd)/Audit_results.txt
    ls -al /proc/$one_pid/exe >> $(pwd)/Audit_results.txt
    done
    if [ -f "$(pwd)/Audit_results.txt" ]; then
    echo "Found it !"
    exit
    fi
    done
  • 除了上述脚本以外,再推荐两款比较优秀的程序

    • sysmon for linux
    • auditd

sysmon for linux 原本是微软为 Windows 开发的监控程序,21年的时候做了 Linux 开源版
https://github.com/Sysinternals/SysmonForLinux
https://github.com/OpenSecureCo/Demos/blob/main/sysmonforlinux
auditd 集成在 Ubuntu 的软件库中,可以直接安装
https://linux.die.net/man/8/auditd

0x04 等待恶意程序执行

0x05 确定程序运行时间

  • 查看程序运行时间

    • ps -w -eo pid,lstart,etime,cmd | grep <pid>

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

  • 与找到的恶意文件创建时间进行对比

    • stat xxx.sh

    • ls -al xxx.sh

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

0x06 处理异常进程

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
# 查看全部的线程

0x07 删除恶意文件

通过进程pid以及/proc/ ,我们已经定位到了文件的具体位置,接下来就是删除恶意文件
当然在删除过程可能中会遇到一些阻力,常见的分为以下几种:

  • 文件占用:
# 使用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/ # 文件名是以上图为例,真实情况需要根据实际情况来写文件名

这样就成功删除了!

0x08 善后阶段

直接查看善后阶段即可

0x09 常规安全检查阶段

直接根据常规安全检查章节进行安全检查即可,目的是找出当前系统中存在的隐藏后门等