慢速 DDoS 攻击实验

实验目的

了解 tomcat-jsp 网站架构,学习慢速 HTTP POST 攻击原理和防护。

实验内容

  1. 使用 tomcat8.0 和 mysql5.7 搭建 java 语言开发的网站。
  2. 用 Tor’s hammer 1.0 工具对第一步搭建的网站发动慢速 HTTP POST 攻击。

实验环境

实验要求

完成(二)实验内容并回答课后问题。

实验步骤和结果

网站搭建

  1. Tomcat 需要 java 环境运行,所以需要先安装 java 运行环境 jre,安装过后环境显示如下

  2. 安装 Tomcat 工具,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。

  3. 安装过后,在 Properties 中的 General 选项卡中,点击 Start 开始服务

  4. 访问 localhost:8080,测试安装情况

  5. 把目标网站的 ROOT 目录拷贝到 tomcat 安装目录下的 webapps 目录中并覆盖。

    tomcat 启动时会加载 webapps 目录下的应用程序,其中 ROOT 目录是网站的根目录,即 /

  6. 准备数据,将 fenxiao.sql 导入到 mysql 数据库中。

    在 mysql5.7 命令行中应该使用以下代码进行导入操作

     
    create database fenxiao;
    use fenxiao;
    source fenxiao.sql;
  7. 配置 database.properties 文件

    • 指定 jdbc.userjdbc.password 为相应 mysql 数据库的配置,jdbcUrl 的本机地址部分要填写为 localhost 而非本机 IP(因为 root@localhost 代表了 root 只允许本机登录,若要从任何地方登录需要把 localhost 改为通配符 %)。
    • 对于 mysql 6+driver 需要填写为 com.mysql.cj.jdbc.Driver
  8. 测试访问网站

Tor’s Hammer 工具攻击

  1. 打开攻击机,启动其中的 torshammer 工具。
  2. 使用命令 python torshammer.py -t 192.168.235.138 -r 201 -p 8080 发动攻击。
  3. 目标机的 cpu 直接飚上 100%,Tomcat 的占用率直接提升至几乎 100%,证明此种攻击确实可以短时间内侵占服务器大量资源。
  4. 网页也卡死在加载中了。
  5. 断开攻击后,目标机的 cpu 立刻恢复原状,网页也可以打开了。

附录(可选)

问题回答

  1. 了解原理后,应该通过什么方式来防范慢速 DDOS 攻击呢?

    • 前述工具是靠向目标网址 POST 一个请求,然后将请求拆分为一些极少量字符的 payload,且保持连接来占用目标服务器的资源。

    • 这些请求具有很长的 Content-length,但每次只发一个字符,还被设定为 keep-connection,注定会占用很多资源。

    • 前面的攻击参数中,-r 被设定为 201,是因为 tomcat 默认只支持同时支持 200 个连接,那么,把这个连接参数调大,一定程度上就可以缓解攻击,但这个方法并不是绝对的。

    • 在 tomcat 配置文件 server.xml 中的 <Connector ... /> 配置中,和连接数相关的参数有:

      • minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为 10
      • maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为 75
      • acceptCount:允许的最大连接数,应大于等于 maxProcessors,默认值为 100
      • enableLookups:是否反查域名,取值为:truefalse。为了提高处理能力,应设置为 false
      • connectionTimeout:网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。
    • 原来 tomcat 最大连接数取决于 maxConnections + acceptCount 的值。如果要加大并发连接数,应同时加大这两个参数。

    • 我们来看看原来这些参数被设定为了多少

      <Connector port="8080" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" />

      没被指定,全为默认,我们改成这样:

      <Connector port="8080" protocol="HTTP/1.1"
      connectionTimeout="5000"
      redirectPort="8443"
      maxConnections="10000"
      acceptCount="5000" />
      • 再重新运行攻击脚本,参数不变。
      • 服务器一定程度上还是顶住了一小下,但随着连接建立越来越多,还是撑不住了,CPU 处理率很快再次爆满。这种方法是治标不治本的。
  2. 网站被攻击后,应该如何分析日志确定攻击者的 IP 呢?

    • 一般网站搭建软件都会提供访问日志记录功能,在类似于 /logs 的目录留下 log 文本文件。Tomcat 也提供了这样的机制,在安装目录/logs/ 下存在着访问日志文件 <域名>_access_log.<date>.log,其中第一列记录了访问者的 IP 地址,双短横线后,紧接着是访问时间,然后是访问方式、访问地址、协议、状态码和返回字节数。从下图中的文件中,可以看出,刚才 192.168.235.136 在短时间内对网站首页 / 进行了大量的 post 操作,占用了大量资源,而这正好是刚才发动 Torshammer 攻击的机器的 IP。
    • 这个记录格式与 apache 和 nginx 都很像。只不过少了 user-agentreferer 信息。可以通过修改 server.xml 选项,加上一些信息来看看。比如把 user-agentreferer 加上。
      server.xml
      <Valve className="org.apache.catalina.valves.AccessLogValve"
      directory="logs" prefix="localhost_access_log." suffix=".txt"
      pattern="combined" resolveHosts="false" />
      • 其中 combined%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"
    • 重新设置后,现在能抓到日志如下
      • 显然,这个脚本使用了随机的 user-agent,所以不可能像限制爬虫名字一样,通过限制 user-agent 来抵抗此种攻击

本网站用到的架构相关资料

  • SSH (Struts2+Spring+Hibernate) 框架 [1]
    • SSH 框架是由 struts2、spring、hibernate 三大框架组合起来的一套总框架。
    • 浏览器(或客户端)发送请求到服务器,先经过项目中 web.xml 中过滤器(<filter><filter-mapping>)审核,通过了再发送给 action 包中的 IndexAction 类,struts.xml 根据 IndexAction 类中 return 的值再进行跳转,跳转的页面是 struts.xml<result> 配置的页面名,然后页面响应回客户端。
    • Struts 是一个 Java Web MVC 开发框架。
      • 模型 Model 用于封装与业务逻辑相关的数据和数据处理方法
      • 视图 View 是数据的 HTML 展现
      • 控制器 Controller 负责响应请求,协调 Model 和 View
      • Model、View 和 Controller 的分开,是一种典型的关注点分离的思想,不仅使得代码复用性和组织性更好,使得 Web 应用的配置性和灵活性更好。
    • Spring 的核心思想:解耦,也就是代码中不出现 new 实现类的代码,我们创建了接口不用关心实现类是谁,实现类由 spring 帮我们注入,我们只需要在定义接口的时候给它一个 set 方法并且在配置文件里改 <property> 中的 id 和 ref 就行
    • Hibernate 的核心思想:(ORM - 对象关系映射) 连接数据库,我们不用在数据库写创建表的语句,数据库表的字段根据实体类中属性的名字然后我们在 *.hbm.xml 文件里配置 <property> 以及 <property> 的相关属性。

  1. 本部分资料来自 https://blog.csdn.net/u014577487/article/details/85558131 ↩︎