1414 NTDSHashes ,
1515)
1616from impacket .nmb import NetBIOSError , NetBIOSTimeout
17- from impacket .dcerpc .v5 import transport , lsat , lsad , scmr
17+ from impacket .dcerpc .v5 import transport , lsat , lsad , scmr , rrp
1818from impacket .dcerpc .v5 .rpcrt import DCERPCException
1919from impacket .dcerpc .v5 .transport import DCERPCTransportFactory , SMBTransport
2020from impacket .dcerpc .v5 .rpcrt import RPC_C_AUTHN_GSS_NEGOTIATE
@@ -273,7 +273,7 @@ def enum_host_info(self):
273273 self .conn .logoff ()
274274 except Exception as e :
275275 self .logger .debug (f"Error logging off system: { e } " )
276-
276+
277277 # DCOM connection with kerberos needed
278278 self .remoteName = self .host if not self .kerberos else f"{ self .hostname } .{ self .domain } "
279279
@@ -572,6 +572,9 @@ def check_if_admin(self):
572572 self .admin_privs = True
573573 except scmr .DCERPCException :
574574 self .admin_privs = False
575+ except Exception as e :
576+ self .logger .fail (f"Error checking if user is admin on { self .host } : { e } " )
577+ self .admin_privs = False
575578
576579 def gen_relay_list (self ):
577580 if self .server_os .lower ().find ("windows" ) != - 1 and self .signing is False :
@@ -707,11 +710,11 @@ def execute(self, payload=None, get_output=False, methods=None):
707710 except UnicodeDecodeError :
708711 self .logger .debug ("Decoding error detected, consider running chcp.com at the target, map the result with https://docs.python.org/3/library/codecs.html#standard-encodings" )
709712 output = output .decode ("cp437" )
710-
713+
711714 self .logger .debug (f"Raw Output: { output } " )
712715 output = "\n " .join ([ll .rstrip () for ll in output .splitlines () if ll .strip ()])
713716 self .logger .debug (f"Cleaned Output: { output } " )
714-
717+
715718 if "This script contains malicious content" in output :
716719 self .logger .fail ("Command execution blocked by AMSI" )
717720 return None
@@ -732,24 +735,24 @@ def ps_execute(self, payload=None, get_output=False, methods=None, force_ps32=Fa
732735 if not payload :
733736 self .logger .error ("No command to execute specified!" )
734737 return None
735-
738+
736739 response = []
737740 obfs = obfs if obfs else self .args .obfs
738741 encode = encode if encode else not self .args .no_encode
739742 force_ps32 = force_ps32 if force_ps32 else self .args .force_ps32
740743 get_output = True if not self .args .no_output else get_output
741-
744+
742745 self .logger .debug (f"Starting ps_execute(): { payload = } { get_output = } { methods = } { force_ps32 = } { obfs = } { encode = } " )
743746 amsi_bypass = self .args .amsi_bypass [0 ] if self .args .amsi_bypass else None
744747 self .logger .debug (f"AMSI Bypass: { amsi_bypass } " )
745-
748+
746749 if os .path .isfile (payload ):
747750 self .logger .debug (f"File payload set: { payload } " )
748751 with open (payload ) as commands :
749752 response = [self .execute (create_ps_command (c .strip (), force_ps32 = force_ps32 , obfs = obfs , custom_amsi = amsi_bypass , encode = encode ), get_output , methods ) for c in commands ]
750753 else :
751754 response = [self .execute (create_ps_command (payload , force_ps32 = force_ps32 , obfs = obfs , custom_amsi = amsi_bypass , encode = encode ), get_output , methods )]
752-
755+
753756 self .logger .debug (f"ps_execute response: { response } " )
754757 return response
755758
@@ -834,6 +837,74 @@ def shares(self):
834837 self .logger .highlight (f"{ name :<15} { ',' .join (perms ):<15} { remark } " )
835838 return permissions
836839
840+ def interfaces (self ):
841+ """
842+ Retrieve the list of network interfaces info (Name, IP Address, Subnet Mask, Default Gateway) from remote Windows registry'
843+ Made by: @Sant0rryu, @NeffIsBack
844+ """
845+ try :
846+ remoteOps = RemoteOperations (self .conn , False )
847+ remoteOps .enableRegistry ()
848+
849+ if remoteOps ._RemoteOperations__rrp :
850+ reg_handle = rrp .hOpenLocalMachine (remoteOps ._RemoteOperations__rrp )["phKey" ]
851+ key_handle = rrp .hBaseRegOpenKey (remoteOps ._RemoteOperations__rrp , reg_handle , "SYSTEM\\ CurrentControlSet\\ Services\\ Tcpip\\ Parameters\\ Interfaces" )["phkResult" ]
852+ sub_key_list = rrp .hBaseRegQueryInfoKey (remoteOps ._RemoteOperations__rrp , key_handle )["lpcSubKeys" ]
853+ sub_keys = [rrp .hBaseRegEnumKey (remoteOps ._RemoteOperations__rrp , key_handle , i )["lpNameOut" ][:- 1 ] for i in range (sub_key_list )]
854+
855+ self .logger .highlight (f"{ '-Name-' :<11} | { '-IP Address-' :<15} | { '-SubnetMask-' :<15} | { '-Gateway-' :<15} | -DHCP-" )
856+ for sub_key in sub_keys :
857+ interface = {}
858+ try :
859+ interface_key = f"SYSTEM\\ CurrentControlSet\\ Services\\ Tcpip\\ Parameters\\ Interfaces\\ { sub_key } "
860+ interface_handle = rrp .hBaseRegOpenKey (remoteOps ._RemoteOperations__rrp , reg_handle , interface_key )["phkResult" ]
861+
862+ # Retrieve Interace Name
863+ interface_name_key = f"SYSTEM\\ ControlSet001\\ Control\\ Network\\ {{4D36E972-E325-11CE-BFC1-08002BE10318}}\\ { sub_key } \\ Connection"
864+ interface_name_handle = rrp .hBaseRegOpenKey (remoteOps ._RemoteOperations__rrp , reg_handle , interface_name_key )["phkResult" ]
865+ interface_name = rrp .hBaseRegQueryValue (remoteOps ._RemoteOperations__rrp , interface_name_handle , "Name" )[1 ].rstrip ("\x00 " )
866+ interface ["Name" ] = str (interface_name )
867+ if "Kernel" in interface_name :
868+ continue
869+
870+ # Retrieve DHCP
871+ try :
872+ dhcp_enabled = rrp .hBaseRegQueryValue (remoteOps ._RemoteOperations__rrp , interface_handle , "EnableDHCP" )[1 ]
873+ except DCERPCException :
874+ dhcp_enabled = False
875+ interface ["DHCP" ] = bool (dhcp_enabled )
876+
877+ # Retrieve IPAddress
878+ try :
879+ ip_address = rrp .hBaseRegQueryValue (remoteOps ._RemoteOperations__rrp , interface_handle , "DhcpIPAddress" if dhcp_enabled else "IPAddress" )[1 ].rstrip ("\x00 " ).replace ("\x00 " , ", " )
880+ except DCERPCException :
881+ ip_address = None
882+ interface ["IPAddress" ] = ip_address if ip_address else None
883+
884+ # Retrieve SubnetMask
885+ try :
886+ subnetmask = rrp .hBaseRegQueryValue (remoteOps ._RemoteOperations__rrp , interface_handle , "SubnetMask" )[1 ].rstrip ("\x00 " ).replace ("\x00 " , ", " )
887+ except DCERPCException :
888+ subnetmask = None
889+ interface ["SubnetMask" ] = subnetmask if subnetmask else None
890+
891+ # Retrieve DefaultGateway
892+ try :
893+ default_gateway = rrp .hBaseRegQueryValue (remoteOps ._RemoteOperations__rrp , interface_handle , "DhcpDefaultGateway" )[1 ].rstrip ("\x00 " ).replace ("\x00 " , ", " )
894+ except DCERPCException :
895+ default_gateway = None
896+ interface ["DefaultGateway" ] = default_gateway if default_gateway else None
897+
898+ self .logger .highlight (f"{ interface ['Name' ]:<11} | { interface ['IPAddress' ]!s:<15} | { interface ['SubnetMask' ]!s:<15} | { interface ['DefaultGateway' ]!s:<15} | { interface ['DHCP' ]} " )
899+
900+ except DCERPCException as e :
901+ self .logger .info (f"Failed to retrieve the network interface info for { sub_key } : { e !s} " )
902+
903+ with contextlib .suppress (Exception ):
904+ remoteOps .finish ()
905+ except DCERPCException as e :
906+ self .logger .error (f"Failed to connect to the target: { e !s} " )
907+
837908 def get_dc_ips (self ):
838909 dc_ips = [dc [1 ] for dc in self .db .get_domain_controllers (domain = self .domain )]
839910 if not dc_ips :
@@ -1302,7 +1373,7 @@ def put_file_single(self, src, dst):
13021373 self .logger .success (f"Created file { src } on \\ \\ { self .args .share } \\ { dst } " )
13031374 except Exception as e :
13041375 self .logger .fail (f"Error writing file to share { self .args .share } : { e } " )
1305-
1376+
13061377 def put_file (self ):
13071378 for src , dest in self .args .put_file :
13081379 self .put_file_single (src , dest )
@@ -1325,7 +1396,6 @@ def get_file(self):
13251396 for src , dest in self .args .get_file :
13261397 self .get_file_single (src , dest )
13271398
1328-
13291399 def enable_remoteops (self ):
13301400 try :
13311401 self .remote_ops = RemoteOperations (self .conn , self .kerberos , self .kdcHost )
@@ -1408,7 +1478,7 @@ def sccm(self):
14081478 except Exception as e :
14091479 self .logger .debug (f"Could not upgrade connection: { e } " )
14101480 return
1411-
1481+
14121482 try :
14131483 self .logger .display ("Collecting Machine masterkeys, grab a coffee and be patient..." )
14141484 masterkeys_triage = MasterkeysTriage (
@@ -1423,7 +1493,7 @@ def sccm(self):
14231493 if len (masterkeys ) == 0 :
14241494 self .logger .fail ("No masterkeys looted" )
14251495 return
1426-
1496+
14271497 self .logger .success (f"Got { highlight (len (masterkeys ))} decrypted masterkeys. Looting SCCM Credentials through { self .args .sccm } " )
14281498 try :
14291499 # Collect Chrome Based Browser stored secrets
@@ -1613,7 +1683,6 @@ def dpapi(self):
16131683 "Google Refresh Token" ,
16141684 )
16151685
1616-
16171686 if dump_cookies and cookies :
16181687 self .logger .display ("Start Dumping Cookies" )
16191688 for cookie in cookies :
@@ -1801,4 +1870,4 @@ def add_ntds_hash(ntds_hash, host_id):
18011870 NTDS .finish ()
18021871
18031872 def mark_guest (self ):
1804- return highlight (f"{ highlight ('(Guest)' )} " if self .is_guest else "" )
1873+ return highlight (f"{ highlight ('(Guest)' )} " if self .is_guest else "" )
0 commit comments