Skip to content

Instantly share code, notes, and snippets.

@LatinSuD
Last active August 23, 2019 10:20
Show Gist options
  • Save LatinSuD/d6cf1dbba2f2275082389d9d1940343a to your computer and use it in GitHub Desktop.
Save LatinSuD/d6cf1dbba2f2275082389d9d1940343a to your computer and use it in GitHub Desktop.
Plugin para mitmdump para autenticar automaticamente en Django.
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