Gunnar´s Vacation Pictures[1-7] - THCON2025
Compilación de retos asociados a la búsqueda de posición en base a imágenes en Google Maps
Introducción
En este post, se recogen 7 retos asociados a la búsqueda de la posición exacta de unas imágenes dadas en Google Maps. En caso de acertar con la posición, obtenemos la flag.
A pesar de ser una serie de ejercicios básicos, he decidido hacer writeup de todos ellos para conocer en exactitud las herramientas y metodologías utilizadas para resolver este tipo de ejercicios basados en Geoguess.
- Búscador de imágenes por Google.
- Chatgpt ayuda enormemente a la hora de realizar estos ejercicios.
- Páginas web de triangulación en base al kilometraje como smappen
- Overpass Turbo permite establecer filtros específicos en base a un script dado en Google Maps.
- Páginas web basadas en IA como Picarta (0% de aciertos) o GeoSpy(No probada por tener los registros cerrados)
- GeoHints es una página basada en ofrecer posibles ubicaciones en base a las diferentes pistas y objetos de un lugar en cuestión. Muy usada por expertos de GeoGuesser.
- CacheSleuth es una navaja suiza de herramientas como por ejemplo, realizar triangulaciones y calcular su punto medio, interseciones de circulos, intersección de líneas, etc.
A la hora de visualizar mapas se pueden utiizar las siguientes herramientas.
- Google Maps, mayor velocidad de búsqueda y más compacto
- Google Earth, más lento pero permite visualizaciones 3D del entorno
- Panoramax, alternativa a las dos anteriores (es francesa)
Enunciado
“It looks like Gunnar (a.k.a “The Executioner”) has given his fellow gang members the slip and ran away with the money they extorted from the THBank !
We are lucky to have some access to The Razor’s infrastructure, and it he seems to have access to some glimpses of Gunnar’s cybernetic eyes. The XSS are effectively tracking him and the website we discovered is probably used to get minions to find the locations of the fugitive under the supervision of a - particular - AI called glad0s (how original !).
Try leveraging this platform to locate as many pictures as possible of places where Gunnar has been during his trip, so we can look at CCTV footage and perhaps guess where he’ll go next.
For your sanity (and copyright reasons) we have disabled the music that the Ai was playing constantly but if you want to have the full experience here it is :”
Básicamente el lore de estos ejercicios se trata en seguir la pista de un cibercriminal en base a unas imágenes aportadas por la organización. A medida que vamos resolviendo retos nos damos cuenta de que todos ellos se basan en la costa mediterránea con más detalle en Francia, concretamente en la costa azul y Córcega.
Picture 1 (Easy)
Básicamente si buscamos el nombre del hotel en Google, obtendremos las ubicaciones del hotel y echando un vistazo sobre ellas, al final encontramos la posición exacta.
Flag
THC{Gl4dos_1s_Un1mpr3ss3d}
Picture 2 (Easy)
En este caso tenemos una imagen de una costa sin letreros y sin nada que podamos encontrar rápido. En este caso realizamos una búsqueda global de la imágen en google, para ello primero tenemos que obtenr toda la imagen de 360º y para ello, le daremos a inspeccionar
a la página web y posteriormente estraemos el recurso estático de la imagen.
Una vez obtenida y buscada en google, obtenedremos imágenes muy parecidas en google y simplemente con observar el nombre del lugar ya sabemos que el lugar se trata de Capo Testa en Cerdeña. Por último debemos cuadrar la posición exacta y listo.
Flag
THC{Hum4n5_4r3_5l0w}
Picture 3 (Medium)
En este caso la dificultad sube ya que tenemos la fotografía de un lugar pero no obtenemos información muy relevante sobre ella. Lo primero en hacer en este caso es obtener nuevamente la imagen estática de la página web y en este caso usar ChatGPT para que nos arroje un análisis más profundo del lugar.
En este caso ChatGPT nos dice que imagen se ha tomado en un lugar cerca de Toulon, más concretamente en Saint-Mandrier-sur-Mer. Mirando la arquitectura de la zona con Google Street View, nos damos cuenta de que la arquitectura del lugar, carretera, aceras y demás elemntos coinciden. Cuadramos la posición exacta de la imágen y listo.
Flag
THC{U_L0s3_Gl4d05_W1nz}
Picture 4 (Medium)
Este reto parece abrumador debido a que nos encontramos justo en una calle de algún lugar y puede parecer que es imposible resolverlo, pero justo en estos casos es donde más referencias de objetos, tiendas y referencias podemos obtener. En este caso obtenemos la imágen y le preguntamos a chatgpt en que ciudades puede haberse tomado dicha imagen y una vez tenemos algunas de referencia, buscamos tiendas Nexity
en Google Maps. Una vez tenemos un repertorio de ellas, vamos descartando las que no coinciden con la imagen. Finalmente la encontramos en Marseille - Bd Chave
Flag
THC{Y0u_Shur3_W3_4re_St1ll_l00king_4_Gunn3r?}
Picture 5 (Medium)
Con este reto la dificultad aumenta y es debido a que no tenemos referencias exactas mas allá de un letrero borroso a la izquierda y la señal clara de una tienda SPAR
con parking, además de contar con la carretera a pie de playa. ChatGPT nos comenta posibles ubicaciones y nos asesora diciendo que el lugar se encuentra en algún punto de Córcega, por lo que nuestra búsqueda de tiendas Spar
la comenzamos en dicha isla y después de un sin fin de búsquedas, conseguimos encontar el lugar. Córcega - Playa de Abartello.
Otra solución más técnica y compacta para conseguir el lugar, es através de la página Overpass Turbo la cual permite establecer filtros específicos en base a un script dado en Google Maps.
Además aclarar que la ejecución de los scripts suele tardar su tiempo, por ello recomiendo ser lo mas compacto. El script utilizado que arroja la misma posición es el siguiente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[out:json][timeout:800];
// Define France area
area["name"="France"][admin_level=2]->.fr;
// Find roundabouts in France
(
node["junction"="roundabout"](area.fr);
way["junction"="roundabout"](area.fr);
)->.roundabouts;
// Find beaches in France
(
way["natural"="beach"](area.fr);
relation["natural"="beach"](area.fr);
)->.beaches;
// Find Spar supermarkets
(
node["shop"="supermarket"]["brand"="Spar"](area.fr);
way["shop"="supermarket"]["brand"="Spar"](area.fr);
)->.spar;
// Convert roundabouts and beaches to center nodes (for around search)
.node.roundabouts->.roundabout_nodes;
way.beaches->.beach_ways;
rel.beaches->.beach_rels;
(.beach_ways; .beach_rels;)->.all_beaches;
.center.all_beaches->.beach_centers;
// Filter Spar shops near roundabouts (300m)
(
node.spar(around.roundabout_nodes:300);
way.spar(around.roundabout_nodes:300);
)->.spar_near_roundabout;
// Filter those Spar shops near beaches (100m)
(
node.spar_near_roundabout(around.beach_centers:100);
way.spar_near_roundabout(around.beach_centers:100);
);
// Output result
out center;
Flag
THC{M3h_1_Gu355_u_f1nd_stuff_3v3ntu411y}
Picture 6 (Hard)
En este caso, solo tenemos una imágen de una carretera y un letrero en ella, el cual se puede observar que pertenece a las distancias próximas de 3 ciudades.
1
2
3
IS ARUTAS 10.5
ORISTANO 19
PUTZU IDU 19.5
En este caso, podemos realizar una triangulación manual en base a las tres ciudades que se mencionan para poder cuadrar en base al kilometraje una posición exacta. Preguntándole a ChatGPT, este nos comenta que dicha carretera pertenece a una carretera secundaria por la zona de la unión de dichas carreteras, concretamente pertenece a la carretera SP6
. Por lo tanto una vez tenemos la zona, debemos de buscar un punto donde pueda estar dicha ubicación. Finalmente se encuentra en Cerdeña - San Giovanni di Sinis.
Además con páginas como smappen podemos realizar una triangulación mucho más precisa en base a las carreteras y el kilometraje real de cada una de ellas.
Flag
THC{1_4m_4lm0st_1mpr3ss3d..._jk_Hum4ns_4r3_P4th3t1c}
Vacation Hideout (Insane)
“The SNAFU raided the location where soe intruders were but we did not find anything that could help. Still we were able to get from the local authorities a message that was received a few hours ago in the vincinity and that reads :
Hey there, I just arrived at the Var hideout and secured the location. Come quickly and try to be stealthy I don’t want to get caught because of you ! There is no one here so we’ll wait until things settle down. The chapel looks as weird as I remembered, look at this picture of the steeple. Ryker “Riot” Morales”
Este reto es el último del lore y se basa en encontrar el escondite final del ciberdelincuente. Para ello solo tenemos una imágen en la que se ve montañas redondas y verdes a lo lejos junto al mar en el horizonte y en primer plano encontramos una especie de dolmen de granito con una cruz en lo alto.
Además según el enunciado tenemos datos de gran importancia para la búsqueda del lugar exacto.
1
2
3
4
La zona se encuentra en el Departamento de Var - Región de la Costa Azul en Francia.
Se menciona que el lugar es una capilla
El lugar se encuentra alejado de zonas urbanas
Dicha capilla tiene una campana
En base a esta información, podemos buscar manualmente por la zona todos las iglesias, santuarios y capillas existentes dentro de la zona del Departamento de Var en Francia. Después de más de 3 horas buscando la dichosa capilla, obtuvimos la solución mediante una búsqueda de la imágen en google, pero insertando parámetros como “Var” y “Capilla” finalmente encontramos una imágen de una capilla al final de todos los resultados la cual cuadra perfectamente con la cruz y el granito desgastado.
La capilla Notre-Dame du Beausset-Vieux
Además otra forma de resolverlo como he comentado anteriormente, era a través de script de filtrado en Overpass Turbo. Para ello simplemente queremos buscar capillas, iglesias o santuarios dentro de la zona del Departamento de Var en Francia.
Os dejo los siguientes scripts que realizan dicha operatoria.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[out:json][timeout:800];
// Buscar la relación administrativa del departamento de Var
relation
["admin_level"="6"]
["name"="Var"]
["boundary"="administrative"]
["ref"="83"];
// Convertir la relación a área
out ids;
->.var_rel;
var_rel->.var_area;
convert area var_rel->.searchArea;
// Buscar capillas e iglesias dentro del área
(
node["amenity"="place_of_worship"](area.searchArea);
way["amenity"="place_of_worship"](area.searchArea);
relation["amenity"="place_of_worship"](area.searchArea);
node["building"~"chapel|church",i](area.searchArea);
way["building"~"chapel|church",i](area.searchArea);
relation["building"~"chapel|church",i](area.searchArea);
node["name"~"chapelle|eglise|église",i](area.searchArea);
way["name"~"chapelle|eglise|église",i](area.searchArea);
relation["name"~"chapelle|eglise|église",i](area.searchArea);
)->.places_of_worship;
// Mostrar resultados
.places_of_worship out center;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[out:json][timeout:800];
// Crear área del departamento de Var (Francia)
area["name"="Var"]["admin_level"="6"]["boundary"="administrative"]->.searchArea;
// Buscar capillas e iglesias dentro del área
(
node(area.searchArea)["amenity"="place_of_worship"];
way(area.searchArea)["amenity"="place_of_worship"];
relation(area.searchArea)["amenity"="place_of_worship"];
node(area.searchArea)["building"~"chapel|church",i];
way(area.searchArea)["building"~"chapel|church",i];
relation(area.searchArea)["building"~"chapel|church",i];
node(area.searchArea)["name"~"chapelle|eglise|église",i];
way(area.searchArea)["name"~"chapelle|eglise|église",i];
relation(area.searchArea)["name"~"chapelle|eglise|église",i];
)->.places_of_worship;
// Mostrar resultados
.places_of_worship out center;
Flag
THC{43.185-5.805}