NetExec/nxc/modules/webdav.py

52 lines
1.6 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from nxc.protocols.smb.remotefile import RemoteFile
from impacket import nt_errors
from impacket.smb3structs import FILE_READ_DATA
from impacket.smbconnection import SessionError
2023-05-02 15:17:59 +00:00
class NXCModule:
"""
2021-09-16 05:41:55 +00:00
Enumerate whether the WebClient service is running on the target by looking for the
DAV RPC Service pipe. This technique was first suggested by Lee Christensen (@tifkin_)
Module by Tobias Neitzel (@qtc_de)
"""
2023-05-02 15:17:59 +00:00
name = "webdav"
description = "Checks whether the WebClient service is running on the target"
supported_protocols = ["smb"]
opsec_safe = True
multiple_hosts = True
def options(self, context, module_options):
"""
2021-09-16 05:41:55 +00:00
MSG Info message when the WebClient service is running. '{}' is replaced by the target.
"""
2023-05-02 15:17:59 +00:00
self.output = "WebClient Service enabled on: {}"
2023-05-02 15:17:59 +00:00
if "MSG" in module_options:
self.output = module_options["MSG"]
def on_login(self, context, connection):
"""
Check whether the 'DAV RPC Service' pipe exists within the 'IPC$' share. This indicates
2021-09-16 05:41:55 +00:00
that the WebClient service is running on the target.
"""
try:
2023-05-08 18:39:36 +00:00
remote_file = RemoteFile(connection.conn, "DAV RPC Service", "IPC$", access=FILE_READ_DATA)
remote_file.open()
remote_file.close()
context.log.highlight(self.output.format(connection.conn.getRemoteHost()))
except SessionError as e:
if e.getErrorCode() == nt_errors.STATUS_OBJECT_NAME_NOT_FOUND:
pass
else:
raise e