@ -103,48 +103,16 @@ def evtxdetect_auto():
try :
try :
#print(Security_path)
#print(Security_path)
# 创建一个多进程对象, 用于并行分析用户配置文件( UserProfile) 相关的日志
userprofile = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( UserProfile_path_list , EvtxDetection . detect_events_UserProfileService_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core ) )
# target参数指定了新进程要执行的函数, args参数传递了执行该函数所需的参数
#创建多线程分析windows日志, 其中参数包括用户配置文件的路径列表、一个检测事件的函数、时区信息、时间范围、以及一系列用于分析的选项( 如对象访问、进程执行、登录、频率分析等) 。
userprofile = multiprocessing . Process (
target = EvtxDetection . multiprocess , # 要在新进程中执行的函数
args = ( # 传递给函数的参数列表
UserProfile_path_list , # 用户配置文件路径的列表
EvtxDetection . detect_events_UserProfileService_log , # 检测事件的函数
input_timezone , # 输入时区信息
timestart , # 分析开始时间
timeend , # 分析结束时间
objectaccess , # 是否分析对象访问事件
processexec , # 是否分析进程执行事件
logons , # 是否分析登录事件
frequencyanalysis , # 是否进行频率分析
allreport , # 是否生成全部报告
Output , # 输出路径或相关配置
CPU_Core # 使用的CPU核心数
)
) #创建多线程分析windows日志, 其中参数包括用户配置文件的路径列表、一个检测事件的函数、时区信息、时间范围、以及一系列用于分析的选项( 如对象访问、进程执行、登录、频率分析等) 。
# 启动新进程, 开始执行multiprocess函数
userprofile . start ( )
userprofile . start ( )
# 将新创建的进程对象添加到process_list列表中, 以便后续管理或跟踪
process_list . append ( userprofile )
process_list . append ( userprofile )
# 如果在try块中发生了IOError异常( 如文件不存在) , 则执行以下代码
except IOError :
except IOError :
# 打印错误信息,指出分析用户配置文件日志时出错,文件路径不存在
print ( " Error Analyzing User Profile logs: " , end = ' ' )
print ( " Error Analyzing User Profile logs: " , end = ' ' )
print ( " File Path Does Not Exist " )
print ( " File Path Does Not Exist " )
# 如果在try块中发生了除IOError之外的其他异常, 则执行以下代码
except Exception as e :
except Exception as e :
# 打印错误信息,指出分析用户配置文件日志时出错
print ( " Error Analyzing User Profile logs " )
print ( " Error Analyzing User Profile logs " )
# 使用logging模块记录异常的详细信息, 包括堆栈跟踪
# traceback.format_exc()会返回一个包含异常堆栈跟踪信息的字符串
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析安全日志
try :
try :
#print(Security_path)
#print(Security_path)
sec = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( Security_path_list , EvtxDetection . detect_events_security_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
sec = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( Security_path_list , EvtxDetection . detect_events_security_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
@ -156,8 +124,6 @@ def evtxdetect_auto():
except Exception as e :
except Exception as e :
print ( " Error Analyzing Security logs " )
print ( " Error Analyzing Security logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析系统日志
try :
try :
#EvtxDetection.multiprocess(system_path_list,EvtxDetection.detect_events_system_log,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(system_path_list,EvtxDetection.detect_events_system_log,input_timezone,timestart,timeend)
sys = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( system_path_list , EvtxDetection . detect_events_system_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
sys = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( system_path_list , EvtxDetection . detect_events_system_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
@ -169,8 +135,6 @@ def evtxdetect_auto():
except Exception as e :
except Exception as e :
print ( " Error Analyzing System logs " )
print ( " Error Analyzing System logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析PowerShell操作日志
try :
try :
#EvtxDetection.multiprocess(powershellop_path_list,EvtxDetection.detect_events_powershell_operational_log,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(powershellop_path_list,EvtxDetection.detect_events_powershell_operational_log,input_timezone,timestart,timeend)
pwshop = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( powershellop_path_list , EvtxDetection . detect_events_powershell_operational_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
pwshop = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( powershellop_path_list , EvtxDetection . detect_events_powershell_operational_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
@ -182,8 +146,6 @@ def evtxdetect_auto():
except Exception as e :
except Exception as e :
print ( " Error Analyzing Powershell Operational logs " )
print ( " Error Analyzing Powershell Operational logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析PowerShell日志
try :
try :
#EvtxDetection.multiprocess(powershell_path_list,EvtxDetection.detect_events_powershell_log,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(powershell_path_list,EvtxDetection.detect_events_powershell_log,input_timezone,timestart,timeend)
pwsh = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( powershell_path_list , EvtxDetection . detect_events_powershell_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
pwsh = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( powershell_path_list , EvtxDetection . detect_events_powershell_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
@ -195,8 +157,6 @@ def evtxdetect_auto():
except Exception as e :
except Exception as e :
print ( " Error Analyzing Powershell logs " )
print ( " Error Analyzing Powershell logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析Terminal Services LocalSessionManager日志
try :
try :
#EvtxDetection.multiprocess(terminal_path_list,EvtxDetection.detect_events_TerminalServices_LocalSessionManager_log,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(terminal_path_list,EvtxDetection.detect_events_TerminalServices_LocalSessionManager_log,input_timezone,timestart,timeend)
terminal = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( terminal_path_list , EvtxDetection . detect_events_TerminalServices_LocalSessionManager_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
terminal = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( terminal_path_list , EvtxDetection . detect_events_TerminalServices_LocalSessionManager_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
@ -208,8 +168,6 @@ def evtxdetect_auto():
except Exception as e :
except Exception as e :
print ( " Error Analyzing TerminalServices LocalSessionManager logs " )
print ( " Error Analyzing TerminalServices LocalSessionManager logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析Terminal Services RDP Client( 远程桌面协议客户端) 的日志
try :
try :
#EvtxDetection.multiprocess(terminal_path_list,EvtxDetection.detect_events_TerminalServices_LocalSessionManager_log,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(terminal_path_list,EvtxDetection.detect_events_TerminalServices_LocalSessionManager_log,input_timezone,timestart,timeend)
terminal_client = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( terminal_Client_path_list , EvtxDetection . detect_events_TerminalServices_RDPClient_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
terminal_client = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( terminal_Client_path_list , EvtxDetection . detect_events_TerminalServices_RDPClient_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
@ -222,7 +180,6 @@ def evtxdetect_auto():
print ( " Error Analyzing TerminalServices RDP Client logs " )
print ( " Error Analyzing TerminalServices RDP Client logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析计划任务( Scheduled Task) 的日志
try :
try :
#EvtxDetection.multiprocess(scheduledtask_path_list,EvtxDetection.detect_events_scheduled_task_log,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(scheduledtask_path_list,EvtxDetection.detect_events_scheduled_task_log,input_timezone,timestart,timeend)
scheduled = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( scheduledtask_path_list , EvtxDetection . detect_events_scheduled_task_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
scheduled = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( scheduledtask_path_list , EvtxDetection . detect_events_scheduled_task_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
@ -235,26 +192,24 @@ def evtxdetect_auto():
print ( " Error Analyzing Scheduled Task logs " )
print ( " Error Analyzing Scheduled Task logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析Windows Defender的日志
try :
try :
#EvtxDetection.multiprocess(defender_path_list,EvtxDetection.detect_events_windows_defender_log,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(defender_path_list,EvtxDetection.detect_events_windows_defender_log,input_timezone,timestart,timeend)
defen = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( defender_path_list , EvtxDetection . detect_events_windows_defender_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
defen = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( defender_path_list , EvtxDetection . detect_events_windows_defender_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
defen . start ( )
defen . start ( )
process_list . append ( defen )
process_list . append ( defen )
except IOError :
except IOError :
print ( " Error Analyzing Windows Defender logs : " , end = ' ' )
print ( " Error Analyzing Windows Defender logs : " , end = ' ' )
print ( " File Path Does Not Exist " )
print ( " File Path Does Not Exist " )
except Exception as e :
except Exception as e :
print ( " Error Analyzing Windows Defender logs " )
print ( " Error Analyzing Windows Defender logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析Windows远程管理( WinRM) 的日志
try :
try :
#EvtxDetection.multiprocess(winrm_path_list,EvtxDetection.detect_events_Microsoft_Windows_WinRM,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(winrm_path_list,EvtxDetection.detect_events_Microsoft_Windows_WinRM,input_timezone,timestart,timeend)
winrm = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( winrm_path_list , EvtxDetection . detect_events_Microsoft_Windows_WinRM , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
winrm = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( winrm_path_list , EvtxDetection . detect_events_Microsoft_Windows_WinRM , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
winrm . start ( )
winrm . start ( )
process_list . append ( winrm )
process_list . append ( winrm )
except IOError :
except IOError :
print ( " Error Analyzing WinRM logs : " , end = ' ' )
print ( " Error Analyzing WinRM logs : " , end = ' ' )
print ( " File Path Does Not Exist " )
print ( " File Path Does Not Exist " )
@ -262,12 +217,12 @@ def evtxdetect_auto():
print ( " Error Analyzing WinRM logs " )
print ( " Error Analyzing WinRM logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析Sysmon( 系统监控器) 的日志
try :
try :
#EvtxDetection.multiprocess(sysmon_path_list,EvtxDetection.detect_events_Sysmon_log,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(sysmon_path_list,EvtxDetection.detect_events_Sysmon_log,input_timezone,timestart,timeend)
sysmon = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( sysmon_path_list , EvtxDetection . detect_events_Sysmon_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
sysmon = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( sysmon_path_list , EvtxDetection . detect_events_Sysmon_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
sysmon . start ( )
sysmon . start ( )
process_list . append ( sysmon )
process_list . append ( sysmon )
except IOError :
except IOError :
print ( " Error Analyzing Sysmon logs " )
print ( " Error Analyzing Sysmon logs " )
print ( " File Path Does Not Exist " )
print ( " File Path Does Not Exist " )
@ -275,12 +230,12 @@ def evtxdetect_auto():
print ( " Error Analyzing Sysmon logs " )
print ( " Error Analyzing Sysmon logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析组策略( Group Policy) 日志
try :
try :
#EvtxDetection.multiprocess(group_policy_path_list,EvtxDetection.detect_events_group_policy_log,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(group_policy_path_list,EvtxDetection.detect_events_group_policy_log,input_timezone,timestart,timeend)
gp = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( group_policy_path_list , EvtxDetection . detect_events_group_policy_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
gp = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( group_policy_path_list , EvtxDetection . detect_events_group_policy_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
gp . start ( )
gp . start ( )
process_list . append ( gp )
process_list . append ( gp )
except IOError :
except IOError :
print ( " Error Analyzing Group Policy logs " )
print ( " Error Analyzing Group Policy logs " )
print ( " File Path Does Not Exist " )
print ( " File Path Does Not Exist " )
@ -288,12 +243,12 @@ def evtxdetect_auto():
# print("Error Analyzing Group Policy logs ")
# print("Error Analyzing Group Policy logs ")
# logging.error(traceback.format_exc())
# logging.error(traceback.format_exc())
#类似上一个try块, 用于并行分析SMB( Server Message Block) 服务器日志
try :
try :
#EvtxDetection.multiprocess(SMB_SERVER_path_list,EvtxDetection.detect_events_SMB_Server_log,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(SMB_SERVER_path_list,EvtxDetection.detect_events_SMB_Server_log,input_timezone,timestart,timeend)
smbserv = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( SMB_SERVER_path_list , EvtxDetection . detect_events_SMB_Server_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
smbserv = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( SMB_SERVER_path_list , EvtxDetection . detect_events_SMB_Server_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
smbserv . start ( )
smbserv . start ( )
process_list . append ( smbserv )
process_list . append ( smbserv )
except IOError :
except IOError :
print ( " Error Analyzing SMB Server logs " )
print ( " Error Analyzing SMB Server logs " )
print ( " File Path Does Not Exist " )
print ( " File Path Does Not Exist " )
@ -301,12 +256,12 @@ def evtxdetect_auto():
print ( " Error Analyzing Group Policy logs " )
print ( " Error Analyzing Group Policy logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#类似上一个try块, 用于并行分析SMB客户端日志
try :
try :
#EvtxDetection.multiprocess(SMB_CLIENT_path_list,EvtxDetection.detect_events_SMB_Client_log,input_timezone,timestart,timeend)
#EvtxDetection.multiprocess(SMB_CLIENT_path_list,EvtxDetection.detect_events_SMB_Client_log,input_timezone,timestart,timeend)
smbcli = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( SMB_CLIENT_path_list , EvtxDetection . detect_events_SMB_Client_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
smbcli = multiprocessing . Process ( target = EvtxDetection . multiprocess , args = ( SMB_CLIENT_path_list , EvtxDetection . detect_events_SMB_Client_log , input_timezone , timestart , timeend , objectaccess , processexec , logons , frequencyanalysis , allreport , Output , CPU_Core , temp_dir ) )
smbcli . start ( )
smbcli . start ( )
process_list . append ( smbcli )
process_list . append ( smbcli )
except IOError :
except IOError :
print ( " Error Analyzing SMB Client logs " )
print ( " Error Analyzing SMB Client logs " )
print ( " File Path Does Not Exist " )
print ( " File Path Does Not Exist " )
@ -314,7 +269,6 @@ def evtxdetect_auto():
print ( " Error Analyzing Group Policy logs " )
print ( " Error Analyzing Group Policy logs " )
logging . error ( traceback . format_exc ( ) )
logging . error ( traceback . format_exc ( ) )
#使用了process.join()来等待所有子进程完成
for process in process_list :
for process in process_list :
process . join ( )
process . join ( )
print ( " preparing results " )
print ( " preparing results " )
@ -352,72 +306,43 @@ def evtxdetect_auto():
Frequency_Analysis_Sysmon = EvtxDetection . Frequency_Analysis_Sysmon
Frequency_Analysis_Sysmon = EvtxDetection . Frequency_Analysis_Sysmon
Frequency_Analysis_SMB_Server = EvtxDetection . Frequency_Analysis_SMB_Server
Frequency_Analysis_SMB_Server = EvtxDetection . Frequency_Analysis_SMB_Server
Frequency_Analysis_TerminalServices = EvtxDetection . Frequency_Analysis_TerminalServices
Frequency_Analysis_TerminalServices = EvtxDetection . Frequency_Analysis_TerminalServices
# 检查临时目录下是否存在名为"_User_SIDs_report.csv"的文件
if os . path . exists ( temp_dir + " _User_SIDs_report.csv " ) :
if os . path . exists ( temp_dir + " _User_SIDs_report.csv " ) :
# 如果文件存在, 则读取该文件到pandas DataFrame中, 但随后将DataFrame转换为字典格式, 其中键是列名, 值是对应列的数据列表
# 注意: 原注释掉的代码是直接将CSV文件读取为DataFrame, 而当前代码是读取后转换为字典
#User_SIDs = pd.DataFrame(pd.read_csv(temp_dir + "_User_SIDs_report.csv"))
#User_SIDs = pd.DataFrame(pd.read_csv(temp_dir + "_User_SIDs_report.csv"))
User_SIDs = pd . DataFrame ( pd . read_csv ( temp_dir + " _User_SIDs_report.csv " ) ) . to_dict ( orient = ' list ' )
User_SIDs = pd . DataFrame ( pd . read_csv ( temp_dir + " _User_SIDs_report.csv " ) ) . to_dict ( orient = ' list ' )
else :
else :
# 如果文件不存在,则打印一条消息说明文件不存在
# 注意: 这里的f-string用于格式化字符串, 将变量temp_dir的值插入到字符串中
print ( f " { temp_dir + ' _User_SIDs_report.csv ' } does not exist. " )
print ( f " { temp_dir + ' _User_SIDs_report.csv ' } does not exist. " )
#User_SIDs = pd.DataFrame(User_SIDs)
#User_SIDs = pd.DataFrame(User_SIDs)
#User_SIDs=EvtxDetection.User_SIDs
#User_SIDs=EvtxDetection.User_SIDs
resolveSID ( )
resolveSID ( )
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————我是分割线———————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
def auto_detect ( path ) :
def auto_detect ( path ) :
global input_timezone
global input_timezone
# 编译正则表达式用于匹配EventID, Channel, 和 Computer 标签的内容
EventID_rex = re . compile ( ' <EventID.*>(.*)< \ /EventID> ' , re . IGNORECASE )
EventID_rex = re . compile ( ' <EventID.*>(.*)< \ /EventID> ' , re . IGNORECASE )
Channel_rex = re . compile ( ' <Channel.*>(.*)< \ /Channel> ' , re . IGNORECASE )
Channel_rex = re . compile ( ' <Channel.*>(.*)< \ /Channel> ' , re . IGNORECASE )
Computer_rex = re . compile ( ' <Computer.*>(.*)< \ /Computer> ' , re . IGNORECASE )
Computer_rex = re . compile ( ' <Computer.*>(.*)< \ /Computer> ' , re . IGNORECASE )
# 检查提供的路径是目录还是文件
if os . path . isdir ( path ) :
if os . path . isdir ( path ) :
# 如果是目录, 使用libPath函数递归查找所有EVTX文件
files = list ( libPath ( path ) . rglob ( " *.[eE][vV][tT][xX] " ) )
files = list ( libPath ( path ) . rglob ( " *.[eE][vV][tT][xX] " ) )
#files=glob.glob(path+"/**/"+"*.evtx")
#files=glob.glob(path+"/**/"+"*.evtx")
elif os . path . isfile ( path ) :
elif os . path . isfile ( path ) :
# 如果是文件,直接匹配该文件的路径
files = glob . glob ( path )
files = glob . glob ( path )
else :
else :
# 如果路径既不是目录也不是文件,则打印错误消息并返回
print ( " Issue with the path " )
print ( " Issue with the path " )
return
return
#print("hunting ( %s ) in files ( %s )"%(str_regex,files))
#print("hunting ( %s ) in files ( %s )"%(str_regex,files))
#user_string = input('please enter a string to convert to regex: ')
#user_string = input('please enter a string to convert to regex: ')
# 遍历找到的文件
for file in files :
for file in files :
file = str ( file )
file = str ( file )
print ( " Analyzing " + file )
print ( " Analyzing " + file )
try :
try :
# 尝试使用PyEvtxParser解析文件
parser = PyEvtxParser ( file )
parser = PyEvtxParser ( file )
except :
except :
# 如果解析文件时出错(例如文件损坏),则打印错误消息并继续下一个文件
print ( " Issue analyzing " + file + " \n please check if its not corrupted " )
print ( " Issue analyzing " + file + " \n please check if its not corrupted " )
continue
continue
try :
try :
# 遍历解析器中的事件记录
for record in parser . records ( ) :
for record in parser . records ( ) :
# 使用正则表达式查找记录数据中的通道信息
Channel = Channel_rex . findall ( record [ ' data ' ] )
Channel = Channel_rex . findall ( record [ ' data ' ] )
# 检查Channel列表是否非空, 并获取第一个元素( 通道名) , 然后去除前后的空白字符
# 根据通道名将文件路径添加到相应的列表中
# 注意: 由于使用了break语句, 每个文件只会被添加到第一个匹配的列表中
if Channel [ 0 ] . strip ( ) == " Security " :
if Channel [ 0 ] . strip ( ) == " Security " :
Security_path_list . append ( file )
Security_path_list . append ( file )
break
break
@ -465,20 +390,8 @@ def auto_detect(path):
break
break
except :
except :
# 捕获异常并打印错误消息
print ( " issue assigning path " )
print ( " issue assigning path " )
evtxdetect_auto ( )
evtxdetect_auto ( )
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————我是分割线———————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
def threat_hunt ( path , str_regex , eid , hunt_file ) :
def threat_hunt ( path , str_regex , eid , hunt_file ) :
global timestart , timeend , input_timezone , Output
global timestart , timeend , input_timezone , Output
import os
import os
@ -487,17 +400,15 @@ def threat_hunt(path,str_regex,eid,hunt_file):
if 1 == 1 :
if 1 == 1 :
if hunt_file is not None :
if hunt_file is not None :
if os . path . isfile ( hunt_file ) :
if os . path . isfile ( hunt_file ) :
print ( regex_file ) # 这行打印一个空列表,可能是调试用的,可以移除
print ( regex_file )
regex_file = open ( hunt_file ) . read ( ) . split ( " \n " )
regex_file = open ( hunt_file ) . read ( ) . split ( " \n " )
regex_file . remove ( ' ' ) # 读取文件并去除空行和首尾空白
regex_file . remove ( ' ' )
print ( regex_file )
print ( regex_file )
else :
else :
print ( " Issue with the hunt file path " )
print ( " Issue with the hunt file path " )
return
return
# 使用os.path.isdir和os.path.isfile检查路径
if os . path . isdir ( path ) :
if os . path . isdir ( path ) :
files = list ( libPath ( path ) . rglob ( " *.[eE][vV][tT][xX] " ) ) # 确保libPath返回的是一个可以调用rglob的对象
files = list ( libPath ( path ) . rglob ( " *.[eE][vV][tT][xX] " ) )
elif os . path . isfile ( path ) :
elif os . path . isfile ( path ) :
files = glob . glob ( path )
files = glob . glob ( path )
@ -505,29 +416,16 @@ def threat_hunt(path,str_regex,eid,hunt_file):
print ( " Issue with the path " )
print ( " Issue with the path " )
return
return
# 确定要使用的正则表达式列表
#user_string = input('please enter a string to convert to regex: ')
#user_string = input('please enter a string to convert to regex: ')
if str_regex is not None :
if str_regex is not None :
regex = [ str_regex ]
regex = [ str_regex ]
elif str_regex is None and len ( regex_file ) > 0 : # 如果str_regex为None且regex_file为空, 可能需要处理这种情况
elif str_regex is None and len ( regex_file ) > 0 :
regex = regex_file
regex = regex_file
print ( " hunting ( %s ) in files ( %s ) " % ( regex , files ) )
print ( " hunting ( %s ) in files ( %s ) " % ( regex , files ) )
EvtxHunt . Evtx_hunt ( files , regex , eid , input_timezone , Output , timestart , timeend )
EvtxHunt . Evtx_hunt ( files , regex , eid , input_timezone , Output , timestart , timeend )
#except Exception as e:
#except Exception as e:
# print("Error in hunting module ")
# print("Error in hunting module ")
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————我是分割线———————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
def report ( ) :
def report ( ) :
# 定义输出文件的名称
global Output , User_SIDs
global Output , User_SIDs
timesketch = Output + " _TimeSketch.csv "
timesketch = Output + " _TimeSketch.csv "
Report = Output + " _Report.xlsx "
Report = Output + " _Report.xlsx "
@ -536,32 +434,26 @@ def report():
ProcessEvents = Output + " _Process_Execution_Events.csv "
ProcessEvents = Output + " _Process_Execution_Events.csv "
Collected_SIDs = Output + " _Collected_SIDs.csv "
Collected_SIDs = Output + " _Collected_SIDs.csv "
print ( " preparing report " )
print ( " preparing report " )
# 读取用户SID报告
if os . path . exists ( temp_dir + " _User_SIDs_report.csv " ) :
if os . path . exists ( temp_dir + " _User_SIDs_report.csv " ) :
User_SIDs = pd . DataFrame ( pd . read_csv ( temp_dir + " _User_SIDs_report.csv " ) )
User_SIDs = pd . DataFrame ( pd . read_csv ( temp_dir + " _User_SIDs_report.csv " ) )
else :
else :
print ( f " { temp_dir + ' _User_SIDs_report.csv ' } does not exist. " )
print ( f " { temp_dir + ' _User_SIDs_report.csv ' } does not exist. " )
User_SIDs = pd . DataFrame ( User_SIDs )
User_SIDs = pd . DataFrame ( User_SIDs )
# 读取Sysmon报告
if os . path . exists ( temp_dir + " _Sysmon_report.csv " ) :
if os . path . exists ( temp_dir + " _Sysmon_report.csv " ) :
Sysmon = pd . DataFrame ( pd . read_csv ( temp_dir + " _Sysmon_report.csv " ) )
Sysmon = pd . DataFrame ( pd . read_csv ( temp_dir + " _Sysmon_report.csv " ) )
else :
else :
print ( f " { temp_dir + ' _Sysmon_report.csv ' } does not exist. " )
print ( f " { temp_dir + ' _Sysmon_report.csv ' } does not exist. " )
Sysmon = pd . DataFrame ( Sysmon_events [ 0 ] )
Sysmon = pd . DataFrame ( Sysmon_events [ 0 ] )
# 读取系统报告
if os . path . exists ( temp_dir + " _System_report.csv " ) :
if os . path . exists ( temp_dir + " _System_report.csv " ) :
System = pd . DataFrame ( pd . read_csv ( temp_dir + " _System_report.csv " ) )
System = pd . DataFrame ( pd . read_csv ( temp_dir + " _System_report.csv " ) )
else :
else :
print ( f " { temp_dir + ' _System_report.csv ' } does not exist. " )
print ( f " { temp_dir + ' _System_report.csv ' } does not exist. " )
System = pd . DataFrame ( System_events [ 0 ] )
System = pd . DataFrame ( System_events [ 0 ] )
# 读取Powershell报告
if os . path . exists ( temp_dir + " _Powershell_report.csv " ) :
if os . path . exists ( temp_dir + " _Powershell_report.csv " ) :
Powershell = pd . DataFrame ( pd . read_csv ( temp_dir + " _Powershell_report.csv " ) )
Powershell = pd . DataFrame ( pd . read_csv ( temp_dir + " _Powershell_report.csv " ) )
else :
else :
print ( f " { temp_dir + ' _Powershell_report.csv ' } does not exist. " )
print ( f " { temp_dir + ' _Powershell_report.csv ' } does not exist. " )
Powershell = pd . DataFrame ( Powershell_events [ 0 ] )
Powershell = pd . DataFrame ( Powershell_events [ 0 ] )
# 以下连续的if-else代码块均实现类似功能, 读取某指定报告
if os . path . exists ( temp_dir + " _Powershell_Operational_report.csv " ) :
if os . path . exists ( temp_dir + " _Powershell_Operational_report.csv " ) :
Powershell_Operational = pd . DataFrame ( pd . read_csv ( temp_dir + " _Powershell_Operational_report.csv " ) )
Powershell_Operational = pd . DataFrame ( pd . read_csv ( temp_dir + " _Powershell_Operational_report.csv " ) )
else :
else :
@ -697,47 +589,33 @@ def report():
#Object_Access_Events_pd=pd.DataFrame(Object_Access_Events[0])
#Object_Access_Events_pd=pd.DataFrame(Object_Access_Events[0])
#ExecutedProcess_Events_pd=pd.DataFrame(Executed_Process_Events[0])
#ExecutedProcess_Events_pd=pd.DataFrame(Executed_Process_Events[0])
# allresults=pd.DataFrame([TerminalServices,Powershell_Operational],columns=['Date and Time', 'Detection Rule','Detection Domain','Severity','Event Description','Event ID','Original Event Log'])
# allresults=pd.DataFrame([TerminalServices,Powershell_Operational],columns=['Date and Time', 'Detection Rule','Detection Domain','Severity','Event Description','Event ID','Original Event Log'])
# 将多个DataFrame( ScheduledTask, Powershell_Operational, Sysmon, 等) 合并为一个DataFrame, 使用内连接( inner join) , 并忽略原索引
allresults = pd . concat (
allresults = pd . concat (
[ ScheduledTask , Powershell_Operational , Sysmon , System , Powershell , Security , TerminalClient , TerminalServices , WinRM ,
[ ScheduledTask , Powershell_Operational , Sysmon , System , Powershell , Security , TerminalClient , TerminalServices , WinRM ,
Windows_Defender , GroupPolicy , SMBServer , SMBClient ] , join = " inner " , ignore_index = True )
Windows_Defender , GroupPolicy , SMBServer , SMBClient ] , join = " inner " , ignore_index = True )
# 重命名DataFrame中的两列, 将'Date and Time'改为'datetime', 'Detection Rule'改为'message'
allresults = allresults . rename ( columns = { ' Date and Time ' : ' datetime ' , ' Detection Rule ' : ' message ' } )
allresults = allresults . rename ( columns = { ' Date and Time ' : ' datetime ' , ' Detection Rule ' : ' message ' } )
# 在DataFrame中新增一个名为'timestamp_desc'的列,其初始值设为空字符串
allresults [ ' timestamp_desc ' ] = " "
allresults [ ' timestamp_desc ' ] = " "
# 重新排序DataFrame的列, 按照指定的顺序排列
allresults = allresults [
allresults = allresults [
[ ' message ' , ' timestamp ' , ' datetime ' , ' timestamp_desc ' , ' Detection Domain ' , ' Severity ' , ' Event Description ' , ' Event ID ' ,
[ ' message ' , ' timestamp ' , ' datetime ' , ' timestamp_desc ' , ' Detection Domain ' , ' Severity ' , ' Event Description ' , ' Event ID ' ,
' Original Event Log ' , ' Computer Name ' , ' Channel ' ] ]
' Original Event Log ' , ' Computer Name ' , ' Channel ' ] ]
# 计算'Severity'列中每个不同值的出现次数, 并将结果存储在新的DataFrame中, 重命名列为'Severity'和'Counts'
Result_Summary_Severity = allresults [ " Severity " ] . value_counts ( ) . reset_index ( )
Result_Summary_Severity = allresults [ " Severity " ] . value_counts ( ) . reset_index ( )
Result_Summary_Severity . columns = [ ' Severity ' , ' Counts ' ]
Result_Summary_Severity . columns = [ ' Severity ' , ' Counts ' ]
# 计算'message'列中每个不同值的出现次数, 并将结果存储在新的DataFrame中, 重命名列为'Detection'和'Counts'
Result_Summary_Detections = allresults [ " message " ] . value_counts ( ) . reset_index ( )
Result_Summary_Detections = allresults [ " message " ] . value_counts ( ) . reset_index ( )
Result_Summary_Detections . columns = [ ' Detection ' , ' Counts ' ]
Result_Summary_Detections . columns = [ ' Detection ' , ' Counts ' ]
# 将allresults DataFrame保存到CSV文件中, 文件名由timesketch变量指定, 不保存索引
allresults . to_csv ( timesketch , index = False )
allresults . to_csv ( timesketch , index = False )
# 将User_SIDs DataFrame保存到CSV文件中, 文件名由Collected_SIDs变量指定, 不保存索引
User_SIDs . to_csv ( Collected_SIDs , index = False )
User_SIDs . to_csv ( Collected_SIDs , index = False )
# 打印信息, 表明Time Sketch报告已保存, 文件名由timesketch变量指定
print ( " Time Sketch Report saved as " + timesketch )
print ( " Time Sketch Report saved as " + timesketch )
#Logon_Events_pd.to_csv(LogonEvents, index=False)
#Logon_Events_pd.to_csv(LogonEvents, index=False)
# 如果logons为True或者allreport为True, 则打印信息表明Logon事件报告已保存, 文件名由LogonEvents变量指定
if ( logons == True or allreport == True ) :
if ( logons == True or allreport == True ) :
print ( " Logon Events Report saved as " + LogonEvents )
print ( " Logon Events Report saved as " + LogonEvents )
#Object_Access_Events_pd.to_csv(ObjectAccess, index=False)
#Object_Access_Events_pd.to_csv(ObjectAccess, index=False)
# 如果objectaccess为True或者allreport为True, 则打印信息表明对象访问事件报告已保存, 文件名由ObjectAccess变量指定
if ( objectaccess == True or allreport == True ) :
if ( objectaccess == True or allreport == True ) :
print ( " Object Access Events Report saved as " + ObjectAccess )
print ( " Object Access Events Report saved as " + ObjectAccess )
#ExecutedProcess_Events_pd.to_csv(ProcessEvents, index=False)
#ExecutedProcess_Events_pd.to_csv(ProcessEvents, index=False)
# 如果processexec为True或者allreport为True, 则打印信息表明进程执行事件报告已保存, 文件名由ProcessEvents变量指定
if ( processexec == True or allreport == True ) :
if ( processexec == True or allreport == True ) :
print ( " Process Execution Events Report saved as " + ProcessEvents )
print ( " Process Execution Events Report saved as " + ProcessEvents )
# Sysmon=Sysmon.reset_index()
# Sysmon=Sysmon.reset_index()
# Sysmon=Sysmon.drop(['index'],axis=1)
# Sysmon=Sysmon.drop(['index'],axis=1)
#写表格
writer = pd . ExcelWriter ( Report , engine = ' xlsxwriter ' , engine_kwargs = { ' options ' : { ' encoding ' : ' utf-8 ' } } )
writer = pd . ExcelWriter ( Report , engine = ' xlsxwriter ' , engine_kwargs = { ' options ' : { ' encoding ' : ' utf-8 ' } } )
Result_Summary_Severity . to_excel ( writer , sheet_name = ' Result Summary ' , index = False )
Result_Summary_Severity . to_excel ( writer , sheet_name = ' Result Summary ' , index = False )
Result_Summary_Detections . to_excel ( writer , sheet_name = ' Result Summary ' , startrow = len ( Result_Summary_Severity ) + 3 , index = False )
Result_Summary_Detections . to_excel ( writer , sheet_name = ' Result Summary ' , startrow = len ( Result_Summary_Severity ) + 3 , index = False )
@ -800,65 +678,37 @@ def report():
print ( " Detection Summary : \n ############################################ \n Number of incidents by Severity: \n " + allresults [ " Severity " ] . value_counts ( ) . to_string ( ) + " \n ############################################ \n Number of incidents by Detection Rule: \n " + allresults [ " message " ] . value_counts ( ) . to_string ( ) + " \n \n " )
print ( " Detection Summary : \n ############################################ \n Number of incidents by Severity: \n " + allresults [ " Severity " ] . value_counts ( ) . to_string ( ) + " \n ############################################ \n Number of incidents by Detection Rule: \n " + allresults [ " message " ] . value_counts ( ) . to_string ( ) + " \n \n " )
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————我是分割线———————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
''' ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— '''
def convert_list ( ) :
def convert_list ( ) :
# 使用global关键字声明一系列全局变量
global timestart , timeend , User_SIDs , SMB_Server_events , SMB_Client_events , TerminalServices_RDPClient_events , Executed_Process_Events , Group_Policy_events , Object_Access_Events , input_timezone , Logon_Events , Executed_Process_Summary , TerminalServices_Summary , Security_Authentication_Summary , Sysmon_events , WinRM_events , Security_events , System_events , ScheduledTask_events , Powershell_events , Powershell_Operational_events , TerminalServices_events , Windows_Defender_events , Timesketch_events , TerminalServices_Summary , Security_Authentication_Summary , Executed_Powershell_Summary
global timestart , timeend , User_SIDs , SMB_Server_events , SMB_Client_events , TerminalServices_RDPClient_events , Executed_Process_Events , Group_Policy_events , Object_Access_Events , input_timezone , Logon_Events , Executed_Process_Summary , TerminalServices_Summary , Security_Authentication_Summary , Sysmon_events , WinRM_events , Security_events , System_events , ScheduledTask_events , Powershell_events , Powershell_Operational_events , TerminalServices_events , Windows_Defender_events , Timesketch_events , TerminalServices_Summary , Security_Authentication_Summary , Executed_Powershell_Summary
# 创建一个名为Results的列表, 其中包含了多个全局变量
Results = [ Executed_Powershell_Summary , SMB_Server_events , User_SIDs , SMB_Client_events , TerminalServices_RDPClient_events , Executed_Process_Events , Group_Policy_events , Object_Access_Events , Logon_Events , Executed_Process_Summary , TerminalServices_Summary , Security_Authentication_Summary , Sysmon_events , WinRM_events , Security_events , System_events , ScheduledTask_events , Powershell_events , Powershell_Operational_events , TerminalServices_events , Windows_Defender_events , TerminalServices_Summary , Security_Authentication_Summary
Results = [ Executed_Powershell_Summary , SMB_Server_events , User_SIDs , SMB_Client_events , TerminalServices_RDPClient_events , Executed_Process_Events , Group_Policy_events , Object_Access_Events , Logon_Events , Executed_Process_Summary , TerminalServices_Summary , Security_Authentication_Summary , Sysmon_events , WinRM_events , Security_events , System_events , ScheduledTask_events , Powershell_events , Powershell_Operational_events , TerminalServices_events , Windows_Defender_events , TerminalServices_Summary , Security_Authentication_Summary
]
]
# 遍历Results列表中的每个元素
for result in Results :
for result in Results :
# 将result[0]的元素中的每个值转换为列表
for i in result [ 0 ] :
for i in result [ 0 ] :
result [ 0 ] [ i ] = list ( result [ 0 ] [ i ] )
result [ 0 ] [ i ] = list ( result [ 0 ] [ i ] )
def resolveSID ( ) :
def resolveSID ( ) :
global TerminalServices_RDPClient_events , WinRM_events , User_SIDs , RDPClient_Resolved_User , WinRM_Resolved_User
global TerminalServices_RDPClient_events , WinRM_events , User_SIDs , RDPClient_Resolved_User , WinRM_Resolved_User
# 检查名为_WinRM_events_report.csv的文件是否存在于指定的临时目录( temp_dir) 中
if os . path . exists ( temp_dir + " _WinRM_events_report.csv " ) :
if os . path . exists ( temp_dir + " _WinRM_events_report.csv " ) :
# 如果文件存在, 读取CSV文件内容到DataFrame, 然后将DataFrame转换为字典( 列表形式) , 并赋值给WinRM_events[0]
WinRM_events [ 0 ] = pd . DataFrame ( pd . read_csv ( temp_dir + " _WinRM_events_report.csv " ) ) . to_dict ( orient = ' list ' )
WinRM_events [ 0 ] = pd . DataFrame ( pd . read_csv ( temp_dir + " _WinRM_events_report.csv " ) ) . to_dict ( orient = ' list ' )
# 检查名为_TerminalServices_RDPClient_report.csv的文件是否存在于指定的临时目录( temp_dir) 中
if os . path . exists ( temp_dir + " _TerminalServices_RDPClient_report.csv " ) :
if os . path . exists ( temp_dir + " _TerminalServices_RDPClient_report.csv " ) :
# 如果文件存在, 读取CSV文件内容到DataFrame, 然后将DataFrame转换为字典( 列表形式) , 并赋值给TerminalServices_RDPClient_events[0]
TerminalServices_RDPClient_events [ 0 ] = pd . DataFrame ( pd . read_csv ( temp_dir + " _TerminalServices_RDPClient_report.csv " ) ) . to_dict ( orient = ' list ' )
TerminalServices_RDPClient_events [ 0 ] = pd . DataFrame ( pd . read_csv ( temp_dir + " _TerminalServices_RDPClient_report.csv " ) ) . to_dict ( orient = ' list ' )
# 初始化RDPClient_Resolved_User列表, 用于存储解析后的用户信息
RDPClient_Resolved_User = [ ]
RDPClient_Resolved_User = [ ]
# 初始化WinRM_Resolved_User列表, 用于存储解析后的用户信息
WinRM_Resolved_User = [ ]
WinRM_Resolved_User = [ ]
# 遍历TerminalServices_RDPClient_events[0]字典中"UserID"键对应的值( SID列表)
for SID in TerminalServices_RDPClient_events [ 0 ] [ " UserID " ] :
for SID in TerminalServices_RDPClient_events [ 0 ] [ " UserID " ] :
# 检查当前SID是否存在于User_SIDs字典的"SID"键对应的值中
if SID in User_SIDs [ " SID " ] :
if SID in User_SIDs [ " SID " ] :
# 如果存在, 找到对应的用户名称, 并添加到RDPClient_Resolved_User列表中
RDPClient_Resolved_User . append ( User_SIDs [ " User " ] [ User_SIDs [ " SID " ] . index ( SID ) ] )
RDPClient_Resolved_User . append ( User_SIDs [ " User " ] [ User_SIDs [ " SID " ] . index ( SID ) ] )
else :
else :
# 如果不存在,将"Could not be resolved"添加到RDPClient_Resolved_User列表中
RDPClient_Resolved_User . append ( " Could not be resolved " )
RDPClient_Resolved_User . append ( " Could not be resolved " )
# 遍历WinRM_events[0]字典中"UserID"键对应的值( SID列表)
for SID in WinRM_events [ 0 ] [ " UserID " ] :
for SID in WinRM_events [ 0 ] [ " UserID " ] :
# 检查当前SID是否存在于User_SIDs字典的"SID"键对应的值中
if SID in User_SIDs [ " SID " ] :
if SID in User_SIDs [ " SID " ] :
# 如果存在, 找到对应的用户名称, 并添加到WinRM_Resolved_User列表中
WinRM_Resolved_User . append ( User_SIDs [ " User " ] [ User_SIDs [ " SID " ] . index ( SID ) ] )
WinRM_Resolved_User . append ( User_SIDs [ " User " ] [ User_SIDs [ " SID " ] . index ( SID ) ] )
else :
else :
# 如果不存在,将"Could not be resolved"添加到WinRM_Resolved_User列表中
WinRM_Resolved_User . append ( " Could not be resolved " )
WinRM_Resolved_User . append ( " Could not be resolved " )
#print("user sid"+str(User_SIDs["SID"]))
#print("user sid"+str(User_SIDs["SID"]))
#print("RDPCLient : "+str(RDPClient_Resolved_User))
#print("RDPCLient : "+str(RDPClient_Resolved_User))
#print("WinRM : " + str(WinRM_Resolved_User))
#print("WinRM : " + str(WinRM_Resolved_User))
#创建临时路径
def create_temp_dir ( ) :
def create_temp_dir ( ) :
global temp_dir
global temp_dir
@ -870,7 +720,6 @@ def create_temp_dir():
else :
else :
print ( f " { temp_dir } already exists " )
print ( f " { temp_dir } already exists " )
#创建输出路径
def create_out_dir ( output ) :
def create_out_dir ( output ) :
global temp_dir
global temp_dir
@ -885,7 +734,6 @@ def create_out_dir(output):
return output + " / " + output
return output + " / " + output
#清除临时路径
def clean_temp_dir ( ) :
def clean_temp_dir ( ) :
global temp_dir
global temp_dir
if os . path . exists ( temp_dir ) :
if os . path . exists ( temp_dir ) :
@ -896,13 +744,10 @@ def clean_temp_dir():
os . rmdir ( os . path . join ( root , name ) )
os . rmdir ( os . path . join ( root , name ) )
os . rmdir ( temp_dir )
os . rmdir ( temp_dir )
def main ( ) :
def main ( ) :
# 记录程序开始执行的时间
tic = time . time ( )
tic = time . time ( )
print ( Banner )
print ( Banner )
global CPU_Core , timestart , timeend , Output , objectaccess , Path , processexec , logons , frequencyanalysis , Security_path , system_path , scheduledtask_path , defender_path , powershell_path , powershellop_path , terminal_path , winrm_path , sysmon_path , input_timezone , objectaccess , processexec , logons , frequencyanalysis , allreport
global CPU_Core , timestart , timeend , Output , objectaccess , Path , processexec , logons , frequencyanalysis , Security_path , system_path , scheduledtask_path , defender_path , powershell_path , powershellop_path , terminal_path , winrm_path , sysmon_path , input_timezone , objectaccess , processexec , logons , frequencyanalysis , allreport
# 创建命令行参数解析器
parser = argparse . ArgumentParser ( )
parser = argparse . ArgumentParser ( )
parser . add_argument ( " -p " , " --path " , help = " path to folder containing windows event logs , APT-Hunter will detect each log type automatically " )
parser . add_argument ( " -p " , " --path " , help = " path to folder containing windows event logs , APT-Hunter will detect each log type automatically " )
parser . add_argument ( " -o " , " --out " , help = " output file name " )
parser . add_argument ( " -o " , " --out " , help = " output file name " )
@ -923,12 +768,10 @@ def main():
parser . add_argument ( " -rules " , " --rules " , help = " path to sigma rules in json format " )
parser . add_argument ( " -rules " , " --rules " , help = " path to sigma rules in json format " )
#parser.add_argument("-evtfreq","--evtfreq", help="Produce event ID frequency analysis report",action='store_true')
#parser.add_argument("-evtfreq","--evtfreq", help="Produce event ID frequency analysis report",action='store_true')
parser . add_argument ( " -cores " , " --cores " , help = " cpu cores to be used in multiprocessing , default is half the number of availble CPU cores " )
parser . add_argument ( " -cores " , " --cores " , help = " cpu cores to be used in multiprocessing , default is half the number of availble CPU cores " )
# 解析命令行参数
args = parser . parse_args ( )
args = parser . parse_args ( )
# 如果指定了输出文件名,则创建输出目录
if args . out is not None :
if args . out is not None :
Output = create_out_dir ( args . out )
Output = create_out_dir ( args . out )
# 如果没有指定日志路径,则打印错误信息并退出
if ( args . path is None ) : # and args.security is None and args.system is None and args.scheduledtask is None and args.defender is None and args.powershell is None and args.powershellop is None and args.terminal is None and args.winrm is None and args.sysmon is None):
if ( args . path is None ) : # and args.security is None and args.system is None and args.scheduledtask is None and args.defender is None and args.powershell is None and args.powershellop is None and args.terminal is None and args.winrm is None and args.sysmon is None):
print ( " You didn ' t specify a path for the logs \n use --help to print help message " )
print ( " You didn ' t specify a path for the logs \n use --help to print help message " )
exit ( )
exit ( )
@ -945,7 +788,6 @@ def main():
allreport = args . allreport
allreport = args . allreport
CPU_Core = 0
CPU_Core = 0
#print(f"all reports value : {allreport}\nlogons value {logons}")
#print(f"all reports value : {allreport}\nlogons value {logons}")
# 尝试解析开始和结束时间,如果格式不正确,则打印错误信息并退出
try :
try :
if args . start is not None and args . end is not None :
if args . start is not None and args . end is not None :
timestart = datetime . timestamp ( dateutil . parser . isoparse ( args . start ) )
timestart = datetime . timestamp ( dateutil . parser . isoparse ( args . start ) )
@ -953,20 +795,18 @@ def main():
except :
except :
print ( " Error parsing time , please use ISO format with timestart and timeend Ex: (2022-04-03T20:56+04:00 or 2022-04-03T20:56 or 2022-04-03 20:56 or 2022-04-03) " )
print ( " Error parsing time , please use ISO format with timestart and timeend Ex: (2022-04-03T20:56+04:00 or 2022-04-03T20:56 or 2022-04-03 20:56 or 2022-04-03) " )
exit ( )
exit ( )
# 根据命令行参数设置时区
if args . timezone is not None :
if args . timezone is not None :
if args . timezone . lower ( ) == " local " :
if args . timezone . lower ( ) == " local " :
input_timezone = tz . tzlocal ( )
input_timezone = tz . tzlocal ( )
else :
else :
input_timezone = timezone ( args . timezone )
input_timezone = timezone ( args . timezone )
# 根据命令行参数设置CPU核心数, 如果格式不正确, 则打印错误信息并退出
if args . cores is not None :
if args . cores is not None :
try :
try :
CPU_Core = int ( args . cores )
CPU_Core = int ( args . cores )
except :
except :
print ( f " Error using supplied CPU cores { args . cores } " )
print ( f " Error using supplied CPU cores { args . cores } " )
exit ( 0 )
exit ( 0 )
# 如果启用了Sigma模块, 则执行Sigma分析
if args . sigma is not False :
if args . sigma is not False :
if args . rules is not None :
if args . rules is not None :
SigmaHunter . Sigma_Analyze ( Path , args . rules , Output )
SigmaHunter . Sigma_Analyze ( Path , args . rules , Output )
@ -975,7 +815,6 @@ def main():
toc = time . time ( )
toc = time . time ( )
print ( ' Done in {:.4f} seconds ' . format ( toc - tic ) )
print ( ' Done in {:.4f} seconds ' . format ( toc - tic ) )
return
return
# 如果指定了搜索字符串或正则表达式,则执行威胁搜索
if args . hunt is not None :
if args . hunt is not None :
if args . eid is not None :
if args . eid is not None :
threat_hunt ( Path , args . hunt , args . eid , None )
threat_hunt ( Path , args . hunt , args . eid , None )
@ -984,7 +823,6 @@ def main():
toc = time . time ( )
toc = time . time ( )
print ( ' Done in {:.4f} seconds ' . format ( toc - tic ) )
print ( ' Done in {:.4f} seconds ' . format ( toc - tic ) )
return
return
# 如果启用了Office 365日志搜索, 则执行Office 365分析
if args . o365hunt is not False :
if args . o365hunt is not False :
if args . o365rules is not None :
if args . o365rules is not None :
O365Hunter . analyzeoff365 ( Path , args . o365rules , Output , input_timezone , args . o365raw )
O365Hunter . analyzeoff365 ( Path , args . o365rules , Output , input_timezone , args . o365raw )
@ -993,7 +831,6 @@ def main():
#toc = time.time()
#toc = time.time()
#print('Done in {:.4f} seconds'.format(toc-tic))
#print('Done in {:.4f} seconds'.format(toc-tic))
return
return
# 如果指定了搜索文件,则根据文件中的字符串或正则表达式执行威胁搜索
if args . hunt is None and args . huntfile is not None :
if args . hunt is None and args . huntfile is not None :
if args . eid is not None :
if args . eid is not None :
threat_hunt ( Path , None , args . eid , args . huntfile )
threat_hunt ( Path , None , args . eid , args . huntfile )
@ -1003,7 +840,7 @@ def main():
print ( ' Done in {:.4f} seconds ' . format ( toc - tic ) )
print ( ' Done in {:.4f} seconds ' . format ( toc - tic ) )
return
return
# 如果没有指定特定的搜索或分析类型,则自动检测日志类型并生成报告
#if args.type is None or args.type=="evtx":
#if args.type is None or args.type=="evtx":
try :
try :
create_temp_dir ( )
create_temp_dir ( )
@ -1016,7 +853,6 @@ def main():
clean_temp_dir ( )
clean_temp_dir ( )
toc = time . time ( )
toc = time . time ( )
# 打印程序执行完毕的时间
print ( ' Analysis finished in {:.4f} seconds ' . format ( toc - tic ) )
print ( ' Analysis finished in {:.4f} seconds ' . format ( toc - tic ) )
return
return