feat(sniffer): capture SSH client banner from TCP stream
Parse RFC 4253 §4.2 identification strings from the first attacker→decky data segment on TCP/22; emit ssh_client_banner syslog events and bus fan-out. Profiler's sniffer_rollup dedupes observed banners into a new AttackerBehavior.ssh_client_banners JSON column. Closes gap #3 from SIGNAL_CAPTURE_AUDIT.md.
This commit is contained in:
@@ -683,6 +683,16 @@ class SQLModelRepository(BaseRepository):
|
||||
d["kex_order_raw"] = []
|
||||
elif raw_kex is None:
|
||||
d["kex_order_raw"] = []
|
||||
# Same list-or-None pattern for ssh_client_banners.
|
||||
raw_banners = d.get("ssh_client_banners")
|
||||
if isinstance(raw_banners, str):
|
||||
try:
|
||||
parsed_banners = json.loads(raw_banners)
|
||||
d["ssh_client_banners"] = parsed_banners if isinstance(parsed_banners, list) else [parsed_banners]
|
||||
except (json.JSONDecodeError, TypeError):
|
||||
d["ssh_client_banners"] = []
|
||||
elif raw_banners is None:
|
||||
d["ssh_client_banners"] = []
|
||||
return d
|
||||
|
||||
@staticmethod
|
||||
|
||||
Reference in New Issue
Block a user