** 谁要“多线程端口扫描程序”源码! *** (0分)

  • 主题发起人 主题发起人 paf
  • 开始时间 开始时间
www.20cn.net
黑客进阶版或者其他版有很多这样的文章(下面只是其中一篇)
原创:alarm(alarm)
作者:refdom (refdom@263.net)

Scan,是一切入侵的基础,对主机的探测工具非常多,比如大名鼎鼎的nmap。我这里没有什么新鲜技术,都是一些老东西老话题,即使参考的Phrack文档也甚至是96年的老文档,我只是拾人牙慧而已。

最基本的探测就是Ping,不过现在连基本的个人防火墙都对Ping做了限制,这个也太基本了。如果透过防火墙,如何获得最理想的目标图,也是很多人整天思考的问题。

一、高级ICMP扫描技术

Ping就是利用ICMP协议走的,我们在这里主要是利用ICMP协议最基本的用途:报错,根据网络协议,如果按照协议出现了错误,那么接收端将产生一个ICMP的错误报文。这些错误报文并不是主动发送的,而是由于错误,根据协议自动产生。

当IP数据报出现checksum和版本的错误的时候,目标主机将抛弃这个数据报,如果是checksum出现错误,那么路由器就直接丢弃这个数据报了。有些主机比如AIX、HP-UX等,是不会发送ICMP的Unreachable数据报的。

我们利用下面这些特性:
1、向目标主机发送一个只有IP头的IP数据包,目标将返回Destination Unreachable的ICMP错误报文。
2、向目标主机发送一个坏IP数据报,比如,不正确的IP头长度,目标主机将返回Parameter Problem的ICMP错误报文。
3、当数据包分片但是,却没有给接收端足够的分片,接收端分片组装超时会发送分片组装超时的ICMP数据报。

向目标主机发送一个IP数据报,但是协议项是错误的,比如协议项不可用,那么目标将返回Destination Unreachable的ICMP报文,但是如果是在目标主机前有一个防火墙或者一个其他的过滤装置,可能过滤掉提出的要求,从而接收不到任何回应。可以使用一个非常大的协议数字来作为IP头部的协议内容,而且这个协议数字至少在今天还没有被使用,应该主机一定会返回Unreachable,如果没有Unreachable的ICMP数据报返回错误提示,那么就说明被防火墙或者其他设备过滤了,我们也可以用这个办法来探测是否有防火墙或者其他过滤设备存在。

利用IP的协议项来探测主机正在使用哪些协议,我们可以把IP头的协议项改变,因为是8位的,有256种可能。通过目标返回的ICMP错误报文,来作判断哪些协议在使用。如果返回Destination Unreachable,那么主机是没有使用这个协议的,相反,如果什么都没有返回的话,主机可能使用这个协议,但是也可能是防火墙等过滤掉了。NMAP的IP Protocol scan也就是利用这个原理。

利用IP分片造成组装超时ICMP错误消息,同样可以来达到我们的探测目的。当主机接收到丢失分片的数据报,并且在一定时间内没有接收到丢失的数据报,就会丢弃整个包,并且发送ICMP分片组装超时错误给原发送端。我们可以利用这个特性制造分片的数据包,然后等待ICMP组装超时错误消息。可以对UDP分片,也可以对TCP甚至ICMP数据包进行分片,只要不让目标主机获得完整的数据包就行了,当然,对于UDP这种非连接的不可靠协议来说,如果我们没有接收到超时错误的ICMP返回报,也有可能时由于线路或者其他问题在传输过程中丢失了。

我们能够利用上面这些特性来得到防火墙的ACL(access list),甚至用这些特性来获得整个网络拓扑结构。如果我们不能从目标得到Unreachable报文或者分片组装超时错误报文,可以作下面的判断:
1、防火墙过滤了我们发送的协议类型
2、防火墙过滤了我们指定的端口
3、防火墙阻塞ICMP的Destination Unreachable或者Protocol Unreachable错误消息。
4、防火墙对我们指定的主机进行了ICMP错误报文的阻塞。

二、高级TCP扫描技术

最基本的利用TCP扫描就是使用connect(),这个很容易实现,如果目标主机能够connect,就说明一个相应的端口打开。不过,这也是最原始和最先被防护工具拒绝的一种。
在高级的TCP扫描技术中主要利用TCP连接的三次握手特性来进行,也就是所谓的半开扫描。这些办法可以绕过一些防火墙,而得到防火墙后面的主机信息。当然,是在不被欺骗的情况下的。下面这些方法还有一个好处就是比较难于被记录,有的办法即使在用netstat命令上也根本显示不出来。

SYN
向远端主机某端口发送一个只有SYN标志位的TCP数据报,如果主机反馈一个SYN || ACK数据包,那么,这个主机正在监听该端口,如果反馈的是RST数据包,说明,主机没有监听该端口。在X-Scanner 上就有SYN的选择项。

ACK
发送一个只有ACK标志的TCP数据报给主机,如果主机反馈一个TCP RST数据报来,那么这个主机是存在的。

FIN
对某端口发送一个TCP FIN数据报给远端主机。如果主机没有任何反馈,那么这个主机是存在的,而且正在监听这个端口;主机反馈一个TCP RST回来,那么说明该主机是存在的,但是没有监听这个端口。

NULL
即发送一个没有任何标志位的TCP包,根据RFC793,如果目标主机的相应端口是关闭的话,应该发送回一个RST数据包。

FIN+URG+PUSH
向目标主机发送一个Fin、URG和PUSH分组,根据RFC793,如果目标主机的相应端口是关闭的,那么应该返回一个RST标志。

三、高级UDP扫描技术
在UDP实现的扫描中,多是了利用和ICMP进行的组合进行,这在ICMP中以及提及了。还有一些特殊的就是UDP回馈,比如SQL SERVER,对其1434端口发送‘x02’或者‘x03’就能够探测得到其连接端口。


下面这段程序就是一个TCP探测的例子,当然,并没有做得完美,因为没有接收部分,而在WIN2000下实际就是一个选择性的SNIFFER,呵呵,大家可以使用其他的SNIFFER来实现同样的目的。也可以改变下面的程序只发送IP包,利用ICMP特性来实现探测。

#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#define SOURCE_PORT 7234
#define MAX_RECEIVEBYTE 255

typedef struct ip_hdr //定义IP首部
{
unsigned char h_verlen; //4位首部长度,4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)
unsigned short ident; //16位标识
unsigned short frag_and_flags; //3位标志位
unsigned char ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IPHEADER;

typedef struct tsd_hdr //定义TCP伪首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //协议类型
unsigned short tcpl; //TCP长度
}PSDHEADER;

typedef struct tcp_hdr //定义TCP首部
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首部长度/6位保留字
unsigned char th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
}TCPHEADER;

//CheckSum:计算校验和的子函数
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}

cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}

void usage()
{
printf("******************************************/n");
printf("TCPPing/n");
printf("/t Written by Refdom/n");
printf("/t Email: refdom@263.net/n");
printf("Useage: TCPPing.exe Target_ip Target_port /n");
printf("*******************************************/n");
}

int main(int argc, char* argv[])
{
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN addr_in;
IPHEADER ipHeader;
TCPHEADER tcpHeader;
PSDHEADER psdHeader;

char szSendBuf[60]={0};
BOOL flag;
int rect,nTimeOver;

usage();

if (argc!= 3)
{ return false; }

if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
printf("WSAStartup Error!/n");
return false;
}

if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
printf("Socket Setup Error!/n");
return false;
}
flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL error!/n");
return false;
}

nTimeOver=1000;
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)
{
printf("setsockopt SO_SNDTIMEO error!/n");
return false;
}
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(atoi(argv[2]));
addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);

//
//
//填充IP首部
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
// ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.sourceIP=inet_addr("本地地址");
ipHeader.destIP=inet_addr(argv[1]);

//填充TCP首部
tcpHeader.th_dport=htons(atoi(argv[2]));
tcpHeader.th_sport=htons(SOURCE_PORT); //源端口号
tcpHeader.th_seq=htonl(0x12345678);
tcpHeader.th_ack=0;
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=2; //修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测 等等
tcpHeader.th_win=htons(512);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0;

psdHeader.saddr=ipHeader.sourceIP;
psdHeader.daddr=ipHeader.destIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader));

//计算校验和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));

memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));

memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));

rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),
0, (struct sockaddr*)&addr_in, sizeof(addr_in));
if (rect==SOCKET_ERROR)
{
printf("send error!:%d/n",WSAGetLastError());
return false;
}
else
printf("send ok!/n");

closesocket(sock);
WSACleanup();

return 0;
}

 
还有一篇类似的,可以看看。
***********************************************************************
标题 ICMP漏洞分析 zou5655(收藏)

关键字 ICMP漏洞



ICMP在IP中的结构是这样的.
VERSION 4
IHL INTERNET HEADER LENGTH IN 32-BITS
TYPE OF SERVICE 0
TOTAL LENGTH LENGTH OF INTERNET HEADER AND DATA IN 字节单位
IDENTIFICATION, FLAGS
分割和重组IP的标记.
TIME TO LIVE
TTL
PROTOCOL 这一点很重要,表示这次IP包内的是ICMP信息.
ICMP=1
SOURCE ADDRESS
发送这个包的原主机IP地址或路由器地址.(在发送ICMP包是可以是任何路由器的地址)
DESTINATION ADDRESS
准备接受这个icmP包的IP地址.
_____________________________________________
目的主机不可到达的ICMP包结构.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type Code Checksum
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
unused
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Internet Header + 64 bits of Original Data Datagram
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
类型 代码 校验和
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
保留字
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IP头和64位原始IP数据 既是原来发送普通IP包有错的数据
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
在IP段里,目的IP是发送错误包的IP地址.
在ICMP 段里
类型是 3
代码有.
0= 网络不可到达.
1= 主机不可到达.
2= 协议不可到达.
3= 端口不可到达.
4= 包需要重组.
5= 原路由失败.
校验和
校验和是0,
Internet Header + 64 bits of Data Datagram
协议头和原数据的前64位.如果原来的协议是高层协议,那么这就是前64
位高层协议的数据.
描述....
如果根据路由的路由表,在一个数据包里的目的网络是不可到达的,例如:
目的网络是无限远,那么,路由就发送一个目的不可到达的消息给这个包的发送者.
在一些路由里,有能力判断目的主机不可能到达的,就回发送主机不可到达.
如果在目的主机里,IP
模块不能传递数据给上层的端口或协议,(因为端口没有激活,或所指的高层协议根本不存在),那么
目的主机会发送目的不可到达的信息回去.
另外一种情况是,当数据报必须分割以通过一个网管时,而偏偏在IP
包里指定了不要分割.此时,网关回发送目的不可到达信息.
代码 0.1. 4, 5的ICMP 一般由路由发送.而 代码 2 3
则来自目的主机.
(cceye 评: 在这个包里,因为0,1, 4 ,5
代码可能来字任何的路由,所以不需要伪造IP
就可以发送ICMP包,此时假冒自己是路由器.
有一点困难是目的不可到达的ICMP包要求附带有原数据的前64位.不过可以假设,
例如:
HOST A -------HOST B
而你是HOST C , 可以想象A
要是访问外界有一些基本的要求,从这里下手,
可以
猜测到他的原始数据.
其一是 DNS , 假如DNS是HOST D , 而我们知道A
必须要访问DNS 才能得以访问其他主机. 而且A
常常访问一个K域,所以只要不断的向A
发送主机不可到达的ICMP信息,并带上那个查询DNS的
K 域名的信息就极有可能成功.
在局域网里可以假冒IP,这时可以假冒受害主机IP地址,并猜测其他主机可能会访问该主机的哪个
高层协议,这时可以发送协议或端口不可到达给所有的主机,
如果技术上能够达到扫描所有的局域网上的包的话,
则只要发现有访问受害主机的包,就紧跟着发送ICMP
端口不可到达.使其他主机不能访问主机)
____________________________________________________________
Time Exceeded Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type Code Checksum
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
unused
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Internet Header + 64 bits of Original Data Datagram
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
超时信息.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
类型 代码 校验和
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
保留字
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IP头和64位原始IP数据 既是原来发送普通IP包有错的数据
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
在IP段里,目的IP是发送错误包的IP地址.
在ICMP 段里
类型为 11
代码
0= TTL生命期结束.
1= 分割重组时间超时.
校验和
校验和是0,
Internet Header + 64 bits of Data Datagram
协议头和原数据的前64位.如果原来的协议是高层协议,那么这就是前64
位高层协议的数据.
描述.
当一个路由处理一个IP 包时,发现其TTL已经为0 ,
则路由有责任把这个数据销毁,不再转发.并会通知原主机.
当一个主机重组一个分割过的IP时,在系统内定的时间内没有接受到所有的分组而不能完成任务
时.会销毁这个分组并告之原主机.
如果分组被设为0 , (就是没有分组,
那么没有必要设定超时限制)
代码1 会来自一个主机, 代码0 会来自一个路由.
(CCEYE 分析: 这个的困难和上一个一样,
是要知道原主机所发的数据.
引起主机的反应不一样, 因为路由表的原因,
在小网和网络支段伪造IP 很不容易.((可以假冒,
但是通不过静态配置的路由器)) 这里只能冒充路由,返回这个ICMP包会时原主机不断试图加大
TTL
而不断重发相同的包. 关键取决与你的主机与
他的目的主机谁的先一步到,会使受害主机不能访问外界网络)
______________________________________________________-
Parameter Problem Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type Code Checksum
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Pointer unused
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Internet Header + 64 bits of Original Data Datagram
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
参数错误信息.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type Code Checksum
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Pointer unused
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Internet Header + 64 bits of Original Data Datagram
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
在IP段里,目的IP是发送错误包的IP地址.
在ICMP 段里
类型为 12
代码
0 = 指针表明了错误.
校验和为 0
指针
如果代码为0 , 标明发生错误的字节.
Internet Header + 64 bits of Data Datagram
协议头和原数据的前64位.如果原来的协议是高层协议,那么这就是前64 位高层协议的数据. 描述, 如果主机或路由在传输一个数据报时发现了一个错误, 那么该主机必须销毁此包并给原主机一个ICMP信息. 代码 0 可以由 主机 或 路由 发出.
(CCEYE 评: 同上一个的方法获得一样的效果,但需要计算更多.)
___________________________________________________________-
Source Quench Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type Code Checksum
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
unused
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Internet Header + 64 bits of Original Data Datagram
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
原数据丢失 信息.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type Code Checksum
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
unused
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Internet Header + 64 bits of Original Data Datagram
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
在IP段里,目的IP是发送错误包的IP地址.
在ICMP 段里
类型为 4
代码
0
校验和
为 0
Internet Header + 64 bits of Data Datagram
协议头和原数据的前64位.如果原来的协议是高层协议,那么这就是前64
位高层协议的数据.
描述:
当一个路由或主机的内部队列已经被等待处理的数据报添满而不能处理时,
会自动销毁新进来的数据报,并告诉原主机数据发送太快,
------------------------------------
(cceye:这个ICMP
包会使原主机发送包的速度越来越慢.方法同上)
_____________________________________
Redirect Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type Code Checksum
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Gateway Internet Address
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Internet Header + 64 bits of Original Data Datagram
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
重定向信息.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type Code Checksum
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Gateway Internet Address
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Internet Header + 64 bits of Original Data Datagram
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
在IP段里,目的IP是发送错误包的IP地址.
在ICMP 段里
类型为 5
代码
0 = 重定向网络.
1 = 冲定向主机
2 = 重定向服务类型和网络
3 = 重定向服务类型和主机
校验和
为 0
Gateway Internet Address
原数据包的目的主机要经过的路由地址.
Internet Header + 64 bits of Data Datagram
Internet Header + 64 bits of Data Datagram
协议头和原数据的前64位.如果原来的协议是高层协议,那么这就是前64
位高层协议的数据.
描述:
一个路由发送一个重定向消息给一个主机在如下的环境下.
一个路由, G1
从一个属于他的网络中的主机得到一个数据报.G1
检查他的路由表并得到下一个路由的地址,G2
是连接着目的网络的路由, 如果G1在此时发现G2是直接连接着同属于这个数据包的原主机的网络
的话.
G1将发送一个重定向信息给原主机.告诉他连向那个网络的路由有一个更好的.路由同时把数据报
传送到目的网络.
对于在IP选项中有原路由路径的数据报,路由将不发重定向ICMP即使有更好的路由.
代码 0.1, 2, 3 都来自同路由器
(CCEYE:评.
使用该选项使目的主机完全与外界失去联系);
___________________________________________________________
Echo or Echo Reply Message
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type Code Checksum
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Identifier Sequence Number
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Data ...
+-+-+-+-+-
回声回应信息.
IP地址,目的主机的IP地址,为了回应一个回声,简单的把目的地址和原地址调换,
把类型改为0 , 并重新校验即可.
类型
8 发送回声请求.
0 回应回声.
代码
0
校验和.
Identifier
如果代码为0 ,一个标视符会加如来回应. 可以为0.
Sequence Number
如果代码为0 , 一个序列号会帮助对应回声响应.可以为0.
描述:
在回声请求里带的数据必须要被回应带回来.
标志符和序列号用来帮助回声请求者来检测回声请求.回应者必须返回同样的值.
代码 0 可以由一个主机或路由发送.
_______________________________________________-
ICMP
还有广播路由的功能.
可以肯定,一个专线主机不会和DNS服务器连接在一个网络中.
计划:
1, 假冒路由, 告诉主机DNS服务器不可到达.
需要, 一个路由, 一个DNS 服务器.两个网段.
受害主机 A ----路由 -------DNS 服务器
_________-发动攻击的主机.
目的,看A 接受到我的错误ICMP后,还对DNS是否有反应
结果:受害主机与DNS服务器之间的联系效率降低
3/4 .
2, 假冒路由, 告诉主机TTL超时.
需要, 一个路由, 一个DNS 服务器.两个网段.
受害主机 A ----路由 -------DNS 服务器
_________-发动攻击的主机.
目的,看A 接受到我的错误ICMP后,还对DNS是否有反应.
3, 假冒路由告诉主机原数据丢失.
需要, 一个路由, 一个DNS 服务器.两个网段.
受害主机 A ----路由 -------DNS 服务器
________-发动攻击的主机.
目的,看A 接受到我的错误ICMP后,还对DNS是否有反应.
4 , 假冒路由,告诉主机有更好的路由.
需要, 一个路由, 一个DNS 服务器.两个网段.
受害主机 A ----路由 -------DNS 服务器
_________-发动攻击的主机.
看主机在接受到ICMP错误信息后,还能不能访问DNS.
结果:奇怪的是路由器陷入几乎死机的状态. (32M
133MHZ redhat6.1 的路由器).看来恶意数据报被路由销毁了,但是由于算法,或机器的原因而导致太慢.
_____________________
以上是假冒路由,
以下是假冒主机在局域网内部.
计划
1 , 假冒主机依次告诉所有主机端口不可到达.
需要,
一个受害主机, 运行代理服务器.一个局域网
受害主机
__________________
A B C D 攻击主机
看局域网内部的主机是否还能访问受害主机.
2 , 假冒主机,依次告诉所有主机分组超时.
需要,
一个受害主机, 运行代理服务器.一个局域网
受害主机
__________________
A B C D 攻击主机
看局域网内部的主机是否还能访问受害主机.
________________
实验记录:
WIN95 97 98 NT的IP 序列号从0 开始, 到65535
再次从头开始 , 间隔256.
LINUX 的IP 序列号是以1 为间隔.
每个TCP的连接在无法接到回应的情况下,会连续产生4次试图连接.
现在实验看这里的4个连接的TCP内的序列号是否一样.
结果: TCP 一样.Ip 序列号不一样.
如一样,则说明IP在没有告诉上层的情况下自动从发.
如不一样说明IP 在接到ICMP报告之后会要求上层从发.
估计是一样.
另外,还要看IP在从发时是在接到ICMP后,还是在之前.结果:似乎是IP与ICMP并不太友好.因为没
有进一步的编写协议分析仪,所以无从可知,而该死的期中考试又来了.各位,原代码在此.原程序在

是计划3,或计划1,记不清了.(抱歉,要知道我连自己家的电话都要朋友提醒.不然老打错成女朋友
:)
基本上原代码是由 MSDN 内的PING.C 范例程序和IPMAN.C
拼凑而成的.这里感谢MICRO 和 HiHint
虽然两位都未见面,心仪已久:0
代码思想是这样的:
向目的主机发送一个ECHO 类型的ICMP包.
抓到返回的包,得到她的IP序列号,以此号为开始,每加256
发送一个ICMP的报错通知,具体发送什么类型的可以在函数
void fill_icmp_datab()内修改,
原代码是目的网络不可到达,可以使路由器达到---(what
shall i say?)高潮?.
编译需要VC++5.0 以上. 注意编译时要加入
WSOCK32.LIB
运行需要WIN98 ( NOT NOT NOT WIN95 ,97 , nt4.0)
运行参数:
1 , 目的攻击IP
2, 假设目的IP要访问的IP
3, 假设目的主机要访问的端口.(这里假设是UDP
的 53 )
原代码. 已经作好的可执行程序.
都在http://cceye.iscool.net
改好了别忘了寄来一份.cceye@371.net
或在
bbs 上留下网址
参考
RFC 950 IMCP





对该文的评论
 
有劳朋友也发一份给我啊,我的邮箱:songxlwin@sohu.com
 
我也想要!
my_bao@sohu.com
 
linyouou@21cn.com

来一份吧~~
谢谢~
 
还是下不了给一份吧
zzgyiyuan@yeah.net或zzgfree@my169.com
 
我下在不了,请发一份端口扫描的源程序给我,谢谢。
qknife_lee@sina.com
 
这是我早期做的端口扫描程序的源码,不太完善的,大家来改吧!

http://5235.cn/web/d99/code/SearchPort.zip
 
PAF
文件不能下载啊!
方便的话,给我一份好吗?
我正好挺急用的!
EAIL: ServerPlus@msn.com
 
我想看看关于此类的东东,谢谢
 
后退
顶部