Skip to content

Commit 4137704

Browse files
Merge pull request Pennyw0rth#729 from haytechy/refactor_SMBSpider
Refactor smb spider
2 parents e11898b + 4104caa commit 4137704

4 files changed

Lines changed: 131 additions & 225 deletions

File tree

nxc/modules/spider_plus.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from impacket.smbconnection import SessionError
1010
from impacket.nmb import NetBIOSTimeout
1111

12-
1312
CHUNK_SIZE = 4096
1413

1514

nxc/protocols/smb.py

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,46 +1499,39 @@ def wmi(self, wmi_query=None, namespace=None):
14991499
dcom.disconnect()
15001500
return records if records else False
15011501

1502-
def spider(
1503-
self,
1504-
share=None,
1505-
folder=".",
1506-
pattern=None,
1507-
regex=None,
1508-
exclude_dirs=None,
1509-
depth=None,
1510-
content=False,
1511-
only_files=True,
1512-
silent=True
1513-
):
1514-
if exclude_dirs is None:
1515-
exclude_dirs = []
1516-
if regex is None:
1517-
regex = []
1518-
if pattern is None:
1519-
pattern = []
1520-
spider = SMBSpider(self.conn, self.logger)
1521-
if not silent:
1522-
self.logger.display("Started spidering")
1523-
start_time = time()
1524-
if not share:
1525-
spider.spider(
1502+
def spider(self):
1503+
if self.args.regex:
1504+
try:
1505+
self.args.regex = [re.compile(bytes(rx, "utf8")) for rx in self.args.regex]
1506+
except Exception as e:
1507+
self.logger.fail(f"Regex compilation error: {e}")
1508+
elif self.args.pattern is None:
1509+
self.args.pattern = [""]
1510+
if self.args.exclude_folders is None:
1511+
self.args.exclude_folders = []
1512+
1513+
spidering = SMBSpider(
1514+
self.conn,
1515+
self.logger,
15261516
self.args.spider,
15271517
self.args.spider_folder,
15281518
self.args.pattern,
15291519
self.args.regex,
1530-
self.args.exclude_dirs,
1520+
self.args.exclude_folders,
15311521
self.args.depth,
15321522
self.args.content,
15331523
self.args.only_files,
1534-
self.args.silent
1524+
self.args.only_folders,
1525+
self.args.spider_all
15351526
)
1536-
else:
1537-
spider.spider(share, folder, pattern, regex, exclude_dirs, depth, content, only_files, silent)
1538-
if not silent:
1539-
self.logger.display(f"Done spidering (Completed in {time() - start_time})")
15401527

1541-
return spider.results
1528+
self.logger.display("Started spidering")
1529+
start_time = time()
1530+
spidering.spider()
1531+
self.logger.display(f"Done spidering (Completed in {round(time() - start_time, 3)} seconds)")
1532+
1533+
def spider_all(self):
1534+
self.spider()
15421535

15431536
def rid_brute(self, max_rid=None):
15441537
entries = []

nxc/protocols/smb/proto_args.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,19 @@ def proto_args(parser, parents):
6262
wmi_group.add_argument("--wmi-namespace", metavar="NAMESPACE", default="root\\cimv2", help="WMI Namespace")
6363

6464
spidering_group = smb_parser.add_argument_group("Spidering", "Options for spidering shares")
65-
spidering_group.add_argument("--spider", metavar="SHARE", type=str, help="share to spider")
66-
spidering_group.add_argument("--spider-folder", metavar="FOLDER", default=".", type=str, help="folder to spider")
67-
spidering_group.add_argument("--content", action="store_true", help="enable file content searching")
68-
spidering_group.add_argument("--exclude-dirs", type=str, metavar="DIR_LIST", default="", help="directories to exclude from spidering")
69-
spidering_group.add_argument("--depth", type=int, help="max spider recursion depth")
70-
spidering_group.add_argument("--only-files", action="store_true", help="only spider files")
71-
spidering_group.add_argument("--silent", action="store_true", help="Do not print found files/directories", default=False)
72-
segroup = spidering_group.add_mutually_exclusive_group()
73-
segroup.add_argument("--pattern", nargs="+", help="pattern(s) to search for in folders, filenames and file content")
74-
segroup.add_argument("--regex", nargs="+", help="regex(s) to search for in folders, filenames and file content")
65+
spidering_group_type = spidering_group.add_mutually_exclusive_group()
66+
spidering_group_type.add_argument("--spider", nargs="+", metavar="SHARE", type=str, help="Share to spider")
67+
spidering_group_type.add_argument("--spider-all", action="store_true", help="Spider all the readable shares")
68+
spidering_group.add_argument("--spider-folder", metavar="FOLDER", default="/", type=str, help="Folder to spider")
69+
spidering_group.add_argument("--content", action="store_true", help="Enable file content searching")
70+
spidering_group.add_argument("--exclude-folders", nargs="+", type=str, metavar="DIR_LIST", help="Directories to exclude from spidering")
71+
spidering_group.add_argument("--depth", type=int, help="Max spider recursion depth")
72+
spidering_group_search = spidering_group.add_mutually_exclusive_group()
73+
spidering_group_search.add_argument("--pattern", nargs="+", help="Pattern(s) to search for in folders, filenames and file content")
74+
spidering_group_search.add_argument("--regex", nargs="+", help="Regex(s) to search for in folders, filenames and file content")
75+
spidering_group_filter = spidering_group.add_mutually_exclusive_group()
76+
spidering_group_filter.add_argument("--only-files", action="store_true", help="Only spider files")
77+
spidering_group_filter.add_argument("--only-folders", action="store_true", help="Only spider folders")
7578

7679
files_group = smb_parser.add_argument_group("Files", "Options for remote file interaction")
7780
files_group.add_argument("--put-file", action="append", nargs=2, metavar="FILE", help="Put a local file into remote target, ex: whoami.txt \\\\Windows\\\\Temp\\\\whoami.txt")

0 commit comments

Comments
 (0)