如何使用C脚本远程打开终端

问题描述 投票:0回答:1

该项目由服务器(受害者 - Debian)和客户端(攻击者 - Kali)组成。服务器是一个循环运行并监听端口的程序。 它通过网络从客户端接收消息。每条消息必须对应于要执行的系统命令。 每条消息必须对应于要执行的系统命令。一旦执行,服务器会向客户端发送一条消息 执行命令的结果。

客户端是攻击者会攻击的另一个程序 随意奔跑。

我已经尝试过了;

服务器端(debian):

#define BUFFER_SIZE 1024

int main(void)
{
        int sockid;
        int port = 1254;
        char *ip = "192.168.0.42";

        sockid = socket(AF_INET, SOCK_STREAM,0); //paramètre du socket
        struct sockaddr_in server_addr, client_addr;
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(port);
        server_addr.sin_addr.s_addr = inet_addr(ip);

        char *buffer[BUFFER_SIZE];
        int n, len;
        int bind_result = bind(sockid, (const struct sockaddr *)&server_addr, sizeof(server_addr));

        if(bind_result<0)
        {
                printf("Erreur durant la liaison de l'IP au socket\n");
        }
        else
        {
                printf("Ecoute sur %s:%d\n", ip, port);
                len = sizeof(client_addr);
                n = recvfrom(sockid, (char *)buffer, BUFFER_SIZE,
                        MSG_WAITALL, (struct sockaddr *) &client_addr,&len);
                printf("Message de taille %d envoyé par [%s:%d]: %s\n",n, inet_ntoa(client_addr.sin_addr), client_addr.sin_port, buffer);

        }
        close(sockid);

}

在客户端(kali):

#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>

int main(void)
{
        int sockid;
        int port = 1254;
        char *ip = "192.168.0.42";

        sockid = socket(AF_INET, SOCK_DGRAM,0);

        struct sockaddr_in server_addr;
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(port);
        server_addr.sin_addr.s_addr = inet_addr(ip);

        char *msg = "Salutation serveur ! ceci est un message test";
//      char *const argv[] = {"/bin/sh", 0};
//      execve("/bin/sh", argv, 0);

        sendto(sockid, (const char *)msg, strlen(msg), 0, (const struct sockaddr *) &server_addr,sizeof(server_addr));

//      return 0;
        close(sockid);
}

使用此代码,我可以向我的服务器发送消息或在本地打开 shell(使用注释的代码)。

但是我想发送“打开终端”到我的服务器,以便能够使用我的 Kali 中的命令——用两个词来说,一个反向 shell

c
1个回答
1
投票

如果您想远程执行命令,通常会使用 ssh。您不需要进行任何套接字编程即可使用 ssh。

如果您可以使用 ssh,那么您应该使用。你不应该重新发明轮子。而且使用 ssh 更安全!

听起来这是一个课堂作业。您需要编写一个套接字“侦听器”来执行某些远程命令并返回命令的输出。如果是这样,您可能希望套接字调用 popen()

这是一个简单的“popen()”示例:

https://c-for-dummies.com/blog/?p=1418

#include <stdio.h>

int main()
{
    FILE *p;
    int ch;

    p = popen("ver","r");   /* DOS */
/*  p = popen("uname","r"); /* Unix */
    if( p == NULL)
    {
        puts("Unable to open process");
        return(1);
    }
    while( (ch=fgetc(p)) != EOF)
        putchar(ch);
    pclose(p);

    return(0);
}

澄清“服务器”和“客户端”的通常含义:

  • 服务器:等待命令,执行命令,返回响应。
  • 客户端:向服务器发送命令,等待服务器响应。

您绝对不需要以编程方式“打开终端”来完成这些操作。

附录

关于课堂作业的要求:

该项目由服务器(受害者 - debian)和客户端(攻击者 - kali)组成。服务器是一个循环运行并监听端口的程序。它通过网络从客户端接收消息。每条消息必须对应于要执行的系统命令。每条消息必须对应于要执行的系统命令。执行后,服务器会向客户端发送一条消息,其中包含执行命令的结果。

简单易行。你就快到了:

  • 您需要将服务器修改为listen(),然后accept()新请求,并循环处理它们。
  • 您的服务器可以使用popen()来执行请求的命令,并将结果写回客户端。忘记“打开终端”。
  • 您的客户正在发送“OK”。现在您需要修改它以从服务器读回结果。

这里有一些示例代码:https://www.thegeekstuff.com/2011/12/c-socket-programming/(Google 上有很多很多示例)

您可能还对 Beej 网络编程指南

感兴趣
© www.soinside.com 2019 - 2024. All rights reserved.