improve ftp/smb logging

This commit is contained in:
ed 2022-11-06 13:30:16 +00:00
parent 450121eac9
commit e442cb677a
4 changed files with 53 additions and 38 deletions

View file

@ -11,7 +11,6 @@ import time
from pyftpdlib.authorizers import AuthenticationFailed, DummyAuthorizer from pyftpdlib.authorizers import AuthenticationFailed, DummyAuthorizer
from pyftpdlib.filesystems import AbstractedFS, FilesystemError from pyftpdlib.filesystems import AbstractedFS, FilesystemError
from pyftpdlib.handlers import FTPHandler from pyftpdlib.handlers import FTPHandler
from pyftpdlib.log import config_logging
from pyftpdlib.servers import FTPServer from pyftpdlib.servers import FTPServer
from .__init__ import PY2, TYPE_CHECKING, E from .__init__ import PY2, TYPE_CHECKING, E
@ -401,8 +400,8 @@ class Ftpd(object):
if self.args.ftp_nat: if self.args.ftp_nat:
h2.masquerade_address = self.args.ftp_nat h2.masquerade_address = self.args.ftp_nat
if self.args.ftp_dbg: lgr = logging.getLogger("pyftpdlib")
config_logging(level=logging.DEBUG) lgr.setLevel(logging.DEBUG if self.args.ftp_dbg else logging.INFO)
ioloop = IOLoop() ioloop = IOLoop()
for ip in self.args.i: for ip in self.args.i:

View file

@ -17,51 +17,21 @@ from .util import Daemon, min_ex
if True: # pylint: disable=using-constant-test if True: # pylint: disable=using-constant-test
from typing import Any from typing import Any
from .util import RootLogger
if TYPE_CHECKING: if TYPE_CHECKING:
from .svchub import SvcHub from .svchub import SvcHub
class HLog(logging.Handler):
def __init__(self, log_func: "RootLogger") -> None:
logging.Handler.__init__(self)
self.log_func = log_func
def __repr__(self) -> str:
level = logging.getLevelName(self.level)
return "<%s cpp(%s)>" % (self.__class__.__name__, level)
def flush(self) -> None:
pass
def emit(self, record: logging.LogRecord) -> None:
msg = self.format(record)
lv = record.levelno
if lv < logging.INFO:
c = 6
elif lv < logging.WARNING:
c = 0
elif lv < logging.ERROR:
c = 3
else:
c = 1
self.log_func("smb", msg, c)
class SMB(object): class SMB(object):
def __init__(self, hub: "SvcHub") -> None: def __init__(self, hub: "SvcHub") -> None:
self.hub = hub self.hub = hub
self.args = hub.args self.args = hub.args
self.asrv = hub.asrv self.asrv = hub.asrv
self.log_func = hub.log self.log = hub.log
self.files: dict[int, tuple[float, str]] = {} self.files: dict[int, tuple[float, str]] = {}
handler = HLog(hub.log) for x in ["impacket", "impacket.smbserver"]:
lvl = logging.DEBUG if self.args.smb_dbg else logging.INFO lgr = logging.getLogger(x)
logging.getLogger().addHandler(handler) lgr.setLevel(logging.DEBUG if self.args.smb_dbg else logging.INFO)
logging.getLogger().setLevel(lvl)
try: try:
from impacket import smbserver from impacket import smbserver
@ -125,7 +95,7 @@ class SMB(object):
self.srv = srv self.srv = srv
self.stop = srv.stop self.stop = srv.stop
logging.info("listening @ %s:%s", ip, port) self.log("smb", "listening @ {}:{}".format(ip, port))
def start(self) -> None: def start(self) -> None:
Daemon(self.srv.start) Daemon(self.srv.start)

View file

@ -8,6 +8,7 @@ import argparse
import base64 import base64
import calendar import calendar
import gzip import gzip
import logging
import os import os
import re import re
import shlex import shlex
@ -34,6 +35,7 @@ from .up2k import Up2k
from .util import ( from .util import (
VERSIONS, VERSIONS,
Daemon, Daemon,
HLog,
HMaccas, HMaccas,
alltrace, alltrace,
ansi_re, ansi_re,
@ -106,6 +108,11 @@ class SvcHub(object):
if args.lo: if args.lo:
self._setup_logfile(printed) self._setup_logfile(printed)
lg = logging.getLogger()
lh = HLog(self.log)
lg.handlers = [lh]
lg.setLevel(logging.INFO)
if args.stackmon: if args.stackmon:
start_stackmon(args.stackmon, 0) start_stackmon(args.stackmon, 0)

View file

@ -6,6 +6,7 @@ import contextlib
import errno import errno
import hashlib import hashlib
import hmac import hmac
import logging
import math import math
import mimetypes import mimetypes
import os import os
@ -381,6 +382,44 @@ class Cooldown(object):
return ret return ret
class HLog(logging.Handler):
def __init__(self, log_func: "RootLogger") -> None:
logging.Handler.__init__(self)
self.log_func = log_func
self.ptn_ftp = re.compile(r"^([0-9a-f:\.]+:[0-9]{1,5})-\[")
self.ptn_smb_ign = re.compile(r"^(Callback added|Config file parsed)")
def __repr__(self) -> str:
level = logging.getLevelName(self.level)
return "<%s cpp(%s)>" % (self.__class__.__name__, level)
def flush(self) -> None:
pass
def emit(self, record: logging.LogRecord) -> None:
msg = self.format(record)
lv = record.levelno
if lv < logging.INFO:
c = 6
elif lv < logging.WARNING:
c = 0
elif lv < logging.ERROR:
c = 3
else:
c = 1
if record.name == "pyftpdlib":
m = self.ptn_ftp.match(msg)
if m:
record.name = ip = m.group(1)
msg = msg[len(ip) + 1 :]
elif record.name.startswith("impacket"):
if self.ptn_smb_ign.match(msg):
return
self.log_func(record.name[-21:], msg, c)
class UnrecvEOF(OSError): class UnrecvEOF(OSError):
pass pass