Call to Action

June 23, 2026 · View on GitHub

PyExfil is an open research project. If you work in offensive security, red teaming, or covert channel research, there are concrete ways to help. Pick a task, open a PR, and link back to this file.

Before contributing, read DOCUMENTATION.md for the module writing guide and ARCHITECTURE.md for the class hierarchy reference.


1. Module Conversions (highest priority)

The modules below still use the old ad-hoc pattern (Send() function + Broker class or raw script). They need to be converted to inherit the right base class from pyexfil/includes/base.py. This makes them testable, stoppable, and consistent with the rest of the framework.

How to convert a module:

  1. Identify the correct pillar (NetworkModule, CommModule, PhysicalModule, StegaModule).
  2. Wrap the existing send logic in _send_impl(self, data, **kwargs).
  3. Wrap the existing listen/broker logic in _listen_impl(self, callback, **kwargs) and check self._stop_event.
  4. For CommModule, also implement _broadcast_impl.
  5. For StegaModule, implement _encode_impl and _decode_impl instead.
  6. Set MODULE_NAME and PROTOCOL class attributes.
  7. Add a test in tests/.

Network modules → NetworkModule

ModuleFileNotes
ICMP exfiltrationpyexfil/network/ICMP/icmp_exfiltration.pyRaw socket, needs root; use _icmp_checksum from general.py
NTP timestamp exfilpyexfil/network/NTP/ntp_exfil.pyClient-only; listener is a stub
QUIC clientpyexfil/network/QUIC/quic_client.pyDepends on aioquic
QUIC serverpyexfil/network/QUIC/quic_server.pyDepends on aioquic
POP3 clientpyexfil/network/POP3/pop_exfil_client.pyUses imaplib/poplib
POP3 serverpyexfil/network/POP3/pop_exfil_server.pyFake POP3 server
Slack clientpyexfil/network/Slack/slack_client.pyNeeds migration to slack-sdk (drop slackclient)
Slack serverpyexfil/network/Slack/slack_server.pyNeeds migration to slack-sdk
SpoofIP clientpyexfil/network/SpoofIP/spoofIPs_client.pyRaw IP with Scapy
SpoofIP serverpyexfil/network/SpoofIP/spoofIPs_server.pyRaw IP with Scapy
DNSQpyexfil/network/DNSQ/__init__.pyDNS query covert channel
Draft (HTTPS Draft)pyexfil/network/Draft/__init__.pyExperimental HTTPS channel
UDP Source Portpyexfil/network/UDP_SPort/__init__.pyEncodes data in UDP source port field

Comm modules → CommModule

ModuleFileNotes
ARP Broadcastpyexfil/Comm/ARPBroadcast/communicator.pyUses Scapy ARP; _broadcast_impl is the key method
AllJoynpyexfil/Comm/AllJoyn/__init__.pyUDP multicast over AllJoyn protocol
GQUICpyexfil/Comm/GQUIC/__init__.pyGoogle QUIC-based C2
MDNSpyexfil/Comm/MDNS/__init__.pymDNS multicast covert channel
cert_exchangepyexfil/Comm/cert_exchange/__init__.pyTLS certificate body as C2 channel
icmp_ttlpyexfil/Comm/icmp_ttl/__init__.pyTTL field encodes data
packet_sizepyexfil/Comm/packet_size/__init__.pyPacket size encodes data

Physical modules → PhysicalModule

ModuleFileNotes
Audio listenerpyexfil/physical/audio/listener.pyPair to audio/exfiltrator.py; override _receive_impl
QR decoderpyexfil/physical/qr/decoder.pyPair to qr/generator.py; override _receive_impl
WiFi Payload clientpyexfil/physical/wifiPayload/client.pyBeacon frame payload
WiFi Payload serverpyexfil/physical/wifiPayload/server.pyBeacon frame sniffer
3.5mm Jackpyexfil/physical/35jack/__init__.pyAudio jack covert channel
Ultrasonicpyexfil/physical/ultrasonic/__init__.pyUltrasonic frequency exfil

Stega modules → StegaModule

ModuleFileNotes
Braillepyexfil/Stega/braille/txt2pdf/txt2pdf.pyEncodes data as braille in a PDF; implement _encode_impl / _decode_impl
ConvertToText (BIP39)pyexfil/Stega/ConvertToText/bip39_encode.pyEncodes binary as BIP39 word list
DataMatrixpyexfil/Stega/datamatrix/__init__.py2D barcode steganography
PNG transparencypyexfil/Stega/png_transparency/__init__.pyAlpha channel covert channel
Zipceptionpyexfil/Stega/zipception/__init__.pyData hidden in nested ZIP metadata
Video dictpyexfil/Stega/video_dict/vid_to_dict.pyFrame-index dictionary encoding

2. New Module Ideas

These channels are not yet implemented. Implementations must follow the class hierarchy from day one.

ChannelPillarDescription
DNS-over-HTTPS (DoH)NetworkModuleExfil encoded in DoH POST requests
HTTP/2 header fieldsNetworkModuleData in pseudo-headers or HPACK table
BGP communitiesNetworkModuleEncode data in BGP community attributes
SMTP header injectionNetworkModuleCovert data in custom mail headers
LDAP queriesCommModuleC2 via crafted LDAP search requests
Bluetooth LE advertisementsPhysicalModuleBLE manufacturer data field
IEEE 802.11 probe requestsPhysicalModuleSSID field or IE data
IR LED (Raspberry Pi)PhysicalModuleInfrared blaster as optical channel
PDF metadataStegaModuleHidden data in PDF XMP or object streams
MP3 ID3 tagsStegaModulePayload in audio file metadata
JPEG EXIF fieldsStegaModuleGPS or comment fields as covert channel

3. Test Coverage

Every module that has been converted needs at minimum:

  • Instantiation test (correct MODULE_NAME, MODULE_TYPE)
  • send() returns bool
  • listen(blocking=False) starts a live thread
  • stop() terminates the thread cleanly within 5 seconds

Tests live in tests/. See DOCUMENTATION.md for a test skeleton.


4. Python 3 Modernisation

Modules not yet touched by the conversion effort may still contain Python 2 idioms. Things to fix:

  • print statements → print() calls
  • except ExcType, e:except ExcType as e:
  • xrangerange
  • urllib2urllib.request / urllib.error
  • from StringIO import StringIOfrom io import BytesIO
  • long literals (2208988800L) → plain integers
  • import threadimport threading
  • .next()next()
  • PyCrypto imports → PyCryptodome (same import path, different package)

5. Documentation

  • Add a per-module README.md inside each module folder describing the covert channel, its detection risk, required privileges, and a usage example.
  • Update the module table in ARCHITECTURE.md when a conversion is complete.
  • Cross-link new modules in CALL_TO_ACTION.md by removing them from the conversion list.

Getting Started

  1. Fork the repository.
  2. Pick one module from the lists above.
  3. Convert it following DOCUMENTATION.md.
  4. Add tests in tests/.
  5. Open a pull request referencing the module name in the title.

Questions? Open an issue.