Serverni yo'q qilish haqidagi xaker o'yinining orqa qismi qanday yaratilgan

Serverni yo'q qilish haqidagi xaker o'yinining orqa qismi qanday yaratilgan
Biz sizga serverni yo'q qilish bo'yicha lazer qidiruvimiz qanday tashkil etilganligini aytib berishda davom etamiz. Oldindan boshlang kvestni hal qilish haqida maqola.

Hammasi bo'lib, o'yinning orqa tomonida 6 ta me'moriy birlik mavjud bo'lib, biz ushbu maqolada tahlil qilamiz:

  1. O'yin mexanizmlari uchun mas'ul bo'lgan o'yin ob'ektlarining orqa qismi
  2. VPS-da backend va sayt ma'lumotlar almashinuvi avtobusi
  3. Backend so'rovlaridan (o'yin elementlari) Arduino va saytdagi uskunaga tarjimon
  4. O'rni nazorat qilish uchun mas'ul bo'lgan Arduino tarjimondan buyruqlar oldi va haqiqiy ishni bajardi.
  5. Haqiqiy qurilmalar: fan, gulchambarlar, pol lampalari va boshqalar.
  6. Frontend - o'yinchilar qurilmalarni boshqaradigan Falcon veb-saytining o'zi

Keling, ularning har birini ko'rib chiqaylik.

O'yin ob'ektlarining orqa tomoni

Backend bahorgi yuklash ilovasi sifatida amalga oshirildi: unda bir nechta dam olish kontrollerlari, veb-soket so'nggi nuqtasi va o'yin mantig'iga ega xizmatlar mavjud edi.

Faqat uchta boshqaruvchi bor edi:

  • Megatron. Joriy Megatron sahifasi GET so'rovlari orqali yuborildi: quvvatni yoqishdan oldin va keyin. POST so'rovi orqali lazer otildi.
  • Tilde sahifalarini sahifa nomi bo'yicha xizmat ko'rsatishi uchun xaritalash. Tilde eksport uchun sahifalarni asl nomlar bilan emas, balki ichki ID va muvofiqlik ma'lumotlari bilan ishlab chiqaradi.
  • Pseudo-yuqori yuklangan server captcha-ga xizmat ko'rsatish uchun Captcha kontrolleri.

Websocket so'nggi nuqtasi gadjetlarni boshqarish uchun ishlatilgan: lampalar, gulchambarlar va harflar. U barcha o'yinchilarga qurilmaning joriy holatini sinxron tarzda ko'rsatish uchun tanlangan: u yoqilgan yoki o'chirilganmi, faolmi yoki yo'qmi, hozirda devorda harfning qaysi rangi yonib turadi. Lazerni yoqish vazifasini biroz qiyinlashtirish uchun biz gulchambar va lazerga bir xil login va parol admin/admin bilan avtorizatsiya qo'shdik.

Aktyorlar uni gulchambarni yoqish orqali sinab ko'rishlari va lazer bilan takrorlashlari mumkin edi.

Biz o'yinchilarni keraksiz tanlov bilan qiynamaslik uchun shunday arzimas login-parol juftligini tanladik.

Vazifani biroz qiziqarliroq qilish uchun mongodb ob'ekt identifikatorlari xonada qurilma identifikatorlari sifatida ishlatilgan.

ObjectId vaqt tamg'asini o'z ichiga oladi: ikkita tasodifiy qiymat, ulardan biri qurilma identifikatori asosida olinadi, ikkinchisi esa uni yaratuvchi jarayonning pidi va hisoblagich qiymatiga asoslanadi. Men identifikatorlarni muntazam ravishda va turli xil pid jarayonlari bilan, lekin umumiy hisoblagich bilan yaratmoqchi edim, shunda lazer qurilmasi identifikatorini tanlash yanada qiziqarli bo'ladi. Biroq, oxir-oqibat, har bir kishi faqat hisoblagich qiymatida farq qiladigan identifikatorlardan boshladi. Bu qadamni juda sodda qilib qo'ygan bo'lishi mumkin va objectId strukturasini tahlil qilishni talab qilmaydi.

Backend so'rovlaridan tarjimon

Python skripti, taymerlar ustida ishlagan va ularni o'yin abstraksiyalaridan jismoniy modelga tarjima qilgan. Masalan, "pol chiroqni yoqing" β†’ "N2 o'rni yoqing".

Skript RabbitMQ navbatiga ulangan va so'rovlarni navbatdan Arduino-ga o'tkazgan. Shuningdek, u parallel yorug'likni almashtirish mantiqini amalga oshirdi: ba'zi qurilmalar bilan birgalikda ulardagi yorug'lik yoqildi, masalan, Megatronga dastlab quvvat berilganda, u sahna nuri bilan yoritilgan. Butun sahnaning kinematografiyasi uchun yorug'lik dizayni loyihamizning prodyuseri va prodyuseri Ilya Serovning ajoyib ishi haqida alohida hikoya bo'lib, biz bu haqda alohida postda aytib beramiz.

Tarjimon, shuningdek, taymer yordamida maydalagichni ishga tushirish va tasvirni televizorga uzatish mantig'i uchun ham javobgar edi: maydalagichni ishga tushirish uchun taymer, qichqirayotgan kapibara, o'yin oxiridagi reklama.

Megatron tokenini yaratish mantig'i qanday tuzilgan

Sinov zarbasi

Har 25 soniyada yangi token yaratildi va lazerni 10/10 quvvatda 255 soniya davomida yoqish uchun ishlatilishi mumkin edi. ga havola Megatron kodi bilan github.

Keyin lazer 1 daqiqa sovib ketdi - bu vaqt davomida u mavjud emas edi va yangi tortishish so'rovlarini qabul qilmadi.

Bu kuch arqondan o'tish uchun etarli emas edi, lekin har qanday o'yinchi Megatronni otib, lazer nurini harakatda ko'rishi mumkin edi.

Tokenni yaratish uchun MD5 xesh algoritmidan foydalanilgan. Va sxema amalga oshdi MD5 dan MD5 + hisoblagich + maxfiy jangovar token uchun va sinov belgisi uchun sirsiz.

MD5 - bu bizning qo'llab-quvvatlovchimiz Pavel qilgan tijorat loyihasiga havola. Bir necha yil oldin bu loyiha MD5 dan foydalangan va u loyiha arxitektoriga bu eskirgan shifrlash algoritmi ekanligini aytganida, ular MD5 dan MD5 dan foydalanishni boshladilar. Biz eng noob loyihani amalga oshirishga qaror qilganimiz sababli, u hamma narsani esladi va kichik bir ma'lumot berishga qaror qildi.

Jangovar zarba

Megatronning jangovar rejimi 100 vattda 3% lazer kuchidir. Bu og'irlikni ushlab turgan arqonni yoqish, akvariumni sindirish va serverni suv bilan to'ldirish uchun 2 daqiqa kifoya qiladi.

Loyihaning Github-da biz bir nechta maslahatlarni qoldirdik: aniqrog'i, token yaratish kodi, undan test va jangovar tokenlar bir xil hisoblagich ko'rsatkichi asosida yaratilganligini tushunish mumkin. Jangovar token bo'lsa, hisoblagich qiymatiga qo'shimcha ravishda tuz ham qo'llaniladi, bu oxirgi ikki belgidan tashqari, ushbu g'oyani o'zgartirish tarixida deyarli butunlay qolgan.

Ushbu ma'lumotni bilib, tuzning oxirgi 2 ta belgisini saralash va aslida Lost-dan o'n oltilik tizimga o'tkazilgan raqamlar ishlatilganligini aniqlash mumkin edi.

Keyin o'yinchilar hisoblagich qiymatini (sinov tokenini tahlil qilish orqali) ushlashlari va keyingi hisoblagich qiymati va oldingi bosqichda tanlangan tuz yordamida jangovar token yaratishlari kerak edi.

Hisoblagich har bir sinov zarbasi bilan va har 25 soniyada oddiygina oshirildi. Biz bu haqda hech qayerda yozmadik, bu kichik o'yin syurprizi bo'lishi kerak edi.

Captcha shovqin xizmati

O'yin dunyosida bu fanni yoqish va flipchartni maslahat bilan ochish uchun yuklanishi kerak bo'lgan xuddi shu captcha edi. Kamera yonida yukni nazorat qiluvchi noutbuk bor edi.

Serverni yo'q qilish haqidagi xaker o'yinining orqa qismi qanday yaratilgan

xizmat Monitoringda joriy yuk sifatida nimani ko'rsatishni hisoblab chiqdim: harorat va CPU Fan. Ko'rsatkichlar vaqt bazasi ma'lumotlar bazasiga o'tkazildi va grafana tomonidan chizilgan.

Agar so'nggi 5 soniya ichida captcha-ni ko'rsatish uchun 50 dan ortiq so'rovlar bo'lsa, unda yuk belgilangan + tasodifiy qadamlar soniga ko'paydi. Hisob-kitoblarga ko'ra, ikki daqiqada 100% yukga erishish mumkin edi.

Aslida, xizmatda oxirgi o'yinda ko'rsatilganidan ko'ra ko'proq mantiq bor edi: biz monitorni faqat CPU Fanning aylanishi ko'rinadigan tarzda joylashtirdik.

Kvestning boshida ular Grafan-ni Falcon veb-saytidan foydalanish imkoniyatini qoldirishni xohlashdi. Ammo u shuningdek, backend ilovasi hisobotidagi Springboot ko'rsatkichlarini o'z ichiga olgan, biz ularni tozalashga vaqtimiz yo'q edi, shuning uchun biz unga kirishni bloklashga qaror qildik. Va bu to'g'ri - kvestning boshida ham ba'zi o'yinchilar dastur bahorgi yuklash tizimida yozilgan deb taxmin qilishdi va hatto ba'zi xizmatlarning nomlarini qazib olishdi.

Xosting va ma'lumotlar avtobusi

Ma'lumotni orqa qismdan saytga, RabbitMQ ishlayotgan VPS serveriga o'tkazish vositasi.

Backend va ma'lumotlar avtobusi yoqilgan edi bizning VPS. Uning quvvatini siz ekranda ko'rgan kompyuter bilan solishtirish mumkin edi: ikki gigabayt operativ xotiraga ega 2 yadroli VPS. Tarif resurslar uchun undirildi, chunki eng yuqori yuk bir necha kunga rejalashtirilgan edi - VPS-ni qisqa vaqt ichida yuklashni rejalashtirgan mijozlarimiz shunday qilishadi. Keyin ma'lum bo'ldiki, yuk biz kutgandan ko'proq bo'lib, qat'iy belgilangan tarif foydaliroq bo'ladi. Agar kvest qilsangiz, liniya tariflarini tanlang turbo.

Serverni DDoSa dan himoya qilish uchun biz Cloudflare-dan foydalandik.

Aytish kerakki, VPS hamma narsaga sharaf bilan bardosh berdi.

O'rni nazorat qilish uchun mas'ul bo'lgan Arduino tarjimondan buyruqlar oldi va haqiqiy ishni bajardi.

Bu loyihaning apparat qismi haqidagi keyingi maqolaning mavzusi: backend shunchaki ma'lum bir releyni yoqish uchun so'rovlarni yubordi. Shunday qilib, backend deyarli barcha ob'ektlarni bilar edi va undan so'rovlar "ushbu ob'ektni yoqing" kabi ko'rinardi. Biz buni saytni erta sinovdan o'tkazish uchun qildik (biz hali barcha Arduino va relelarni yig'magan edik), oxirida biz hamma narsani shunday qoldirdik.

Foydalanuvchi interfeysi

Biz tezda tilde ustida sayt yaratdik, bu bir ish kunini oldi va bizning byudjetimizga 30 mingni tejab qoldi.

Dastlab biz saytni shunchaki eksport qilish va etishmayotgan mantiqni qo'shish haqida o'yladik, lekin biz buni amalga oshirishni taqiqlovchi foydalanish shartlariga duch keldik.

Biz litsenziyani buzishga tayyor emas edik, shuning uchun ikkita variant bor edi: hamma narsani o'zimiz amalga oshirish yoki to'g'ridan-to'g'ri Tilda bilan bog'lanish, loyiha haqida gaplashish va kodni o'zgartirishga ruxsat so'rash.

Biz ikkinchi variantni tanladik va ular bizni nafaqat yarim yoβ€˜lda uchratishdi, balki bizga bir yillik bepul biznes hisobini ham berishdi, buning uchun biz ulardan juda minnatdormiz. Ularga Sokolning veb-sayt dizaynini ko'rsatish juda noqulay edi.

Natijada, biz elementar qurilmalarga so'rov yuborish uchun js logikasini old qismga biriktirdik va o'yin elementlarini yoqish va o'chirish uchun tugmachalarning uslublarini biroz o'zgartirdik.

Veb-sayt dizayni

Alohida bobga arziydigan qidiruvlar tarixi.

Biz nafaqat eskirgan saytni, balki dizaynning barcha asosiy qoidalarini buzadigan mutlaqo jirkanch saytni yaratmoqchi edik. Shu bilan birga, ishonchlilikni saqlab qolish juda muhim edi: u KBB hikoyasini buzmasligi, muallifning da'vogarligini namoyish qilishi kerak edi va o'yinchilar bunday sayt mavjudligiga va hatto mijozlarni olib kelishiga ishonishlari kerak edi. Va u olib keldi! O'yin davom etayotganda biz bilan ikki marta veb-saytlar yaratish uchun bog'lanishdi.

Avvaliga koβ€˜proq gif va yorqin elementlarni kiritishga harakat qilib, dizaynni oβ€˜zim qildim. Ammo mening 10 yillik dizaynerlik turmush o'rtog'im yelkasiga qaradi va buni "juda yaxshi" deb rad etdi. Dizayn qoidalarini buzish uchun siz ularni bilishingiz kerak.

Serverni yo'q qilish haqidagi xaker o'yinining orqa qismi qanday yaratilgan

Doimiy jirkanish tuyg'usini keltirib chiqaradigan bir nechta rang kombinatsiyasi mavjud: yashil va qizil teng boylik, kulrang va pushti, ko'k va jigarrang. Oxir-oqibat, biz asosiy ranglar sifatida qizil va yashil ranglarning kombinatsiyasiga qaror qildik, mushuk bilan gif qo'shdik va stok fotosuratidan Sokolovning 3-4 fotosuratini tanladik. Menga bir nechta talablar bor edi: o'rta yoshli erkak, bir-ikki o'lchamdagi noto'g'ri kostyum kiygan va "professional studiyada suratga olish" pozasida. Sinov uchun ular uni do'stlariga ko'rsatishdi va "sizga bu qanday yoqadi?" Deb so'rashdi.

Dizaynni ishlab chiqish jarayonida erim har yarim soatda yotishga majbur bo'ldi, vertolyot ucha boshladi. Pasha ko'zlarini himoya qilish uchun old qismni tugatgandan so'ng ekranning katta qismi uchun dasturchi konsolini ochishga harakat qildi.

Haqiqiy qurilmalar

Fanlar va chiroqlar qattiq holatdagi o'rni orqali o'rnatildi, shunda ular darhol to'liq quvvatda yoqilmaydi - shuning uchun quvvat monitoring bilan parallel ravishda kuchayadi.

Ammo biz bu haqda keyingi postda, o'yinning apparat qismi va saytning haqiqiy qurilishi haqida gapiramiz.

Yangiliklarni kuzatib boring, xabardor bo'lib boring; Biz bilan qoling!

Serverni yo'q qilish haqidagi boshqa maqolalar

Serverni yo'q qilish haqidagi xaker o'yinining orqa qismi qanday yaratilgan

Manba: www.habr.com

a Izoh qo'shish