Salut à toi ! Aujourd’hui, je te montre comment mettre en place un faux serveur SSH écrit en Python (avec Paramiko), et comment le faire tourner dans un conteneur Docker. C’est super pratique pour jouer avec un honeypot basique, enregistrer des tentatives de login ou simplement t’amuser à piéger des bots qui scannent tes ports.

1. Le script Python
On utilise la librairie Paramiko qui gère tout le protocole SSH. Ça nous permet de :
- Simuler un vrai serveur SSH (handshake, chiffrement…),
- Définir un utilisateur/password en dur,
- Afficher une bannière (pour faire genre on est sur Debian ou un autre OS),
- Capturer/Voler les mots de passe erronés et renvoyer un shell bidon.
Exemple de code (fichier ssh.py
) :
pythonCopierModifierimport socket
import threading
import paramiko
HOST_KEY = paramiko.RSAKey.from_private_key_file("test_rsa.key")
class FakeSSHServer(paramiko.ServerInterface):
def __init__(self):
self.event = threading.Event()
def check_auth_password(self, username, password):
if username == "root" and password == "1234":
return paramiko.AUTH_SUCCESSFUL
else:
print(f"[-] Auth ratée : login={username}, pass={password}")
return paramiko.AUTH_FAILED
def get_allowed_auths(self, username):
return "password"
def check_channel_request(self, kind, chanid):
if kind == "session":
return paramiko.OPEN_SUCCEEDED
return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED
def check_channel_shell_request(self, channel):
self.event.set()
return True
def start_fake_ssh_server(host='0.0.0.0', port=22):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((host, port))
server_socket.listen(100)
print(f"Faux SSH en écoute sur {host}:{port}")
while True:
client, addr = server_socket.accept()
print(f"[+] Connexion entrante de {addr}")
t = paramiko.Transport(client)
t.add_server_key(HOST_KEY)
server = FakeSSHServer()
try:
t.start_server(server=server)
except paramiko.SSHException:
print("[-] Erreur de négociation SSH")
continue
chan = t.accept(20)
if chan is None:
print("[-] Pas de channel, connexion abandonnée.")
continue
print("[+] Authentification OK, session ouverte.")
server.event.wait(10)
if not server.event.is_set():
print("[-] Pas de requête de shell, on ferme.")
chan.close()
continue
banner = """Linux server6.1.0-23-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) x86_64
Last login: Wed Jan 29 00:14:10 2025 from 192.168.1.68
"""
chan.send(banner.encode("utf-8"))
while True:
chan.send(b"$ ")
command = ""
while not command.endswith("\r") and not command.endswith("\n"):
data = chan.recv(1024)
if not data:
break
command += data.decode("utf-8")
command = command.strip()
if not command:
continue
if command.lower() == "exit":
chan.send(b"Bye!\r\n")
break
response = f"Tu as tapé: {command}\r\n"
chan.send(response.encode("utf-8"))
chan.close()
if __name__ == "__main__":
start_fake_ssh_server()
Assure-toi d’avoir généré une clé RSA au format PEM (ex. test_rsa.key
), installée dans le même dossier via la commande ssh-keygen -t rsa -b 2048 -m PEM -f test_rsa.key.
2. Dockeriser le faux serveur
On va créer deux fichiers : Dockerfile et docker-compose.yml.
Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY . /app
RUN pip install --no-cache-dir paramiko
EXPOSE 22
CMD ["python", "ssh.py"]
docker-compose.yml
version: "3.9"
services:
fake-ssh:
build: .
container_name: fake-ssh
ports:
- "22:22" # Ou "2222:22" si tu ne veux pas toucher au vrai port 22
restart: unless-stopped
Place ces deux fichiers, avec ssh.py
et test_rsa.key
, dans un même dossier.
Pour lancer :
docker-compose up --build
Et voilà, ton serveur SSH factice est dispo sur le port 22
3. Test
Depuis ta machine, essaie :


Tu verras la bannière bidon, un prompt #. Les mauvaises tentatives de mots de passe seront loguées dans ta console Docker pour voir les mot de passes tenté.
Conclusion
Ce projet est un petit honeypot sympa ou un outil pour s’amuser. Libre à toi d’enrichir le script pour logger davantage d’infos, faire semblant de répondre à des commandes Linux, etc.
Amuse-toi bien !