Como usar mi propio DNS en un script

Este es un artículo algo corto, pero lo hice principalmente para acordarme de un “mantra” que no se puede olvidar cuando uno trabaja en Ethical Hacking:

Si tengo una barrera, la puedo saltar

Mientras estaba haciendo unas pruebas internas me pregunté si con un script me puedo saltar la resolución de DNS dentro de una red como la de mi casa.

¿Por qué me hago esa pregunta?

Como lo vimos en un artículo anterior Un ED (casi EDR) gratis para tu casa y/o PyME (Parte 3), puedes tener un sistema de monitoreo dentro de tu casa, como es mi caso, pero además tengo bloqueos de DNS para dominios maliciosos.

¿Pero qué pasa cuando intencionalmente quiero descargar un malware? ¿Qué pasa cuando quiero conectarme a algo que sé que me puede hacer daño?

Como trabajo en Seguridad Informática de repente necesito “salir” a buscar ese tipo de cosas para poder estudiarlas, pero si estoy restringido por mi propia seguridad ¿cómo puedo salir?

Depende del momento y del lenguaje de programación, por ejemplo, usando el DNS 1.1.1.1 de Cloudflare tenemos los siguientes ejemplos:

Bash

Para Bash, podría ser súper simple, usando la opción –dns-servers, de curl, pero lamentablemente esa opción está deshabilitada en algunas distribuciones de Linux, por lo que tenemos que darnos una pequeña vuelta:

#!/bin/bash
URL="http://0xdeadbeef.tw/"
PORT=80
if [[ "${URL}" =~ 'https://' ]]; then
        PORT=443
fi
DOM=$(echo $URL | sed -e 's|^[^/]*//||' -e 's|/.*$||')
MYIP=$(dig @1.1.1.1 +short ${DOM})
curl --resolve ${DOM}:${PORT}:${MYIP} "${URL}"

Python3

Si queremos hacer lo mismo pero en Python3, tenemos que sobreescribir la función de create_connection de urllib para poder usar nuestro propio “Resolver”:

#!/usr/bin/env python3
import requests
from dns import resolver
from urllib3.util import connection

def myResolver(host,dnssrv):
    if host in ["127.0.0.1","localhost"]:
        return "127.0.0.1"
    elif re.search("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$",host):
        return host
    r = resolver.Resolver()
    r.nameservers = dnssrv
    answers = r.query(host, 'A')
    for rdata in answers:
        if "0.0.0.0" == str(rdata):
            raise Exception("0.0.0.0 value for resolution")
        return str(rdata)

def patched_create_connection(address, *args, **kwargs):
    host, port = address
    hostname = myResolver(host,["1.1.1.1"])
    return _orig_create_connection((hostname, port), *args, **kwargs)

connection.create_connection = patched_create_connection

r = requests.get("http://0xdeadbeef.tw/")

Conclusión

No se confíen al monitorear sus DNS, si es que tienen algún malware o algún informático curioso metido en sus redes, porque aunque tengas bloqueados ciertos dominios uno siempre puede salir.

Ahora basta con escoger el DNS que más te guste y ponerlo dentro del código (para reemplazar el 1.1.1.1); aquí hay una lista de algunos servidores (https://www.profesionalreview.com/mejores-servidores-dns-publicos-gratuitos/), pero existen muchos más, lo dejo a criterio de cada uno.

Ojalá les sirva en alguna de sus “andanzas”.

Muchas gracias por leer hasta acá.

Una respuesta a “Como usar mi propio DNS en un script

Add yours

Deje un comentario

Crea una web o blog en WordPress.com

Subir ↑