Ataque por diccionario usando UTesla y Erica

  • 7 Respuestas
  • 623 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 775
  • Actividad:
    100%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email

Ataque por diccionario usando UTesla y Erica

  • en: Julio 10, 2020, 07:13:14 am
Un ataque por diccionario es considerado un tipo de ataque contra una contraseña (o una palabra que cause validez) usando una lista de posibles contraseñas, mayormente dado en un fichero de texto o una base de datos gigante. El ataque por diccionario (muchas veces confundido con fuerza bruta) usa una gran lista de contraseñas que pueden ser generadas por un generador automatizado, preferencias de la víctima, o incluso combinarse con la mismísima fuerza bruta para lograr el cometido.


Para saber más sobre Ultra Tesla pueden leer el You are not allowed to view links. Register or Login que hace algunos momentos lo he actualizado para que coincida con el README.md del repositorio. Sin embargo es recomendable que se haga una lectura del repositorio oficial ya que puede haber un cambio reciente que no esté en algún artículo de Internet.

Erica es un script para realizar un ataque por diccionario contra numerosas funciones Hash creado por nuestro compañero @You are not allowed to view links. Register or Login. Para esta ocasión nosotros adaptaremos Erica para usarlo como un simple servicio en UTesla. Si quieres leer un tutorial sobre el script puedes leer un You are not allowed to view links. Register or Login

Cabe aclarar que UTesla no está diseñado para soportar grandes cantidades de datos, pese a que se esté trabajando para mejorarlo cada día, uno de los muchos objetivos que se tienen en mente, es realizar de una forma diferente, APIs Webs siguiendo un formato no convencional. Para esta demostración usaremos un diccionario pequeño y unas pequeñas configuraciones para que funcione eficientemente


Esquema de la red:

Para este escenario se usarán tres máquinas, pero para que se tenga más rendimiento el plugin 'Erica' contiene un pequeño algoritmo que disminuye la carga "partiendo" el diccionario en mitades de longitud similar para cada parte (las partes son los servidores), incluso el límite de las líneas es un factor a tener en cuenta. Claro que todo esto estará automatizado por un plugin de UTeslaCLI

Comencemos:

Antes que nada, es importante que tengan actualizado (si es que lo tienen instalado, si no, pueden descargarlo) UTesla porque se han hecho varias actualizaciones arreglando errores y mejorandolo. Por lo que si han usado git, simplemente ejecuten:

Código: Bash
  1. git pull origin master
  2. git submodule update --remote

O pueden descargarlo nuevamente, no tendrán que reinstalar las dependencias, así que será menos pesado  ;)

También es importante que usen la versión You are not allowed to view links. Register or Login de python, porque el plugin estará usando algunas nuevas sintaxis de ésta.

Si los repositorios de su distribución no tiene incluido la versión 3.8 de python, pueden You are not allowed to view links. Register or Login.

Es muy recomendable configurar las claves 'connect_timeout' y 'request_timeout' en la sección 'Client' del fichero 'config/UTesla.ini' según lo que se puede tardar, lo cual es relativo a la velocidad de conexión, la velocidad de procesamiento, la memoria, las líneas del archivos, entre otros.


Instalación del plugin 'Erica':

Debemos comenzar con un pequeño fichero para empezar a crear la estructura, el cual estará ubicado en 'complements/erica.py' con el siguiente contenido:

complements/erica.py:

Código: Python
  1. class Handler:
  2.     pass

Ahora la estructura puede verse como '<Esquema>://<Dirección IP/Host>:<Puerto>/erica'

Por consiguiente necesitamos crear sub-servicios para organizar mejor el esquema, éso se hace creando la siguiente carpeta:


Código: Bash
  1. mkdir complements/erica-folder

Ahí podemos crear nuevos servicios que se verán reflejados como lo siguiente '<Esquema>://<Dirección IP/Host>:<Puerto>/erica/<Sub-servicio>'. Por ejemplo:

complements/erica-folder/get_job.py:

Código: Python
  1. import os
  2. import tempfile
  3. import secrets
  4.  
  5. class Handler:
  6.     async def get(self):
  7.         id = secrets.token_hex(16)
  8.         workspace = '%s/erica_%s' % (
  9.             tempfile.gettempdir(), id
  10.  
  11.         )
  12.  
  13.         os.makedirs(workspace, exist_ok=True)
  14.        
  15.         await self.write(id)

complements/erica-folder/write.py:
Código: Python
  1. import tempfile
  2. import os
  3.  
  4. class Handler:
  5.     async def post(self):
  6.         wordlist = self.get_argument('wordlist')
  7.         hash = self.get_argument('hash')
  8.         hash_type = self.get_argument('hash_type')
  9.         shake_length = str(self.get_argument('shake_length'))
  10.         id = self.get_query_argument('id')
  11.        
  12.         workspace = '%s/erica_%s' % (
  13.             tempfile.gettempdir(), id
  14.        
  15.         )
  16.         hash_filename = '%s/hash.txt' % (workspace)
  17.         hash_type_filename = '%s/hash_type.txt' % (workspace)
  18.         wordlist_filename = '%s/wordlist.lst' % (workspace)
  19.         shake_length_filename = '%s/shake_length.txt' % (workspace)
  20.        
  21.         response = {
  22.             'error'   : False,
  23.             'message' : None
  24.                
  25.         }
  26.  
  27.         if (os.path.isdir(workspace)):
  28.             if not (os.path.isfile(hash_filename)):
  29.                 with open(hash_filename, 'w') as fd:
  30.                     fd.write(hash)
  31.                     fd.flush()
  32.                     os.fsync(fd)
  33.  
  34.             if not (os.path.isfile(hash_type)):
  35.                 with open(hash_type_filename, 'w') as fd:
  36.                     fd.write(hash_type)
  37.                     fd.flush()
  38.                     os.fsync(fd)
  39.  
  40.             if not (os.path.isfile(shake_length_filename)):
  41.                 with open(shake_length_filename, 'w') as fd:
  42.                     fd.write(shake_length)
  43.                     fd.flush()
  44.                     os.fsync(fd)
  45.  
  46.             with open(wordlist_filename, 'a', buffering=1) as fd:
  47.                 fd.writelines(wordlist)
  48.                 os.fsync(fd)
  49.  
  50.         else:
  51.             response['error'] = True
  52.             response['message'] = 'El identificador de trabajo "%s" no existe' % (id)
  53.  
  54.         await self.write(response)

complements/erica-folder/crack.py:
Código: Python
  1. import tempfile
  2. import os
  3. import hashlib
  4.  
  5. def set_status(status, workspace):
  6.     with open('%s/status.txt' % (workspace), 'w') as fd:
  7.         fd.write(status)
  8.  
  9. def crack(hash, hash_type, wordlist, workspace, shake_length):
  10.     result = False
  11.  
  12.     if not (hash_type in hashlib.algorithms_guaranteed):
  13.         set_status('No se encuentra la función "%s"' % (hash_type), workspace)
  14.         return
  15.  
  16.     set_status('running', workspace)
  17.  
  18.     with open(wordlist, 'r') as fd:
  19.         for word in fd:
  20.             word = word.strip()
  21.             hashfunc = getattr(hashlib, hash_type)(word.encode())
  22.  
  23.             if (hash_type[:5] == 'shake'):
  24.                 hash2cmp = hashfunc.hexdigest(shake_length)
  25.  
  26.             else:
  27.                 hash2cmp = hashfunc.hexdigest()
  28.  
  29.             if (hash == hash2cmp):
  30.                 result = True
  31.                 break
  32.  
  33.     if (result):
  34.         set_status('success:%s' % (word), workspace)
  35.  
  36.     else:
  37.         set_status('fail', workspace)
  38.  
  39. class Handler:
  40.     async def get(self):
  41.         id = self.get_query_argument('id')
  42.        
  43.         workspace = '%s/erica_%s' % (
  44.             tempfile.gettempdir(), id
  45.  
  46.         )
  47.         hash_filename = '%s/hash.txt' % (workspace)
  48.         hash_type_filename = '%s/hash_type.txt' % (workspace)
  49.         wordlist_filename = '%s/wordlist.lst' % (workspace)
  50.         shake_length_filename = '%s/shake_length.txt' % (workspace)
  51.  
  52.         response = {
  53.             'error'   : False,
  54.             'message' : None
  55.                
  56.         }
  57.  
  58.         if (os.path.isfile(hash_filename) and os.path.isfile(hash_type_filename) and os.path.isfile(wordlist_filename) and os.path.isfile(shake_length_filename)):
  59.             with open(hash_filename, 'r') as fd:
  60.                 hash = fd.read().strip()
  61.  
  62.             with open(hash_type_filename, 'r') as fd:
  63.                 hash_type = fd.read().strip()
  64.  
  65.             with open(shake_length_filename, 'r') as fd:
  66.                 shake_length = int(fd.read())
  67.  
  68.             self.procs.create(crack, args=(hash, hash_type, wordlist_filename, workspace, shake_length))
  69.  
  70.         else:
  71.             response['error'] = True
  72.             response['message'] = 'Hay una incongruencia con los archivos del espacio de trabajo'
  73.  
  74.         await self.write(response)

complements/erica-folder/status.py:
Código: Python
  1. import os
  2. import tempfile
  3.  
  4. class Handler:
  5.     async def get(self):
  6.         id = self.get_query_argument('id')
  7.  
  8.         workspace = '%s/erica_%s' % (
  9.             tempfile.gettempdir(), id
  10.            
  11.         )
  12.         response = {
  13.             'error'   : False,
  14.             'message' : None
  15.                
  16.         }
  17.  
  18.         status_file = '%s/status.txt' % (workspace)
  19.  
  20.         if (os.path.isfile(status_file)):
  21.             with open(status_file, 'r') as fd:
  22.                 response['message'] = fd.read().strip()
  23.  
  24.         else:
  25.             response['error'] = True
  26.             response['message'] = 'No se puede leer el estado de la operación'
  27.  
  28.         await self.write(response)

Todos los servicios anteriormente mostrados irían en cada servidor que se desee usar para realizar el ataque por diccionario, quedando de la siguiente forma:

* - <Esquema>://<Dirección IP/Host>:<Puerto>/erica/get_job
* - <Esquema>://<Dirección IP/Host>:<Puerto>/erica/write
* - <Esquema>://<Dirección IP/Host>:<Puerto>/erica/crack
* - <Esquema>://<Dirección IP/Host>:<Puerto>/erica/status

Si parece tedioso repartir cada servicio para cada servidor, hay distintas modalidades. Se puede usar el comando You are not allowed to view links. Register or Login para transportar los archivos facilmente, usar un USB al modo tradicional o usar el módulo de python 'http.server' el cual crearía un pequeño servidor web local según donde lo hayamos ejecutado.

Como último archivo que tendría que estar ubicado sólo en nuestra máquina local, sería el cliente para comunicarse con los servicios mostrados anteriormente.

modules/Cmd/erica.py:

Código: Python
  1. import os
  2. import sys
  3. import asyncio
  4. import logging
  5. import hashlib
  6. import tempfile
  7. import sqlite3
  8. import multiprocessing
  9.  
  10. from modules.Infrastructure import client
  11. from utils.General import parse_config
  12. from utils.extra import create_pool
  13.  
  14. conf = parse_config.parse()
  15. client_conf = conf['Client']
  16. server_conf = conf['Server']
  17. username = server_conf['user_server']
  18. public_key = server_conf['pub_key']
  19. private_key = server_conf['priv_key']
  20. client.config = client_conf
  21. db_name = '%s/erica.db' % (tempfile.gettempdir())
  22. tmp_wordlist = '%s/erica-wordlist.lst' % (tempfile.gettempdir())
  23.  
  24. information = {
  25.     'description' : 'Realizar un ataque por diccionario',
  26.     'commands'    : [
  27.         {
  28.             'argumentos principales' : [
  29.                 {
  30.                     'args'     : ('-o', '--option'),
  31.                     'help'     : 'El comando a ejecutar en el servidor',
  32.                     'choices'  : ('get_job', 'write', 'crack', 'crack_local', 'status', 'reset'),
  33.                     'default'  : 'get_job'
  34.  
  35.                 }
  36.  
  37.  
  38.             ]
  39.  
  40.         },
  41.        
  42.         {
  43.             'argumentos requeridos por el comando \'write\'' : [
  44.                 {
  45.                     'args' : ('-w', '--wordlist'),
  46.                     'help' : 'La lista de palabras a usar'
  47.  
  48.                 }
  49.  
  50.             ]
  51.  
  52.         },
  53.  
  54.         {
  55.             'argumentos requeridos por el comando \'write\' y \'crack_local\'' : [
  56.                 {
  57.                     'args'     : ('-H', '--hash'),
  58.                     'help'     : 'La suma de verificación a atacar'
  59.  
  60.                 },
  61.  
  62.                 {
  63.                     'args'     : ('-t', '--hash-type'),
  64.                     'help'     : 'La función hash a usar'
  65.  
  66.                 }
  67.  
  68.             ]
  69.  
  70.             },
  71.  
  72.         {
  73.             'optionals'       : [
  74.                 {
  75.                     'args'    : ('-l', '--lines'),
  76.                     'help'    : 'Dividir el archivo en N líneas para cada servidor',
  77.                     'default' : 1000000,
  78.                     'type'    : int
  79.  
  80.                 },
  81.  
  82.                 {
  83.                     'args'    : ('-i', '--interval'),
  84.                     'help'    : 'El intervalo en segundos para comprobar si el trabajo a concluido',
  85.                     'type'    : int,
  86.                     'default' : 15
  87.  
  88.                 },
  89.  
  90.                 {
  91.                     'args'    : ('-m', '--max-workers'),
  92.                     'help'    : 'El máximo de procesos trabajando en la operación localmente',
  93.                     'default' : multiprocessing.cpu_count(),
  94.                     'type'    : int
  95.  
  96.                 },
  97.  
  98.                 {
  99.                     'args'    : ('-L', '--shake-length'),
  100.                     'help'    : 'La longitud del resultado en la función shake y derivados',
  101.                     'default' : 32,
  102.                     'type'    : int
  103.  
  104.                 }
  105.  
  106.             ]
  107.  
  108.         }
  109.  
  110.     ],
  111.     'version'     : '1.0.0'
  112.  
  113. }
  114.  
  115. def get_lines(filename):
  116.     count = 0
  117.  
  118.     with open(filename, 'r') as fd:
  119.         while (line := fd.readline()):
  120.             count += 1
  121.  
  122.     return count
  123.  
  124. def crack(args):
  125.     (wordlist, hash, hash_type) = args
  126.     func = getattr(hashlib, hash_type)
  127.  
  128.     with open(wordlist, 'r') as fd:
  129.         for i in fd:
  130.             i = i.strip()
  131.             hash2cmp = func(i.encode()).hexdigest()
  132.  
  133.             if (hash2cmp == hash):
  134.                 logging.info('Operación concluida localmente: %s (%s(%s))',
  135.                              hash, hash_type.upper(), i)
  136.                 return True
  137.  
  138.         logging.warning('No se pudo satisfacer la operación localmente')
  139.  
  140.         return False
  141.  
  142. def chunk(fd, lines, parts):
  143.     chunks = []
  144.  
  145.     index = 0
  146.     count = 0
  147.  
  148.     for i in range(parts):
  149.         chunks.append([])
  150.  
  151.     while (line := fd.readline()):
  152.         if not (line.strip()):
  153.             continue
  154.  
  155.         if (index == parts):
  156.             index = 0
  157.  
  158.             yield chunks
  159.  
  160.             for i in range(parts):
  161.                 chunks[i] = []
  162.  
  163.         chunks[index].append(line)
  164.            
  165.         if (count == lines):
  166.             index += 1
  167.             count = 0
  168.  
  169.             continue
  170.            
  171.         count += 1
  172.  
  173.     if (chunks != []):
  174.         yield chunks
  175.  
  176. def execute_sql_command(cmd, args=(), write=False):
  177.     with sqlite3.connect(db_name) as sqlite_db:
  178.         cursor = sqlite_db.cursor()
  179.         cursor.execute('CREATE TABLE IF NOT EXISTS jobs(job VARCHAR(32) NOT NULL, network TEXT NOT NULL)')
  180.         sqlite_db.commit()
  181.  
  182.         cursor.execute(cmd, args)
  183.  
  184.         if (write):
  185.             sqlite_db.commit()
  186.  
  187.         else:
  188.             return cursor.fetchall()
  189.  
  190. def getJob(net):
  191.     result = execute_sql_command(
  192.         'SELECT job FROM jobs WHERE network = ? LIMIT 1', (net,)
  193.  
  194.     )
  195.  
  196.     if (result != []):
  197.         return result[0][0]
  198.  
  199. def writeControl(net, response):
  200.     error = response['error']
  201.     message = response['message']
  202.  
  203.     if (error):
  204.         logging.warning('Ocurrió un error interno en el servidor "%s": %s', net, message)
  205.  
  206.     else:
  207.         logging.info('Se ha escrito una parte del diccionario en el servidor %s', net)
  208.  
  209. def jobsControl(net, response):
  210.     execute_sql_command('INSERT INTO jobs(job, network) VALUES (?, ?)', (response, net), True)
  211.  
  212.     logging.info('El trabajo "%s" se creó en el servidor "%s"', response, net)
  213.  
  214. def crackControl(net, response):
  215.     error = response['error']
  216.     message = response['message']
  217.  
  218.     if (error):
  219.         logging.warning('Ocurrió un error interno en el servidor "%s": %s', net, message)
  220.  
  221.     else:
  222.         logging.info('Se ha iniciado el ataque en el servidor "%s" 3:-)', net)
  223.  
  224. def statusControl(net, response):
  225.     error = response['error']
  226.     message = response['message']
  227.  
  228.     if (error):
  229.         logging.warning('Ocurrió un error interno en el servidor "%s": %s', net, message)
  230.  
  231.     else:
  232.         if (message == 'running'):
  233.             logging.warning('La operación todavía se sigue efectuando')
  234.  
  235.         elif (message[:7] == 'success'):
  236.             logging.info('Operación realizada con éxito, se ha obtenido la palabra correcta en la lista de palabras almacenada en el servidor "%s": %s', net, message[8:])
  237.  
  238.         elif (message == 'fail'):
  239.             logging.warning('No se pudo obtener la palabra con éxito usando la lista de palabras almacenada en el servidor "%s" :-(', net)
  240.  
  241.         else:
  242.             logging.warning('Estado desconocido en el servidor "%s": %s', net, message)
  243.  
  244. async def execute_command(net, cmd, data, callback, *args, method='POST', **kwargs):
  245.     url = '%s/erica/%s' % (net, cmd)
  246.     url_hash = hashlib.sha3_224(net.encode()).hexdigest()
  247.     pub_key_file = '%s/servkeys/%s' % (
  248.         server_conf['init_path'], url_hash
  249.    
  250.     )
  251.  
  252.     UClient = client.UTeslaClient(username)
  253.  
  254.     await UClient.set_user_keys(public_key, private_key)
  255.     await UClient.set_server_key(pub_key_file)
  256.    
  257.     try:
  258.         result = await UClient.fetch(
  259.             url, data, method=method
  260.  
  261.         )
  262.  
  263.     except Exception as err:
  264.         logging.warning('Ocurrió en la petición hacia el servidor "%s": %s', url, err)
  265.  
  266.         response = None
  267.  
  268.     else:
  269.         response = UClient.get_message(result.body)
  270.  
  271.     if (response):
  272.         return callback(net, response, *args, **kwargs)
  273.  
  274.     else:
  275.         logging.warning('No se obtuvo ningún dato por parte del servidor %s...', net)
  276.  
  277. async def MainParser(args):
  278.     hash = args.hash
  279.     hash_type = args.hash_type
  280.     wordlist = args.wordlist
  281.     lines = args.lines
  282.     interval = args.interval
  283.     max_workers = args.max_workers
  284.     option = args.option
  285.     shake_length = args.shake_length
  286.  
  287.     db = await create_pool.create(server_conf['mysql_db'])
  288.     networks = await db.get_networks(show_all=True)
  289.     jobs = []
  290.    
  291.     if (option == 'get_job') and (os.path.isfile(db_name)):
  292.         logging.warning('No se puede obtener nuevos trabajas hasta que se haga un reinicio para evitar alteraciones. Use el comando \'reset\' para permitir esta operación')
  293.         return
  294.  
  295.     if (wordlist is None) and (option == 'write'):
  296.         logging.warning('¡No se definió la ruta del diccionario a usar!')
  297.         return
  298.  
  299.     if (hash is None or hash_type is None) and (option == 'write' or option == 'crack_local'):
  300.         logging.warning('Falta definir el \'hash\' y/o la función a usar')
  301.         return
  302.  
  303.     if (option == 'get_job' or option == 'status' or option == 'crack'):
  304.         callbacks = {
  305.             'get_job' : jobsControl,
  306.             'crack'   : crackControl,
  307.             'status'  : statusControl
  308.  
  309.         }
  310.  
  311.         for _, net, token in networks:
  312.             data = {
  313.                 'token' : token
  314.  
  315.             }
  316.  
  317.             job = getJob(net)
  318.  
  319.             params = {
  320.                 'crack'   : '?id=%s' % (job),
  321.                 'status'  : '?id=%s' % (job)
  322.  
  323.             }
  324.  
  325.             jobs.append(
  326.                 execute_command(net, option + params.get(option, ''), data, callbacks[option], method='GET')
  327.  
  328.             )
  329.  
  330.     elif (option == 'write'):
  331.         local_machine = '<Local Machine>'
  332.         networks = networks + ((None, local_machine, None),)
  333.         parts = len(networks)
  334.  
  335.         with open(wordlist, 'r') as fd:
  336.             with open(tmp_wordlist, 'w', buffering=1) as tmp_fd:
  337.                 for words in chunk(fd, lines, parts):
  338.                     for (_, net, token), chunk_val in zip(networks, words):
  339.                         if (net == local_machine):
  340.                             tmp_fd.writelines(chunk_val)
  341.  
  342.                         else:
  343.                             data = {
  344.                                 'token'     : token,
  345.                                 'body'      : {
  346.                                     'wordlist'  : chunk_val,
  347.                                     'hash'      : hash,
  348.                                     'hash_type' : hash_type,
  349.                                     'shake_length'    : shake_length
  350.  
  351.                                 }
  352.  
  353.                             }
  354.  
  355.                             cmd = 'write?id=%s' % (
  356.                                 getJob(net)
  357.  
  358.                             )
  359.  
  360.                             logging.warning('Escribiendo %d líneas en %s...', len(chunk_val)-1, net)
  361.                             await execute_command(net, cmd, data, writeControl)
  362.  
  363.     elif (option == 'crack_local'):
  364.         processes = multiprocessing.Pool(max_workers)
  365.         processes.map(crack, [(tmp_wordlist, hash, hash_type)])
  366.         processes.close()
  367.         processes.join()
  368.  
  369.     elif (option == 'reset'):
  370.         files2del = [
  371.             tmp_wordlist,
  372.             db_name
  373.  
  374.         ]
  375.  
  376.         for file in files2del:
  377.             if (os.path.isfile(file)):
  378.                 os.remove(file)
  379.                 logging.warning('¡%s se ha eliminado!', file)
  380.  
  381.     await asyncio.gather(*jobs)

Preparando el escenario:

Para comenzar, necesitamos registrarnos en los diversos servidores que deseemos usar, pero la peculiaridad de todo esto es que usaremos el nombre de usuario de nuestro servidor local mas las claves de éste. Como se viene viendo en el You are not allowed to view links. Register or Login de UTesla, para generar el par de claves del servidor se usaría el siguiente comando:

Código: Bash
  1. ./UTesla
  2. # Si se desea usar la versión 3.8 de python explícitamente
  3. # python3.8 ./UTesla


Mi par de claves RSA O:)

Aquí lo importante es la clave pública que tendrá que ser transportada en los múltiples servidores que nos registraremos. En las anteriores secciones se explicó cómo transportar dichos archivos.

Una vez estamos en los otros servidores necesitamos ejecutar el siguiente comando para registrarnos:


Código: Bash
  1. ./UTeslaCLI add -u utesla -p uteslapasswd123@ -i /tmp/key.pub


Creando el usuario 'utesla' en Debian Buster


Creando el usuario 'utesla' en AntiX

Una vez se ha registrado el usuario correspondiente sin problemas en los distintos servidores de nuestra red, pasaremos a generar el token de acceso para agregar los servidores a posteriori.


Agregando 'You are not allowed to view links. Register or Login' (Debian Buster) a la red


Agregando 'You are not allowed to view links. Register or Login' (AntiX) a la red

Iniciando el ataque:

Una vez agregada las redes empecemos con el ataque, para ello simplemente ejecutemos:

Código: Bash
  1. ./UTeslaCLI erica
  2. ./UTeslaCLI erica -w /tmp/wordlist.lst -t md5 -H 9d2b9e517b4c13d92a91472d1d1d4acb -o write -l 30000


Escribiendo un diccionario de 14MB en los servidores


El resultado de haber obtenido la palabra 'dtxdf' a partir de '9d2b9e517b4c13d92a91472d1d1d4acb'

Como ya hizo saber, el diccionario será dividido según las partes y el número de líneas proporcionado, en este se dividirá en tres partes; dos son de los servidores y la tercera es local, almacenada como '/tmp/erica-wordlist.lst'. Si los servidores no pudieron satisfacer la operación, se puede probar el ataque de manera local:


Intento por realizar el ataque de manera local

Como se puede observar se intentó realizar el ataque de manera local con el diccionario dividido, pero fue un intento fallido, aunque lo bueno es que el primer servidor (Debian Buster) si logró satisfacer la operación.

Notas:

* El contenido está hecho con fines demostrativos, en entornos reales y mejor preparados se usaría un cluster con buena maquinaria (en un futuro quizá haga un tutorial 3:-D)
* Tengo que aclarar nuevamente que UTesla aún no está diseñado para transportar grandes cantidades de datos eficientemente, se realizó un pequeño protocolo entre plugin/servicios para enviar por partes el archivo. Ya se está preparando la mejora para enviar cargas grandes con un buen rendimiento
* Espero hayan disfrutado y aprendido tanto como yo lo hice :D


~ DtxdF
Los seres humanos son robots, cuyo combustible es el afanado dinero.

Desconectado d3adly

  • *
  • Colaborador
  • *
  • Mensajes: 89
  • Actividad:
    100%
  • Country: 00
  • Reputación 5
    • Ver Perfil
    • sh1tty c0d3
    • Email

Re:Ataque por diccionario usando UTesla y Erica

  • en: Julio 10, 2020, 02:40:27 pm
Buenisimo compañero.
Ya decia yo, cuando se viene lo que todos pensamos: cracking distribuido  ;D.

Felicidades por tu proyecto @You are not allowed to view links. Register or Login esta muy genial. UTesla sera la base de mas proyectos geniales como este.

Mis respetos, saludos.
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn

Conectado Gabriela

  • *
  • Co Admin
  • Mensajes: 985
  • Actividad:
    100%
  • Country: 00
  • Reputación 21
  • Twitter: @hira_io
    • Ver Perfil
    • Email

Re:Ataque por diccionario usando UTesla y Erica

  • en: Julio 10, 2020, 05:06:23 pm

  @You are not allowed to view links. Register or Login

Como te han comentado antes: felicitaciones!!

Cuando se lee tu proyecto, la claridad de exposición, los comentarios/documentación y la transparencia de un código limpio, únicamente queda expresar, no solo el agradecimiento porque lo compartes sino mi profunda admiración.

Saludos

Gabriela


Tú te enamoraste de mi valentía, yo me enamoré de tu oscuridad; tú aprendiste a vencer tus miedos, yo aprendí a no perderme en tu abismo.

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 775
  • Actividad:
    100%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email

Re:Ataque por diccionario usando UTesla y Erica

  • en: Julio 10, 2020, 07:49:49 pm
Muchísimas gracias a los dos (@You are not allowed to view links. Register or Login y @You are not allowed to view links. Register or Login) y a todos los lectores, será un placer seguir continuando con esta temática ^-^

~ DtxdF
Los seres humanos son robots, cuyo combustible es el afanado dinero.

Conectado Kirari

  • *
  • Moderator
  • Mensajes: 191
  • Actividad:
    100%
  • Country: ru
  • Reputación 11
  • No dejes que el mundo te corrompa
    • Ver Perfil
    • Baúl para el público

Re:Ataque por diccionario usando UTesla y Erica

  • en: Julio 10, 2020, 10:26:13 pm
Me ha gustado mucho como has implementado mi viejo script en tu gran proyecto, sin duda la idea del cracking distribuido resulta grandiosa. Nuevamente felicitaciones amigo por todos estos grandes aportes  ;D ;D ;D

Ya tendremos esa GUI esperada, un poco de paciencia  :D

Saludos!
-Kirari
Jamás te contarán la verdadera versión, siempre te dirán la suya... Por eso... Si quieres saber la verdad, debes buscarla tú mismo...

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 775
  • Actividad:
    100%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email

Re:Ataque por diccionario usando UTesla y Erica

  • en: Julio 10, 2020, 11:00:08 pm
Gracias compañero @You are not allowed to view links. Register or Login, es un placer :'D

~ DtxdF
Los seres humanos son robots, cuyo combustible es el afanado dinero.

Desconectado AXCESS

  • *
  • Moderador Global
  • Mensajes: 806
  • Actividad:
    100%
  • Country: 00
  • Reputación 15
    • Ver Perfil
    • Email

Re:Ataque por diccionario usando UTesla y Erica

  • en: Julio 12, 2020, 01:55:27 am
Muy bien hecho el post, y toda una joyita.
Muy bueno @You are not allowed to view links. Register or Login.
You are not allowed to view links. Register or Login

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 775
  • Actividad:
    100%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email

Re:Ataque por diccionario usando UTesla y Erica

  • en: Julio 12, 2020, 02:50:03 am
Muchísimas gracias @You are not allowed to view links. Register or Login, será un placer seguir aportando estos temas ^-^

~ DtxdF
Los seres humanos son robots, cuyo combustible es el afanado dinero.

 

Usando la herramienta "Weevely"

Iniciado por OswireW0rding

Respuestas: 1
Vistas: 4256
Último mensaje Marzo 11, 2014, 07:12:05 pm
por Acidkode
BruteSpray: automatizar el escaneo de puertos y hacer ataque por fuerza bruta

Iniciado por Gabriela

Respuestas: 7
Vistas: 6331
Último mensaje Enero 05, 2019, 11:42:32 pm
por KiddArabic
[CURSO] Tecnicas basicas y avanzadas de ataque y defensa Hacking

Iniciado por graphixx

Respuestas: 0
Vistas: 4447
Último mensaje Febrero 09, 2016, 04:50:39 am
por graphixx
[CONFERENCIA][VIDEO DESCARGA] Ataque a servidores web y seguridad en redes

Iniciado por graphixx

Respuestas: 0
Vistas: 3071
Último mensaje Marzo 12, 2016, 01:42:59 am
por graphixx
[vide0]Xss+Set+Msf+Java applet infection+Ataque remoto

Iniciado por ju4nz123

Respuestas: 2
Vistas: 3159
Último mensaje Mayo 22, 2011, 04:57:16 pm
por ju4nz123