Last active
August 23, 2019 10:20
-
-
Save LatinSuD/d6cf1dbba2f2275082389d9d1940343a to your computer and use it in GitHub Desktop.
Plugin para mitmdump para autenticar automaticamente en Django.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from pprint import pprint | |
import re | |
import requests | |
from lxml import html | |
from mitmproxy.net.http import cookies | |
from archivo_configuracion import usuario, passw | |
import traceback | |
# La idea es poder mostrar informacion desde una pantalla que no tiene teclado, luego no puede autenticarse. | |
# En lugar de eso se configura como proxy en la pantalla a otro servidor que corre mitmdump con este plugin. | |
# Ejemplo de uso: | |
# mitmdump --proxyauth @htpasswd -s django.py -H ':~s ~d servidor-django.local:X-Frame-Options:*' -H ':~s ~d servidor-django.local:Acce-Control-Allow-Origin:*' | |
# De paso modifica algunas cabeceras para que deje embeber la informacion en un IFRAME. | |
# La autenticacion por htpasswd es opcional | |
# Requiere poner el usuario y contraseña del django en archivo aparte (archivo_configuracion.py) tal que: | |
# usuario = "admin" | |
# passw = "mipass" | |
def response(flow): | |
print("REQUEST :" + str(flow.request)) | |
if necesita_autenticacion(flow): | |
if autentica_django(flow): | |
flow.response.headers.pop('Location') | |
flow.response.headers['Location'] = flow.request.url | |
flow.response.status_code = 302 | |
pass | |
def necesita_autenticacion(flow): | |
if 'Location' in flow.response.headers and \ | |
flow.response.status_code == 302 and \ | |
re.match(r'^/admin/login/.*', flow.response.headers['Location']): | |
return True | |
else: | |
return False | |
def autentica_django(flow): | |
try: | |
print("\n") | |
login_url = flow.response.headers['Location'] | |
if re.match(r'^\/', login_url): | |
login_url = flow.request.scheme + "://" + flow.request.host + ":" + str(flow.request.port) + login_url | |
# Aqui usamos la libreria "requests" para hacer GET y leer un campo INPUT hidden | |
session_http = requests.session() | |
session_http.headers.update({'Accept-Encoding': ''}) | |
resp1 = session_http.get(login_url) | |
setCookie = resp1.headers['Set-Cookie'] | |
tree = html.fromstring(resp1.content) | |
token = tree.xpath('//input[@name="csrfmiddlewaretoken"]/@value') | |
# Aqui hacemos el POST de la autenticacion | |
resp2 = session_http.post( | |
login_url, | |
data={ | |
"username": usuario , | |
"password": passw , | |
"csrfmiddlewaretoken": token, | |
"next":"/admin/", | |
}, | |
allow_redirects=False | |
) | |
#print(session_http.cookies.get('csrftoken')) | |
#print(session_http.cookies.get('sessionid')) | |
#print (resp2.raw.headers.getlist('Set-Cookie')) | |
# Pasamos las cookies de una libreria a la otra | |
flow.response.headers.set_all("Set-Cookie", resp2.raw.headers.getlist('Set-Cookie')) | |
# Ultima comprobacion de que tenemos 2 cookies | |
if 'sessionid' not in flow.response.cookies or 'csrftoken' not in flow.response.cookies: | |
print ("No tenemos las 2 cookies esperadas") | |
return False | |
return True | |
except Exception as e: | |
print("EXCEPCION en autenticacion " + str(e)) | |
#flow.response.status_code = 200 | |
#traceback.print_exc() | |
return False |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment