Your NTP daemon is a megaphone strangers can borrow to shout at someone else's building
Tenable plugin 97861 flags NTP servers that respond to mode 6 control queries (readvar, peers, sysinfo, etc.) from arbitrary source addresses. The problem isn't that mode 6 leaks catastrophic data — it leaks daemon version, peer list, and system variables — it's that mode 6 replies can be dozens to hundreds of times larger than the query, giving a spoofed-source attacker a UDP amplification vector for reflection DDoS. Related CVEs include CVE-2016-9310 (mode 6 unauthenticated trap / DDoS vector, fixed in ntpd 4.2.8p9) and CVE-2013-5211 (monlist). The plugin fires on any NTP daemon — reference ntpd, chrony with cmdallow, Cisco IOS NTP, Juniper, Windows W32Time is not typically affected because it doesn't speak mode 6.
Tenable's MEDIUM rating is defensible as a compliance flag but overstates the risk to *your* organization. The victim of amplification is a third party on the internet, not you — the confidentiality leak is trivial (version banners you'd expose to Shodan anyway), and there is no code execution, no privilege gain, no lateral movement path. The only way this rating deserves to stay MEDIUM is if the affected host is internet-facing UDP/123 and your org cares about being a reflection source (ISP, cloud, regulated). For internal-only NTP infrastructure, this is a LOW finding — hygiene, not a fire.
3 steps from start to impact.
Locate a mode-6-responsive NTP server
zmap -p 123 -M udp --probe-args=file:ntp_mode6.pkt) and Shadowserver's public NTP-Version report, which enumerates ~1M+ mode-6-responsive hosts weekly.- ntpd 4.x with default
restrictor missingnoquery - No upstream ACL blocking UDP/123 ingress from the public internet
- Modern
ntp.conftemplates from Debian/RHEL/Ubuntu ship withrestrict default nomodify notrap nopeer noquery— mode 6 blocked out of the box on new installs chrony(default on RHEL 8/9, Ubuntu 20.04+) does not respond to mode 6 unlesscmdallowis set — it's a different protocol
Craft spoofed-source readvar / peers query
ntpq -c rv <server> is the researcher-friendly way to see what a mode 6 response looks like. Response payloads for readvar can reach ~30x the request; peer-listing responses have been observed at 200x+ in the wild.- Attacker's upstream network permits IP source spoofing (violates BCP38)
- Victim's uplink is not upstream-scrubbing UDP/123 reflection floods
- Major carriers (Level3, Cogent, Zayo, most Tier-1s) have deployed BCP38 uRPF on customer edges — spoofing works only from a small subset of hosting providers and residential ISPs
- Cloud provider egress (AWS/GCP/Azure) blocks spoofed source addresses entirely
Reflect amplified traffic to the victim
monlist, but mode 6 amplification factors are more modest.- A large pool of unpatched, mode-6-open NTP hosts (attacker's bot resource, not the defender's problem to solve alone)
- Cloudflare Magic Transit, AWS Shield, Akamai Prolexic scrub NTP amplification signatures automatically
- Amplification factor for mode 6 is meaningfully lower than legacy
monlist(CVE-2013-5211) — attackers prefer DNS/memcached/CLDAP
restrict default nomodify notrap nopeer noquery in ntp.conf — Pushes the daemon to refuse mode 6 (and mode 7) from anyone not explicitly permitted. Then allow local admin queries with restrict 127.0.0.1 / restrict ::1. Roll via config-management (Ansible/Puppet/Chef) across the fleet.ntpd to chrony where feasible — chrony does not respond to mode 6 by default and has a smaller attack surface. RHEL 8+, Ubuntu 20.04+, and Amazon Linux 2023 use chrony as the default time daemon.no ntp allow mode control (or ntp allow mode control 3 with ACL) — Cisco devices are a common source of 97861 hits. The command disables mode 6 replies entirely. Apply via network-team change window.- IPS signatures for 'NTP amplification' inbound — the amplification traffic flows *outbound* from your NTP host to the victim; inbound IPS won't see the flood
- Rate-limiting UDP/123 at the firewall — reduces amplification factor but doesn't eliminate the reflection; still leaves you as a listed reflector
- Patching
ntpdalone to 4.2.8p9 — the fix requires a config change (noquery), not just a version bump. Many orgs upgrade the binary and stay vulnerable to the plugin - Disabling
monlist— that's CVE-2013-5211; mode 6 is a separate control channel and remains open
The supporting signals.
| Plugin ID | Tenable Nessus 97861 — Misc family, published 2017-03 |
|---|---|
| Underlying CVEs | CVE-2016-9310 (mode 6 unauth trap / DDoS vector), CVE-2013-5211 (monlist amplification) |
| In-the-wild | NTP reflection is a known, active DDoS vector; NOT on CISA KEV (KEV tracks endpoint compromise, not reflection). No campaign attributes 97861 to a specific actor — it's a commodity booter/stresser resource. |
| EPSS | CVE-2016-9310 EPSS ~0.5–1.5% — reflection isn't 'exploited against you' in the EPSS sense, so score is intentionally low |
| KEV status | Not listed. KEV explicitly excludes DDoS reflection primitives. |
| Public exposure | Shadowserver publishes a daily 'Accessible NTP Version' feed — historically ~1M+ hosts globally; trending down as distros ship noquery defaults. Shodan ntp readvar returns hundreds of thousands. |
| Affected versions | ntpd < 4.2.8p9 with permissive restrict config; Cisco IOS NTP without no ntp allow mode control; any daemon speaking RFC 1305 mode 6 without ACL |
| Fixed versions | ntp 4.2.8p9 (Dec 2016) with mitigation; distro-shipped configs (RHEL/CentOS, Debian/Ubuntu, Amazon Linux) default to noquery since ~2017 |
| Amplification factor | ~3.7x to 30x for readvar; higher for peers on servers with many associations; well below monlist's 200x+ |
| Reporter | Matthew Van Gundy (Cisco Talos / ntp.org) — NTP Bug 3118 |
Sources.
Why this verdict
- No compromise of the scanned host. Mode 6 responses leak
ntpdversion and peer variables — nothing an attacker can pivot into RCE, credential theft, or lateral movement. - Victim is external. The amplification harm accrues to whoever the attacker spoofs, not to you. This is a good-internet-citizen issue, not a fleet-defense issue.
- Friction: spoofing is required. BCP38 uRPF on Tier-1 carrier edges and hyperscaler egress filters block source-address spoofing from most of the internet — the attacker population is bounded.
- Role multiplier: none. NTP daemons run in a stateless time-service role. There is no high-value deployment scenario (DC, hypervisor, PAM, CI) where mode 6 responses turn into fleet compromise. The role-multiplier floor does not apply.
- Modern defaults already fix it.
chrony(RHEL 8+, Ubuntu 20.04+) doesn't speak mode 6;ntpdpackages since ~2017 shiprestrict default noquery. New-build fleets are largely clean. - Reputational / compliance tail exists. ISPs, hosting providers, and CDN/edge operators receive Shadowserver abuse notifications and can end up on RBLs — for those orgs, the finding stays MEDIUM.
Why not higher?
MEDIUM would require impact on the scanned host or its data. Mode 6 exposes only version and peer metadata, no auth material, no config secrets, no RCE. There is no chain that pivots from mode 6 response to endpoint compromise, so keeping this at MEDIUM misallocates SOC attention against genuinely exploitable findings.
Why not lower?
IGNORE would require zero externality. If the flagged host is internet-facing on UDP/123, it can be conscripted into reflection DDoS campaigns and generate abuse tickets, RBL entries, and potentially breach hosting-provider AUPs. LOW captures 'fix on a normal hygiene cadence' — the correct signal.
Crowdsourced verification payload.
Run on the target NTP host as any user, or against a remote target from your auditor workstation (network-reachable to UDP/123). Requires ntpq (package ntp or ntpsec-ntpq). Example: ./check_ntp_mode6.sh 10.0.0.5 — omit the argument to check localhost.
#!/usr/bin/env bash
# noisgate: Tenable 97861 — NTP Mode 6 responder check
# Exit: 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN
set -u
TARGET="${1:-127.0.0.1}"
TIMEOUT=3
if ! command -v ntpq >/dev/null 2>&1; then
echo "UNKNOWN: ntpq not installed — install 'ntp' or 'ntpsec-ntpq' package"
exit 2
fi
# Mode 6 readvar query — a responsive daemon returns system variables
RESP=$(timeout "$TIMEOUT" ntpq -c 'rv 0' "$TARGET" 2>&1)
RC=$?
if [ $RC -ne 0 ] && echo "$RESP" | grep -qiE 'timed? out|no server|refused|connection'; then
echo "PATCHED: $TARGET does not respond to mode 6 readvar (or UDP/123 filtered)"
exit 0
fi
if echo "$RESP" | grep -qiE 'version=|processor=|system=|stratum='; then
echo "VULNERABLE: $TARGET responded to unauthenticated mode 6 readvar"
echo "---"
echo "$RESP" | head -5
exit 1
fi
echo "UNKNOWN: inconclusive response from $TARGET"
echo "$RESP" | head -3
exit 2