该项目由服务器(受害者 - 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。
如果您想远程执行命令,通常会使用 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)组成。服务器是一个循环运行并监听端口的程序。它通过网络从客户端接收消息。每条消息必须对应于要执行的系统命令。每条消息必须对应于要执行的系统命令。执行后,服务器会向客户端发送一条消息,其中包含执行命令的结果。
简单易行。你就快到了:
这里有一些示例代码:https://www.thegeekstuff.com/2011/12/c-socket-programming/(Google 上有很多很多示例)
您可能还对 Beej 网络编程指南
感兴趣