11import os
22import docker
33import yaml
4+ import time
45from src .thirdparty import triageutils as triageutils
56from src .thirdparty .AESCipher import AESCipher
67from src .thirdparty .ParseEVTX import ParseEVTX
@@ -97,6 +98,9 @@ def __init__(self, conf: dict):
9798 self .recyclebin_dir = Path (os .path .join (self .generaptor_dir , "RecycleBin" ))
9899 triageutils .create_directory_path (path = self .recyclebin_dir , logger = self .logger )
99100
101+ self .psreadline_dir = Path (os .path .join (self .generaptor_dir , "PSReadLine" ))
102+ triageutils .create_directory_path (path = self .psreadline_dir , logger = self .logger )
103+
100104 self .log_dirs = (
101105 dict ()
102106 ) # for filebeat volumes: ex {apache: "/home/user/.../elk/apache"}
@@ -689,11 +693,17 @@ def generaptor_parse_evtx(self, logger: Logger):
689693
690694 # send analytics info
691695 if self .is_logstash_active :
692- _analytics = triageutils .get_file_informations (filepath = _f )
693- _analytics ["numberOfLogRecords" ] = _res .get ("nb_events_read" , 0 )
694- _analytics ["numberOfEventSent" ] = _res .get ("nb_events_sent" , 0 )
695- _analytics ["hostname" ] = self .hostname
696- _analytics ["logfilename" ] = _res .get ("file" , "" )
696+ _file_infos = triageutils .get_file_informations (filepath = _f )
697+ _analytics = triageutils .generate_analytics (logger = self .logger )
698+ _analytics ["log" ]["file" ]["eventcount" ] = _res .get ("nb_events_read" , 0 )
699+ _analytics ["log" ]["file" ]["eventsent" ] = _res .get ("nb_events_sent" , 0 )
700+ _analytics ["log" ]["file" ]["path" ] = str (_f )
701+ _analytics ["log" ]["file" ]["size" ] = _file_infos .get ("fileSize" , 0 )
702+ _analytics ["log" ]["file" ]["lastaccessed" ] = _file_infos .get ("lastAccessTime" , 0 )
703+ _analytics ["log" ]["file" ]["creation" ] = _file_infos .get ("creationTime" , 0 )
704+ _analytics ["csirt" ]["client" ] = self .clientname
705+ _analytics ["csirt" ]["hostname" ] = self .hostname
706+ _analytics ["csirt" ]["application" ] = "generaptor_parse_evtx"
697707 triageutils .send_data_to_elk (
698708 data = _analytics ,
699709 ip = _ip ,
@@ -843,6 +853,28 @@ def generaptor_parse_recyclebin(self, logger: Logger):
843853 except Exception as ex :
844854 self .error (f"[generaptor_parse_recyclebin] { ex } " )
845855
856+ @triageutils .LOG
857+ def generaptor_get_consolehost_history (self , logger : Logger ):
858+ try :
859+ for _f in triageutils .search_files_generator (
860+ src = self .zip_destination ,
861+ pattern = "ConsoleHost_history.txt" ,
862+ patterninpath = "PSReadLine" ,
863+ strict = True ,
864+ ):
865+ self .info (f"[generaptor_get_consolehost_history] Parse: { _f } " )
866+ try :
867+ _username = _f .parts [_f .parts .index ('Users' )+ 1 ]
868+ except Exception as errorname :
869+ self .error (f"{ errorname } " )
870+ _username = time .time ()
871+ _dst = self .psreadline_dir / Path (f"{ _username } " )
872+ triageutils .copy_file (src = _f , dst = _dst , overwrite = True , logger = self .logger )
873+ except Exception as ex :
874+ self .error (f"[generaptor_get_consolehost_history] { str (ex )} " )
875+ raise ex
876+
877+
846878 @triageutils .LOG
847879 def run (self , logger : Logger ):
848880 """Fonction principale qui exécute tout le triage de generaptor
@@ -891,7 +923,7 @@ def run(self, logger: Logger):
891923 except Exception as copy_err :
892924 self .error (f"[RUN] { copy_err } " )
893925 pass
894- if self .config ["run" ]["generaptor" ][ "evtx" ] :
926+ if self .config ["run" ]["generaptor" ]. get ( "evtx" , False ) :
895927 self .info ("[generaptor] Run EVTX" )
896928 if self .config ["run" ]["generaptor" ]["winlogbeat" ]:
897929 evtx_logs = self .get_evtx (
@@ -903,57 +935,63 @@ def run(self, logger: Logger):
903935 )
904936 else :
905937 self .generaptor_parse_evtx (logger = self .logger )
906- if self .config ["run" ]["generaptor" ][ "registry" ] :
938+ if self .config ["run" ]["generaptor" ]. get ( "registry" , False ) :
907939 self .info ("[generaptor] Run Registry" )
908940 try :
909941 self .generaptor_parse_registry (logger = self .logger )
910942 except Exception as err_reg :
911943 self .error (f"[generaptor ERROR] { str (err_reg )} " )
912- if self .config ["run" ]["generaptor" ][ "mft" ] :
944+ if self .config ["run" ]["generaptor" ]. get ( "mft" , False ) :
913945 self .info ("[generaptor] Run MFT" )
914946 try :
915947 self .generaptor_parse_mft (logger = self .logger )
916948 except Exception as err_reg :
917949 self .error (f"[generaptor ERROR] { str (err_reg )} " )
918- if self .config ["run" ]["generaptor" ][ "usnjrnl" ] :
950+ if self .config ["run" ]["generaptor" ]. get ( "usnjrnl" , False ) :
919951 self .info ("[generaptor] Run UsnJrnl" )
920952 try :
921953 self .generaptor_parse_usnjrnl (logger = self .logger )
922954 except Exception as err_reg :
923955 self .error (f"[generaptor ERROR] { str (err_reg )} " )
924- if self .config ["run" ]["generaptor" ][ "prefetch" ] :
956+ if self .config ["run" ]["generaptor" ]. get ( "prefetch" , False ) :
925957 self .info ("[generaptor] Run Prefetch" )
926958 try :
927959 self .generaptor_parse_prefetch (logger = self .logger )
928960 except Exception as err_reg :
929961 self .error (f"[generaptor ERROR] { str (err_reg )} " )
930- if self .config ["run" ]["generaptor" ][ "mplog" ] :
962+ if self .config ["run" ]["generaptor" ]. get ( "mplog" , False ) :
931963 self .info ("[generaptor] Run MPLog" )
932964 try :
933965 self .generaptor_parse_mplog (logger = self .logger )
934966 except Exception as err_reg :
935967 self .error (f"[generaptor ERROR] { str (err_reg )} " )
936- if self .config ["run" ]["generaptor" ][ "activitiescache" ] :
968+ if self .config ["run" ]["generaptor" ]. get ( "activitiescache" , False ) :
937969 self .info ("[generaptor] Run ActivitiesCache" )
938970 try :
939971 self .generaptor_parse_activitiescache (logger = self .logger )
940972 except Exception as err_reg :
941973 self .error (f"[generaptor ERROR] { str (err_reg )} " )
942- if self .config ["run" ]["generaptor" ][ "recyclebin" ] :
974+ if self .config ["run" ]["generaptor" ]. get ( "recyclebin" , False ) :
943975 self .info ("[generaptor] Run Recycle Bin" )
944976 try :
945977 self .generaptor_parse_recyclebin (logger = self .logger )
946978 except Exception as err_reg :
947979 self .error (f"[generaptor ERROR] { str (err_reg )} " )
948- if self .config ["run" ]["generaptor" ]["iis" ]:
980+ if self .config ["run" ]["generaptor" ].get ("psreadline" , False ):
981+ self .info ("[generaptor] Run PSReadline" )
982+ try :
983+ self .generaptor_get_consolehost_history (logger = self .logger )
984+ except Exception as err_reg :
985+ self .error (f"[generaptor ERROR] { str (err_reg )} " )
986+ if self .config ["run" ]["generaptor" ].get ("iis" , False ):
949987 self .info ("[generaptor] Run IIS" )
950988 try :
951989 res = self .get_iis_logs (logger = self .logger )
952990 except Exception as err_reg :
953991 self .error (f"[generaptor ERROR] { str (err_reg )} " )
954992 if self .is_logstash_active :
955993 self .send_iis_logs (iis_logs = res , logger = self .logger )
956- if self .config ["run" ]["generaptor" ][ "timeline" ] :
994+ if self .config ["run" ]["generaptor" ]. get ( "timeline" , False ) :
957995 self .info ("[generaptor] Run PLASO" )
958996 self .check_docker_image (
959997 image_name = self .docker_images ["plaso" ]["image" ],
0 commit comments