Πώς δημιουργήθηκε το backend ενός παιχνιδιού χάκερ για την καταστροφή ενός διακομιστή

Πώς δημιουργήθηκε το backend ενός παιχνιδιού χάκερ για την καταστροφή ενός διακομιστή
Συνεχίζουμε να σας λέμε πώς κανονίστηκε η αποστολή μας με λέιζερ με την καταστροφή του διακομιστή. Έναρξη στο προηγούμενο άρθρο για την επίλυση της αποστολής.

Συνολικά, το backend του παιχνιδιού είχε 6 αρχιτεκτονικές ενότητες, τις οποίες θα αναλύσουμε σε αυτό το άρθρο:

  1. Backend οντοτήτων παιχνιδιού που ήταν υπεύθυνες για τους μηχανισμούς παιχνιδιού
  2. Δίαυλος ανταλλαγής δεδομένων υποστήριξης και τοποθεσίας σε VPS
  3. Μεταφραστής από αιτήματα υποστήριξης (στοιχεία παιχνιδιού) σε Arduino και υλικό στον ιστότοπο
  4. Το Arduino, το οποίο ήταν υπεύθυνο για τον έλεγχο των ρελέ, έλαβε εντολές από τον μεταφραστή και έκανε την πραγματική δουλειά
  5. Πραγματικές συσκευές: ανεμιστήρας, γιρλάντες, φωτιστικά δαπέδου κ.λπ.
  6. Frontend - ο ίδιος ο ιστότοπος Falcon, από τον οποίο οι παίκτες έλεγχαν συσκευές

Ας περάσουμε από το καθένα από αυτά.

Backend οντοτήτων παιχνιδιού

Το backend υλοποιήθηκε ως εφαρμογή ελατηρίου εκκίνησης: είχε πολλούς ελεγκτές ανάπαυσης, ένα τελικό σημείο websocket και υπηρεσίες με λογική παιχνιδιού.

Υπήρχαν μόνο τρεις ελεγκτές:

  • Μέγατρον. Η τρέχουσα σελίδα Megatron στάλθηκε μέσω αιτημάτων GET: πριν και μετά την ενεργοποίηση του ρεύματος. Το λέιζερ εκτοξεύτηκε μέσω του αιτήματος POST.
  • Αντιστοίχιση σελίδων tilde ώστε να προβάλλονται με βάση το όνομα της σελίδας. Το Tilde παράγει σελίδες για εξαγωγή όχι με πρωτότυπα ονόματα, αλλά με εσωτερική ταυτότητα και πληροφορίες συμμόρφωσης.
  • Ελεγκτής Captcha για την εξυπηρέτηση ψευδο-υψηλού φορτίου captcha διακομιστή.

Το τελικό σημείο του Websocket χρησιμοποιήθηκε για τον έλεγχο gadget: λάμπες, γιρλάντα και γράμματα. Επιλέχθηκε για να εμφανίζει συγχρονισμένα σε όλους τους παίκτες την τρέχουσα κατάσταση της συσκευής: είτε είναι ενεργοποιημένη είτε απενεργοποιημένη, ενεργή ή όχι, ποιο χρώμα του γράμματος ανάβει αυτήν τη στιγμή στον τοίχο. Για να κάνουμε το έργο της ενεργοποίησης του λέιζερ λίγο πιο δύσκολο, προσθέσαμε εξουσιοδότηση στη γιρλάντα και στο λέιζερ με το ίδιο login και κωδικό πρόσβασης admin/admin.

Οι παίκτες μπορούσαν να το δοκιμάσουν ενεργοποιώντας τη γιρλάντα και να επαναλάβουν το ίδιο με το λέιζερ.

Επιλέξαμε ένα τόσο ασήμαντο ζεύγος σύνδεσης-κωδικού πρόσβασης για να μην βασανίζουμε τους παίκτες με περιττές επιλογές.

Για να γίνει η εργασία λίγο πιο ενδιαφέρουσα, τα αναγνωριστικά αντικειμένων από το mongodb χρησιμοποιήθηκαν ως αναγνωριστικά συσκευών στο δωμάτιο.

Το ObjectId περιέχει μια χρονική σήμανση: δύο τυχαίες τιμές, η μία από τις οποίες λαμβάνεται με βάση το αναγνωριστικό συσκευής και η δεύτερη με βάση το pid της διαδικασίας που το δημιουργεί και την τιμή του μετρητή. Ήθελα να κάνω τα αναγνωριστικά που δημιουργούνται σε τακτά χρονικά διαστήματα και με διαφορετικές διεργασίες pid, αλλά με έναν κοινό μετρητή, έτσι ώστε η επιλογή ενός αναγνωριστικού συσκευής λέιζερ να είναι πιο ενδιαφέρουσα. Ωστόσο, στο τέλος, όλοι ξεκίνησαν με αναγνωριστικά που διέφεραν μόνο στην τιμή του μετρητή. Αυτό μπορεί να έκανε το βήμα πολύ απλό και να μην απαιτεί ανάλυση της δομής του objectId.

Μεταφραστής από αιτήματα υποστήριξης

Σενάριο Python, ο οποίος εργάστηκε σε χρονόμετρα και τους μετέφρασε από αφηρήσεις gaming σε φυσικό μοντέλο. Για παράδειγμα, "ανάψτε το φωτιστικό δαπέδου" → "ενεργοποιήστε το ρελέ N2".

Το σενάριο συνδέθηκε στην ουρά RabbitMQ και μετέφερε αιτήματα από την ουρά στο Arduino. Εφάρμοσε επίσης τη λογική της παράλληλης εναλλαγής φωτός: μαζί με ορισμένες συσκευές, το φως σε αυτές ήταν αναμμένο, για παράδειγμα, όταν αρχικά τροφοδοτήθηκε με ρεύμα στο Megatron, φωτιζόταν με φως σκηνής. Ο σχεδιασμός φωτισμού για την κινηματογράφηση ολόκληρης της σκηνής είναι μια ξεχωριστή ιστορία για το σπουδαίο έργο του συμπαραγωγού και σχεδιαστή παραγωγής του έργου μας Ilya Serov, και θα το πούμε σε ξεχωριστή ανάρτηση.

Ο μεταφραστής ήταν επίσης υπεύθυνος για τη λογική της εκτόξευσης του καταστροφέα χρησιμοποιώντας ένα χρονόμετρο και τη μετάδοση της εικόνας στην τηλεόραση: το χρονόμετρο για την εκτόξευση του καταστροφέα, ένα capybara που ουρλιάζει, ένα διαφημιστικό στο τέλος του παιχνιδιού.

Πώς δομήθηκε η λογική για τη δημιουργία του διακριτικού Megatron

Δοκιμαστική βολή

Κάθε 25 δευτερόλεπτα παρήχθη ένα νέο διακριτικό και μπορούσε να χρησιμοποιηθεί για την ενεργοποίηση του λέιζερ για 10 δευτερόλεπτα σε ισχύ 10/255. Συνδέω με github με κωδικό Megatron.

Στη συνέχεια, το λέιζερ ψύχθηκε για 1 λεπτό - κατά τη διάρκεια αυτής της περιόδου δεν ήταν διαθέσιμο και δεν δεχόταν νέα αιτήματα λήψης.

Αυτή η δύναμη δεν ήταν αρκετή για να καεί μέσα από το σχοινί, αλλά οποιοσδήποτε παίκτης μπορούσε να πυροβολήσει τον Megatron και να δει τη δέσμη λέιζερ σε δράση.

Ο αλγόριθμος κατακερματισμού MD5 χρησιμοποιήθηκε για τη δημιουργία του διακριτικού. Και το σχέδιο πέτυχε MD5 από MD5 + μετρητής + μυστικό για μια μάρκα μάχης και χωρίς μυστικό για μια μάρκα δοκιμής.

Το MD5 είναι μια αναφορά σε ένα εμπορικό έργο που έκανε ο Pavel, ο συνεργάτης μας. Μόλις πριν από μερικά χρόνια αυτό το έργο χρησιμοποιούσε MD5 και όταν είπε στον αρχιτέκτονα του έργου ότι ήταν ένας απαρχαιωμένος αλγόριθμος κρυπτογράφησης, άρχισαν να χρησιμοποιούν το MD5 από το MD5. Δεδομένου ότι αποφασίσαμε να κάνουμε το πιο noob έργο δυνατό, θυμήθηκε τα πάντα και αποφάσισε να κάνει μια μικρή αναφορά.

Βολή μάχης

Η λειτουργία μάχης του Megatron είναι 100% ισχύς λέιζερ στα 3 Watt. Αυτό αρκεί για 2 λεπτά για να καεί μέσα από το σχοινί που συγκρατούσε το βάρος, να σπάσει το ενυδρείο και να πλημμυρίσει ο διακομιστής με νερό.

Αφήσαμε μερικές συμβουλές για το Github του έργου: δηλαδή, τον κώδικα δημιουργίας διακριτικών, από τον οποίο θα μπορούσε κανείς να καταλάβει ότι τα μάρκες δοκιμής και μάχης δημιουργούνται με βάση τον ίδιο δείκτη μετρητή. Στην περίπτωση ενός κουπονιού μάχης, εκτός από την αντίτιμη, χρησιμοποιείται και ένα αλάτι, το οποίο έχει μείνει σχεδόν εντελώς στο ιστορικό αλλαγής αυτής της ουσίας, με εξαίρεση τους δύο τελευταίους χαρακτήρες.

Γνωρίζοντας αυτά τα δεδομένα, ήταν δυνατό να ταξινομηθούν τα 2 τελευταία σύμβολα του αλατιού και στην πραγματικότητα να ανακαλύψουμε ότι οι αριθμοί από το Lost, που μετατράπηκαν στο δεκαεξαδικό σύστημα, χρησιμοποιήθηκαν για αυτό.

Στη συνέχεια, οι παίκτες έπρεπε να πιάσουν την τιμή του μετρητή (αναλύοντας το διακριτικό δοκιμής) και να δημιουργήσουν ένα διακριτικό μάχης χρησιμοποιώντας την επόμενη τιμή μετρητή και το αλάτι που επιλέχθηκε στο προηγούμενο βήμα.

Ο μετρητής απλώς αυξανόταν με κάθε δοκιμαστική βολή και κάθε 25 δευτερόλεπτα. Δεν γράψαμε πουθενά γι 'αυτό, υποτίθεται ότι ήταν μια μικρή έκπληξη παιχνιδιού.

Υπηρεσία αλληλεπίδρασης Captcha

Στον κόσμο του gaming, αυτό ήταν το ίδιο captcha που έπρεπε να φορτωθεί για να ενεργοποιηθεί ο ανεμιστήρας και να ανοίξει το flipchart με μια υπόδειξη. Δίπλα στην κάμερα υπήρχε ένας φορητός υπολογιστής με παρακολούθηση φορτίου.

Πώς δημιουργήθηκε το backend ενός παιχνιδιού χάκερ για την καταστροφή ενός διακομιστή

Υπηρεσίες Υπολόγισα τι θα εμφανίζεται στην παρακολούθηση ως τρέχον φορτίο: θερμοκρασία και ανεμιστήρας CPU. Οι μετρήσεις μεταφέρθηκαν στη βάση δεδομένων χρόνου και σχεδιάστηκαν από το grafana.

Εάν τα τελευταία 5 δευτερόλεπτα υπήρξαν περισσότερα από 50 αιτήματα για εμφάνιση της captcha, τότε το φορτίο αυξήθηκε κατά σταθερό + τυχαίο αριθμό βημάτων. Ο υπολογισμός ήταν ότι το 100% φορτίο μπορούσε να επιτευχθεί σε δύο λεπτά.

Στην πραγματικότητα, υπήρχε περισσότερη λογική στην υπηρεσία από ό,τι εμφανίστηκε στο τελικό παιχνίδι: τοποθετήσαμε την οθόνη με τέτοιο τρόπο ώστε να φαίνεται μόνο η περιστροφή του ανεμιστήρα της CPU.

Στην αρχή της αποστολής ήθελαν να αφήσουν τον Grafan προσβάσιμο από τον ιστότοπο του Falcon. Αλλά περιείχε επίσης μετρήσεις Springboot από την αναφορά εφαρμογής backend, τις οποίες δεν είχαμε χρόνο να διαγράψουμε, οπότε αποφασίσαμε να αποκλείσουμε την πρόσβαση σε αυτήν. Και δικαίως - ακόμη και στην αρχή της αποστολής, ορισμένοι παίκτες μάντευαν ότι η εφαρμογή ήταν γραμμένη στο πλαίσιο του Springboot και ξέθαψαν ακόμη και τα ονόματα ορισμένων υπηρεσιών.

Φιλοξενία και δίαυλος δεδομένων

Ένα εργαλείο για τη μεταφορά πληροφοριών από το backend στον ιστότοπο, τον διακομιστή VPS στον οποίο εκτελούσε το RabbitMQ.

Το backend και ο δίαυλος δεδομένων διατηρήθηκαν σε λειτουργία το VPS μας. Η ισχύς του ήταν συγκρίσιμη με τον υπολογιστή που είδατε στην οθόνη: ένα VPS 2 πυρήνων με δύο gigabyte RAM. Το τιμολόγιο χρεώθηκε για πόρους, καθώς το φορτίο αιχμής είχε προγραμματιστεί για λίγες μόνο ημέρες - αυτό κάνουν οι πελάτες μας που σχεδιάζουν να φορτώσουν VPS για σύντομο χρονικό διάστημα. Στη συνέχεια αποδείχθηκε ότι το φορτίο ήταν υψηλότερο από αυτό που περιμέναμε και ένα σταθερό τιμολόγιο θα ήταν πιο κερδοφόρο. Εάν κάνετε μια αποστολή, επιλέξτε τα τιμολόγια γραμμής τούρμπο.

Για την προστασία του διακομιστή από το DDoSa, χρησιμοποιήσαμε το Cloudflare.

Αξίζει να πούμε ότι το VPS άντεξε τα πάντα με τιμή.

Το Arduino, το οποίο ήταν υπεύθυνο για τον έλεγχο των ρελέ, έλαβε εντολές από τον μεταφραστή και έκανε την πραγματική δουλειά

Αυτό είναι περισσότερο το θέμα του επόμενου άρθρου σχετικά με το τμήμα υλικού του έργου: το backend απλώς έστειλε αιτήματα για να ενεργοποιήσει ένα συγκεκριμένο ρελέ. Έτυχε το backend να γνώριζε σχεδόν όλες τις οντότητες και τα αιτήματα από αυτό έμοιαζαν με "ενεργοποίηση αυτής της οντότητας". Το κάναμε για πρώιμη δοκιμή του ιστότοπου (δεν είχαμε συναρμολογήσει ακόμα όλα τα Arduino και τα ρελέ), στο τέλος τα αφήσαμε όλα έτσι.

Frontend

Δημιουργήσαμε γρήγορα τον ιστότοπο στο tilde, χρειάστηκε μία εργάσιμη ημέρα και μας εξοικονομήσαμε 30 χιλιάδες στον προϋπολογισμό μας.

Αρχικά, σκεφτήκαμε απλώς να εξάγουμε τον ιστότοπο και να προσθέσουμε τη λογική που μας έλειπε, αλλά αντιμετωπίσαμε όρους χρήσης που μας απαγόρευαν να το κάνουμε αυτό.

Δεν ήμασταν έτοιμοι να παραβιάσουμε την άδεια, οπότε υπήρχαν δύο επιλογές: να εφαρμόσουμε τα πάντα μόνοι μας ή να επικοινωνήσουμε απευθείας με την Tilda, να μιλήσουμε για το έργο και να ζητήσουμε άδεια για την αλλαγή του κωδικού.

Διαλέξαμε τη δεύτερη επιλογή και όχι μόνο μας συνάντησαν στα μισά, αλλά μας έδωσαν ακόμη και ένα χρόνο δωρεάν επαγγελματικό λογαριασμό, για τον οποίο τους είμαστε πολύ ευγνώμονες. Ήταν πολύ άβολο να τους δείξω τον σχεδιασμό της ιστοσελίδας του Sokol.

Ως αποτέλεσμα, συνδέσαμε τη λογική js στο frontend για την αποστολή αιτημάτων σε στοιχειώδεις συσκευές και αλλάξαμε ελαφρώς τα στυλ των κουμπιών για την ενεργοποίηση και απενεργοποίηση στοιχείων παιχνιδιού.

Σχεδιασμός ιστοσελίδας

Η ιστορία των αναζητήσεων, η οποία αξίζει ένα ξεχωριστό κεφάλαιο.

Θέλαμε να δημιουργήσουμε όχι απλώς έναν παλιομοδίτικο ιστότοπο, αλλά έναν απολύτως αηδιαστικό που παραβιάζει όλους τους βασικούς κανόνες σχεδιασμού. Ταυτόχρονα, ήταν σημαντικό να διατηρηθεί η αξιοπιστία: δεν έπρεπε να σπάσει την ιστορία της ΩΡΛ, να αποδείξει την επιδεξιότητα του συγγραφέα και οι παίκτες θα έπρεπε να πιστεύουν ότι ένας τέτοιος ιστότοπος θα μπορούσε να υπάρξει και ακόμη και να φέρει πελάτες. Και το έφερε! Ενώ το παιχνίδι συνεχιζόταν, επικοινωνήσαμε δύο φορές μαζί μας για τη δημιουργία ιστοσελίδων.

Στην αρχή έκανα το σχέδιο μόνος μου, προσπαθώντας να συμπεριλάβω περισσότερα gif και λαμπερά στοιχεία. Αλλά ο επί 10 χρόνια σχεδιαστής σύζυγός μου κοίταξε πάνω από τον ώμο του και το απέρριψε ως «πολύ καλό». Για να σπάσετε τους κανόνες σχεδιασμού, πρέπει να τους γνωρίζετε.

Πώς δημιουργήθηκε το backend ενός παιχνιδιού χάκερ για την καταστροφή ενός διακομιστή

Υπάρχουν αρκετοί χρωματικοί συνδυασμοί που προκαλούν ένα διαρκές αίσθημα αηδίας: πράσινο και κόκκινο ίδιου πλούτου, γκρι και ροζ, μπλε συν καφέ. Στο τέλος, καταλήξαμε σε έναν συνδυασμό κόκκινου και πράσινου ως βασικά χρώματα, προσθέσαμε gif με μια γάτα και επιλέξαμε 3-4 φωτογραφίες του ίδιου του Sokolov από μια στοκ φωτογραφία. Είχα μόνο μερικές απαιτήσεις: έναν μεσήλικα, φορώντας ένα άσχετο κοστούμι δύο πολύ μεγάλου μεγέθους και σε πόζα «επαγγελματικής φωτογράφισης στούντιο». Για τη δοκιμή, το έδειξαν σε φίλους και ρώτησαν "πώς σας αρέσει;"

Κατά τη διάρκεια της διαδικασίας ανάπτυξης σχεδιασμού, ο σύζυγός μου έπρεπε να ξαπλώνει κάθε μισή ώρα· το ελικόπτερο άρχισε να πετάει. Ο Pasha προσπάθησε να ανοίξει την κονσόλα προγραμματιστή στο μεγαλύτερο μέρος της οθόνης ενώ ολοκλήρωσε το frontend - για να προστατεύσει τα μάτια του.

Πραγματικές συσκευές

Οι ανεμιστήρες και τα φώτα τοποθετήθηκαν μέσω ρελέ στερεάς κατάστασης ώστε να μην ανάβουν αμέσως σε πλήρη ισχύ - έτσι ώστε η ισχύς να αυξάνεται παράλληλα με την παρακολούθηση.

Αλλά θα μιλήσουμε για αυτό στην επόμενη ανάρτηση, για το μέρος του υλικού του παιχνιδιού και την πραγματική κατασκευή του ιστότοπου.

Μείνετε συντονισμένοι!

Άλλα άρθρα σχετικά με την προσπάθεια καταστροφής του διακομιστή

Πώς δημιουργήθηκε το backend ενός παιχνιδιού χάκερ για την καταστροφή ενός διακομιστή

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο