Lucene search
+L

DNP3 TCP Client

🗓️ 02 Aug 2026 20:51:56Reported by KittySploitType 
kittysploit
 kittysploit
🔗 kittysploit.com👁 3 Views

DNP3 TCP Client connects to an outstation to create an interactive DNP3 shell session.

Refs
Code
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""DNP3 TCP bind listener — opens a DNP3 session for interactive polling."""

from kittysploit import *
from lib.protocols.ics.constants import ICS_PROTOCOL_PORTS
from lib.protocols.ics.dnp3_client import Dnp3Client


class Module(Listener):
    __info__ = {
        "name": "DNP3 TCP Client",
        "description": "Connects to a DNP3 outstation and creates an interactive DNP3 shell session",
        "author": "KittySploit Team",
        "version": "1.0.0",
        "handler": Handler.BIND,
        "session_type": SessionType.DNP3,
        "protocol": "dnp3",
        "agent": {
            "risk": "active",
            "effects": ["network_probe"],
            "produces": ["tech_hints", "endpoints"],
            "chain": {
                "produces_capabilities": ["ot_assets", "dnp3_access"],
                "suggested_followups": ["post/ics/dnp3/gather/read_points"],
            },
        },
    }

    rhost = OptString("127.0.0.1", "Target DNP3 host", True)
    rport = OptPort(ICS_PROTOCOL_PORTS["dnp3"], "DNP3 TCP port", True)
    src = OptInteger(1024, "DNP3 master (source) address", False)
    dest = OptInteger(1, "DNP3 outstation (destination) address", False)

    def run(self):
        host = str(self.rhost).strip()
        port = int(self.rport)
        src = int(self.src or 1024)
        dest = int(self.dest or 1)
        timeout = float(self.timeout or 5)

        print_status(f"Connecting to DNP3 {host}:{port} (src={src} dest={dest})...")
        client = Dnp3Client(host, port, timeout, src, dest)
        if not client.connect():
            print_error(f"DNP3 TCP connection failed for {host}:{port}")
            return False

        identify = client.identify()
        if identify.error:
            print_warning(f"Connected but identify weak: {identify.error}")
        else:
            print_success("DNP3 outstation reachable")
            for hint in (identify.strings or [])[:6]:
                print_info(f"  attr: {hint}")

        additional_data = {
            "host": host,
            "port": port,
            "src": src,
            "dest": dest,
            "protocol": "dnp3",
            "platform": "ics",
            "timeout": timeout,
            "identify_strings": list(identify.strings or []),
        }
        return (client, host, port, additional_data)

    def shutdown(self):
        return True

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

02 Aug 2026 20:51Current
5.9Medium risk
Vulners AI Score5.9
3