Skip to content

Commit dfccc39

Browse files
authored
Merge pull request #32 from hlein/separate-listeners-rpc-services
Split TCP listeners off from RPC services.
2 parents 10a619f + b53ed53 commit dfccc39

File tree

1 file changed

+31
-31
lines changed

1 file changed

+31
-31
lines changed

enum4linux-ng.py

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,6 @@
298298
ENUM_LSAQUERY_DOMAIN_INFO = "enum_lsaquery_domain_info"
299299
ENUM_USERS_RPC = "enum_users_rpc"
300300
ENUM_GROUPS_RPC = "enum_groups_rpc"
301-
ENUM_SERVICES = "services_check"
302301
ENUM_SHARES = "enum_shares"
303302
ENUM_SERVICES = "enum_services"
304303
ENUM_POLICY = "enum_policy"
@@ -376,6 +375,7 @@ def __init__(self, host, credentials, port=None, tls=None, timeout=None, samba_c
376375
self.ip_version = None
377376
self.smb_ports = []
378377
self.ldap_ports = []
378+
self.listeners = []
379379
self.services = []
380380
self.smb_preferred_dialect = None
381381
self.smb1_supported = False
@@ -749,31 +749,31 @@ class ServiceScan():
749749
def __init__(self, target, scan_list):
750750
self.target = target
751751
self.scan_list = scan_list
752-
self.services = OrderedDict({})
752+
self.listeners = OrderedDict({})
753753

754754
def run(self):
755755
module_name = ENUM_SERVICES
756756
output = {}
757757

758-
print_heading(f"Service Scan on {self.target.host}")
759-
for service, port in SERVICES.items():
760-
if service not in self.scan_list:
758+
print_heading(f"Listener Scan on {self.target.host}")
759+
for listener, port in SERVICES.items():
760+
if listener not in self.scan_list:
761761
continue
762762

763-
print_info(f"Checking {service}")
764-
result = self.check_accessible(service, port)
763+
print_info(f"Checking {listener}")
764+
result = self.check_accessible(listener, port)
765765
if result.retval:
766766
print_success(result.retmsg)
767767
else:
768-
output = process_error(result.retmsg, ["services"], module_name, output)
768+
output = process_error(result.retmsg, ["listeners"], module_name, output)
769769

770-
self.services[service] = {"port": port, "accessible": result.retval}
770+
self.listeners[listener] = {"port": port, "accessible": result.retval}
771771

772-
output["services"] = self.services
772+
output["listeners"] = self.listeners
773773

774774
return output
775775

776-
def check_accessible(self, service, port):
776+
def check_accessible(self, listener, port):
777777
if self.target.ip_version == 6:
778778
address_family = socket.AF_INET6
779779
elif self.target.ip_version == 4:
@@ -784,22 +784,22 @@ def check_accessible(self, service, port):
784784
sock.settimeout(self.target.timeout)
785785
result = sock.connect_ex((self.target.host, port))
786786
if result == 0:
787-
return Result(True, f"{service} is accessible on {port}/tcp")
788-
return Result(False, f"Could not connect to {service} on {port}/tcp: {SOCKET_ERRORS[result]}")
787+
return Result(True, f"{listener} is accessible on {port}/tcp")
788+
return Result(False, f"Could not connect to {listener} on {port}/tcp: {SOCKET_ERRORS[result]}")
789789
except Exception:
790-
return Result(False, f"Could not connect to {service} on {port}/tcp")
790+
return Result(False, f"Could not connect to {listener} on {port}/tcp")
791791

792792
def get_accessible_services(self):
793793
accessible = []
794-
for service, entry in self.services.items():
794+
for listener, entry in self.listeners.items():
795795
if entry["accessible"] is True:
796-
accessible.append(service)
796+
accessible.append(listener)
797797
return accessible
798798

799799
def get_accessible_ports_by_pattern(self, pattern):
800800
accessible = []
801-
for service, entry in self.services.items():
802-
if pattern in service and entry["accessible"] is True:
801+
for listener, entry in self.listeners.items():
802+
if pattern in listener and entry["accessible"] is True:
803803
accessible.append(entry["port"])
804804
return accessible
805805

@@ -2694,14 +2694,14 @@ def run(self):
26942694

26952695
def enum(self):
26962696
'''
2697-
Tries to enum services via net rpc serivce list.
2697+
Tries to enum RPC services via net rpc service list.
26982698
'''
26992699

2700-
result = SambaNet(['rpc', 'service', 'list'], self.target, self.creds).run(log='Attempting to get services')
2700+
result = SambaNet(['rpc', 'service', 'list'], self.target, self.creds).run(log='Attempting to get RPC services')
27012701
services = {}
27022702

27032703
if not result.retval:
2704-
return Result(None, f"Could not get services via 'net rpc service list': {result.retmsg}")
2704+
return Result(None, f"Could not get RPC services via 'net rpc service list': {result.retmsg}")
27052705

27062706
match_list = re.findall(r"([^\s]*)\s*\"(.*)\"", result.retmsg, re.MULTILINE)
27072707
if not match_list:
@@ -2776,9 +2776,9 @@ def run(self):
27762776
# SMB and LDAP, simple TCP connect scan is used for that. From the result
27772777
# of the scan and the arguments passed in by the user, a list of modules
27782778
# is generated. These modules will then be run.
2779-
services = self.service_scan()
2780-
self.target.services = services
2781-
modules = self.get_modules(services)
2779+
listeners = self.service_scan()
2780+
self.target.listeners = listeners
2781+
modules = self.get_modules(listeners)
27822782
self.run_modules(modules)
27832783

27842784
def service_scan(self):
@@ -2796,16 +2796,16 @@ def service_scan(self):
27962796
self.target.ldap_ports = scanner.get_accessible_ports_by_pattern("LDAP")
27972797
return scanner.get_accessible_services()
27982798

2799-
def get_modules(self, services, session=True):
2799+
def get_modules(self, listeners, session=True):
28002800
modules = []
28012801
if self.args.N:
28022802
modules.append(ENUM_NETBIOS)
28032803

2804-
if SERVICE_LDAP in services or SERVICE_LDAPS in services:
2804+
if SERVICE_LDAP in listeners or SERVICE_LDAPS in listeners:
28052805
if self.args.L:
28062806
modules.append(ENUM_LDAP_DOMAIN_INFO)
28072807

2808-
if SERVICE_SMB in services or SERVICE_SMB_NETBIOS in services:
2808+
if SERVICE_SMB in listeners or SERVICE_SMB_NETBIOS in listeners:
28092809
modules.append(ENUM_SMB)
28102810
modules.append(ENUM_SMB_DOMAIN_INFO)
28112811
modules.append(ENUM_SESSIONS)
@@ -2869,7 +2869,7 @@ def run_modules(self, modules):
28692869
# If sessions are not possible, we regenerate the list of modules again.
28702870
# This will only leave those modules in, which don't require authentication.
28712871
if self.target.sessions and not self.target.sessions[self.creds.auth_method]:
2872-
modules = self.get_modules(self.target.services, session=False)
2872+
modules = self.get_modules(self.target.listeners, session=False)
28732873

28742874
# Try to get domain name and sid via lsaquery
28752875
if ENUM_LSAQUERY_DOMAIN_INFO in modules:
@@ -2891,7 +2891,7 @@ def run_modules(self, modules):
28912891
result = EnumGroupsRpc(self.target, self.creds, self.args.Gm, self.args.d).run()
28922892
self.output.update(result)
28932893

2894-
# Enum services
2894+
# Enum RPC services
28952895
if ENUM_SERVICES in modules:
28962896
result = EnumServices(self.target, self.creds).run()
28972897
self.output.update(result)
@@ -2923,12 +2923,12 @@ def run_modules(self, modules):
29232923
result = BruteForceShares(self.share_brute_params, self.target, self.creds).run()
29242924
self.output.update(result)
29252925

2926-
if not self.target.services:
2926+
if not self.target.listeners:
29272927
warn("Aborting remainder of tests since neither SMB nor LDAP are accessible")
29282928
elif self.target.sessions['sessions_possible'] and not self.target.sessions[self.creds.auth_method]:
29292929
warn("Aborting remainder of tests, sessions are possible, but not with the provided credentials (see session check results)")
29302930
elif not self.target.sessions['sessions_possible']:
2931-
if SERVICE_SMB not in self.target.services and SERVICE_SMB_NETBIOS not in self.target.services:
2931+
if SERVICE_SMB not in self.target.listeners and SERVICE_SMB_NETBIOS not in self.target.listeners:
29322932
warn("Aborting remainder of tests since SMB is not accessible")
29332933
else:
29342934
warn("Aborting remainder of tests since sessions failed, rerun with valid credentials")

0 commit comments

Comments
 (0)