从TCP/IP协议编程看DDos攻击

前言

最近在做一些关于TCP/IP协议相关的网络安全编程实验,还是收获了不少心得,这里给大家分享一下。


0x01 网络套接字编程

网络套接字编程主要是面向应用层做文章,使用封装好的套接字足以完成应用层上的各种功能。这是学习网络编程的必经之路,他也能带领我们快速入门。
就拿一个典型的C/S模式的通讯模型来说,从创建套接字、设置套接字参数、绑定套接字到套接字的监听以及最后数据的传输,其中并不需要太多的TCP/IP协议的相关知识便可以实现。因此如果存在协议上的漏洞,仅仅掌握这些是远远不够的。

0x02 DDos攻击

DDos攻击方式有很多种,比如UDP Flood、SYN Flood以及DNS放大攻击等等。这些攻击方式都是利用了TCP/IP协议的特性进行。
比如UDP Flood攻击,它利用UDP协议的无连接状态,只要向目标机发送UDP数据包,目标主机就会返回数据包,因此可以伪造大量不同源IP地址向目标主机发送恶意数据包,而目标机均会对这些请求做出响应从而引发DDos攻击。
再比如DNS放大攻击,它是利用请求的DNS数据包小于响应的DNS数据包的特点,因此可以利用该特点伪造源地址为受害者的IP,然后不断地向DNS服务器发送请求,从而将响应请求引向目标主机,完成DNS放大攻击。这里以DNS放大攻击为例简单说一下编程与DDos攻击。

0x03 DDos攻击与编程

通过上述攻击原理可以看出,我们必须要学会的一项基本技能就是伪造。我们需要剖开已经封装好的数据包,把它转化为想要的格式,因此这样就确定了编程的思路。

  1. 首先要了解TCP/IP协议的结构体,根据协议中各结构体的字段名称以及大小构造需要的数据包结构体,比如DNS报文格式如下:
    1.jpg

关于DNS的头部12个字节,我们就可以这样构造:

typedef struct{
unsigned short id; // 标识
unsigned short flags; // 标志位
unsigned short qcount; // 问题数目
unsigned short ans; // 回答数目
unsigned short auth; // 授权应答
unsigned short add; // 附加信息
}dns_header;

其中unsigned short表示声明长度为16位。

  1. 第二步需要做的就是伪造数据,给结构体进行赋值操作。这里一般会给该结构体创建一个空间,然后为该空间中各个变量进行赋值操作。
    比如本例中DNS头结构体的赋值如下:
void MakeDNSHeader(dns_header *header){
header->id = 1;
header->flags = htons(256);
header->qcount = htons(1);
header->ans = 0;
header->auth = 0;
header->add = 0;
}
  1. 第三步就是调用sendto函数直接发送伪造好的结构体,sendto函数是面向的是IP报文,它无需建立连接。之后便是使用一些抓包工具比如wireshark等分析发送的数据包格式是否正确。
  2. 在编程的最后便是加入一些线程,优化一些参数提升攻击效率。

0x04 后记
在DNS数据报文中,DNS数据报的大小最多为512,过长就会发生截断,因此普通的DNS放大攻击最多放大倍数为7倍左右。但是DNS协议中还存在一种EDNS0扩展协议,它允许数据报大小超出512个字节而不会发生截断,所以我们可以利用这个特点来增加DNS放大攻击倍数。通过了解该拓展协议协议EDNS0可以类似修改之前的数据报,比如上述中的header->add的值变为htons(1),同时增加OPT结构体,便可完成扩展攻击。
OPT结构体如下:


// 设置字节对齐
#pragma pack(push, 1)
typedef struct
{
    unsigned char name; // domain name,默认为空
    uint16_t type; // OPT,一般为41
    uint16_t payload_size; // 额外信息长度
    uint8_t rcode; // 返回状态码
    uint8_t version; // EDNS0版本
    uint16_t z; // 一般置为0
    uint16_t data_len; 
}res_record;
#pragma pack(pop)

最终两者的效果图对比如下:
普通DNS
4.PNG

扩展DNS
2.png


在Internet普及的今天,作为Internet工作基础的TCP/IP协议及其编程已经成了IT人业人员所要具备的基本知识与技能。打开国内外各大知名网站的招聘页面,都可以看到类似于“熟悉TCP/IP协议、掌握socket通讯开发”等字样的要求。本书就是为了满足读者在这方面知识的需求而编写的一本TCP/IP协议与基于TCP/IP编程方面的书籍。 本书有以下几个方面的特点: (1)内容的组织上按照协议原理与协议编程分为上、下篇。上篇主要介绍TCP/IP协议簇中的常用协议,下篇专门介绍网络编程知识与技能。 (2)具体在编写每一节的内容时将原理知识与实用技能融为一体。以方便读者学习。 (3)考虑到TCP/IP协议比较抽象,学习起来有一定的难度,所以全书尽量避免使用晦涩难懂专业术语,而用浅显易懂的语言说明问题,努力将书打造成一本人人都读懂书籍。 (4)初学网络程序设计的人员,往往感到网络程序设计内容多,学习进来比较复杂。针对这一问题,本书在讲解网络程序设计时,根据网络程序固有的特点,先总结了网络程序设计的通用模式,然后再举例说明网络程序的设计,使读者易于入手。 (5)Winsock函数内容多,使用起来比较复杂,针对这一问题,笔者在写作时将常用的Winsock函数分散到各种实例中去介绍,然后在最后一章将所有常用的Winsock函数一一作了较为详细说明,并在每个函数后面加入了其应用实例或使用说明。 本书分为上、下两篇内容,上篇内容包含6章,各章主要如下: 第1章:介绍了TCP/IP协议的产生、结构和工作原理,另外本章内容中还简要介绍一一下ISO/OSI RM。 第2章:介绍TCP/IP协议层次结构中网络接口层包含的内容,主要有物理层和数据链路的相关知识。 第3章:介绍TCP/IP协议层次结构中网络层及其相关知识。主要内容有IP数据报格式、IP层的功能、IP地址、ICMP协议、地址转换协议并介绍了IP的最新版本IP v6等。 第4章:介绍TCP/IP协议层次结构中传输层及其相关知识。主要内容有端口的概念、TCP协议和UDP协议的协议数据格式、协议原理和TCP协议与UDP协议的比较等内容。 第5章:介绍TCP/IP协议层次结构中应用层及其相关知识。主要内容有应用层常用协议DNS、FTP、Telnet、HTTP、POP和SMTP的格式、工作原理、协议实例等内容。 第6章:简要的介绍了一下TCP/IP协议在Windows和LINUX操作系统下的实现原理TCP/IP协议的二进制代码。 下篇包含以下6章内容: 第7章:介绍了网络程序设计有关的基础知识、一个网络程序入门实例和Winsock中编写网络程序常用的建立连接、传输数据、关闭连接等有关的函数。 第8章:介绍了TCP程序设计流程、基于C/C++的TCP程序设计实例和基于Java技术的TCP程序设计实例。 第9章:介绍了UDP程序设计流程、基于C/C++的UDP程序设计实例和基于Java技术的UDP程序设计实例。 第10章:介绍了使用MFC中提供的有关类进行网络程序设计知识。 第11章:介绍了Winsock API中各种函数的功能,并举例说明了些函数的使用方法。 本书在编写过程中得到了邮电出版和刘博等编辑的大力支持和帮助,在此表示感谢。由于作者水平有限,错漏之处在所难免,欢迎广大读者批评指正和提出宝贵的意见,可发邮件到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值