♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥
schreibe vorne
╔════════════════════════════════════════ ═════════ ═════════════════════════╗
Hallo zusammen! Ich bin Myon. Obwohl mein Cloud-Server noch nicht abgelaufen ist, werde ich Ihnen ein sehr detailliertes Tutorial zum Einrichten des Schießstandes für den CTF-Wettbewerb sowie zur Erstellung von Web-Wettbewerbsfragen und der Bereitstellung der Docker-Umgebung geben. Aufgrund meiner Aufgrund meiner begrenzten Fähigkeiten kann ich Ihnen nur einige grundlegende und einfache Dinge sagen. Gerne können Sie im Kommentarbereich kommunizieren und voneinander lernen. Ich hoffe, dass Sie durch diesen Blog etwas Neues lernen können. Ich freue mich auch auf Ihre Aufmerksamkeit und Unterstützung!
╚════════════════════════════════════════ ═════════ ═════════════════════════╝
♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥
Weil ich diese Art von CTF-Schießstand schon einmal gebaut habe. Wenn Sie den Blog gelesen haben, den ich zuvor geschrieben habe, wissen Sie, dass der vorherige ausschließlich auf CTFd basierte, dieses Mal jedoch auf H1ve basiert (dieser sieht besser aus). Ich war für den Aufbau, den Betrieb und die Wartung des letzten CTF-Wettbewerbs an unserer Schule sowie für die Umgebungsbereitstellung von Pwn- und Web-Wettbewerbsfragen verantwortlich. Ich werde sie später vorstellen.
Lassen Sie mich Ihnen zunächst die fertigen Produkt-Renderings zeigen.
Titelseite:
Rangfolge:
Herausforderungen:
Bekanntmachung:
Ich schreibe diesen Blog hauptsächlich, um einige der vorherigen Inhalte zu ergänzen und zusammenzufassen. Wenn Sie während des Lesevorgangs nichts verstehen, können Sie gerne auf meine vorherigen Artikel verweisen. In der Spalte „Website-Aufbau“ noch einmal vielen Dank für Ihre Unterstützung und Aufmerksamkeit!
Bevor der Artikel beginnt, möchte ich Ihnen eine Website zum Erlernen künstlicher Intelligenz vorstellen. Sie ist leicht zu verstehen und humorvoll.
Künstliche Intelligenz https://www.captainbed.cn/myon/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Server verwenden: centos8 OK Text beginnt mit ◉ ‿ ◉
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Inhaltsverzeichnis
3. Installieren Sie Python-Pip
4. Installieren Sie Docker-Compose
5. Ziehen Sie das Bild und starten Sie den Einzelmodus
6. Stellen Sie alle Container im gesamten H1ve-Verzeichnis auf Selbststart ein
Teil 2: Erstellung von Web-Wettbewerbsfragen und Bereitstellung der Terminal-Docker-Umgebung
1. Vorbereitung der Frageunterlagen
2. Bereitstellung der Docker-Umgebung
3. Front-End-Bereitstellung von Wettbewerbsfragen
4. Betrieb und Wartung des Terminalwettbewerbs
Teil 1, CTF-Schießstandbau
Wenn es sich um einen neuen Server handelt und es keinen Git-Befehl gibt, installieren wir ihn zuerst.
yum install git
1. Klonen Sie H1ve von Github
Sie können es dort platzieren, wo Sie möchten. Ich habe im Stammverzeichnis einen Myon-Ordner erstellt und ihn dort geklont.
git clone https://github.com/D0g3-Lab/H1ve.git
Nach dem Klonen müssen wir zunächst noch einige Dinge installieren
Leckere Quelle einrichten
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2. Docker installieren
yum install -y docker-ce
Wenn „Abgeschlossen“ angezeigt wird, ist die Installation abgeschlossen.
Lassen Sie uns die Docker-Version überprüfen und sie so einstellen, dass sie beim Booten automatisch startet
docker version
systemctl start docker
systemctl enable docker
Dann installieren wir Docker-Compose
(Dieser Docker-Compose-Befehl wird später häufig beim Abrufen von Bildern und in der Wettbewerbsumgebung verwendet.)
3. Installieren Sie Python-Pip
✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧
Beachten Sie, dass die Standardinstallation von pip hier einen Fehler verursacht. Führen Sie nicht zuerst den folgenden Befehl aus, sondern lesen Sie erst später die Fehlererklärung.
Die Standardinstallation ist die Python2.7-Version, und hier benötigen wir die Python3-Version von pip
✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧
yum -y install epel-release
yum -y install python-pip
Wenn Sie „Abgeschlossen“ sehen, bedeutet dies, dass die Installation erfolgreich war. Wir können dies auch mit dem Befehl überprüfen
pip -V
Wenn wir jedoch versuchen, Docker-Compose zu installieren, tritt ein Fehler auf
pip install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple
Die allgemeine Bedeutung ist, dass unsere Pip-Version zu alt ist und wir keine geeignete Docker-Compose-Version finden können
Versuchen Sie, die Pip-Version zu aktualisieren
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install --upgrade pip
Es besteht jedoch eine hohe Wahrscheinlichkeit, dass Sie auf die folgende Fehlermeldung stoßen:
Es konnte keine Version gefunden werden, die die Anforderungen von Docker-Compose erfüllt (aus Versionen:).
Für Docker-Compose wurde keine passende Distribution gefunden
Sie verwenden die Pip-Version 8.1.2, Version 23.3.1 ist jedoch verfügbar.
Sie sollten ein Upgrade über den Befehl „pip install --upgrade pip“ in Betracht ziehen.
Lösung: Installieren Sie pip von Python3
Aus dem obigen pip -v wissen wir, dass die Standardversion von Python2.7 installiert ist
Hier installieren wir also pip von Python3 und aktualisieren es
yum install python3-pip
pip3 install --upgrade pip
Sie können sehen, dass pip erfolgreich auf 21.3.1 aktualisiert wurde
Alle nachfolgenden Pip-Operationen werden durch pip3 ersetzt.
4. Installieren Sie Docker-Compose
pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple
Sie können sehen, dass die Installation erfolgreich war. Was die Warnung betrifft, machen Sie sich darüber keine Sorgen.
Als nächstes geben wir das H1ve-Verzeichnis ein, das wir zuvor geklont haben.
Konfigurationsdatei ändern
(Es ist am besten, diesen Schritt nicht zuerst auszuführen, da ich nicht sicher bin, ob der nachfolgende Fehler mit diesem Schritt zusammenhängt. Es wird empfohlen, den nachfolgenden Image-Pull-Vorgang direkt auszuprobieren. Wenn ein Problem auftritt, können Sie versuchen, H1ve zu löschen und erneut klonen)
sed -i 's/mariadb:10.4/mariadb:10.4.12/g' single.yml
sed -i 's/mariadb:10.4/mariadb:10.4.12/g' single-nginx.yml
5. Ziehen Sie das Bild und starten Sie den Einzelmodus
docker-compose -f single.yml up
Es ist der folgende Fehler aufgetreten:
FEHLER: Manifest für mariadb:10.4.12.12.12.12 nicht gefunden: Manifest unbekannt: Manifest unbekannt
Diese Situation bedeutet, dass wir für Docker die Versionsnummer des heruntergeladenen Bildes angeben müssen.
Aber ich habe keine Lösung gefunden, also habe ich die Datei single.yml ersetzt
Dann können Sie es abrufen (ich vermute, dass es durch eine frühere Änderung der Konfigurationsdatei verursacht wird).
Dann greifen Sie auf Port 8000 zu
Nach Eingabe der grundlegenden Informationen kann die unten angezeigte Seite geladen werden.
Also habe ich H1ve gelöscht und zum Testen erneut geklont.
Stellen Sie fest, ob aufgrund einer Änderung der Konfigurationsdatei ein Problem mit single.yml vorliegt
Nach dem Klonen müssen Sie nichts tun. Gehen Sie einfach in das Verzeichnis und ziehen Sie es direkt ab
Versuchen Sie dann, den Single-Nginx-Modus zu aktivieren
docker-compose -f single-nginx.yml up
Es kann erfolgreich abgerufen werden, hier kann jedoch nicht darauf zugegriffen werden
Ändern Sie die Konfigurationsdatei zur Überprüfung und stellen Sie fest, dass sie erfolgreich abgerufen werden kann.
Das ist sehr seltsam. Natürlich kann ich nicht ausschließen, dass das Abrufen der vorherigen Version Auswirkungen auf die Umgebung der Version hatte, die ich gerade von Github geklont habe.
Im Allgemeinen empfehle ich Ihnen, zu versuchen, das Image direkt nach dem Klonen abzurufen (für spätere Tests können Sie es erfolgreich abrufen, ohne eine Konfigurationsdatei einzurichten. Die Details hängen immer noch von der Umgebungskonfiguration Ihres eigenen Servers ab). Fehlbedienungen sind ebenfalls möglich. Versuchen Sie, H1ve zu löschen und erneut zu klonen.
Übrigens müssen Sie auch sicherstellen, dass die verwendeten Ports erlaubt und in den Sicherheitsgruppenregeln des Servers festgelegt sind.
Wenn Sie direkt auf die IP-Adresse zugreifen und zum Schießstand gehen möchten, müssen Sie natürlich möglicherweise eine Proxy-Weiterleitung einrichten, um Port 80 an 8000 weiterzuleiten.
(Das ist bei der Version, über die ich zuvor gesprochen habe, nicht notwendig, da sie vollständig auf CTFd basiert. Direkter Zugriff auf die IP ist die Homepage des Schießstandes.)
Spezifische Inhalte finden Sie in meinem vorherigen Blog: „Cloud-Server-basierter Blog- und Schießstandbau – Erfahrungen und Lektionen“
Wir müssen alle mit H1ve verbundenen Container öffnen und auf Selbststart einstellen
Container ansehen
docker ps -a
Container starten
docker start 容器名
6. Stellen Sie alle Container im gesamten H1ve-Verzeichnis auf Selbststart ein
docker update --restart=always $(docker ps -aq)
Offene Container anzeigen
docker ps
Jetzt müssen wir das Bild nicht mehr abrufen, wir können direkt auf die Adresse des Schießstands + die Portnummer zugreifen und der Schießstand ist immer geöffnet.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
Als nächstes kommt der zweite Teil ◉ ‿ ◉
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
Teil 2: Erstellung von Web-Wettbewerbsfragen und Bereitstellung der Terminal-Docker-Umgebung
Um das Testen zu erleichtern, habe ich hier alle Ports des Servers geöffnet. Sie können Ihre eigenen hinzufügen, je nachdem, an welchem Port sich die Frage befindet.
1. Vorbereitung der Frageunterlagen
Jede Webseite sollte mindestens eine index.php oder index.html (Homepage-Datei) enthalten.
Lassen Sie uns zunächst die einfachste Webfrage beantworten, z. B. das Ausblenden der Flagge im Quellcode einer Webseite
Die Datei heißt index.php und ihr Inhalt ist wie unten dargestellt
Der Inhalt sieht vielleicht kompliziert aus, aber in Wirklichkeit handelt es sich nur um eine Seite.
(1) Dateiordner
Wir haben also die Fragedatei, erstellen einen neuen Ordner „Dateien“ und legen diese Datei „index.php“ im Dateiverzeichnis ab.
(Warum heißt der Ordner Dateien? Da ich Ihnen später zwei Vorlagendateien geben werde, folgen Sie einfach dem, was ich gesagt habe.)
Wenn Sie Dockerfile und docker-compose.yml selbst schreiben können, können Sie es natürlich tun, wie Sie möchten.
Ich habe ChatGPT gebeten, es zu schreiben, und es ist machbar, aber hier spreche ich hauptsächlich über grundlegende Routinen, daher gebe ich Ihnen eine Vorlage. Befolgen Sie, was ich gesagt habe, und Sie können einfache Web-Wettbewerbsfragen bereitstellen.
Zusätzlich zu den Dateien benötigen wir noch zwei weitere Dateien:
(2)Docker-Datei
(Sie können diese Datei ohne Änderung direkt verwenden)
Der Inhalt ist wie folgt:
FROM php:5.6-fpm-alpine
RUN rm -rf ar/wwwml/*
COPY ./files ar/wwwml
EXPOSE 80
WORKDIR ar/wwwml
CMD ["php", "-S", "0.0.0.0:80"]

(3)docker-compose.yml
(Diese Datei muss den Port auf den Port ändern, auf dem Ihre eigene Frage bereitgestellt wird.)
Der Inhalt ist wie folgt:
version: "2"
services:
web:
build: .
restart: always
ports:
- "0.0.0.0:8001:80"
environment:
- FLAG=Myon{s0_eaSyest_wEb_fl2}
Erläuterung des Inhalts der zweiten Datei:
0.0.0.0:8001:80 # Die Frage wird auf Port 8001 bereitgestellt. Spieler können auf die Fragenumgebung zugreifen, indem sie auf Port 8001 zugreifen.
80 ist der Port, an dem sich ngnix befindet. Dies hängt von Ihrer Umgebung ab. Normalerweise liegt er bei 80. Natürlich bin ich bei der Bereitstellung von Pwn-Wettbewerbsfragen bereits auf andere Probleme gestoßen. Ich muss die Konfigurationsdatei ändern. Für Einzelheiten wenden Sie sich bitte an Sie kann auf meinen vorherigen Blog verweisen:
„Bereitstellen von Webfragen in CTFd basierend auf CTFTraining“ und
„Pwn-Frage basierend auf xinetd bereitstellen (100 % erfolgreich und kann die Adresse des Schießstands ermitteln)“
FLAG=Myon{s0_eaSyest_wEb_fl2} # Tatsächlich habe ich später herausgefunden, dass es keine Auswirkungen zu haben scheint, da das richtige Flag selbst in die Datei eingefügt wird, es sei denn, die Frage bezieht sich auf Umgebungsvariablen, die sich darauf auswirken könnten Auf der sicheren Seite können Sie den FLAG-Wert hier in den Flag-Wert Ihrer eigenen Frage ändern, um die Konsistenz noch weiter zu gewährleisten.
Alles andere bleibt unverändert.
Legen Sie die oben genannten Dateien: files, Dockerfile, docker-compose.yml in einen neuen Ordner
Um den Speicher sowie die Bedienung und Wartung zu erleichtern, benenne ich die Frage gerne nach dem Namen, zum Beispiel heißt sie f12 (sehen Sie sich den Quellcode der Frage an).
Auf diese Weise sind alle Dateien für unseren Webwettbewerb fertig. Legen Sie den Ordner f12 im Terminal ab.
Ich habe hier zunächst einen testctf-Ordner erstellt, um CTF-Wettbewerbsfragen zu speichern.
Befehl zum Erstellen eines neuen Ordners
mkdir 文件夹名
Beim Übertragen von Dateien verwende ich lieber xftp, direkt ziehen oder einfügen und kopieren.
2. Bereitstellung der Docker-Umgebung
Geben Sie das f12-Verzeichnis ein und verwenden Sie den Befehl, um das Bild abzurufen
docker-compose up -d
Nachdem der Pull-Vorgang erfolgreich war, verwenden Sie den Befehl, um den Container anzuzeigen
docker ps
Greifen Sie auf den Port zu, an dem sich die Frage befindet, hier ist 8001
Verwenden Sie F12, um das Flag im Quellcode der Webseite zu finden
3. Front-End-Bereitstellung von Wettbewerbsfragen
Wie man also die Wettbewerbsfragen platziert, sie am vorderen Ende unseres Schießstandes hinzufügt, die Flagge setzt, punktet usw., wurde ausführlich in meinem Blog „Deploying Web Questions in CTFd Based on CTFTraining“ besprochen, also habe ich Ich werde hier nicht auf Details eingehen.
Der Link sollte ablaufen. Sie können direkt nach dem Namen meines Blogs suchen, um ihn zu finden, oder in der Spalte „Website-Aufbau“
Darüber hinaus habe ich hier auch den Quellcode einiger anderer Arten von Webfragen. Es ist sehr einfach, diese Fragen zu erstellen, z. B. Minispiele, grundlegende Parameterübergabe, PHP-Deserialisierung, Befehlsausführung, Datei-Upload, PHP-Umgehung und Informationslecks . Begrüßen Sie alle. Kommen Sie zu mir zur Diskussion.
Für die SQL-Injection muss es mit der Datenbank kombiniert werden. Der Quellcode einiger Fragen kann auch von ChatGPT geschrieben werden.
4. Betrieb und Wartung des Terminalwettbewerbs
Wenn wir beim Bereitstellen der Docker-Umgebung auf Probleme stoßen, z. B. auf Unzugänglichkeit, oder wenn einige Dateiinformationen nicht geändert wurden, die Bildumgebung des Themas jedoch abgerufen wurde, müssen wir zuerst den Container löschen und ihn dann erneut abrufen:
Fragencontainernamen anzeigen
docker ps
Löschen Sie den problematischen Container mit dem Befehl
docker rm -f 容器名
Die Fragenseite ist derzeit nicht mehr zugänglich
Aber hier kommt der Punkt: Können wir docker-compose up -d immer noch verwenden, um direkt zu ziehen?
Dieser Vorgang funktioniert nicht. Nach dem Ziehen erhalten Sie denselben Container wie vor dem Löschen, auch wenn Sie den Dateiinhalt geändert haben.
Zu dieser Frage können Sie auch meinen vorherigen Blog „Stellen Sie eine pwn-Frage basierend auf xinetd bereit (100 % erfolgreich und kann die Adresse des Schießstands ermitteln)“ lesen.
Da Docker einen Container erstellt, können Sie ihn als unabhängige Umgebung verstehen und die Pfade der darin enthaltenen Dateien sind unterschiedlich. Warum wagen wir es, Schwachstellen direkt auf unseren eigenen Servern bereitzustellen? Das liegt daran, dass die Sicherheit von Docker immer noch sehr hoch ist. Natürlich können Docker-Container lokal entkommen, aber im Allgemeinen sind mit Docker erstellte Dinge immer noch sehr sicher Wenn etwas kaputt ist, hat dies keine Auswirkungen auf die lokalen Dinge auf Ihrem Server. Es handelt sich um eine separate Umgebung.
Um die Frageumgebung wirklich zu ersetzen, gibt es zwei korrekte Operationen:
Methode 1: Benennen Sie den Fragenordner um (ändern Sie beispielsweise F12 in F12) und verwenden Sie den Befehl mv
Natürlich müssen Sie sicherstellen, dass der Name, den Sie umbenennen, der Name des Bildes ist, das nicht abgerufen wurde, also ein völlig neuer Name.
mv f12 F12
Zu diesem Zeitpunkt geben wir F12 ein, um das Bild abzurufen, ebenfalls mit
docker-compose up -d
Methode 2: Löschen Sie alle nicht verwendeten Netzwerke. Nicht verwendete Netzwerke sind Netzwerke, auf die kein Container verweist.
docker network prune
Da der ursprüngliche Container dieses Netzwerks von uns gelöscht wurde, sein Netzwerk jedoch noch vorhanden ist, der Container jedoch nicht darauf verweist, muss er zuerst gelöscht werden. Anschließend kann der Image-Pull verwendet werden, um den Inhalt Ihres Netzwerks abzurufen geänderte Datei.
Es wird empfohlen, Methode 2 zu verwenden, Sie können aber auch die Umbenennungsmethode verwenden und warten, bis sich die ungenutzten Netzwerke eine Zeit lang angesammelt haben, bevor Sie sie löschen.
♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
Der Artikel endet hier. Ich hoffe, dass Sie durch die Lektüre etwas gewinnen werden. Ich freue mich auf Ihre Aufmerksamkeit und Unterstützung◉ ‿ ◉
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥