2017-05-09 2 views
0

Donc pour des raisons personnelles, je veux me connecter à une socket que je crée via telnetlib, je peux me connecter à partir de netcat mais quand j'essaye de python refuse la connexion.Connexion refusée sur les sockets python (le port est ouvert, je peux me connecter avec nc)

tn.write(b"/usr/bin/nc -l -p 3333 -e /bin/sh\n") 
print("netcat listening on 3333 on target, trying to connect") 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((tn.host, 3333)) 
s.send('ls') 
print(s.recv(1024)) 
s.close() 

Si je peux connecter via netcat (en mettant par exemple et boucle infinie après tn.write())

+0

est-ce que cela devrait être '/ bin/sh ' comme dans le code que vous avez montré? –

+0

ce n'est pas le problème si je lance/usr/bin/nc -l -p 3333 -e/bin/sh sur la machine distante je peux me connecter via netcat –

+0

Vous pourriez noter que la commande que vous démarrez de python a une citation à la fin selon le code que vous avez montré alors que la commande que vous exécutez sur la machine distante ne le fait pas. –

Répondre

1

Vous avez un race condition classique:

Le paquet contenant la commande commencer un nc est envoyé à seulement nanosecondes avant la demande de connexion (paquet TCP SYN) de s.connect. Il peut même arriver que le SYN arrive à l'hôte distant avant la commande pour démarrer nc.

Vous devez ajouter une synchronisation correcte. Du code que vous avez montré, il n'y a vraiment pas besoin d'utiliser deux canaux en premier lieu, alors pourquoi ne pas envoyer le ls via le canal telnet existant à l'hôte distant?

Si vous devez absolument utiliser un second canal, essayez l'une de ces options:

  • Ajouter import time et time.sleep(5) juste avant d'appeler s.connect. De cette façon, la tentative de connexion sera différée de 5 secondes. Cependant, en général, il n'y a aucune garantie que 5 secondes suffisent.
  • Envoyez une commande supplémentaire à wait for the port to be taken, pour indiquer que nc est prêt.
  • Réessayez plusieurs fois (et patientez entre les deux).

Notez également que votre code a trois failles de sécurité différentes:

  1. Vous utilisez telnetlib, qui ne garantit la confidentialité, ni l'intégrité des commandes, la production et les mots de passe. Utilisez ssh à la place.
  2. Vous vous connectez au port 3333 en mode normal, ce qui n'assure ni la confidentialité ni l'intégrité des commandes et des sorties. Utilisez ssh à la place.
  3. Entre le démarrage de nc et votre programme se connectant à celui-ci, n'importe qui peut se connecter au port 3333 et exécuter des commandes arbitraires. Utilisez ssh à la place.
+0

Merci pour votre explication! J'ai réussi à le réparer, je sais qu'il a des failles de sécurité mais je le fais à des fins de recherche. Merci encore! –