11class NXCModule :
22 """
33 Enumerate SQL Server linked servers
4- Module by deathflamingo
4+ Module by deathflamingo, NeffIsBack
55 """
66
77 name = "enum_links"
8- description = "Enumerate linked SQL Servers"
8+ description = "Enumerate linked SQL Servers and their login configurations. "
99 supported_protocols = ["mssql" ]
1010 opsec_safe = True
1111 multiple_hosts = True
@@ -14,6 +14,9 @@ def __init__(self):
1414 self .mssql_conn = None
1515 self .context = None
1616
17+ def options (self , context , module_options ):
18+ pass
19+
1720 def on_login (self , context , connection ):
1821 self .context = context
1922 self .mssql_conn = connection .conn
@@ -25,6 +28,18 @@ def on_login(self, context, connection):
2528 else :
2629 self .context .log .fail ("No linked servers found." )
2730
31+ def on_admin_login (self , context , connection ):
32+ res = self .mssql_conn .sql_query ("EXEC sp_helplinkedsrvlogin" )
33+ srvs = [srv for srv in res if srv ["Local Login" ] != "NULL" ]
34+ if not srvs :
35+ self .context .log .fail ("No linked servers found." )
36+ return
37+ self .context .log .success ("Linked servers found:" )
38+ for srv in srvs :
39+ self .context .log .display (f"Linked server: { srv ['Linked Server' ]} " )
40+ self .context .log .display (f" - Local login: { srv ['Local Login' ]} " )
41+ self .context .log .display (f" - Remote login: { srv ['Remote Login' ]} " )
42+
2843 def get_linked_servers (self ) -> list :
2944 """
3045 Fetches a list of linked servers.
@@ -36,5 +51,3 @@ def get_linked_servers(self) -> list:
3651 query = "EXEC sp_linkedservers;"
3752 res = self .mssql_conn .sql_query (query )
3853 return [server ["SRV_NAME" ] for server in res ] if res else []
39- def options (self , context , module_options ):
40- pass
0 commit comments