Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
37 changes: 37 additions & 0 deletions src/main/java/org/owasp/wrongsecrets/MvcConfiguration.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.owasp.wrongsecrets;

import java.util.List;
import java.util.Locale;
import java.util.Set;
import lombok.extern.slf4j.Slf4j;
import nz.net.ultraq.thymeleaf.layoutdialect.LayoutDialect;
Expand All @@ -12,7 +14,11 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ResourceLoader;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.thymeleaf.extras.springsecurity6.dialect.SpringSecurityDialect;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
Expand All @@ -26,8 +32,39 @@
@Slf4j
public class MvcConfiguration implements WebMvcConfigurer {

/** Supported locales for the language toggle. */
public static final List<Locale> SUPPORTED_LOCALES =
List.of(
Locale.ENGLISH,
Locale.of("nl"),
Locale.GERMAN,
Locale.FRENCH,
Locale.of("es"),
Locale.of("uk"));

private static final String UTF8 = "UTF-8";

/** Session-based locale resolver so the selected language persists across requests. */
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.ENGLISH);
return slr;
}

/** Interceptor that reads the {@code lang} request parameter and updates the session locale. */
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}

@Bean
public ITemplateResolver springThymeleafTemplateResolver(ApplicationContext applicationContext) {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,33 @@
package org.owasp.wrongsecrets.challenges;

import java.util.List;
import java.util.Locale;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;
import lombok.Getter;
import org.apache.commons.io.FilenameUtils;
import org.owasp.wrongsecrets.RuntimeEnvironment;
import org.owasp.wrongsecrets.ScoreCard;
import org.owasp.wrongsecrets.definitions.ChallengeDefinition;
import org.owasp.wrongsecrets.definitions.Difficulty;
import org.owasp.wrongsecrets.definitions.Environment;
import org.owasp.wrongsecrets.definitions.Navigator;
import org.owasp.wrongsecrets.definitions.Sources.ChallengeSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.io.ClassPathResource;

/** Wrapper class to move logic from Thymeleaf to keep logic in code instead of the html file. */
@Getter
public class ChallengeUI {

/**
* Cache of classpath file existence results so that we only hit the filesystem once per unique
* locale-specific filename across all requests.
*/
private static final ConcurrentHashMap<String, Boolean> FILE_EXISTS_CACHE =
new ConcurrentHashMap<>();

private final DifficultyUI difficultyUI;
private final List<Environment> environments;
private final Navigator navigation;
Expand Down Expand Up @@ -86,6 +98,36 @@ public String getTech() {
return challengeDefinition.category().category();
}

/**
* Resolves a locale-specific filename if available, falling back to the default (English) file.
* Checks both the raw .adoc source (used in dev mode) and the pre-compiled .html (used in
* production). If neither locale-specific file exists, the original filename is returned so the
* English content is shown. Results are cached to avoid repeated classpath lookups.
*
* @param defaultFileName the default (English) file path, e.g. "explanations/challenge1.adoc"
* @return locale-specific filename if it exists, otherwise the default filename
*/
private String localizeFileName(String defaultFileName) {
if (defaultFileName == null || defaultFileName.isEmpty()) {
return defaultFileName;
}
Locale locale = LocaleContextHolder.getLocale();
if (Locale.ENGLISH.getLanguage().equals(locale.getLanguage())) {
return defaultFileName;
}
String ext = FilenameUtils.getExtension(defaultFileName);
String base = FilenameUtils.removeExtension(defaultFileName);
String localizedAdoc = base + "_" + locale.getLanguage() + (ext.isEmpty() ? "" : "." + ext);
String localizedHtml = base + "_" + locale.getLanguage() + ".html";
boolean exists =
FILE_EXISTS_CACHE.computeIfAbsent(
localizedAdoc,
key ->
new ClassPathResource(key).exists()
|| new ClassPathResource(localizedHtml).exists());
return exists ? localizedAdoc : defaultFileName;
}

/**
* Returns the number of the next challenge (e.g current+1).
*
Expand Down Expand Up @@ -114,30 +156,30 @@ private String documentation(Function<ChallengeSource, String> extractor) {
}

/**
* Returns filename of the explanation of the challenge.
* Returns filename of the explanation of the challenge, locale-aware with English fallback.
*
* @return String with filename.
*/
public String getExplanation() {
return documentation(s -> s.explanation().fileName());
return localizeFileName(documentation(s -> s.explanation().fileName()));
}

/**
* Returns filename of the hints for the challenge.
* Returns filename of the hints for the challenge, locale-aware with English fallback.
*
* @return String with filename.
*/
public String getHint() {
return documentation(s -> s.hint().fileName());
return localizeFileName(documentation(s -> s.hint().fileName()));
}

/**
* Returns filename of the reasons of the challenge.
* Returns filename of the reasons of the challenge, locale-aware with English fallback.
*
* @return String with filename.
*/
public String getReason() {
return documentation(s -> s.reason().fileName());
return localizeFileName(documentation(s -> s.reason().fileName()));
}

/**
Expand Down
3 changes: 3 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
spring.web.resources.cache.period=PT2H
server.compression.enabled=true
spring.config.import=classpath:/wrong-secrets-configuration.yaml
spring.messages.basename=messages
spring.messages.encoding=UTF-8
spring.messages.fallback-to-system-locale=false

password=ThisEnvironmentIsAnotherPlaceToHide
challenge61.webhook.enabled=false
Expand Down
22 changes: 22 additions & 0 deletions src/main/resources/explanations/challenge0_de.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
=== Eröffnungsherausforderung

Willkommen bei der Eröffnungsherausforderung von OWASP WrongSecrets!

In dieser Herausforderung erklären wir dir alles, was du wissen musst, um OWASP WrongSecrets zu spielen.

Bei jeder Herausforderung geht es darum, ein Geheimnis zu finden, das nicht gut versteckt und/oder konfiguriert wurde – in unserem https://github.com/OWASP/wrongsecrets[Anwendungscode], https://hub.docker.com/r/jeroenwillemsen/wrongsecrets[Docker-Container] oder in einem der verwandten Teile des https://github.com/OWASP/wrongsecrets#table-of-contents[Systems].

Sobald du das Geheimnis gefunden hast, kannst du es in das Eingabefeld unten eingeben und auf "Einreichen" klicken. Mit der Schaltfläche "Löschen" wird das Eingabefeld geleert.
Möchtest du die Herausforderung erneut spielen? Klicke auf die Schaltfläche "Zurücksetzen".

Die richtige Antwort lautet `The first answer`. Kopiere sie in das Feld und klicke auf "Einreichen".

Viel Spaß bei den schwierigeren Herausforderungen ;-).

Hinweis: Einige der folgenden Herausforderungen erfordern zusätzliche Tools. Möchtest du sie nicht selbst installieren? Du kannst einen Container verwenden:

[source, shell]
docker run -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock jeroenwillemsen/wrongsecrets-desktop:latest


Gehe dann in deinem Browser zu http://localhost:3000[http://localhost:3000], um ein Webtop mit allen benötigten Tools zu finden.
22 changes: 22 additions & 0 deletions src/main/resources/explanations/challenge0_es.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
=== Desafío de apertura

¡Bienvenido al desafío de apertura de OWASP WrongSecrets!

En este desafío, te explicamos todo lo que necesitas saber para jugar OWASP WrongSecrets.

Cada desafío consiste en encontrar un secreto que no ha sido bien ocultado y/o configurado en nuestro https://github.com/OWASP/wrongsecrets[código de aplicación], https://hub.docker.com/r/jeroenwillemsen/wrongsecrets[contenedor Docker] o en una de las partes relacionadas del https://github.com/OWASP/wrongsecrets#table-of-contents[sistema].

Una vez que hayas encontrado el secreto, puedes introducirlo en el cuadro de abajo y presionar "Enviar". El botón "Borrar" limpiará el cuadro de entrada.
¿Quieres jugar el desafío de nuevo? Presiona el botón "Reiniciar".

La respuesta correcta es `The first answer`. Cópiala en el cuadro y presiona "Enviar".

Que te diviertas mucho con los desafíos más difíciles ;-).

Nota: algunos de los desafíos que siguen requieren herramientas adicionales. ¿No quieres instalarlas tú mismo? Puedes usar un contenedor:

[source, shell]
docker run -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock jeroenwillemsen/wrongsecrets-desktop:latest


Luego, en tu navegador ve a http://localhost:3000[http://localhost:3000] para encontrar un webtop con todas las herramientas necesarias.
22 changes: 22 additions & 0 deletions src/main/resources/explanations/challenge0_fr.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
=== Défi d'ouverture

Bienvenue dans le défi d'ouverture d'OWASP WrongSecrets !

Dans ce défi, nous vous expliquons tout ce que vous devez savoir pour jouer à OWASP WrongSecrets.

Chaque défi consiste à trouver un secret qui n'a pas été bien caché et/ou configuré dans notre https://github.com/OWASP/wrongsecrets[code d'application], https://hub.docker.com/r/jeroenwillemsen/wrongsecrets[conteneur Docker] ou dans l'une des parties connexes du https://github.com/OWASP/wrongsecrets#table-of-contents[système].

Une fois que vous avez trouvé le secret, vous pouvez le saisir dans le champ ci-dessous et cliquer sur « Soumettre ». Le bouton « Effacer » nettoiera le champ de saisie.
Vous souhaitez rejouer le défi ? Cliquez sur le bouton « Réinitialiser ».

La bonne réponse ci-dessous est `The first answer`. Copiez-la dans le champ et cliquez sur « Soumettre ».

Amusez-vous bien avec les défis plus difficiles ;-).

Remarque : certains des défis suivants nécessitent des outils supplémentaires. Vous ne voulez pas les installer vous-même ? Vous pouvez utiliser un conteneur :

[source, shell]
docker run -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock jeroenwillemsen/wrongsecrets-desktop:latest


Puis, dans votre navigateur, accédez à http://localhost:3000[http://localhost:3000] pour trouver un webtop avec tous les outils requis.
1 change: 1 addition & 0 deletions src/main/resources/explanations/challenge0_hint_de.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Wenn du auf die Schaltfläche "Hinweise anzeigen" klickst, geben wir dir Hinweise, wie du diese spezifische Herausforderung lösen kannst.
1 change: 1 addition & 0 deletions src/main/resources/explanations/challenge0_hint_es.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Cuando presiones el botón "Mostrar pistas", te daremos pistas sobre cómo resolver ese desafío específico.
1 change: 1 addition & 0 deletions src/main/resources/explanations/challenge0_hint_fr.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Lorsque vous appuyez sur le bouton « Afficher les indices », nous vous donnerons des indices sur la façon de résoudre ce défi spécifique.
1 change: 1 addition & 0 deletions src/main/resources/explanations/challenge0_hint_nl.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Wanneer je op de knop "Toon hints" drukt, geven we je aanwijzingen over hoe je die specifieke uitdaging kunt oplossen.
1 change: 1 addition & 0 deletions src/main/resources/explanations/challenge0_hint_uk.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Коли ви натиснете кнопку «Показати підказки», ми дамо вам підказки щодо вирішення цього конкретного виклику.
22 changes: 22 additions & 0 deletions src/main/resources/explanations/challenge0_nl.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
=== Openingsuitdaging

Welkom bij de openingsuitdaging van OWASP WrongSecrets!

In deze uitdaging leggen we je alles uit wat je nodig hebt om OWASP WrongSecrets te spelen.

Elke uitdaging gaat over het vinden van een geheim dat niet goed verborgen en/of geconfigureerd is in onze https://github.com/OWASP/wrongsecrets[applicatiecode], https://hub.docker.com/r/jeroenwillemsen/wrongsecrets[Docker-container], of in een van de gerelateerde onderdelen van het https://github.com/OWASP/wrongsecrets#table-of-contents[systeem].

Zodra je het geheim hebt gevonden, kun je het in het onderstaande invoervak plaatsen en op "Indienen" drukken. De knop "Wissen" maakt het invoervak leeg.
Wil je de uitdaging opnieuw spelen? Druk op de knop "Opnieuw instellen".

Het juiste antwoord hieronder is `The first answer`. Kopieer het in het invoervak en druk op "Indienen".

Veel plezier met de moeilijkere uitdagingen ;-).

Opmerking: sommige uitdagingen vereisen aanvullende tools. Wil je ze niet zelf installeren? Je kunt een container gebruiken:

[source, shell]
docker run -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock jeroenwillemsen/wrongsecrets-desktop:latest


Ga vervolgens in je browser naar http://localhost:3000[http://localhost:3000] om een webtop te vinden met alle benodigde tools.
5 changes: 5 additions & 0 deletions src/main/resources/explanations/challenge0_reason_de.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*Warum machen wir das?*

Mit diesem Projekt hoffen wir, dass du Spaß beim Suchen nach Geheimnissen hast. Gleichzeitig hoffen wir, dass du aus den Fehlern anderer Menschen im Bereich Geheimnismanagement lernst, damit du nicht dieselben Fehler machst.

Wusstest du, dass wir all diese Herausforderungen in der Praxis gesehen haben? Sie können daher eine große Hilfe sein, wenn du mehr Bounty-Hunting betreiben möchtest.
5 changes: 5 additions & 0 deletions src/main/resources/explanations/challenge0_reason_es.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*¿Por qué hacemos esto?*

Con este proyecto, esperamos que te diviertas buscando secretos. Al mismo tiempo, esperamos que aprendas de los errores de otras personas en la gestión de secretos, para que no cometas los mismos errores.

¿Sabías que hemos visto todos estos desafíos en la práctica? Por lo tanto, pueden ser de gran ayuda si quieres hacer más caza de recompensas.
5 changes: 5 additions & 0 deletions src/main/resources/explanations/challenge0_reason_fr.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*Pourquoi faisons-nous cela ?*

Avec ce projet, nous espérons que vous prendrez plaisir à chasser les secrets. En même temps, nous espérons que vous apprendrez des erreurs des autres en matière de gestion des secrets, afin de ne pas commettre les mêmes erreurs.

Saviez-vous que nous avons repéré tous ces défis dans la pratique ? Ils peuvent donc être d'une grande aide si vous souhaitez faire davantage de chasse aux bugs.
5 changes: 5 additions & 0 deletions src/main/resources/explanations/challenge0_reason_nl.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*Waarom doen we dit?*

Met dit project hopen we dat je plezier hebt met het zoeken naar geheimen. Tegelijkertijd hopen we dat je leert over de fouten die anderen maken op het gebied van geheimenbeheer, zodat jij dezelfde fouten niet maakt.

Wist je dat we al deze uitdagingen in de praktijk zijn tegengekomen? Ze kunnen daarom een grote hulp zijn als je meer aan bug bounty wilt doen.
5 changes: 5 additions & 0 deletions src/main/resources/explanations/challenge0_reason_uk.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*Навіщо ми це робимо?*

Завдяки цьому проекту ми сподіваємося, що вам сподобається пошук секретів. Водночас ми сподіваємося, що ви навчитеся на помилках інших людей у сфері управління секретами, щоб не повторювати їх.

Чи знаєте ви, що ми зустріли всі ці виклики на практиці? Тому вони можуть стати великою підмогою, якщо ви хочете займатися пошуком вразливостей.
22 changes: 22 additions & 0 deletions src/main/resources/explanations/challenge0_uk.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
=== Вступний виклик

Ласкаво просимо до вступного виклику OWASP WrongSecrets!

У цьому виклику ми пояснюємо все, що вам потрібно знати для гри в OWASP WrongSecrets.

Кожен виклик полягає у знаходженні секрету, який не був добре прихований та/або налаштований у нашому https://github.com/OWASP/wrongsecrets[коді програми], https://hub.docker.com/r/jeroenwillemsen/wrongsecrets[контейнері Docker] або в одній з пов'язаних частин https://github.com/OWASP/wrongsecrets#table-of-contents[системи].

Коли ви знайдете секрет, введіть його у поле нижче та натисніть «Надіслати». Кнопка «Очистити» очистить поле введення.
Хочете зіграти знову? Натисніть кнопку «Скинути».

Правильна відповідь нижче — `The first answer`. Скопіюйте її у поле та натисніть «Надіслати».

Бажаємо успіхів у складніших викликах ;-).

Примітка: деякі наступні виклики потребують додаткових інструментів. Не хочете встановлювати їх самостійно? Скористайтеся контейнером:

[source, shell]
docker run -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock jeroenwillemsen/wrongsecrets-desktop:latest


Потім у браузері перейдіть на http://localhost:3000[http://localhost:3000], щоб знайти webtop з усіма необхідними інструментами.
3 changes: 3 additions & 0 deletions src/main/resources/explanations/challenge10-azure_de.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
=== Azure Key Vault Teil 2

Das Geheimnis ist nun randomisiert und direkt im Cloud-Secrets-Manager gespeichert. Wir binden es noch über den https://secrets-store-csi-driver.sigs.k8s.io[CSI-Treiber] an den K8s-Pod... Kannst du darauf zugreifen?
3 changes: 3 additions & 0 deletions src/main/resources/explanations/challenge10-azure_es.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
=== Azure Key Vault parte 2

El secreto ahora está aleatorizado y almacenado directamente en el gestor de secretos de la nube. Todavía lo montamos en el pod K8s a través del https://secrets-store-csi-driver.sigs.k8s.io[controlador CSI]... ¿Puedes acceder a él?
3 changes: 3 additions & 0 deletions src/main/resources/explanations/challenge10-azure_fr.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
=== Azure Key Vault partie 2

Le secret est maintenant aléatoire et stocké directement dans le gestionnaire de secrets cloud. Nous le montons toujours dans le pod K8s via le https://secrets-store-csi-driver.sigs.k8s.io[pilote CSI]... Pouvez-vous y accéder ?
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Du kannst diese Herausforderung mit den folgenden alternativen Lösungen lösen:

1. Finde das Geheimnis direkt im Cloud-Secrets-Manager (der günstige Weg):
- Melde dich bei der Cloud-Konsole an und gehe zum Secrets-Manager.
- Rufe die Daten des entsprechenden Geheimnisses ab.

2. Finde das Geheimnis durch Exec in den Pod:
- Stelle sicher, dass du kubectl konfiguriert hast.
- Verwende `kubectl exec -it <pod-name> -- cat /mnt/secrets/wrongsecret`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Puedes resolver este desafío con las siguientes soluciones alternativas:

1. Encuentra el secreto directamente en el gestor de secretos cloud (la forma barata):
- Inicia sesión en la consola cloud y ve al gestor de secretos.
- Obtén los datos del secreto correcto.

2. Encuentra el secreto ejecutando en el pod:
- Asegúrate de tener kubectl configurado.
- Usa `kubectl exec -it <nombre-pod> -- cat /mnt/secrets/wrongsecret`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Vous pouvez résoudre ce défi avec les solutions alternatives suivantes :

1. Trouvez le secret directement dans le gestionnaire de secrets cloud (la façon bon marché) :
- Connectez-vous à la console cloud et accédez au gestionnaire de secrets.
- Récupérez les données du bon secret.

2. Trouvez le secret en exécutant dans le pod :
- Assurez-vous d'avoir kubectl configuré.
- Utilisez `kubectl exec -it <nom-pod> -- cat /mnt/secrets/wrongsecret`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Je kunt deze uitdaging oplossen met de volgende alternatieve oplossingen:

1. Zoek het geheim direct in de cloud secrets manager (de goedkope manier):
- Log in op de cloudconsole en ga naar de secrets manager.
- Haal de gegevens op van het juiste geheim.

2. Zoek het geheim door exec in de pod:
- Zorg ervoor dat je kubectl hebt geconfigureerd.
- Gebruik `kubectl exec -it <pod-naam> -- cat /mnt/secrets/wrongsecret`.
Loading