Menyapu berjalan di bidang yang bersih atau cara mengumpulkan alamat MAC dari perangkat Wi-Fi terdekat

Saya memulai semua pidato publik saya (untungnya, tidak begitu banyak dari mereka) dengan secara eksplisit atau implisit menyebutkan tesis "Industri kami kompleks, masalah dapat terungkap pada setiap, bahkan langkah yang paling jelas, dan optimis untuk menganggap bahwa semuanya akan sederhana dan mudah - naif" . Anehnya, ide sederhana ini, yang diperoleh selama bertahun-tahun dengan isian kerucut, kadang-kadang merupakan wahyu bagi para profesional yang lebih berpengalaman, meskipun kelihatannya semua antusiasme dan kepercayaan yang mendalam akan infalibilitas ide-ide dan praktik-praktik mereka sendiri seharusnya sudah bertahan lama. Saya akan menceritakan sebuah kisah tentang ini kepada Anda, contoh proyek sederhana, sekilas pandang.




Suatu hari, seorang teman memberi saya tautan ke sebuah startup yang menarik . Orang-orang menyarankan agar perwakilan bisnis kecil dari sektor layanan dan penjualan menyiapkan titik akses (dengan portal tawanan) untuk pelanggan mereka agar dapat mendistribusikan Internet, sekaligus mengumpulkan alamat MAC dari ponsel cerdas orang yang lewat. Tujuan dari tindakan ini sangat sederhana - sejumlah besar jaringan periklanan memungkinkan Anda menargetkan daftar alamat perangkat, oleh karena itu, mengarahkan perusahaan periklanan kepada pengguna yang lewat, kami lebih mungkin menerima pengunjung baru (karena dekat dan "di suatu tempat saya sudah melihatnya") . Itu distribusi selebaran virtual tersebut. Seorang teman bertanya bagaimana hal ini dilakukan dan apakah kita dapat melakukan ini lagi.

Pencarian cepat pada topik tersebut mengungkapkan mekanisme pengumpulan data tersebut. Adaptor WiFi diluncurkan dalam mode mendengarkan udara dan dijalankan melalui saluran, menangkap paket, menganalisisnya, dan mengumpulkan data yang diterima. Ada juga utilitas terbuka yang siap pakai untuk ini, misalnya, airodump-ng dari aircrack-ng . Itu untuk pengulangan, kita hanya perlu menjalankan utilitas ini, lebih disukai pada perangkat yang terpisah dan dapat dipakai, dan mendorong data yang diterima ke dalam basis data, dari mana kita kemudian mendapatkan daftar alamat MAC yang siap pakai untuk jaringan iklan. Tampaknya tugas itu sederhana, diselesaikan dalam satu, paling banyak - dua malam kerja santai, hampir semuanya sudah siap.

Tentu saja, ini tidak pernah terjadi.

Seperti yang Anda tahu, apa yang diizinkan untuk Jupiter tidak diizinkan untuk banteng. Dan ketika pembayar tunggal digunakan, maka Anda harus mengorbankan, pertama-tama, sumber daya komputasi dan memori. Selanjutnya, pengorbanan sumber daya diikuti oleh pengorbanan kenyamanan pengembangan dan debugging - tidak setiap sistem akan memungkinkan menyeret alat kompilasi ke perangkat.

Awalnya, kami ingin mengambil sesuatu yang sederhana dan murah, misalnya, kotak Orange Pi Zero, letakkan airodump-ng di sana dan teruskan data yang dimuntahkan oleh utilitas ke server, di mana mereka dapat dengan aman dimasukkan ke dalam database. Saya punya pengalaman bekerja dengan sistem terdistribusi seperti itu dengan pusat khusus (walaupun, di sana, mesin virtual bertindak sebagai workhorses diangkat melalui cloud API melalui pusat yang sama seperti yang diperlukan, tetapi bukan intinya), sehingga bagian dari kode berhasil bermigrasi ke proyek baru .

Alat untuk meneruskan data ke server adalah aplikasi Erlang paling sederhana yang ditulis, yang seharusnya untuk menarik data dari peredam eter (penguraian), membuat serialisasi (serialisasi asli Erlang) dan mentransfernya melalui soket web ke server melalui HTTPS (tanpa menimbulkan kecurigaan Sistem DPI dan tidak menemukan protokol mereka sendiri). Prosesor Allwinner H2 + yang digunakan dalam Orange Pi cukup kuat untuk berkumpul dan debug langsung pada perangkat. Sekali lagi, secara teori, semuanya baik-baik saja.

Latihan telah dimulai.

1. ternyata, built-in WiFi di Orange Pi hanya baik untuk mengambil jalur akses dan membuang data ke server. Yah, lebih tepatnya, bukan adaptor itu sendiri, tetapi dukungan chipsetnya di kernel. Untuk sebagian besar proyek IoT, ini mungkin sudah cukup. Namun, kami siap untuk pukulan ini, karena studi pendahuluan dari situs aircrack-ng memberikan yang sangat jelas dan ambigu "itu tidak akan bekerja di mana-mana, jika itu bukan kesalahan kami, kami akan melampirkan daftar chipset yang teruji". Hampir semua perangkat Atheros (dibeli oleh Qualcomm) dan Ralink (dibeli oleh MediaTek) ditemukan dalam daftar, yang menginspirasi beberapa prospek dalam hal transisi dari ARM Cina yang rakus ke MIPS yang lebih asketis dari chipset untuk router.

Tapi, sementara ini semua berasal dari ingus dan tongkat, mis. prototyped - Anda harus menyelesaikan masalah di sini dan sekarang. Oleh karena itu, kami memanfaatkan eksotik semacam itu di zaman teknologi kami (saat komunikasi nirkabel lebih ringan) sebagai adaptor USB Wi-Fi. Mempelajari daftar kompatibilitas dan membandingkannya dengan bermacam-macam toko terdekat memberi korban - DLink DWA-160 dalam revisi C1 (ini penting karena revisi perangkat keras lain menggunakan chip yang berbeda dan menyebabkan sakit kepala dalam hal menegakkan pekerjaan). Dual-band, yang tidak perlu menari dengan pengemudi, karena dukungan telah lama berada di kernel, peluit ini berguna kemudian dalam operasi di proyek lain, jadi saya membelinya, mungkin semua (lima potong) yang tersedia di kota provinsi kami.



Setelah memastikan bahwa perangkat itu berfungsi, saya menghubungkannya ke perangkat papan tunggal dan mematikan adaptor WiFi bawaan dengan harapan bahwa Internet akan tersedia melalui antarmuka Ethernet.



Babi kedua diletakkan dengan aircrack-ng. Utilitas ini dibuat dengan tujuan peretasan.Pemeriksaan penetrasi WiFi, mis. ditulis oleh peretas untuk peretas. Saya tidak tahu, berkat logika apa yang mereka pilih untuk menggunakan dumper eter nirkabel bukan dalam bentuk pendekatan unix-way tradisional, untuk memuntahkan teks terstruktur untuk diproses lebih lanjut, tetapi untuk membuat antarmuka istilah lengkap yang digunakan untuk menampilkan informasi dalam hampir waktu nyata (dan dengan mempertimbangkan pengaturan terminal) oleh jaringan dan perangkat yang ditemukan, tetapi mereka melakukan hal itu. Ya, saya menemukan API Python dari tingkat kesiapan yang tidak diketahui untuk semua ini, tetapi, sekali lagi, laba-laba prototyping yang hidup di kepala saya secara ketat melarang menyeret bahasa lain, beralih ke bahasa lain (kami ingat, bagian server sudah sebagian siap dan ditulis jauh dari Python-e) atau, Tuhan melarang, menerapkan airodump-ng sendiri berdasarkan tcpdump. Dan akibatnya,Saya harus mencari solusi.

Untungnya, peretas nirkabel mulai mencurigai sesuatu yang terus-menerus macet di antarmuka adalah kegiatan semacam itu, sehingga mereka menerapkan pengunggahan berkala atas semua yang ditemukan dan dikumpulkan sebagai file CSV. Dengan interval yang ditentukan. Anda sudah bisa hidup dengannya. Tentu saja, opsi naif - untuk menjalankan utilitas dan membaca kembali file pada timer - segera diberikan dengan tangan. Bekerja pada laptop, ketika mentransfer ke papan tunggal, itu mulai gagal dalam proses membaca file karena alasan yang jelas - kadang-kadang utilitas tidak punya waktu untuk membongkar semuanya dan beberapa data hilang secara permanen.

Solusi untuk ini adalah mekanisme inotify di kernel, memberitahukan operasi file - segera setelah kode saya melihat perubahan pada file data, ia memulai pembacaannya dengan sedikit penundaan (lebih tepatnya, memiliki nilai psikologis murni, yakinkan pembuatnya). Percobaan menunjukkan bahwa dalam kasus ini, kegagalan membaca dan kehilangan data tidak terjadi. Nah, bagus, CSV parsim, dimasukkan ke dalam struktur internal dan kirim ke server. Kami menyimpannya di server di PostgreSQL (terima kasih untuk jsonb) dan setelah itu sudah dimungkinkan untuk membuat pertanyaan, membongkar formulir, dll. Kami akan menambahkan otorisasi yang paling sederhana menggunakan kunci simetris, sehingga kami tidak menjejalkan sampah di sana dan kami dapat mengikat data ke titik di mana perangkat diinstal, dan semuanya tampak baik-baik saja, Anda dapat pergi berperang.

Ya, sekarang bagaimana. Perakitan uji coba rantai ini (dan penulisan kode dan debugging benar-benar memakan waktu beberapa malam) mengungkapkan fakta lucu - jumlah alamat yang ditangkap per hari di kantor kami, cukup jauh dari tempat-tempat yang lumayan umum, berfluktuasi sekitar beberapa ribu keping. Ya, tentu saja, ada sebuah hotel kecil di dekatnya (itu pada waktu pra-karantina, jangan kaget), tapi tetap saja, ada banyak.

Menyegarkan pengetahuan struktur alamat MAC dan mengingat fakta bahwa perangkat seluler sering menghasilkan alamat lokal untuk menyembunyikan alamat MAC mereka yang sebenarnya, saya memodifikasi bagian server dengan filter sederhana yang membersihkan semua siaran dan alamat lokal pada input. Daftar itu dikurangi dengan urutan besarnya dan sudah tampak seperti kebenaran. Semuanya siap untuk uji coba lapangan.

Seperti yang Anda ketahui, ketika mengubah lokasi dari kantor yang hangat dan nyaman ke kondisi pertempuran yang kejam, prototipe cenderung berhenti berfungsi secara normal, sehingga proses implementasi harus disertai dengan pasokan insinyur saku yang akan memperbaiki semua masalah yang muncul. Di sisi lain, juga diketahui bahwa alat yang tidak memerlukan tarian tambahan dengan rebana di awal operasi kemungkinan akan segera rusak, dan tidak dapat dibatalkan. Ini, tentu saja, tercermin dalam hukum Murphy, tetapi, sayangnya, penulis baris ini terlalu malas untuk memeriksa yang mana, oleh karena itu, kami akan menyetujui istilah "hukum kekejaman".

Instalasi pertama segera mengungkapkan banyak kekurangan.

Pertama, sebagian besar papan prototipe Cina datang dengan memori microSD jangka panjang sebagai lawan dari chip flash NAND / NOR. Pengecualian hanya dibuat untuk SoC yang kuat, jelas berlebihan untuk tugas ini. Sayangnya, MicroSD adalah sakit kepala langsung operator - mengoksidasi bantalan, kegagalan kartu SD, ketergantungan kontak pada suhu di dalam kasing (yang cukup besar, chip Cina tidak sangat hemat energi, dan papan sering dihitung sepenuhnya berdasarkan pada konsumsi daya puncak, jadi tanpa radiator tambahan, yah, tidak mungkin). Jadi ternyata ketika daya dicabut dari perangkat, sistem menjadi tidak beroperasi - file dengan bytecode ERTS rusak, setelah reboot aplikasi menolak untuk bekerja.

Momen tidak menyenangkan kedua - pada titik instalasi, Internet disediakan oleh router LTE dan, secara halus, kualitas biasa-biasa saja, tidak seperti kabel kantor. Jaringan terus-menerus dipicu, aplikasi sering terhubung kembali, atau bahkan mati karena akumulasi pesan dalam antrian.

Tentu saja, kedua masalah dapat diatasi, misalnya, kehilangan data akan dihilangkan dengan mencari kombinasi optimal dari kartu microSD dan pengaturan sistem file yang baik, dan ketidakstabilan koneksi dapat dikompensasi dengan agregasi data awal, sesi pengiriman pendek, batas waktu, dll. Tetapi masalah yang telah terungkap adalah kesempatan untuk merenungkan apakah jalan yang benar telah dipilih. Kebutuhan untuk koneksi permanen ke server mengakhiri pengumpulan data acara, ketika perangkat digantung pada baterai eksternal dan dilemparkan ke dalam ransel, pemilik yang pergi ke acara massal, di mana, tentu saja, Anda tidak dapat mengharapkan stabilitas koneksi.

Oleh karena itu, langkah selanjutnya adalah meninggalkan bagian server dan melokalkan gudang data langsung pada perangkat. Selain itu, untuk menghindari eksperimen lama dan sangat suram dengan kartu SD, diputuskan untuk menggunakan model papan tempat memotong roti dengan chip flash di iterasi berikutnya.

Pada saat itu, saya ingat bahwa dalam koleksi saya ada papan Carambola 2 yang indah dari kawan-kawan Lithuania 8Devices . Dan jika Anda pergi ke situs mereka, Anda dapat menemukan perangkat yang lebih kompak pada chip yang sama yang disebut Lipan. Eksperimen sebelumnya dengan perangkat kelas ini menunjukkan bahwa Erlang sepenuhnya sesuai dengan memori flash 16 MB yang dialokasikan (dan sedikit sisa untuk aplikasi). Satu-satunya minus (yang agak bahkan plus) adalah MIPS berdaya rendah dan kebutuhan untuk kompilasi silang, yang membuat membangun aplikasi Erlang sedikit lebih non-sepele. Tapi itu sudah merupakan rute yang terkenal, jadi saya memesan beberapa Lipan, dan sejauh ini saya telah porting versi yang ada yang bekerja dengan server ke Carambol.



Ketika komponen tiba, fase baru dimulai. Chip AR9331 berhasil didukung oleh aircrack-ng dari kotak, data dapat diambil dari antarmuka Ethernet, versi terbaru OpenWRT dan ERTS telah dikumpulkan dan berhasil diuji. Aplikasi ini ditulis ulang - bagian dari kode dipindahkan ke kode perangkat, data diakumulasikan dalam proses terpisah dan secara berkala dibuang ke file dalam bentuk istilah Erlang berseri. Untuk ini ditarik antarmuka berbasis web paling sederhana yang menerima data melalui websocket. Port untuk inotify dan erlexec dikompilasi dengan aman dengan OpenWRT.

Hanya satu hal yang membingungkan - 300 kilobyte tersisa pada data. Ini tidak terlalu kecil jika Anda hanya menyimpan alamat MAC dari perangkat klien, tetapi airodump-ng memberi Anda informasi yang jauh lebih menarik, termasuk alamat titik akses, ESSID mereka dan sebagainya, yang juga menyenangkan untuk diingat. Untuk berjaga-jaga. Oke, kita akan bertindak sesuai keadaan.

Kami mengumpulkan, memeriksa. Masalah terungkap dengan cepat.

Openwrt, seperti yang kita semua tahu, ini adalah Linux minimalis yang dirancang khusus untuk perangkat dengan memori terbatas. Sebagai hasilnya, ia membuang dari sana bahwa mungkin untuk membuang tanpa rasa sakit, dan menyederhanakan apa yang bisa disederhanakan, termasuk mode multipemain. Itu Ini adalah praktik umum ketika kode dimulai dari root dan bekerja dengan hak maksimum, yang, tentu saja, memfasilitasi masalah yang terkait dengan grup, pengguna, dan kontrol tindakan mereka. Ya, ya, huruf S dalam singkatan IoT bertanggung jawab atas keamanan. Masalahnya adalah erlexec itu, yang saya gunakan untuk menjalankan dan mengelola airodump-ng, tidak dapat melakukan operasi dari bawah root - untuk ini, diperlukan pengguna tambahan, atas nama yang akan menelurkan proses yang ditugaskan untuk itu. Dan ketika membuat pengguna tambahan dengan tingkat hak istimewa yang berbeda ... dengan benar, itu mencegah airodump dari mencapai perangkat jaringan. Melepas pembatasan dari perpustakaan ini tampaknya merupakan proses yang lambat, jadi erlexec digantikan dengan port - mekanisme bawaan untuk meluncurkan proses pihak ketiga di Erlang. Agak, tapi tidak menyenangkan.

Jadi, perangkat diterima, diremukkan, dan bahkan bekerja dalam kondisi rumah kaca. Kami menangkap baterai, melempar kotak itu ke dalam ransel, pergi ke mal. Hari berikutnya, kita melihat hasilnya - kegagalan, file data dengan panjang nol - baik tidak ada ruang yang cukup, atau distorsi daya tidak berfungsi pada saat yang sangat baik. Kami memperbaiki kode sehingga penghematan terjadi dalam dua tahap - pertama file sementara dibuat, lalu diganti dengan yang sekarang.

Namun, kedua tangan tidak dapat memeriksa operabilitas opsi ini - mainan berikutnya - Onion Omega2 + pada Mediatek 7688 mulai terlihat. Seperti saudara mereka, perancang LinkIt Smart 7688 , ada banyak hal, tetapi yang paling penting adalah memori flash dua kali lipat, yang berarti Anda tidak bisa lagi khawatir tentang kurangnya ruang untuk penyimpanan data. baik

Kami memesan, tunggu. Bulan. Dua. Sabar meledak - kami menulis kepada orang Amerika tentang subjek "di mana barang, Zin". Diam. Buka perselisihan di PayPal. Orang Amerika bangun. Mereka berkata, "Oh, sistem penerimaan pesanan kami telah gagal, sekarang kami akan mengirim semuanya." Mereka mengirim, kami menunggu tiga minggu. Fuh, perangkat sudah dekat dan bahkan berfungsi.



Di sini kita perlu melakukan penyimpangan kecil - walaupun faktanya saya memiliki beberapa papan LinkIt Smart dalam jarak berjalan kaki, saya tidak menganggapnya sebagai platform, karena pada awal hikayat, upaya untuk menggunakannya sebagai perangkat penangkapan gagal. Kemudian driver untuk chip diberikan dalam bentuk modul rakitan untuk versi spesifik dari kernel dan, tampaknya, ini menjadi penyebab ketidakmampuan operasi. Dalam versi terbaru OpenWRT, baik dukungan asli untuk 7688 dan driver terbuka muncul, jadi ini adalah kesempatan untuk mempertimbangkan kembali pendekatan ke perangkat ini.

Namun, sudah biasa untuk menggunakan WiFi langsung pada chip untuk tujuan yang dimaksudkan - setelah semua, perangkat memerlukan setidaknya beberapa antarmuka kontrol, dan juga di lapangan, setidaknya untuk memahami apakah itu berfungsi atau tidak. Untuk melihat data yang diperoleh juga akan bermanfaat.

Karena itu, kami menggabungkan pendekatan sebelumnya - kami menggunakan satu-satunya antarmuka USB yang ditampilkan pada MiniDoc untuk peluit WiFi untuk memindai ruang, dan WiFi bawaan - untuk mengontrol perangkat sebagai titik akses berdaya rendah. Kami mengumpulkan, memeriksa, semuanya berfungsi.

Tapi nafsu makan datang dengan makan. Untuk mulai dengan, file data dalam bentuk serialisasi Erlang adalah banyak maniak nyata, dan berbagai profesional terlatih yang sedikit lebih luas membutuhkan sesuatu yang lebih sederhana. Sekali lagi, selain menambahkan data dari airodump, saya juga ingin waktu pengukuran yang tepat, dan, lebih disukai, setidaknya beberapa jenis referensi ke lokasi perangkat di ruang angkasa.

Kami menyematkan antara peluit WiFi dan perangkat hub USB. Pengaturan (dan mereka bergantung pada posisi perangkat pada bus dalam hal OpenWRT) berhutan, tetapi ini adalah hal-hal sepele. Benar. Kami mengeluarkan penerima USB-GPS dari puing-puing, untungnya, sudah teruji oleh waktu dan dengan kode tertulisPenguraian NMEA-0183 (kode, tentu saja, harus diperbaiki pula). Kami memeriksa - perangkat tidak terdeteksi dengan aman oleh sistem, jelas ada kekurangan driver. Kami mengumpulkan driver USB Serial dan menjatuhkannya ke perangkat - juga diam. Kemudian kita ingat bahwa dalam sistem besar peluit GPS terdeteksi bukan ttyUSBx, tetapi sebagai ttyACMx, mis. Modem GSM USB. Baiklah, panggilan kedua untuk menambah driver, sukses.

Kami mengambil kode, mengintegrasikan ke dalam aplikasi. Tambahkan sqlite3 ke aplikasi sebagai penyimpanan. Sekarang tidak perlu untuk memeriksa ketersediaan catatan di negara bagian, dan secara umum pekerjaan dengan data disederhanakan ke sejumlah kecil garis. Menyatukan semuanya, kami mengajarkan ketika menambahkan data untuk membaca GPS, kami memperbaiki kode JS pada wajah untuk ditampilkan jika set data tidak lengkap (itu bisa terjadi ketika GPS belum menangkap satelit, dan data pemindaian udara sudah berjalan). Kami memeriksa pekerjaan - sepertinya hidup. Anda dapat mendeklarasikan kemenangan sementara.



Selama beberapa minggu pekerjaan tanpa gangguan - banyak data baik di stasiun di udara maupun di pelanggan. Sekarang saya berjuang dengan godaan untuk menawarkan perangkat ini kepada spesialis keamanan informasi untuk mengontrol penyiaran di wilayah yang dipercayakan dan kepada negara untuk mengontrol pergerakan ponsel warga. Ini lelucon, tentu saja, mereka sendiri sudah tahu segalanya.

Jadi, semua cobaan yang dijelaskan di atas hanyalah sebuah proyek kesayangan dengan kompleksitas yang sangat rendah (hampir segera jelas apa yang harus dilakukan dan bagaimana), kurangnya pengembangan perangkat keras (halo, fisika) dan akses ke produk yang agak lebih lengkap atau kurang lengkap. Tidak, tentu saja, tidak dapat dikesampingkan bahwa penulis dari baris-baris ini adalah seorang amatir yang padat, dan guru sejati pergi dengan cara ini dalam satu malam antara minum teh sore dan segelas cognac, tetapi sejauh ini pengalaman hanya menunjukkan satu hal: IT rumit dan optimisme di sini dihukum secara finansial, reputasi dan secara motivasi, dan mereka yang mengatakan "semuanya sederhana" adalah jenius atau penjahat, dan yang kedua lebih mungkin.

All Articles