
مفكك لاحق (postdissector) قائم على Lua لبرنامج Wireshark، يقوم بفك تشفير وتحليل عناصر معلومات البائع (vendor IEs) الخاصة بأجهزة Ubiquiti AirMAX/RouterBoard بمعيار 802.11 إلى حقول قابلة للتصفية.
محلل (dissector) لحزم Wireshark/tshark لعناصر معلومات المورّد الخاصة بـ Ubiquiti AirMAX (AC + M) و Mikrotik / RouterBoard المرافقة، مكتوب بلغة Lua.
هو النظير المباشر على الهواء لـ pyrmax: فمنطق فك الترميز يطابق حزمة بايثون تلك حقلًا بحقل. تمت هندسة تنسيق حزم AC عكسيًا من الثنائي الخاص ببرنامج AirMAX AC الثابت؛ بينما جاءت تخطيطات M وRouterBoard من ملاحظات منشورة سابقة حول عنصر المورّد AirMAX-M الأقدم.
يركب AirMAX داخل عناصر معلومات خاصة بالمورّد في 802.11 (العلامة 221). يحلل Wireshark إطار 802.11 ويُظهر عنصر المورّد ككتلة غير شفافة؛ wiremax يأخذ تلك الكتلة، ويفك تشفيرها (AES-128-ECB، بمفتاح مشتق من عناوين MAC للإطار) ويعرض شجرة فرعية محللة وقابلة للتصفية.
Tag: Vendor Specific: Ubiquiti Inc (built-in 802.11 dissector)
AirMAX AC (Vendor Specific IE) ← added by wiremax
Flags: 0x02 ( .... ..1. = Encrypted: True )
Message Type: Beacon (1)
Encrypted Length: 48
[Decrypted payload (AES-128-ECB)]
[AES Key …: 1f162a13… (dst=broadcast)]
Version: 9
Source MAC: 24:5a:4c:44:57:fd
Radio MAC (mac_0c): 24:5a:4c:44:57:fd
Capability Flags: 0x0000003e
Mixed Mode: 0
Radioname: LB1
SSID: labalUBI2
TLV: Radioname (1), len 3
TLV: SSID (2), len 9
TLV: Padding (0)
يعتمد التخطيط بعد فك التشفير على Message Type: تحمل إطارات المنارة (beacons) mac_0c / cap_flags / mixed_mode + عناصر TLV للاسم (أعلاه)؛ وتحمل طلبات/ردود الارتباط (assoc req/resp) chainmasks وcap_flags وحقولًا ذيلية خاضعة لإصدار البروتوكول (field_9c وrssi وfwname وtxpower)؛ وطلب الاستقصاء (probe req) يحتوي على الترويسة فقط؛ ويحمل إطار deauth قيمة nonce من نوع jiffies ورمز توثيق غير شفاف (وعنوان MAC المصدر فيه مُقنّع بـ XOR، وهو ما يزيل wiremax قناعه).
| الطراز | التغطية |
|---|---|
| AirMAX AC | الترويسة الخارجية + الرأس المشترك بعد فك التشفير (version + src_mac) + الجسم الخاضع لنوع الرسالة وإصدار البروتوكول (beacon, assoc req/resp, probe req, deauth) + عناصر TLV للاسم |
| AirMAX M | الهيكل الخارجي + 9 بايتات موثقة بعد فك التشفير (version, msg_type, src_mac, enable) + الباقي الخام |
| RouterBoard (Mikrotik) | OUI/النوع + عناصر فرعية IE + اسم الجهاز (نص صريح) |
تُعرض مناطق البايت غير الموثقة بشكل خام (Unknown [n:len]) ولا تُختلق أبدًا — بنفس نهج pyrmax وقاعدة المعرفة ac/.
يعمل كـ محلل لاحق (postdissector) (لا يستبدل محلل 802.11 المدمج، بل يعمل بعده). لكل إطار يقوم بـ:
wlan.tag.oui بالإضافة إلى wlan.sa / wlan.da عبر أدوات استخراج Field؛00:27:22) أو M (00:15:6d) أو RouterBoard (00:0c:42) — بالنسبة لـ AC/M يتطلب أيضًا نوع OUI FF FF FF، لأن 00:15:6d مشترك مع Mikrotik ومع عنصر Ubiquiti آخر يظهر في نفس الإطار؛AES-128-ECB، بمفتاح = HMAC-SHA1(dst_mac, src_mac)[:16]، محاولًا الوجهة 802.11 الملتقطة أولًا ثم الرجوع إلى البث (إطارات الهوية تستخدم مفتاح البث حتى عند الإرسال الأحادي) — والفائز هو من تتطابق عناوين MAC المصدر المضمّنة في حمولته المفكوكة مع مصدر 802.11؛التشفير (SHA-1, HMAC-SHA1, فك تشفير AES-128) هو Lua خالص ومكتفٍ ذاتيًا — لا يعرض Wireshark أي واجهة برمجية للتشفير إلى Lua. الحمولات عبارة عن بضعة كتل من 16 بايت، لذا فالأداء غير مهم. المفتاح مشتق من عناوين MAC عامة، لذا فهذا إخفاء وليس أمانًا.
للاستخدام مرة واحدة (بدون تثبيت):
tshark -X lua_script:airmax.lua -r capture.pcap -V
wireshark -X lua_script:airmax.lua capture.pcap
للتثبيت الدائم (واجهة Wireshark + tshark): ضع مجلد wiremax/ بالكامل في دليل إضافات Lua الشخصي. يظهر المسار الدقيق في Wireshark تحت Help ▸ About Wireshark ▸ Folders ▸ Personal Lua Plugins؛ والمسارات الافتراضية هي:
| نظام التشغيل | مسار إضافات Lua الشخصي الافتراضي |
|---|---|
| Linux | ~/.local/lib/wireshark/plugins/ |
| macOS | ~/.local/lib/wireshark/plugins/ (أو ~/.config/wireshark/plugins/) |
| Windows | %APPDATA%\Wireshark\plugins\ |
يعد الارتباط الرمزي (symlink) مثاليًا أثناء التكرار — تُلتقط التعديلات عند إعادة التحميل (Ctrl+Shift+L) دون خطوة نسخ:
ln -s "$PWD" ~/.local/lib/wireshark/plugins/wiremax
يقوم Wireshark بتحميل كل ملف .lua بشكل متكرر داخل مجلد الإضافات؛ الوحدات الفرعية ضمن wsairmax/ هي وحدات عادية (غير ضارة إذا حُملت بشكل مستقل)، وtest/selftest.lua لا تؤدي أي عملية داخل Wireshark.
أمثلة:
tshark -r cap.pcap -Y 'airmax.ac.ssid' -T fields -e wlan.sa -e airmax.ac.ssid
tshark -r cap.pcap -Y 'airmax.m.msg_type == 1' -T fields -e airmax.m.src_mac
tshark -r cap.pcap -Y 'airmax.rb.device_name' -T fields -e airmax.rb.device_name
يجب أن تكون التسجيلات في وضع مراقبة 802.11 (radiotap)؛ فإطارات الإدارة التي تحمل عناصر IE (beacon / probe response / assoc) غير مشفرة على طبقة 802.11 — فقط حمولة AirMAX داخل IE هي المغلفة بـ AES، وwiremax يفك غلافها.
test/selftest.lua يشغّل التشفير وأجهزة فك الترميز تحت مترجم Lua 5.4 المستقل (بدون Wireshark)، مع التحقق من متجهات مرجعية بالإضافة إلى متجهات SHA-1 / RFC-2202 HMAC القياسية:
lua test/selftest.lua # from this directory
اختبار شامل من البداية إلى النهاية ضد تسجيل حقيقي (يوفّر pyrmax ملفات pcap نموذجية ضمن tests/samples/):
tshark -X lua_script:airmax.lua -r airmax_ac_beacon.pcap -V
tshark -X lua_script:airmax.lua -r airmax_m_probe_response.pcap -V
wiremax/
├── airmax.lua # Wireshark entry: ProtoFields + postdissector + tree
├── wsairmax/ # pure-Lua modules (no Wireshark dependency)
│ ├── util.lua # hex / MAC helpers
│ ├── sha1.lua # SHA-1 + HMAC-SHA1
│ ├── aes.lua # AES-128 ECB decrypt
│ ├── crypto.lua # key derivation + decrypt (mirrors pyrmax/_crypto.py)
│ ├── ac.lua # AirMAX AC decoder (outer ksy: airmax_ac; payload hand-written per 09b)
│ ├── m.lua # AirMAX M decoder (ksy: airmax_m[_payload])
│ └── routerboard.lua # RouterBoard decoder (ksy: routerboard)
├── test/selftest.lua # standalone-Lua test harness
└── README.md
msg_type يضع تسمية 1 = Beacon وفقًا لملاحظات AirMAX-M الأقدم، لكن القيمة 1 تُلاحَظ أيضًا على استجابات probe — فمساحة أنواع رسائل M غير موثّقة بالكامل، لذا اعتمد على الرقم الخام.enc_len، وهو u16 big-endian (09b §3)؛ كانت قراءة البايت الواحد القديمة صحيحة بالصدفة فقط للحمولات الأصغر من 256.version < 9 غير موثقة بالمثل (يُصدر TX القيمة 9 فقط). انظر المتجهات الاصطناعية في test/selftest.lua.عند إضافة أو إعادة تسمية حقل في pyrmax (src/pyrmax/ac.py أو مخططات ksy/*.ksy الخاصة به)، عكسه في وحدة فك الترميز المقابلة wsairmax/*.lua، وإذا كان الحقل ظاهرًا للمستخدم، أضف ProtoField في airmax.lua. تأتي المتجهات المرجعية في test/selftest.lua من ملفات pcap النموذجية لـ pyrmax، لذا سيظهر أي اختلاف هناك.
| الفلتر | المعنى |
|---|
airmax.ac.msg_type | نوع الرسالة: 1 Beacon، 2 Assoc Req، 3 Assoc Resp، 4 Probe Req، 0xC Deauth |
airmax.ac.flags.encrypted | بت التشفير (0x02) |
airmax.ac.version | إصدار التنسيق بعد فك التشفير (البوابة؛ يُصدر TX القيمة 9) |
airmax.ac.src_mac | عنوان MAC المصدر من الرأس المفكوك (يزيل deauth قناعه) |
airmax.ac.mac_0c | عنوان MAC الراديوي للمنارة (BSSID) |
airmax.ac.cap_flags + airmax.ac.cap_flags.chanbw/.high_density/.auth_deauth/.compat_11ax | حقل بتات القدرات (§11) |
airmax.ac.radioname, airmax.ac.ssid, airmax.ac.fwname | سلاسل اسم AC / البرنامج الثابت |
airmax.ac.jiffies_nonce, airmax.ac.enc_token | nonce الخاص بـ deauth + رمز توثيق غير شفاف |
airmax.ac.tlv.tag / .len / .data | مسح TLV الخام |
airmax.m.version, airmax.m.msg_type, airmax.m.src_mac, airmax.m.enable | الحقول الموثقة لـ M |
airmax.m.unknown_rest | ذيل M غير الموثق |
airmax.rb.device_name | اسم جهاز RouterBoard |
airmax.ac.key / airmax.m.key | مفتاح AES المشتق (مولّد، للتحقق) |