{% from "partials/_macros.html" import card_header, verdict_pill %} {# Network exposure & MITM surface — configured proxies, mounted network shares, active login sessions, and promiscuous-mode interfaces. The silent-proxy / lateral-movement / live-operator / packet-sniffer surfaces. Tables are small and bounded, so all rows show behind one shared verdict + search filter (no pagination). #} {# ----- reusable section renderer: header + counts + table (defined before use — Jinja2 does not hoist macros) ----- #} {% macro _expo_section(title, subtitle, rows, counts, columns) %}
{{ title }} {{ subtitle }}
{{ counts.total }} rows {% if counts.malicious %} {{ counts.malicious }} malicious {% endif %} {% if counts.suspicious %} {{ counts.suspicious }} suspicious {% endif %}
{% if rows %}
{% for label, _ in columns %} {% endfor %} {% for r in rows %} {% for _, key in columns %} {% endfor %} {% endfor %}
verdict{{ label }}why
{% if r.verdict %}{{ verdict_pill(r.verdict, r.confidence) }} {% else %}{% endif %} {{ r[key] if r[key] not in (none, '') else "—" }}{{ r.reasoning }}
{% else %}
none
{% endif %}
{% endmacro %}
{{ card_header("Network exposure — proxies, shares, sessions & sniffers") }} {% if expo %} {# ----- shared filter bar ----- #}
{% endif %} {% if expo and expo.any %} {% set c = expo.counts %} {# ===== Proxies ===== #} {{ _expo_section( "Proxies", "configured proxies / PAC — a silent one is MITM or exfil", expo.proxies, c.proxies, [("scope", "scope"), ("host", "host"), ("port", "port"), ("PAC url", "pac_url")] ) }} {# ===== Network shares ===== #} {{ _expo_section( "Network shares", "mounted SMB/NFS — lateral movement & staging", expo.shares, c.shares, [("remote", "remote"), ("mountpoint", "mountpoint"), ("fstype", "fstype"), ("options", "options")] ) }} {# ===== Login sessions ===== #} {{ _expo_section( "Login sessions", "active logins — a remote source is a live operator", expo.sessions, c.sessions, [("user", "user"), ("tty", "tty"), ("source", "source"), ("login at", "login_at")] ) }} {# ===== Promiscuous interfaces ===== #} {{ _expo_section( "Promiscuous interfaces", "promisc=1 means a packet sniffer is attached", expo.promisc, c.promisc, [("interface", "interface"), ("promiscuous", "promiscuous"), ("flags", "flags")] ) }} {% elif expo %}
no exposure rows match the current filters.
{% else %}
no exposure data captured yet — wait for a collection cycle to complete.
{% endif %}