Showing posts with label IP-over-HF. Show all posts
Showing posts with label IP-over-HF. Show all posts

11 March 2026

a WireGuard-like VPN Protocol Adaptation over HF

Disclaimer: The following analysis is based on empirical observation of HF traffic and does not represent an official specification. The identification of protocol messages and roles is a technical hypothesis intended for research purposes.

This post examines what appears to be a custom HF adaptation of the WireGuard VPN protocol [1], a streamlined UDP-native protocol designed for high-performance secure tunneling. While the examined protocol shares characteristics with both MESH and VPN architectures, I have opted for the latter definition. This is because an HF implementation of a mesh protocol is better suited for tactical (field-deployed) theaters rather than the consolidated, fixed-site network observed in this case.

I have used the term "WireGuard-like" in the title because the observed packet structures diverge from standard specifications; nevertheless, protocol-specific signatures suggest a proprietary implementation tailored for transmission over HF links. For convenience, the term "WireGuard" (WG) will be used hereafter to refer to this specific implementation, its framing characteristics, and the field designations identified here.
This analysis also serves as a continuation of the work initiated in [2] [3]; readers are encouraged to refer to those previous posts for background on the operational scenario.

As established in the aforementioned posts, the bulk of the previous captures consists of intermittent 2G-ALE (MS-141A) handshakes between Node 101 (caller) and Node 102 (called). Sometimes handshakes are followed by short MS-110A bursts, carrying encapsulated STANAG-5066 UDP payloads of 16 and 32 bytes. However, a few days ago (February 19), while occasionally monitoring 20779.5 kHz (1), sustained async MS-110A transmissions were recorded, characterized by prolonged data exchanges specifically between nodes 101 and 102 (Figure 1). Unlike the sporadic heartbeats/pings observed earlier, these emissions suggest the transfer of larger, continuous data blocks. My friend Kosmod  kindly shared his recordings with me.

Fig. 1: Waterfall display showing continuous MS-110A bursts on 20779.5 kHz, indicating an active data session between ALE nodes 101 and 102

1. Bitstream Analysis

The MS-110A demodulated bitstreams exhibit the expected 8N1 asynchronous framing format, an example is shown in Figure 2. This format ensures that even if the radio link drops or fades momentarily, the serial framing allows the hardware to re-sync at the very next byte, rather than losing an entire synchronous frame.

Fig. 2: MS-110A 8N1 asynchronous pattern

After stripping the asynchronous start/stop bits, the underlying STANAG-5066 frames are identified via their 0x90EB sync sequence. These frames encapsulate IP traffic within U_PDUs (Unreliable/Unacknowledged PDUs), facilitating data exchange between nodes 011.020.100.101 and 011.020.100.102 (Figure 3a). The U_PDU payloads were subsequently extracted and reassembled, revealing IP/UDP datagrams routed between 192.168.101.15 and 192.168.102.15. Analysis of the reassembled UDP payloads identified a consistent 0x04 initial value, corresponding to WireGuard Type 4 Transport Data packets (2). This protocol identification was further validated by the Wireshark dissector (Figure 3b).

Fig. 3: Example of protocol decapsulation using STANAG-5066 (3a) and Wireshark dissectors (3b)

Figures 3a/3b highlights some interesting elements:

1. Cross-Layer Addressing: source and destination IP addresses are correlated with the ALE and STANAG-5066 node IDs. This mapping confirms a consistent logical-to-physical addressing scheme, verifying the identity of the transceiving stations across the radio link:
ALE address: 101 -> STANAG-5066 address: 011.020.100.101 -> LAN IP address: 192.168.101.15
ALE address: 102 -> STANAG-5066 address: 011.020.100.102 -> LAN IP address: 192.168.102.15
2. Transport Layer Optimization: the capture reveals the implementation of UDP (User Datagram Protocol). This choice is mirrored at the data-link layer by the use of STANAG-5066 Non-ARQ data transfer.
3. Encapsulated Tunneling: further dissection of the UDP payload identifies the use of an HF implementation of WireGuard VPN Protocol, indicating that the session employs a modern, high-performance encryption to secure the traffic.

2. Proposed Protocol Analysis

(All field designations are my own and are used for convenience of presentation)
The following section provides the UDP payloads analysis of the data transfer session illustrated in Figure 4.

Fig. 4: spectral time-frequency analysis

For reference, the following workflow was utilized for signal processing and analysis:

- MS-110A demodulation and asynchronous start/stop bit stripping
- STANAG-5066 protocol dissection
- Extraction and reassembly of segmented U_PDUs (Unreliable Data Protocol Units)
- Wireshark IP packet dissection
- Hexadecimal forensic analysis of the extracted UDP payloads 

The session commences with the standard MS-141A 2G-ALE handshake between Node 101 (caller) and Node 102 (called) which are followed by 3 WG bursts.

WG1 burst:
Internet Protocol Version 4, Src: 192.168.101.15, Dst: 192.168.102.15
User Datagram Protocol, Src Port: 55504, Dst Port: 2753
UDP payload (32 bytes): 002000020003cbf6c0a8650f00000def699713f500010000c0a8660f0000064d

This 32-byte pyload is the first packet of a new session, it serves as the "Announcement" or "Master Synchronization" Type 2 Message . In a high-latency, low-bandwidth environment like HF, you cannot afford the back-and-forth of a standard TCP-style or WireGuard handshake. Instead, the sender "pushes" the entire connection state in this single 32-byte burst.
 
WG2 burst:
Internet Protocol Version 4, Src: 192.168.102.15, Dst: 192.168.101.15
User Datagram Protocol, Src Port: 54107, Dst Port: 2754
UDP payload (28 bytes): 001c00010600a36dc0a8660f0001000ec0a8650f00000def00010002
This 28-byte payload serves as the Synchronized Acknowledgement (ACK) Type 1 Message. It confirms that the receiver has accepted the session parameters (Session ID and Clock) proposed in the initial 32-byte WG1 burst.
 
WG3 burst: The WG3 burst consists of two parts:
WG3_1 part: 
Internet Protocol Version 4, Src: 192.168.101.15, Dst: 192.168.102.15
User Datagram Protocol, Src Port: 55504, Dst Port: 2753
UDP payload (32 bytes): 002000020003cbf6c0a8650f00000def699713f500010000c0a8660f0000064d 
 
In this capture, the third payload seems to complete the MS-141A ALE Three-Way Handshake paradigm, transitioning the link from the "Linking" state to the "Data Traffic" state. Interestingly, the hex for this 3rd packet is identical to the 1st packet. In HF protocols, this usually indicates a re-transmission or a State Enforcement frame to ensure the receiver definitely has the Master Context before the data burst begins.
 
WG3_2 part: 
Internet Protocol Version 4, Src: 192.168.101.15, Dst: 192.168.102.15
User Datagram Protocol, Src Port: 55504, Dst Port: 2753
WireGuard Protocol
    Type: Transport Data (4)
    Reserved: 000000
    Receiver: 0x9ee70200
    Counter: 17225424150020335808
    Encrypted Packet
 
Examination of the UDP payload hexdump reveals a consistent 0x04000000 initial sequence , i.e., a fingerprint of standard-WireGuard Transport Data Type 4 Message
 
Fig. 5: hexdump of WG3_2 UDP payload
 
The structural composition of the header is detailed below:
The 16-byte Authentication Tag is always the last 16 bytes appended at the end of the encrypted payload. This tag is the result of the Poly1305 algorithm ChaCha20-Poly1305 for Authenticated Encryption with Associated Data (AEAD).
Note that while the Receiver Index is stored in Little-Endian (WireGuard standard), the Embedded IP (C0 A8...) is stored in Big-Endian (Network Byte Order). This "hybrid" endianness is an indicator of a custom wrapper being used to bridge standard networking with the WireGuard protocol.
In a standard WireGuard implementation, the Nonce (bytes 08-15) is usually just a monotonic counter starting from zero. 
However, this specific capture shows interesting points:
 
1. Identity Injection: by placing 192.168.101.15 (the sender's internal IP) directly into the first 4 bytes of the Nonce, the receiver can verify the source of the packet at the cryptographic layer before even attempting to decrypt the inner payload.
2. Timestamp Alignment: the following 4 bytes (00 00 0d ef) ensure the packet is unique and in sequence.
3. The "Double Match": notice this is an exact match to the 32-byte Master Sync packet analyzed in WG_1 burst. This confirms that the first data packet in a session "inherits" the sequence number and identity used during the handshake to prevent any startup delay on the HF link.
 
Below the complete packet flow summary. 
The captured sequence reveals a three-way synchronization establishment designed to bypass the high-overhead  handshake typically found in standard WireGuard implementations.
In this HF-optimized environment, the 32-byte Master Sync (WG1 burst) functions as a "state-push" mechanism, forcefully synchronizing the absolute Unix Epoch and session identity to satisfy WireGuard's anti-replay requirements in a single burst. The subsequent 28-byte ACK (WG2 burst) confirms bidirectional reachability and IP binding, while the final 32-byte State Lock (WG3_1 part) ensures the receiver is fully primed despite potential HF fading or ALE tuning delays. This robust "handshake-less" initiation minimizes airtime while establishing the necessary cryptographic context for the immediate transmission of WireGuard Type 4 Data packets.
 
Another significant capture reveals the existence of a 16-byte Type 3 Message, which in this context likely functions as a Status/Keep-Alive announcement. Notice that this Type 3 control message is transmitted immediately following the 2G-ALE (MS-141A) handshake, without an instant follow-up data burst, thereby marking the transition from link establishment to tunnel maintenance. Figure 6 displays the transition between the physical (2G-ALE) and logical (WG message) layers.
 
Fig. 6 : transition between the physical (2G-ALE) and logical (Type 3 Message) layers

The following table provides the proposed structure of the Type 3 message:

Internet Protocol Version 4, Src: 192.168.101.15, Dst: 192.168.102.15
User Datagram Protocol, Src Port: 56503, Dst Port: 2753
UDP payload (16 bytes): 0010000306001056c0a8650f0000059d

While Type 1 & 2 messages handle acknowledgments between peers, shorter 16-byte Type 3 messages likely serve as heartbeat signals, periodically announcing the presence of the 192.168.101.15 node to the network.
The immediate transmission of the Type 3 message after the 2G-ALE handshake serves as a bridge between the physical layer (radio synchronization) and the logical layer (tunnel persistence). This ensures that the UDP session is active before the bulk transport of Type 4 encrypted data begins. As seen in previous sequences, the ALE → WG transition is the "acid test" confirming that the system utilizes ALE merely as a pathfinder before immediately handing over control to the tunneling protocol.
 

2.1. Functional Parallelism with MS-141A Sounding 

Critical observation of the traffic patterns reveals Sub-Type 2 Messages 2.1 (02 01) and 2.2 (02 02) appearing either in isolation (Figure 7) or as a three-message exchange (Figure 8), both notably occurring without an immediate follow-up data burst. These behaviors exhibit a functional parallelism with 2G-ALE (MS-141A) sounding transmissions, where unilateral or short-handshake bursts are used to maintain channel state and verify path viability independently of active traffic.
 
Fig. 7 : isolated/probe Type 02  Message without an immediate follow-up handshake or data burst

Analisys of the payload (IP/UDP encapsulation is omitted)
Hex: 0020020200030b03c0a8650f00000de76996f7d300010000c0a8660f00000646

 
 
Figure 8 sows a three-message exchange between nodes 101 and 102 without an immediate follow-up data burst.
 
Fig. 8:  three-message exchange without an immediate follow-up data burst
 
Analisys of the UDP payloads, IP/UDP encapsulations are omitted.
 
WG1 Burst UDP Payload: Initial Sounding (Node 101)
Hex: 0020020200030b03c0a8650f00000de76996f7d300010000c0a8660f00000646
 
WG2 Burs UDP Payload: Response (Node 102)
Hex: 001c0201060019fdc0a8660f0001000ec0a8650f00000de700010002
WG2 payload is 28 bytes and contains the reflected "Echo" of  WG1 payload.
 
WG3 Burst UDP Payoad: Final Confirmation (Node 101)
Hex: 0020020200030b03c0a8650f00000de76996f7d300010000c0a8660f00000646
WG3 payload is a re-transmission of WG1 payload 1 to ensure link stability.
 
Sumarizing:
WG1 (The Sound): Node 101 announces itself and sets the Sync ID to 0x0de7.
WG2 (The Call/Response): Node 102 confirms it heard the sound by reflecting the IP .101.15 and the ID 0x0de7 back to the sender.
WG3 (The Conclusion): Node 101 re-transmits its state to ensure the link is locked. This redundancy is the core of the ALE-logic parallelism, ensuring connectivity even if the first packet had jitter.
 

This confirms that the nodes are handshaking on a state, not just passing data.
 
Observed sequences also show the presence of Sub-Type 1 Messages 1.2 (01 02), appearing either as isolated/probe burst (Figure 9): 
 
Fig. 9: isolated/probe WG burst
 
UDP Payload (IP/UDP encapsulation is omitted)
Hex: 00200102000323aac0a8650f00000df1699706f600010000c0a8660f0000064b
or occurring immediately before a Type 2 Message inside the same Type 4 data exchange burst. Notably, no ACK is issued by the destination peer (typically Node 102) in this specific sequence.
 
Fig. 10

UDP Payload WG1 (IP/UDP encapsulation is omitted)
Hex: 00200102000323aac0a8650f00000df1699706f600010000c0a8660f0000064b
UDP Payload WG2 (IP/UDP encapsulation is omitted)
Hex: 002000020003a325c0a8650f00000dea699713f300010000c0a8660f0000064e

Note the time jump between the two contiguous bursts
Payload A Epoch: 69 97 06 f6 ≈ 07:40:06 UTC
Payload B Epoch: 69 97 13 f3 ≈ 08:35:01 UTC
Delta: 3325 seconds (approx. 55 minutes and 25 seconds).
The fact that Type 04 (Data) follows Payload B immediately, could likely mean that the 55-minute jump in the epoch was a session sesynchronization.
The specific role of Sub-Type 1.2 remains unclear and deserves further investigation. 
 

2.2. Protocol Type Messages

Based on the observed sequences, this WireGuard-like protocol follows a deterministic four-stage lifecycle for link management and data transfer identified by the Type Message IDs:

- Link Initiatior (Type 2 Message): the session originates with an Initiator message utilized to request channel allocation or to "wake up" the remote peer within the STANAG-5066 stack.
- Receiver ACK (Type 1 Message): the responding node returns a Receiver ACK message. This exchange validates link-layer synchronization and confirms that both modems are aligned.
- Link Maintenance/Persistence (Type 3 Message): during periods of data inactivity, the link is sustained via Heartbeat messages. These 16-byte frames likely prevent STANAG-5066 session timeouts and provide the network controller with continuous node reachability status.
- Transport Data (Type 4 Message): once the control plane is stabilized, the Transport Data packets carry the encrypted payload. The persistence of the Receiver Index across distinct captures confirms a long-term security association managed by this custom signaling layer. 
Notice the similarity between the two ACK Types 0001 and 0201.
Interestingly, the protocol utilizes a non-sequential Type Message assignment that deviates from standard handshake conventions. Type 02 functions as the Initiator, signaling the intent to establish a link, while Type 01 serves as the Receiver ACK. This inversion suggests a priority-based numbering system or a derivation from a legacy STANAG-5066 signaling framework, where Type 01 is traditionally reserved for link-layer acknowledgments.

3. Some techical observations

3.1. STANAG-5066 addresses
The addresses utilized in STANAG-5066 (Source: 011.020.100.101; Destination: 011.020.100.102) are formally assigned to an Armenian political or organizational network (STANAG-5066 Table N-9  Middle East National Addressing Schema); however, they are likely dummy/fictitious addresses intended to avoid interference with official NATO-standard communications. Regardless, they do not help in geolocation since these represent logical identifiers that reflect organizational affiliation rather than physical geographical location. They identify "who" is communicating within the network, but they bear no relationship to "where" the transmitter is physically located.
 
3.2. Cross-Mapped UDP Architecture (port asimettry)
In a typical internet deployment, WireGuard is symmetric (e.g., Peer A:51820 ↔ Peer B:51820), however analysis of the UDP datagrams reveals a consistent asymmetric pattern:

    Node 101 TX Path: Local Port 55504 → Node 102 Remote Port 2753
    Node 102 TX Path: Local Port 54107 → Node 101 Remote Port 2754

Looking at previous captures, the local port does not always have the same value but changes (55504,54107,56503,60510,...) while remote ports 2753/2754 remain fixed:

    Node 101 TX Path: Local Port (variable) → Node 102 Remote Port 2753
    Node 102 TX Path: Local Port (variable) → Node 101 Remote Port 2754

The transition from symmetric to asymmetric UDP ports confirms that this is a Radio-Aware implementation. The cross-mapping of ports 2753 and 2754 serves as a synchronization bridge between the synchronous nature of the WireGuard protocol and the asynchronous, half-duplex constraints of HF.
By separating the RX/TX paths into different ports the software knows that anything arriving on ports 2753/2754 is exclusively incoming traffic from the remote peer, eliminating any risk of processing its own transmitted signals. In essence, the port asymmetry transforms a standard peer-to-peer VPN tunnel into a dual-channel "Virtual Circuit" optimized for the unique HF channel. 
Although a search of the IANA port registry yields no official assignments for UDP ports 2753 or 2754, the consistency of their appearance suggests they are de facto service-dedicated ports for this specific protocol.
 
3.3. End-user Identification and Attribution
Regarding the end-user, it can be confirmed with certainty that the entity is an Italian diplomatic/military body, as previous signal captures have intercepted op-chats conducted in Italian language. Furthermore, multiple UDXF logs support this attribution, identifying the ALE exchanges between nodes 101 and 102 as part of an Italian Military Attaché network.
 
3.4. Node Roles and Network Topology
The specific roles of ALE nodes 101 and 102 remain difficult to define, specifically regarding which functions as the HQ node and which as the remote node. However, it is established that node 101 consistently initiates both the link negotiation and the VPN tunnel, while also managing subsequent data forwarding. Based on standard network architecture, this behavior suggests that node 101 likely operates as the remote station (initiating a "call home" procedure), while node 102 functions as the central gateway or HQ. 
Based on the assumption of an Italian Military Attaché entity, it is highly plausible that the remote station (Node 101) transmits periodic diplomatic/military situation reports (SITREPs) to the central headquarters in Rome (Node 102), likely Ministry of Foreign Affairs or Ministry of Defense.
 
3.5. Geolocation and Technical Constraints
Similar uncertainties apply to the geolocation of the two transmitters. The TDoA (Time Difference of Arrival) method employed for Direction Finding (DF) requires a minimum dwell time of 30 seconds from a single transmitting source and at least three receivers synchronized to the monitoring frequency.
These conditions are difficult to meet due to the unpredictable nature of the transmissions (they seem to happen only when a "report" is ready) and the handshake mechanism employed, which involves two distinct transmitting sources alternating rapidly. This rapid switching between the initiator (Node 101) and the responder (Node 102) prevents the TDoA system from maintaining a stable lock long enough for a precise fix. 

3.6. Protocol's timing logic
Examining several captures, significant temporal differences were observed between the WireGuard handshake timestamps in the initiator packets and their actual reception; an example is shown in Figure 11.
 
Fig. 11: temporal difference
 
All data points in the following table were recorded on the same day (2026/02/19), highlighting the intra-day volatility of the protocol's timing logic.
While the synchronization between the packets is evident, the multi-hour gaps between the Internal Timestamp and the Actual Reception time (specifically in Captures C through F) present an unresolved anomaly. At this stage of the analysis, no definitive explanation can be provided for these significant offsets. Several hypotheses remain under consideration: session-based epochs, system clock misalignment (Node 101), or a "store-and-forward" mechanism.
The negative deltas (specifically in Captures A and B) suggest that the internal timestamp functions as an expiration marker, i.e., a Session Validity Deadlines (Time-to-Live): this hypotheses also remains under consideration.
Negative deltas and multi-hour gaps highlight a complex session management logic that requires further data acquisition to be fully decoded and interpreted.
 
By the way, all the 2024/11/28 captures show similar negative deltas.  
 
 
Conclusions
In conclusion, the captured traffic likely represents an HF-customized VPN protocol. Although it deviates from the standard WireGuard specifications, its alignment with observed message structures suggests its specialized HF implementation. This adaptation transcends the capabilities of standard Wireshark dissectors, which are designed for "Vanilla" protocols and may not natively support these physical-layer modifications. This analysis remains a work in progress; further captures will be essential to confirm these findings and refine the protocol details.
 
 
(1) Transmissions do not appear to follow a fixed schedule. According to UDXF logs, there are multiple frequencies to monitor, making simultaneous tracking difficult unless a polling strategy using ALE software with a scanning receiver or a "staring" monitoring approach is implemented across various remote web-based SDRs:
07780.50, 10220.50, 12110.50, 14963.50, 15906.50
17411.50, 18325.50, 19516.50, 20776.50, 20779.50
(all KHz/USB)

 

12 January 2026

UDP datagrams sent via STANAG-5066 (2)

For background read the previous post

I ended the previous post hoping to recover new transmissions to understand more about the used application-layer protocol, and somehow this happened: my friend Kosmod indeed kindly sent me several transmissions he recorded on 20779.5 KHz/USB. The recordings date back to the end of 2024 (November) and this allowed me to understand how - actually - there has been a sort of evolution/improvement of the application-layer protocol that sits above UDP and which is therefore responsible for the UDP payloads. 

2024 transmissions follow the same schema: initial MS-141A link setup between ALE address 101 (caller) and 102 (called), then MS-110A running at 300bps/L to trasnfer data in async 8N1 mode (Figure 1). 

Fig. 1 - async 8N1 MS-110A

After removing the start/stop bits, the resulting bistreams consist of Data Transfer Protocol Data Units (D_PDUs) of the STANAG-5066 protocol, as parsed by the S-5066 dissector (as for example in Figure 2). The results are as expected, namely:

* D_PDU (Data Transfer Protocol Data Units) type 7, NON-ARQ DATA (Non-ARQ data transfer)
* the last 3 digits of the STANAG-5066 Addresses correspond to the respective MS-141A ALE addresses used during link setup
* IP-type Client/Application, ie IP over HF ("Source and Destination Service Access Point" is 9)

Fig. 2 - analysis of a  STANAG-5066 frames

The same conclusions (ie expected results) can be drawn by examining IP packets with "wireshark" tool (an example is shown in Figure 3):

* source/destination (LAN) IP addresseses are 192.168.101.15 and 192.168.102.15 (note the digits 101 and 102)
* the IP packet transports User Datagram Protocol (UDP) messages which are addressed to the destination port 2753, the "de-spot" port

Practically, just as in the recordings analyzed in the previous post... but there is a very important difference compared to the 2025 recordings: here the length of the UDP payload is 32 bytes instead of 16! (double length).

Fig. 3 - analysis of an IP packet

Below I report the 32-byte payloads related to 10 consecutive transmissions: as you can easily see, these are repeated transmissions, probably due to missed or incorrect receptions:

0020010200035b88c0a8650f0000059f67487bb400010000c0a8660f000002b1

0020010200033eaac0a8650f000005a067487caa00010000c0a8660f000002b4
0020010200033eaac0a8650f000005a067487caa00010000c0a8660f000002b4

00200102000379e9c0a8650f000005a56748871e00010000c0a8660f000002b6
00200102000379e9c0a8650f000005a56748871e00010000c0a8660f000002b6
00200102000379e9c0a8650f000005a56748871e00010000c0a8660f000002b6
00200102000379e9c0a8650f000005a56748871e00010000c0a8660f000002b6
00200102000379e9c0a8650f000005a56748871e00010000c0a8660f000002b6
00200102000379e9c0a8650f000005a56748871e00010000c0a8660f000002b6
00200102000379e9c0a8650f000005a56748871e00010000c0a8660f000002b6

(2025 payload: 00100003060072c6c0a8650f00000cc3)

By isolating unique payloads you get:

0020010200035b88c0a8650f0000059f67487bb400010000c0a8660f000002b1
0020010200033eaac0a8650f000005a067487caa00010000c0a8660f000002b4
00200102000379e9c0a8650f000005a56748871e00010000c0a8660f000002b6

Then I tried a parsing of the first payload, results are interesting.

00 20 → 0x0020 = 32 (matches payload length!)
01 02 → likely protocol version or message type
00 03 → subtype / command / channel ID
5b 88 → 0x5B88 = 23432 (this value changes every payload, likely a sequence number, transaction ID, or session counter)
c0 a8 65 0f → 192.168.101.15 (source IP address!)
00 00 05 9f → 1439 (changes per payload: 1439, 1440, 1445)
67 48 7b b4 → 0x67487BB4 = 1732924340 that decodes cleanly as a Unix epoch timestamp! (seconds), other packets: 67487caa, 6748871e
00 01 → flag or command = 1, constant in all payloads
00 00 → Likely reserved or alignment padding
c0 a8 66 0f → 192.168.102.15 (destination IP address!)
00 00 02 b1 → 689 (changes slightly per payload: 689, 692, 694)

Given the fixed 32-byte control packet, embedded source/destination IPs, timestamps, repeated sends with identical content, in my opinion UDP port 2753 is here used as a rendezvous/control/signaling port. Moreover, I thinked of missed or incorrect receptions: this is suggested, other than by repeated transmissions, also by some text-mode op-chats also reported by Kosmod in his comment to the previous post; chats are in Italian language and, according to some UDXF logs, this is  likely a military attaché (1):

"MESSO IN CODA 5 EMAIL.....SPERO CHE TI ARRIVI ALMENO UNA AH AH AH" (I QUEUED 5 EMAILS.....I HOPE YOU GET AT LEAST ONE AH AH AH)
"RICEVUTO QUALCHE EMAIL? DUE SU 15... MI LASCIA PERPLESSO" (RECEIVED ANY EMAILS? TWO OUT OF 15... IT LEAVES ME PERPLEXED)

Well, let's work now on the “timestamp” field, bytes 16–19:

67 48 7b b4
67 48 7c aa
67 48 87 1e

Interpreted as big-endian:

0x67487BB4 Decimal: 1732803508 UTC time: 2024-11-28 14:18:28
0x67487CAA Decimal: 1732803754 UTC time: 2024-11-28 14:22:34
0x6748871E Decimal: 1732806430 UTC time: 2024-11-28 15:07:10 

Since the same timestamp is repeated across multiple transmissions, it doesn't reflect the sending time, but rather the message creation time. It's important to note that the timestamps correspond to the recording dates, except for the time (hours:minutes:seconds):

For the sake of completeness, I repeat below the analysis of the payloads captured in December 2025 followed by a little comparison.

00 10 → Possibly a message type or some identifier (2 bytes). Hex 0x0010 = 16 decimal (the length of the message!)
00 03 → Another 2-byte field, could be message type or command. Hex 0x0003 = 3 decimal.
06 00 → Could represent a flags field, version, or sub-type. Hex 0x0600 = 1536 decimal.
72 C6 → Often a transaction ID, session ID, or another 2-byte value. Hex 0x72C6 = 29318 decimal.
C0 A8 65 0F → This looks exactly like an IPv4 address in hex: C0 A8 65 0F → 192.168.101.15 (source IP address!)
00 00 → Possibly padding, reserved, or a 2-byte zero field.
0C C3 → Could be a port, checksum, or some other 2-byte value. Hex 0x0CC3 = 3267 decimal.

Both payloads share the same core structure:
[ Header | Opcode | Flags | TxID | IP #1 | Value ]
that strongly suggests same protocol or same base message format. Note that the 2024 captures  had an extended basic message with  timestamp, status/flag fields, the destination IP address and an additional numeric value.

Likely, these "isolated" 16-byte and 32-byte UDP payloads suggests a Link Maintenance Phase by STANAG-5066. These are non-data transmissions used for synchronization and channel-state monitoring, ensuring the point-to-point path between 101.15 and 102.15 remains viable even during periods of traffic silence:
- the 16-byte frame acts as a
"Keep-alive" standing by for data or "Checking for signal quality"
- the 32-byte frame announces: "I am 101.15 and I want to talk to 102.15

https://disk.yandex.com/d/L4yj5a8xQNpqBA

(1) an armed forces officer assigned by governments to diplomatic missions abroad as a technical advisor on matters of military relevance.

23 December 2025

UDP datagrams sent via STANAG-5066 over async MS-110A (IP over HF)

This is a casual catch while I was exploring the 14 MHz band (14963.5 KHz/USB to be precise): the data transmission occurred after the usual MS-141A 3-way handshake between the ALE nodes 101 (caller) and 102 (called). Recording thanks to linkz KiwiSDR [1]. The used HF waveform is MS-110A in 300bps/Long mode (Figure 1).

Fig. 1 - MS-110A 300bps/L waveform

The resulting bitstream after MS-110A decoding uses 8N1 asynchronous framing (1 start bit, 1 stop bit) as shown in Figure 2.

Fig. 2 - 8N1 framing in demodulated bitstream

Examining the 8-bit bitstream after removing the start/stop bits, it must be noted the presence of the 16-bit Maury-Styles synchronization sequence 0xEB90 (LSB transmitted first) which identifies the STANAG-5066 Data Transfer Protocol Data Units (D_PDUs) frames (1)

Fig. 3 - STANAG-5066 sync sequences
 
I then decided to process the 8-bit bitstream using the STANAG-5066 dissector tool [2] obtaining interesting results which I comment below. The STANAG-5066 transfer consists of two frames which are basically a repetition (2): Figure 4 shows the first D_UDP frame.
 
Fig. 4 - first frame of the STANAG-5066 transfer

a) The D_PDU is type: 7 NON-ARQ DATA, ie Non-ARQ data transfer. Indeed, as Figure 1 shows, the data transmission is not followed by feedback ACK bursts. The "Delivery confirmation = none" flag is an additional confirmation of the NON-ARQ data transfer mode.

b) STANAG-5066 Addresses are
Source node address: 011.020.100.101
Destination node address: 011.020.100.102
Note that the last 3 digits of the addresses (101 and 102) correspond to the respective MS-141A ALE addresses used during link management.
If 11.20.y.z are actual STANAG-5066 addresses, ie not fake or dummy addresses (!), the nodes belong to an Armenian political or organizational network (STANAG-5066 Table N-9 — Middle East National Addressing Schema). Also note that in STANAG 5066, addresses are logical identifiers that reflect political or organizational belonging, not physical location.
 

c) The used "Source and Destination Service Access Point" is 9 (1001 binary): this identifies an IP-type Client/Application, according to STANAG-5066 #F.1.2 Standardized Assignment of Service Access Point Identifiers. Thus, this is a real-world example of IP over HF.

d) The "Client Application ID" field serves to identify the application (i.e., higher-level protocol) using the connection.

For further analysis of the IP packet we need to extract and edit a "reassembled" C_PDU, provided by the dissector tool, and then save it as an HEX dump file. We have to remove the first 6 bytes, ie the headers of C (Channel Access Sublayer) and S (Subnetwork Interface Sublayer) Protocol Data Units:
00 00 99 40 6D 9F
where:
00 C_PDU type (0 = data)
00 S_PDU type (0 = data)
99 S_PDU source & destination SAP IDs (1001 & 1001)
40 6D 9F S_PDU control and TDD fields
After removing these first 6 bytes you can copy and paste the hexadecimal data and save it to a .txt file, as for example "hex_dump.txt" (Figure 5).
 
Fig. 5

The HEX dump file can be now analyzed by using the well-known "wireshark" tool [3]: first click "File" -> "Import from Hex Dump", select the file to be imported, set offsets to "none" and Encapsulation Type to "Raw IP" then click Import. The result of the IP packet analysis is shown in Figure 6.
 
Fig. 6 - IP packet analysis

a) The first interesting thing to note are the values of the source/destination IP addresseses: 192.168.101.15 and 192.168.102.15, here too we see a repetition of the "digits" 101 and 102. Sumarizing:
ALE address: 101 - STANAG-5066 address: 011.020.100.101 - LAN IP address: 192.168.101.15
ALE address: 102 - STANAG-5066 address: 011.020.100.102 - LAN IP address: 192.168.102.15

b) As expecetd, since the Non-ARQ type D_PDU, the IP packet transports an User Datagram Protocol (UDP, a connectionless communication protocol) datagram with destination port 2753.
According to the official IANA service registry [4], the UDP port 2753 is registered as "de-spot". This means that if an application declares it uses UDP 2753, it’s conventionally associated with a service called de-spot, but that name doesn’t correspond to any widely known mainstream protocol like DNS or DHCP. It’s a registered but obscure / application-specific designation, port 2753 seems to be utilized by specific monitoring tools without a universal standard service name. 

c) The UDP datagram transports the 16 bytes payload [0x]:
00 10 00 03 06 00 72 c6 c0 a8 65 0f 00 00 0c c3
I asked ChatGPT to try to break down the payload byte by byte, it's something like "mission impossible" I know, but some results are worth attention. 

1. 00 10 → Possibly a message type or some identifier (2 bytes). Hex 0x0010 = 16 decimal (just the length of the message!)
2. 00 03 → Another 2-byte field, could be message type or command. Hex 0x0003 = 3 decimal.
3. 06 00 → Could represent a flags field, version, or sub-type. Hex 0x0600 = 1536 decimal.
4. 72 C6 → Often a transaction ID, session ID, or another 2-byte value. Hex 0x72C6 = 29318 decimal.
5. C0 A8 65 0F → This looks exactly like an IPv4 address in hex: C0 A8 65 0F → 192.168.101.15 (just the IP address of the sender!)
6. 00 00 → Possibly padding, reserved, or a 2-byte zero field.
7. 0C C3 → Could be a port, checksum, or some other 2-byte value. Hex 0x0CC3 = 3267 decimal.

The exact meaning depends on what application protocol is encapsulated inside the UDP packet. As seen, the IP address in UDP payload matches the source address in IP header: by itself, UDP doesn’t care about IP addresses, payload fields just contain whatever the application protocol puts there (data/metadata).
I do not know why the source IP address is repeated in the UDP paylod, maybe it's due to protocol design, NAT traversal, or validation (heartbeat/keepalive message?): I think that a network specialist could clarify the question and the used application protocol.

As is usual in SIGINT analysis, I followed a bottom-up approach, that is, I started from the HF bitstream and worked my way up to the application layer protocol. Top-down flow of the data is shown in Figure 7.

Fig. 7 - data flow during transmission

Every now and then I stop for a few hours to monitor the channel (14963.5 KHz) but up until the time of writing I have not had the luckiness of listening such transmissions, neither simple MS-141A exchanges.

https://disk.yandex.com/d/qUCfb7EBQyIKxg

(1) As per STANAG-5066 "C.3.2 Generic detailed D_PDU structure": All D_PDUs, regardless of type, shall begin with the same 16-bit synchronisation (SYNC) sequence. The 16-bit sequence shall (5) be the 16-bit Maury-Styles (0xEB90) sequence shown below, with the least significant bit (LSB) transmitted first: (MSB) 1 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 (LSB).

(2) most likely the D_PDU frame is repeated to provide some increased probability of receipt and reliability.


[1] http://linkz.ddns.net:8075/?f=14963.50usbz8
[2] http://i56578-swl.blogspot.com/2021/02/a-stanag-5066-off-line-dissector.html
[3] https://www.wireshark.org/
[4] https://www.iana.org/...service-names-port-numbers.txt

27 June 2025

IPSec (ESP) over HF using STANAG-5066

For a few days I have been monitoring the 20.5 MHz/USB frequency, thanks to the KiwiSDR owned by IZ6BYY [1], recording some transmissions such as the sample in Figure 1, by the way such transmissions are not at all frequent. Data transfer is via the HF waveforms MS-110A and STANAG-4539 (MS-110B App.C), the links are managed by BW5 FLSU (Fast Link SetUp protocol) bursts and therefore everything happens according the "circuit mode service" of  STANAG-4538 (1). 

Fig. 1 - the transmission being analyzed

HF layer
The symbol rate of both waveforms is 2400 Baud, but it was not immediately detectable. In fact, in Figure 2a the automatically detected baud rate value is about 100 Bd (!): a value that is clearly inconsistent. I then used the "modified amplitude detector" function (Figure 2b) which shows a solid continuous line of 2400 Hz and therefore the correct value of 2400 Bd. But the function also reveals faint horizontal lines that "should" represent the baud rate and harmonics and which - unfortunately - should not be there and therefore fool the automatic detection (in PSK modulation the amplitude of the carrier signal remains constant). As a further test I used the automatic detection after the "hard-limited amplitude control" (Figure 2c) and in this case the result is the expected one.

Fig. 2 - Baud rate measurements

Apparently, there is a superimposed 100 Hz signal: according my friend cryptomaster it could be the residual ripple from a full-wave rectifier operating on a 50 Hz AC mains supply, which is then imperfectly filtered by smoothing capacitors.

Fig. 3 - residual ripple from a full-wave rectifier operating on a 50 Hz AC mains supply

The ACF values of MS-110A and STANAG-4539 signals (in the current sample) are respectively ~66.6 ms and ~119.5 ms which - at the speed of 2400 Bd - make 160 symbols frames for MS-110A and 287 symbols frames (256 symbols data block + 31 symbols mini-probe) for STANAG-4539. Actually the length of MS-110A frames is 40 symbols (20 symbols data block + 20 symbols mini-probe) but at slow data rates the length of the scrambler (160 symbols) matches 4 frames and originates the 66.6 ms ACF. Bitmaps and ACFs are shown in Figure 4 (note the four MS-110A frames within the 66.6 ms interval).

Fig. 4 - Bitmaps and ACFs

Figure 5 displays PSK8 constellations that appear "odd" or "twisted" compared to an ideal one. Instead of distinct, equally spaced points on a single circle, we see a slight amplitude variation and a twisted/spiral arrangement of the points. This odd appearance is most likely due to the superposition of the 100 Hz signal, as already highlighted during the baud rate measurement.

Fig. 5 - "twisted" PSK8 constellations

data-link layer
The demodulation of the signals inevitably "suffers" from the non-perfect PSK8 constellations, however it is still possible to analyze the resulting bitstreams and find a 1776-bit period that reveals the use of the STANAG-5066 suite at the data-link layer, presence which is also confirmed by some detections of the 16-bit synchronisation sequences 0x90EB, typical of that Standard.

Fig. 6 - an MS-110A decoded bitstream

The bitstreams have been analyzed using the "STANAG-5066 Dissector" tool [2]; below the traffic-flow output from one of the demodulated bitstreams (S4539.txt) that clearly shows the use of the ARQ DATA-ONLY (simplex) transfer mode; traffic flows from node 001.001.001.101 to node 001.010.010.110 (STANAG-5066 address):


Further "technical" information can be extracted by examining the data transfer frames as for examle the one shown in Figure 7 (frame #26 of 49):

Fig. 7 - a STANAG-5066 frame

As shown, the source and destination Service Access Point Identifiers (SAP ID, equivalent to the “ports” of the TCP protocol) have value 9 (1001 binary) and according to STANAG-5066 they refer to an IP based client/application, more precisely the traffic consists of segmented IPSec (IP Security) packets sent by node 001.001.001.101 to node 001.010.010.110.

user-to-user data
For further analysis of the IP packet we need to extract and edit a "reassembled" C_PDU and then save it as an HEX dump file. Figures 8,9 show an example.

Fig. 8 - an extracted STANAG-5066 C_PDU

We have to remove the first 6 bytes, ie the headers of C (Channel Access Sublayer) and S (Subnetwork Interface Sublayer) Protocol Data Units:
00 07 99 4B 5E 4F
where:
00 C_PDU type (0 = data)
07 S_PDU type (0 = data)
99 S_PDU source & destination SAP IDs (1001 & 1001)
4B 5E 4F S_PDU control and TDD fields
After removing these first 6 bytes you can copy and paste the hexadecimal data and save it to a .txt file, as for example "hex_dump_001.txt":

Fig. 9 - HEX dump file

The HEX dump file can be now analyzed by using the well-known "wireshark" tool [3]: first click "File" -> "Import from Hex Dump", select the file to be imported, set offsets to "none" and Encapsulation Type to "Raw IP" then click Import (Figure 10).

Fig. 10 - wireshark: import from hex dump file

Figure 11 displays the hexadecimal and ASCII representation of the imported IP packet. You can see the bytes that make up the IP header and the subsequent ESP (Encapsulating Security Payload) header and its (encrypted) payload. In summary, this image shows an IPSec (IP Security) ESP packet traveling from the IP addresses 192.168.10.48 to 192.168.1.48. The ESP protocol provides confidentiality, data origin authentication, data integrity, and anti-replay services for IP packets. This type of packet is common in VPN connections or other secure network communications.

Fig. 11 - imported IP packet

The IP header can also be parsed by using the tool CyberChef [4], obviously getting the same results.

Fig. 12 - CyberChef IP parser

Further analysis is not possible since the IP packets payloads are protected by encryption,  however some comments can be added.

The first one concerns the HF waveforms. As seen in Figure 1, HF traffic is conducted in STANAG-4538 "circuit mode". The FLSU Request specifies the traffic waveforms that will be used during the circuit mode service: for example, STANAG-4285 can be specified as the traffic waveform. Once circuit mode begins, any station can initiate transmissions using the specified traffic waveform. Indeed, quoting Annex C to STANAG-4538 "For circuit mode connections, the called station can issue a FLSU Confirm with a different modem parameter (data rate or interleaving), but it shall not change the waveform selection". Well, this is in contrast to what I saw, ie two different waveforms: MS-110A 600bps/S and STANAG-4539 (MS-110B App.C) 4800bps/S, and 9600bps/S also. Although MS-110B superseding MS-110A, Appendix C uses a completely different framing.

Unlike typical IP networks where addresses might be dynamically assigned via DHCP, STANAG-5066 addresses are generally statically configured and are part of the network's design and planning, ie each STANAG-5066 server or device is manually configured with its unique address (Figure 13).

Fig. 13 - manually assignment of a STANAG-5066 address

While STANAG-5066 has its own addressing, it can also provide IP and IPv6 address translation for its subnetwork addresses to allow IP-based applications to communicate over the HF link. In such cases, the mapping between STANAG 5066 addresses and IP addresses would also be part of the static configuration. For example, the sample being analyzed shows the matches:

[STANAG-5066]     [IP]
001.001.001.101  192.168.10.48 source
001.010.010.110  192.168.1.48  dest

Well, about seven years ago (respectively november and october, 2018) I found these matches:
 
[STANAG-5066]     [IP]
001.001.001.101  192.168.2.48  source          
001.003.003.103  192.168.12.48 dest

001.001.001.101  192.168.1.48  source
001.005.005.105  192.168.14.48 dest

Assuming that it is the same HF network(!) and trusting in the goodness of the decoders, you may see that the STANAG-5066 node 001.001.001.101 was always the sender and had 3 different IP mappings (192.168.10.48, 192.168.2.48, 192.168.1.48), as well as the IP node 192.168.1.48 had two different STANAG-5066 mappings (001.010.010.110, 001.001.001.101). Obviously over the time the servers/devices may have changed as well as the related configurations, furthermore only three samples are not so significant.
However, it must be said that ESP protocol may work in "tunnel" and "transport" mode. In tunnel mode, the entire original IP packet (including its original IP header) is encapsulated and becomes the payload of a new, outer IP packet. This means you will see two IP headers:
* an outer IP header that contains the source and destination IP addresses of the IPSec gateways or tunnel endpoints.
* an inner (original) IP header that contains the actual source and destination IP addresses of the end-hosts. This inner header is encrypted along with the original payload(!).
In transport mode, the original IP header is retained. There is only one IP header in the packet. This header contains the source and destination IP addresses of the actual end-hosts communicating.

I can't reliably determine whether these IPSec ESP headers are operating in transport or tunnel mode, thus the above IP addresses may belong to tunnel endpoints (tunnel mode) or directly correspond to the ultimate source and destination hosts (transport mode).
By the way, according to Annex N to STANAG-5066 (Guidance on Address Management in STANAG 5066 Networks) the address range 1.0.0.0-1.255.255.255 is managed by US DoD and includes US Armed Forces and Homeland Security as major S’5066 users.

(1) In the context of STANAG-4538, when we talk about "circuit mode service," we generally refer to establishing a dedicated, continuous connection between two points for the duration of the communication. This is in contrast to the packet mode service, where data is broken into discrete packets and sent independently via xDL protocols.

https://disk.yandex.com/d/LSGj4GzIpjBYOg 
https://disk.yandex.com/d/iZNNGFhziG5opA 

[1] https://iz6byy.k1fm.us/
[2] http://i56578-swl.blogspot.com/2021/02/a-stanag-5066-off-line-dissector.html
[3] https://www.wireshark.org/
[4] https://gchq.github.io/CyberChef/