Bir sunucuyu yok etmeye yönelik bir hacker oyununun arka ucu nasıl oluşturuldu?

Bir sunucuyu yok etmeye yönelik bir hacker oyununun arka ucu nasıl oluşturuldu?
Sunucunun yok edilmesiyle lazer arayışımızın nasıl düzenlendiğini size anlatmaya devam ediyoruz. Öncekinden başla Görevi çözme hakkında makale.

Toplamda oyunun arka ucunda 6 mimari birim vardı ve bunları bu makalede analiz edeceğiz:

  1. Oyun mekanizmalarından sorumlu olan oyun varlıklarının arka ucu
  2. VPS'de arka uç ve site veri alışverişi veri yolu
  3. Arka uç isteklerinden (oyun öğeleri) Arduino'ya ve sahadaki donanıma çevirmen
  4. Rölelerin kontrolünden sorumlu olan Arduino, tercümandan komutlar aldı ve asıl işi yaptı.
  5. Gerçek cihazlar: fan, çelenkler, zemin lambaları vb.
  6. Ön Uç - Oyuncuların cihazları kontrol ettiği Falcon web sitesinin kendisi

Her birinin üzerinden geçelim.

Oyun varlıklarının arka ucu

Arka uç bir bahar önyükleme uygulaması olarak uygulandı: birkaç dinlenme denetleyicisine, bir websocket uç noktasına ve oyun mantığına sahip hizmetlere sahipti.

Yalnızca üç denetleyici vardı:

  • Megatron. Mevcut Megatron sayfası, gücü açmadan önce ve sonra GET istekleri aracılığıyla gönderildi. Lazer, POST isteği aracılığıyla ateşlendi.
  • Yaklaşık sayfalarını, sayfa adına göre sunulacak şekilde eşleme. Tilde, orijinal adlarla değil, dahili kimlik ve uyumluluk bilgileriyle dışa aktarılacak sayfalar üretir.
  • Sahte yüksek yüklü sunucu captcha'sını sunmak için Captcha denetleyicisi.

Websocket uç noktası, gadget'ları kontrol etmek için kullanıldı: lambalar, çelenkler ve harfler. Cihazın mevcut durumunu tüm oyunculara eşzamanlı olarak görüntülemek için seçildi: açık mı kapalı mı, aktif mi değil mi, duvarda o anda hangi harf rengi yanıyor? Lazeri açma işini biraz daha zorlaştırmak için garland ve lazere aynı kullanıcı adı ve şifre admin/admin ile yetkilendirme ekledik.

Oyuncular çelengi açarak bunu test edebilir ve aynı işlemi lazerle tekrarlayabilir.

Gereksiz seçimlerle oyunculara eziyet etmemek için böylesine önemsiz bir giriş-şifre çiftini seçtik.

Görevi biraz daha ilginç hale getirmek için odada cihaz tanımlayıcıları olarak mongodb'un nesne kimlikleri kullanıldı.

ObjectId bir zaman damgası içerir: iki rastgele değer; bunlardan biri aygıt tanımlayıcısına göre alınır, ikincisi ise onu oluşturan işlemin pid'sine ve sayaç değerine göre alınır. Lazer cihaz tanımlayıcı seçiminin daha ilginç olması için tanımlayıcıların düzenli aralıklarla ve farklı pid süreçleriyle ancak ortak bir sayaçla oluşturulmasını istedim. Ancak sonuçta herkes yalnızca sayaç değerinde farklılık gösteren tanımlayıcılarla başladı. Bu, adımı çok basit hale getirmiş ve objectId yapısının analizini gerektirmemiş olabilir.

Arka uç isteklerinden çevirmen

Python betiğiZamanlayıcılar üzerinde çalışan ve bunları oyun soyutlamalarından fiziksel bir modele çeviren kişi. Örneğin, "zemin lambasını açın" → "N2 rölesini açın."

Betik, RabbitMQ kuyruğuna bağlandı ve istekleri kuyruktan Arduino'ya aktardı. Aynı zamanda paralel ışık değiştirme mantığını da uyguladı: bazı cihazlarla birlikte üzerlerindeki ışık açıldı, örneğin Megatron'a ilk güç verildiğinde sahne ışığıyla aydınlatıldı. Tüm sahnenin sinematografisi için aydınlatma tasarımı, proje ortak yapımcımız ve yapım tasarımcımız Ilya Serov'un harika çalışmasına dair ayrı bir hikaye ve bunu ayrı bir yazıda anlatacağız.

Çevirmen aynı zamanda bir zamanlayıcı kullanarak parçalayıcıyı başlatma ve görüntüyü TV'ye aktarma mantığından da sorumluydu: parçalayıcıyı başlatmak için zamanlayıcı, çığlık atan bir kapibara, oyunun sonunda bir reklam.

Megatron jetonunu oluşturma mantığı nasıl yapılandırıldı?

Deneme çekimi

Her 25 saniyede bir yeni bir jeton üretiliyordu ve lazeri 10 saniye boyunca 10/255 güçte açmak için kullanılabiliyordu. Bağlamak Megatron koduyla github.

Lazer daha sonra 1 dakika süreyle soğudu; bu süre zarfında kullanılamıyordu ve yeni atış taleplerini kabul etmedi.

Bu güç ipi yakmaya yetmiyordu ama herhangi bir oyuncu Megatron'u ateşleyebilir ve lazer ışınını çalışırken görebilirdi.

Belirteci oluşturmak için MD5 karma algoritması kullanıldı. Ve plan işe yaradı MD5'ten MD5 + sayaç + gizli bir savaş jetonu için ve bir test jetonu için sır olmadan.

MD5, destekçimiz Pavel'in yaptığı ticari bir projeye referanstır. Sadece birkaç yıl önce bu proje MD5'i kullanıyordu ve proje mimarına bunun güncelliğini yitirmiş bir şifreleme algoritması olduğunu söylediğinde MD5'ten MD5'i kullanmaya başladılar. Mümkün olan en noob projeyi yapmaya karar verdiğimiz için her şeyi hatırladı ve küçük bir referans yapmaya karar verdi.

Savaş atışı

Megatron'un savaş modu 100 watt'ta %3 lazer gücüdür. Bu, ağırlığı tutan ipi yakmak, akvaryumu kırmak ve sunucuyu suyla doldurmak için 2 dakika yeterlidir.

Projenin Github'ına birkaç ipucu bıraktık: yani, test ve savaş tokenlarının aynı sayaç göstergesine göre oluşturulduğunu anlayabileceğimiz token oluşturma kodu. Savaş jetonu durumunda, sayaç değerine ek olarak, son iki karakter hariç, bu özü değiştirme geçmişinde neredeyse tamamen bırakılan bir tuz da kullanılır.

Bu verileri bilerek, tuzun son 2 sembolünü sıralamak ve aslında onaltılık sisteme dönüştürülen Lost'taki sayıların bunun için kullanıldığını bulmak mümkündü.

Daha sonra oyuncuların sayaç değerini yakalamaları (test jetonunu analiz ederek) ve bir sonraki sayaç değerini ve önceki adımda seçilen tuzu kullanarak bir savaş jetonu oluşturmaları gerekiyordu.

Sayaç, her test atışında ve her 25 saniyede bir arttı. Bunu hiçbir yere yazmadık, küçük bir oyun sürprizi olması gerekiyordu.

Captcha etkileşim hizmeti

Oyun dünyasında bu, fanı açmak ve sunumlu sunum tahtasını bir ipucuyla açmak için yüklenmesi gereken captcha'nın aynısıydı. Kameranın yanında yük izleme özelliğine sahip bir dizüstü bilgisayar vardı.

Bir sunucuyu yok etmeye yönelik bir hacker oyununun arka ucu nasıl oluşturuldu?

Hizmet Mevcut yük olarak izlemede neyin görüntüleneceğini hesapladım: sıcaklık ve CPU Fanı. Metrikler zaman tabanı veritabanına aktarıldı ve grafana tarafından oluşturuldu.

Son 5 saniyede captcha'nın görüntülenmesi için 50'den fazla istek varsa, yük sabit + rastgele adım sayısı kadar arttı. Hesaplama, iki dakika içinde %100 yükün elde edilebileceği yönündeydi.

Aslında hizmette son oyunda gösterilenden daha fazla mantık vardı: Monitörü yalnızca CPU Fanının dönüşü görülebilecek şekilde yerleştirdik.

Görevin başında Grafan'ı Falcon web sitesinden erişilebilir kılmak istediler. Ancak aynı zamanda, temizlemek için zamanımız olmadığı için arka uç uygulama raporundan gelen springboot metriklerini de içeriyordu, bu yüzden ona erişimi engellemeye karar verdik. Ve haklı olarak - arayışın başında bile, bazı oyuncular uygulamanın springboot çerçevesinde yazıldığını tahmin etti ve hatta bazı hizmetlerin adlarını bile çıkardı.

Barındırma ve veri yolu

Arka uçtan siteye, RabbitMQ'nun çalıştığı VPS sunucusuna bilgi aktarmak için kullanılan bir araç.

Arka uç ve veri yolu açık tutuldu VPS'miz. Gücü, ekranda gördüğünüz bilgisayarla kıyaslanabilir düzeydeydi: iki gigabayt RAM'e sahip 2 çekirdekli bir VPS. En yüksek yük yalnızca birkaç gün için planlandığından, tarife kaynaklar için ücretlendirildi - kısa bir süre için VPS yüklemeyi planlayan müşterilerimizin yaptığı budur. Daha sonra yükün beklediğimizden fazla olduğu ve sabit tarifenin daha karlı olacağı ortaya çıktı. Görev yaparsanız hat tarifelerini seçin turbo.

Sunucuyu DDoSa'dan korumak için Cloudflare kullandık.

VPS'nin her şeye onurla dayandığını söylemeye değer.

Rölelerin kontrolünden sorumlu olan Arduino, tercümandan komutlar aldı ve asıl işi yaptı.

Bu daha çok projenin donanım kısmıyla ilgili bir sonraki makalenin konusu: arka uç yalnızca belirli bir röleyi açmak için istek gönderdi. Öyle oldu ki, arka uç neredeyse tüm varlıkları biliyordu ve ondan gelen talepler "bu varlığı aç" gibi görünüyordu. Bunu sitenin erken testi için yaptık (henüz tüm Arduino'yu ve röleleri monte etmedik), sonunda her şeyi böyle bıraktık.

Başlangıç ​​aşaması

Siteyi hızlı bir şekilde tilde ile oluşturduk, bir iş günü sürdü ve bütçemizden 30 bin tasarruf ettik.

Başlangıçta siteyi dışa aktarmayı ve eksik olduğumuz mantığı eklemeyi düşündük, ancak bunu yapmamızı engelleyen kullanım şartlarıyla karşılaştık.

Lisansı ihlal etmeye hazır değildik, bu yüzden iki seçeneğimiz vardı: her şeyi kendimiz uygulamak veya doğrudan Tilda ile iletişime geçmek, proje hakkında konuşmak ve kodu değiştirmek için izin istemek.

İkinci seçeneği seçtik ve bizi yarı yolda karşılamakla kalmadılar, hatta bize bir yıllık ücretsiz işletme hesabı bile verdiler, bunun için onlara çok minnettarız. Onlara Sokol'un web sitesi tasarımını göstermek çok tuhaftı.

Sonuç olarak, temel cihazlara istek göndermek için ön uca js mantığını ekledik ve oyun öğelerini açıp kapatmak için kullanılan düğmelerin stillerini biraz değiştirdik.

Web sitesi tasarımı

Ayrı bir bölüme değer olan aramaların tarihi.

Sadece eski moda bir site değil, aynı zamanda tasarımın tüm temel kurallarını ihlal eden kesinlikle iğrenç bir site yaratmak istedik. Aynı zamanda inanılırlığı korumak da önemliydi: KBB hikayesini bozmamalı, yazarın iddialılığını göstermemeli ve oyuncuların böyle bir sitenin var olabileceğine ve hatta müşteri getirebileceğine inanması gerekiyordu. Ve onu getirdi! Oyun devam ederken web sitesi oluşturmamız için iki kez bizimle iletişime geçildi.

İlk başta tasarımı kendim yaptım, daha fazla gif ve parlak öğeler eklemeye çalıştım. Ancak 10 yıllık tasarımcı kocam omzunun üzerinden baktı ve onu "çok iyi" olarak nitelendirdi. Tasarım kurallarını çiğnemek için onları bilmeniz gerekir.

Bir sunucuyu yok etmeye yönelik bir hacker oyununun arka ucu nasıl oluşturuldu?

Kalıcı bir tiksinti hissi uyandıran çeşitli renk kombinasyonları vardır: eşit zenginlikte yeşil ve kırmızı, gri ve pembe, mavi artı kahverengi. Sonunda temel renkler olarak kırmızı ve yeşilin bir kombinasyonuna karar verdik, kedili gifler ekledik ve bir stok fotoğraftan Sokolov'un 3-4 fotoğrafını seçtik. Sadece birkaç şartım vardı: Orta yaşlı bir adam, üzerime birkaç beden büyük gelen bir takım elbise giymiş ve “profesyonel stüdyo fotoğrafı çekimi” pozu vermiş. Test için arkadaşlarına gösterip “nasıl beğendin?” diye sordular.

Tasarım geliştirme sürecinde eşim her yarım saatte bir yatmak zorunda kaldı, helikopter uçmaya başladı. Pasha, ön yüzü bitirmeyi bitirirken gözlerini korumak için geliştirici konsolunu ekranın büyük bir kısmına açmaya çalıştı.

Gerçek cihazlar

Fanlar ve ışıklar, hemen tam güçte açılmayacak, böylece izlemeye paralel olarak güç artacak şekilde katı hal röleleri aracılığıyla monte edildi.

Ancak bu konuya bir sonraki yazımızda, oyunun donanım kısmından ve sitenin asıl yapısından bahsedeceğiz.

Bizi izlemeye devam edin!

Sunucuyu yok etme arayışı hakkında diğer makaleler

Bir sunucuyu yok etmeye yönelik bir hacker oyununun arka ucu nasıl oluşturuldu?

Kaynak: habr.com

Yorum ekle