47808/udp - Pentesting BACNet - HackTricks

> [!TIP] Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
> Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

> Support HackTricks
> - Check the subscription plans!
> - Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
> - Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.

# Protocol Information

BACnet is a communications protocol for Building Automation and Control (BAC) networks that leverages the ASHRAE, ANSI, and ISO 16484-5 standard protocol. It facilitates communication among building automation and control systems, enabling applications such as HVAC control, lighting control, access control, and fire detection systems to exchange information. BACnet ensures interoperability and allows computerized building automation devices to communicate, regardless of the specific services they provide.

Default port: 47808

    PORT      STATE SERVICE
    47808/udp open  BACNet -- Building Automation and Control NetworksEnumerate

# Enumeration

## Manual

    pip3 install BAC0
    pip3 install netifaces

    import BAC0
    import time

    myIP = '<Your IP>/<MASK>' #You need to be on the same subnet as the bacnet device. Example: '192.168.1.4/24'
    bacnet = BAC0.connect(ip=myIP)
    bacnet.whois() #Broadcast request of bacnet devices
    time.sleep(5)  #Wait for devices to respond
    for i, (deviceId, companyId, devIp, numDeviceId) in enumerate(bacnet.devices):
        print(f"-------- Device #{numDeviceId} --------")
        print(f"Device:     {deviceId}")
        print(f"IP:         {devIp}")
        print(f"Company:    {companyId}")
        readDevice = bacnet.readMultiple(f"{devIp} device {numDeviceId} all")
        print(f"Model Name: {readDevice[11]}")
        print(f"Version:    {readDevice[2]}")
        # print(readDevice) #List all available info about the device

## Automatic

    nmap --script bacnet-info --script-args full=yes -sU -n -sV -p 47808 <IP>

This script does not attempt to join a BACnet network as a foreign device, it simply sends BACnet requests directly to an IP addressable device.

## Shodan

- `port:47808 instance`
- `"Instance ID" "Vendor Name"`

> [!TIP] Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
> Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

> Support HackTricks
> - Check the subscription plans!
> - Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
> - Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.