jdpro/jd_clean_muma.py
2026-02-28 17:50:43 +08:00

128 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# !/usr/bin/env python3
# -*- coding: utf-8 -*-
#最近由于很多中木马病毒,仅对该木马做检测清除
'''
new Env('病毒检测清除');
8 8 29 2 * jd_clean_muma.py
'''
import os
import shutil
import subprocess
import sys
def get_malicious_pids(process_name):
try:
result = subprocess.run(['pgrep', '-f', process_name], capture_output=True, text=True)
if result.returncode == 0:
return result.stdout.strip().split('\n')
except Exception:
pass
return []
def clean_config_file(config_file_path):
if not os.path.exists(config_file_path):
return False
# 备份原始文件
backup_file_path = f"{config_file_path}.bak"
try:
shutil.copyfile(config_file_path, backup_file_path)
except Exception as e:
print(f"警告:备份文件失败: {e}")
try:
with open(config_file_path, 'r', encoding='utf-8', errors='ignore') as f:
lines = f.readlines()
except Exception as e:
print(f"错误:读取文件 {config_file_path} 失败: {e}")
return False
malicious_keywords = [
".fullgc",
"551911.xyz",
"fullgc-linux",
"fullgc-macos",
"QL_DIR:-/ql}/data/db",
"chmod",
"curl",
"{",
"}",
"nohup \"$b\" >/dev/null 2>&1 &"
]
new_lines = []
removed_count = 0
for line in lines:
is_malicious = False
for keyword in malicious_keywords:
if keyword in line:
is_malicious = True
break
if is_malicious:
removed_count += 1
print(f"发现并移除恶意行: {line.strip()}")
else:
new_lines.append(line)
if removed_count > 0:
try:
temp_file_path = f"{config_file_path}.tmp"
with open(temp_file_path, 'w', encoding='utf-8') as f:
f.writelines(new_lines)
shutil.move(temp_file_path, config_file_path)
print(f"成功从 {config_file_path} 中清除 {removed_count} 行恶意代码。")
return True
except Exception as e:
print(f"错误:写入或替换文件 {config_file_path} 失败: {e}")
return False
if __name__ == "__main__":
MALICIOUS_PROCESS_NAME = ".fullgc"
MALICIOUS_FILE = "/ql/data/db/.fullgc"
print(f"--- 开始木马检测 [{MALICIOUS_PROCESS_NAME}] ---")
pids = get_malicious_pids(MALICIOUS_PROCESS_NAME)
if not pids:
print(f"未发现名为 '{MALICIOUS_PROCESS_NAME}' 的木马进程。请注意安全,不要开到公网访问,不要弱密码!!!")
sys.exit(0)
print(f"‼️警告:发现 {len(pids)} 个木马进程PID 列表: {', '.join(pids)}")
print(f"正在强制终止这些进程...")
try:
subprocess.run(['pkill', '-9', '-f', MALICIOUS_PROCESS_NAME], capture_output=True)
print(f"✅已成功终止所有木马进程。")
except Exception as e:
print(f"终止进程时发生错误: {e}")
if os.path.exists(MALICIOUS_FILE):
print(f"‼️发现恶意文件 '{MALICIOUS_FILE}',正在删除...")
try:
os.remove(MALICIOUS_FILE)
print(f"✅恶意文件 '{MALICIOUS_FILE}' 已删除。")
except Exception as e:
print(f"警告:无法删除恶意文件: {e}")
print(f"正在清理配置文件中的持久化代码...")
config_paths = ["/ql/data/config/config.sh", "/ql/config/config.sh"]
for path in config_paths:
if os.path.exists(path):
clean_config_file(path)
print("正在扫描 /ql/data/db/ 目录下的其他可疑隐藏文件...")
if os.path.exists("/ql/data/db/"):
found_suspicious = False
for root, _, files in os.walk("/ql/data/db/"):
for file in files:
if file.startswith('.') and not file.endswith('.db'):
file_path = os.path.join(root, file)
if os.access(file_path, os.X_OK):
print(f"警告:发现可疑隐藏执行文件: {file_path}")
found_suspicious = True
if not found_suspicious:
print("未发现其他可疑隐藏文件。")
print("--- 木马清理过程全部完成 ---")
print("🚫🚫面板不要开到公网上访问,等待漏洞修复,以免再次中招!!!修改登录密码,不要弱密码")