Skip to content

Commit 008c490

Browse files
committed
Reworked interface module to core functionality and fixed all its bugs
1 parent 9d3bc4d commit 008c490

3 files changed

Lines changed: 70 additions & 82 deletions

File tree

nxc/modules/interface.py

Lines changed: 0 additions & 81 deletions
This file was deleted.

nxc/protocols/smb.py

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
NTDSHashes,
1515
)
1616
from 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
1818
from impacket.dcerpc.v5.rpcrt import DCERPCException
1919
from impacket.dcerpc.v5.transport import DCERPCTransportFactory, SMBTransport
2020
from impacket.dcerpc.v5.rpcrt import RPC_C_AUTHN_GSS_NEGOTIATE
@@ -833,6 +833,74 @@ def shares(self):
833833
continue
834834
self.logger.highlight(f"{name:<15} {','.join(perms):<15} {remark}")
835835
return permissions
836+
837+
def interfaces(self):
838+
"""
839+
Retrieve the list of network interfaces info (Name, IP Address, Subnet Mask, Default Gateway) from remote Windows registry'
840+
Made by: @Sant0rryu, @NeffIsBack
841+
"""
842+
try:
843+
remoteOps = RemoteOperations(self.conn, False)
844+
remoteOps.enableRegistry()
845+
846+
if remoteOps._RemoteOperations__rrp:
847+
reg_handle = rrp.hOpenLocalMachine(remoteOps._RemoteOperations__rrp)["phKey"]
848+
key_handle = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, reg_handle, "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces")["phkResult"]
849+
sub_key_list = rrp.hBaseRegQueryInfoKey(remoteOps._RemoteOperations__rrp, key_handle)["lpcSubKeys"]
850+
sub_keys = [rrp.hBaseRegEnumKey(remoteOps._RemoteOperations__rrp, key_handle, i)["lpNameOut"][:-1] for i in range(sub_key_list)]
851+
852+
self.logger.highlight(f"{'-Name-':<11} | {'-IP Address-':<15} | {'-SubnetMask-':<15} | {'-Gateway-':<15} | -DHCP-")
853+
for sub_key in sub_keys:
854+
interface = {}
855+
try:
856+
interface_key = f"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\{sub_key}"
857+
interface_handle = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, reg_handle, interface_key)["phkResult"]
858+
859+
# Retrieve Interace Name
860+
interface_name_key = f"SYSTEM\\ControlSet001\\Control\\Network\\{{4D36E972-E325-11CE-BFC1-08002BE10318}}\\{sub_key}\\Connection"
861+
interface_name_handle = rrp.hBaseRegOpenKey(remoteOps._RemoteOperations__rrp, reg_handle, interface_name_key)["phkResult"]
862+
interface_name = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, interface_name_handle, "Name")[1].rstrip("\x00")
863+
interface["Name"] = str(interface_name)
864+
if "Kernel" in interface_name:
865+
continue
866+
867+
# Retrieve DHCP
868+
try:
869+
dhcp_enabled = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, interface_handle, "EnableDHCP")[1]
870+
except DCERPCException:
871+
dhcp_enabled = False
872+
interface["DHCP"] = bool(dhcp_enabled)
873+
874+
# Retrieve IPAddress
875+
try:
876+
ip_address = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, interface_handle, "DhcpIPAddress" if dhcp_enabled else "IPAddress")[1].rstrip("\x00").replace("\x00", ", ")
877+
except DCERPCException:
878+
ip_address = None
879+
interface["IPAddress"] = ip_address if ip_address else None
880+
881+
# Retrieve SubnetMask
882+
try:
883+
subnetmask = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, interface_handle, "SubnetMask")[1].rstrip("\x00").replace("\x00", ", ")
884+
except DCERPCException:
885+
subnetmask = None
886+
interface["SubnetMask"] = subnetmask if subnetmask else None
887+
888+
# Retrieve DefaultGateway
889+
try:
890+
default_gateway = rrp.hBaseRegQueryValue(remoteOps._RemoteOperations__rrp, interface_handle, "DhcpDefaultGateway")[1].rstrip("\x00").replace("\x00", ", ")
891+
except DCERPCException:
892+
default_gateway = None
893+
interface["DefaultGateway"] = default_gateway if default_gateway else None
894+
895+
self.logger.highlight(f"{interface['Name']:<11} | {interface['IPAddress']!s:<15} | {interface['SubnetMask']!s:<15} | {interface['DefaultGateway']!s:<15} | {interface['DHCP']}")
896+
897+
except DCERPCException as e:
898+
self.logger.info(f"Failed to retrieve the network interface info for {sub_key}: {e!s}")
899+
900+
with contextlib.suppress(Exception):
901+
remoteOps.finish()
902+
except DCERPCException as e:
903+
self.logger.error(f"Failed to connect to the target: {e!s}")
836904

837905
def get_dc_ips(self):
838906
dc_ips = [dc[1] for dc in self.db.get_domain_controllers(domain=self.domain)]

nxc/protocols/smb/proto_args.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def proto_args(parser, parents):
3434

3535
mapping_enum_group = smb_parser.add_argument_group("Mapping/Enumeration", "Options for Mapping/Enumerating")
3636
mapping_enum_group.add_argument("--shares", action="store_true", help="enumerate shares and access")
37+
mapping_enum_group.add_argument("--interfaces", action="store_true", help="enumerate network interfaces")
3738
mapping_enum_group.add_argument("--no-write-check", action="store_true", help="Skip write check on shares (avoid leaving traces when missing delete permissions)")
3839
mapping_enum_group.add_argument("--filter-shares", nargs="+", help="Filter share by access, option 'read' 'write' or 'read,write'")
3940
mapping_enum_group.add_argument("--sessions", action="store_true", help="enumerate active sessions")

0 commit comments

Comments
 (0)