Kali与Metasploit实战:Slowloris慢速攻击原理、复现与防御
1. 项目概述为什么选择Slowloris作为入门实战如果你刚接触网络安全或者对渗透测试和攻击原理充满好奇那么“Slowloris攻击”绝对是一个绝佳的起点。它不像那些需要复杂工具链和深厚背景知识的漏洞利用Slowloris的原理非常直观甚至可以说有点“古典”的优雅——它不靠洪水般的流量压垮服务器而是像一个有耐心的“话痨”用最少的资源通过保持大量半开的连接让服务器“累”到无法响应正常用户。这种攻击方式在2009年由RSnake提出至今仍是许多Web服务器尤其是Apache 1.x和2.x的某些配置需要警惕的威胁。为什么用Kali Linux和Metasploit来复现Kali是渗透测试领域的“瑞士军刀”预装了海量安全工具省去了我们一个个安装配置的麻烦。而Metasploit框架则是漏洞利用的“自动化武器库”它把复杂的攻击过程模块化、流程化让我们可以专注于理解攻击原理本身而不是纠结于底层的网络编程。通过这个组合我们不仅能亲手“发动”一次攻击更能深入理解其背后的TCP/IP协议、HTTP协议以及服务器资源管理机制。这比单纯看理论文章要深刻得多。本教程的目标就是带你从零开始在一个完全受控的“靶场”环境里完成一次Slowloris攻击的完整复现。你会学到如何搭建一个安全的实验环境用虚拟机隔离绝不碰真实网络如何配置一个存在漏洞的靶机我们选用经典的DVWA以及如何使用Metasploit中的auxiliary/dos/http/slowloris模块发起攻击并观察攻击效果。整个过程就像一次外科手术式的解剖安全、清晰且富有教育意义。2. 实验环境搭建构建安全的数字沙盒在开始任何安全实验之前第一条铁律就是必须在隔离的环境中进行。我们绝不在真实的网络或服务器上尝试任何攻击行为这不仅是为了遵守法律和道德规范更是为了保护自己和他人的系统安全。因此搭建一个本地的虚拟化实验室是我们的第一步。2.1 虚拟化平台与Kali Linux安装我推荐使用VMware Workstation Pro或免费的VirtualBox作为虚拟化平台。两者都能很好地支持Kali Linux。这里以VMware为例但步骤在VirtualBox中大同小异。首先去Kali官网下载最新的Kali Linux虚拟机镜像.ova或.vmdk格式。这是最省事的方法官方已经帮你配置好了基础系统。下载后直接在VMware中“文件”-“打开”选择这个.ova文件导入即可。注意首次启动导入的Kali虚拟机时VMware可能会提示“此虚拟机可能已被移动或复制”。务必选择“我已复制该虚拟机”。如果选错了可能会导致网络配置问题。启动虚拟机默认用户名是kali密码也是kali。登录后第一件事我强烈建议你立即更新软件源并升级系统。由于网络原因直接使用官方源可能很慢我们可以换成国内的镜像源比如清华源或阿里源。打开终端备份原来的源列表文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后用文本编辑器如nano或vim编辑/etc/apt/sources.list文件sudo nano /etc/apt/sources.list将文件内容替换为清华源的地址以Kali 2024.x为例deb https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main non-free contrib deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main non-free contrib保存退出后执行更新和升级sudo apt update sudo apt full-upgrade -y这个过程可能需要一些时间取决于你的网速。升级完成后最好重启一下虚拟机。2.2 靶机选择与DVWA靶场部署我们需要一个“靶子”来承受攻击。对于Slowloris这种针对HTTP服务的攻击我们需要一个Web服务器。为了学习效果我们选择一个故意留有漏洞的Web应用——Damn Vulnerable Web Application (DVWA)。它集成了SQL注入、XSS、文件上传等多种漏洞当然也包括我们需要的、可供测试的Web服务环境。部署DVWA最简单的方法是使用Docker。Kali Linux默认已经安装了Docker如果没有可以运行sudo apt install docker.io docker-compose -y来安装。接下来我们拉取DVWA的Docker镜像并运行sudo docker pull vulnerables/web-dvwa sudo docker run --rm -it -p 80:80 vulnerables/web-dvwa这条命令做了几件事docker pull从仓库下载镜像docker run运行容器--rm表示容器停止后自动删除-it让我们可以交互式地看到日志-p 80:80将容器的80端口映射到Kali虚拟机的80端口。现在打开Kali虚拟机内的浏览器如Firefox访问http://127.0.0.1或http://localhost你应该能看到DVWA的登录页面。默认登录凭证是admin/password。实操心得有时候运行后访问不了可能是端口冲突。检查Kali本机是否有其他服务如Apache占用了80端口可以用sudo netstat -tulpn | grep :80查看。如果有冲突可以修改映射端口比如-p 8080:80然后访问http://127.0.0.1:8080。登录DVWA后你需要先初始化数据库。点击页面上的Create / Reset Database按钮。完成后重新登录你就可以在左侧看到各种安全漏洞的测试模块了。至此我们的靶机就准备好了。请确保你的Kali虚拟机网络模式设置为“NAT模式”或“仅主机模式”这样所有流量都被封闭在宿主机内部不会影响到外部网络。3. 核心原理深度解析Slowloris如何“慢”死服务器在动手之前我们必须吃透Slowloris的工作原理。这能帮助你在后续使用工具时明白每一个参数的意义甚至在工具不奏效时自己也能进行排查和调整。Slowloris攻击的精髓全在于它对HTTP协议和服务器线程/资源池机制的巧妙利用。3.1 HTTP连接与服务器资源管理想象一下Web服务器如Apache就像一个餐厅的服务员。每个进来的顾客HTTP客户端都需要服务员来接待点餐处理请求。服务员的数量是有限的服务器的工作线程或进程数。正常情况下顾客点完餐服务员就去后厨下单然后可以接待下一位顾客。HTTP协议基于TCP建立一个完整的连接需要“三次握手”。连接建立后客户端发送一个完整的HTTP请求比如GET /index.html HTTP/1.1\r\nHost: ...\r\n\r\n服务器处理并返回响应然后连接关闭或通过Keep-Alive复用。服务器的“服务员”工作线程/进程会绑定到每一个活跃的连接上直到这个连接上的请求被完整处理并响应。如果连接一直不发送完整的请求也不关闭这个服务员就会被一直占用无法服务其他顾客。3.2 Slowloris的攻击向量与实现机制Slowloris攻击者扮演的就是那种“磨磨蹭蹭”的顾客。它的攻击流程可以分解为以下几步建立连接攻击者向目标服务器的80端口HTTP发起大量TCP连接并完成三次握手。此时在服务器看来这是一大批“正在等待接收请求”的新客户。发送不完整的请求头连接建立后攻击者立即发送一个HTTP请求的第一部分。例如GET / HTTP/1.1\r\n Host: target.com\r\n User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)\r\n Content-Length: 42\r\n注意这个请求没有以两个连续的\r\n结束这意味着HTTP请求头还没有发送完毕。服务器会认为客户端的数据还在传输中。保持连接活跃服务器的工作线程被这个未完成的请求挂起等待剩余的请求数据。为了防止服务器因超时而断开连接Slowloris会周期性地比如每15秒向每个连接发送一些无意义的头字段例如X-a: b\r\n这行字符会让服务器认为“哦客户还在缓慢地发送数据请求还没结束。” 于是服务器会重置连接的超时计时器继续等待。耗尽资源攻击者用相对较少的机器甚至一台建立成百上千个这样的“半开连接”。每一个连接都占用服务器一个宝贵的工作线程。当所有可用线程都被这些恶意连接占用后新的、合法的用户连接请求就无法得到处理服务器表现为“拒绝服务”。从外部看网站变得极慢甚至完全无法访问但服务器的CPU和网络带宽占用可能并不高——这正是Slowloris区别于传统DDoS洪水攻击的“低带宽”特性。3.3 影响范围与防御思路Slowloris主要影响使用线程或进程模型来处理连接的Web服务器经典受害者是Apache HTTP Server在其prefork或workerMPM模式下且MaxClients配置有限时。像Nginx这类采用异步事件驱动模型的服务器由于一个工作进程可以处理成千上万的连接而不会被阻塞所以对Slowloris有天生的抵抗力。防御Slowloris的思路也很清晰服务器端限制每个IP地址的并发连接数缩短连接和请求的超时时间使用反向代理如Nginx、HAProxy前置它们能更好地处理慢速连接升级到对慢速攻击有更好韧性的Web服务器软件。网络层部署能够识别和缓解慢速攻击的Web应用防火墙WAF或专门的DDoS防护设备。理解了这些我们再使用Metasploit工具时就会知道我们是在模拟大量“慢速客户端”试图占满靶机Apache服务器的MaxClients队列。4. Metasploit框架与Slowloris模块详解Metasploit Framework (MSF) 是一个开源的渗透测试平台它提供了海量的漏洞利用模块、辅助模块扫描、嗅探、拒绝服务等以及载荷Payload。我们不需要自己编写攻击脚本直接使用其内置的auxiliary/dos/http/slowloris模块即可。4.1 启动与基础配置首先在Kali终端中启动Metasploit的控制台msfconsole启动过程会显示一个炫酷的banner稍等片刻你会进入msf6 提示符状态。接下来加载Slowloris模块use auxiliary/dos/http/slowloris使用show options或options命令查看这个模块需要配置哪些参数Module options (auxiliary/dos/http/slowloris): Name Current Setting Required Description ---- --------------- -------- ----------- DELAY 15 yes Seconds between keep-alive headers RHOSTS yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit RPORT 80 yes The target port (TCP) RSVHOST false no Use a random source address per request SNAPLEN 65535 yes The number of bytes to capture THREADS 1 yes Number of concurrent threads TIMEOUT 100 yes Number of seconds to wait for new data VHOST no HTTP server virtual host我们需要关注几个关键参数RHOSTS这是最重要的参数指定目标服务器的IP地址。我们的靶机DVWA Docker容器运行在Kali本机所以这里填127.0.0.1。RPORT目标端口HTTP默认是80我们的DVWA也在80端口。DELAY发送保持连接信息的间隔时间秒。默认15秒这个时间需要小于服务器的超时时间Timeout或KeepAliveTimeout才能有效保持连接。对于测试我们可以用默认值或更小如10秒。THREADS并发线程数。每个线程会负责创建和维护一批慢速连接。增加线程数可以加快连接建立速度但对本机资源消耗也更大。初始测试用1即可。TIMEOUT等待新数据的超时时间。这个值通常需要略大于DELAY确保在发送保持包之前连接不会因超时被服务器关闭。4.2 参数设置与攻击启动现在我们来设置参数并启动攻击。首先设置目标set RHOSTS 127.0.0.1如果你修改了端口也需要设置set RPORT 80其他参数我们先保持默认。然后运行run或exploit命令开始攻击run你会看到类似下面的输出[*] Auxiliary module running as background job 0. [*] Attacking http://127.0.0.1:80 with 1 threads... [*] 0/0 connections queued... [*] 0/0 connections queued... [*] 1/0 connections queued... ...模块会在后台运行并开始尝试建立慢速连接。connections queued显示当前已成功建立并保持的连接数。由于我们的靶机资源有限Docker容器可能很快就能看到效果。4.3 效果验证与监控如何验证攻击是否生效呢我们需要从两个视角观察1. 攻击者视角Kali终端在MSF中运行jobs命令可以查看后台任务运行sessions命令可以查看建立的会话虽然DoS模块一般不建立会话。更直接的是攻击开始后MSF会持续输出连接数信息。当连接数达到并稳定在一个数值接近服务器最大并发连接数时说明攻击正在生效。你可以按CtrlC来中断当前的前台任务如果run是前台运行或者用jobs -K杀死所有后台任务来停止攻击。2. 靶机/受害者视角打开另一个终端窗口我们尝试访问DVWA或者使用命令测试服务器的响应。尝试在浏览器中刷新DVWA页面 (http://127.0.0.1)。如果攻击生效页面加载会变得极其缓慢或者直接返回“连接超时”、“无法访问此网站”的错误。使用curl命令测试响应时间time curl -s -o /dev/null -w %{http_code}\n http://127.0.0.1这个命令会显示请求的HTTP状态码和所用时间。正常情况下应该很快返回200。攻击生效时可能会长时间卡住最后返回000或超时。3. 系统资源监控在Kali上打开一个终端运行htop或top命令观察资源使用情况。你会看到ruby进程Metasploit是Ruby写的的CPU和内存占用上升因为它要维护大量TCP连接。同时可以用网络监控工具iftop或nethogs查看网络流量你会发现Slowloris产生的流量非常小主要是TCP握手包和周期性的小数据包这与带宽消耗型DDoS攻击形成鲜明对比。注意事项在虚拟机环境中进行测试由于资源有限特别是可用端口数和CPU你可能无法模拟出成千上万的连接。但几十到几百个连接足以让一个配置有限的测试用Apache服务器如DVWA容器内的那一个失去响应。这正是我们选择在本地虚拟环境做实验的原因——用最小的资源看到最直观的效果。5. 靶场环境深度优化与问题排查在实际操作中你可能会遇到各种问题导致攻击不成功或者效果不明显。这通常不是工具的问题而是实验环境配置需要微调。下面我分享一些常见的坑和解决方案。5.1 攻击无效的常见原因与解决问题1连接数上不去始终是0或个位数。原因A靶机Apache的MaxClients或ThreadLimit设置很高。Docker化的DVWA使用的Apache配置可能为了兼容性允许的并发连接数较高。Slowloris需要占满这个队列才有效果。解决我们可以修改靶机Apache的配置降低其并发处理能力让攻击更容易见效。首先进入DVWA容器的shellsudo docker ps # 找到DVWA容器的CONTAINER ID sudo docker exec -it 容器ID /bin/bash然后编辑Apache的MPM配置文件通常是/etc/apache2/mods-enabled/mpm_prefork.conf找到并修改以下参数StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 50 # 原来是150或更高改小 MaxConnectionsPerChild 0将MaxRequestWorkers旧版本叫MaxClients改成一个较小的值比如30或50。保存后退出编辑器在容器内重启Apacheapachectl restart退出容器再重新运行Slowloris攻击观察连接数是否能达到你设置的这个阈值附近。原因BKali虚拟机的本地端口耗尽。每个Slowloris连接都需要一个本地端口。Linux系统有临时端口范围通常约28000个如果短时间内建立大量连接可能耗尽。解决可以扩大本地端口范围但更简单的方法是增加DELAY参数让连接建立得慢一些或者减少攻击的强度。也可以检查系统当前连接数ss -ant | grep ESTAB | wc -l。问题2攻击一开始有效但很快连接就断开了。原因服务器的超时时间比攻击的DELAY间隔短。如果服务器在15秒内没收到数据就断开了连接而你设置的DELAY是15秒那么保活包还没发出连接就被服务器主动断开了。解决减小Metasploit模块中的DELAY参数比如设置为5秒或10秒。同时可以适当增大TIMEOUT参数确保模块的等待逻辑匹配。set DELAY 5 set TIMEOUT 60 run问题3Metasploit模块报错或崩溃。原因可能是Ruby环境问题、网络问题或模块本身的bug。解决首先确保你的Kali系统是最新的执行过apt update apt upgrade。其次尝试在MSF中重新加载模块reload。如果问题依旧可以尝试搜索Metasploit的GitHub仓库或安全论坛看是否有已知问题。5.2 使用其他工具进行对比验证除了MetasploitKali上还有其他工具可以发起Slowloris攻击比如经典的slowhttptest。用它来验证可以加深理解也能作为Metasploit的备选方案。安装slowhttptestsudo apt install slowhttptest它的参数更丰富攻击模式也更多样。一个基本的Slowloris模式攻击命令如下slowhttptest -c 1000 -H -g -o slowloris_report -i 10 -r 200 -t GET -u http://127.0.0.1 -x 24 -p 3参数解释-c 1000建立1000个连接。-H启用Slowloris模式。-i 10发送数据间隔为10秒。-r 200每秒建立200个连接。-u目标URL。-x 24指定发送数据的长度。-p 3等待3秒后开始攻击。运行后它会生成一个HTML报告slowloris_report.html详细展示连接建立情况、服务器状态等非常直观。通过对比不同工具的效果你能更全面地理解攻击参数对效果的影响。6. 防御视角如何检测与缓解Slowloris攻击作为一名安全从业者知其攻更要知其防。通过这次攻击复现我们更应该从防御者的角度思考如果我的服务器被这样攻击我该如何发现和应对6.1 攻击检测指标在服务器端以下异常现象可能预示着Slowloris攻击网络连接数异常高使用netstat -an | grep :80 | wc -l或ss -ant sport :80 state established | wc -l查看80端口的ESTABLISHED连接数如果远高于平时且持续增长。服务器负载低但服务不可用top或htop显示CPU、内存、网络带宽占用都不高但Web服务响应极慢或超时。大量慢速连接通过监控工具如iftop或Web服务器日志如Apache的access_log发现大量来自少数IP的、长时间没有完成请求的TCP连接。工作进程/线程饱和对于Apache可以查看server-status页面需启用mod_status观察Win0等待连接的进程数是否长时间为0而BusyWorkers接近MaxClients。6.2 缓解与防御措施一旦怀疑遭受攻击可以采取以下应急和长期措施应急响应识别并屏蔽恶意IP分析网络连接找出建立大量慢速连接的源IP地址。使用防火墙如iptables立即封禁这些IP。# 例如封禁IP 192.168.1.100 sudo iptables -A INPUT -s 192.168.1.100 -j DROP调整Web服务器配置临时降低KeepAliveTimeout如设为2秒减少慢速连接存留时间。降低MaxClients可能适得其反需谨慎。启用防慢速攻击模块如果使用Apache可以考虑启用mod_reqtimeout或mod_qos模块它们可以限制请求头接收时间主动断开超时的慢速连接。长期加固前端部署反向代理/负载均衡器在Web服务器前放置Nginx或HAProxy。它们采用事件驱动模型对慢速攻击抵抗力强可以作为“缓冲层”。可以在这一层设置连接数限制、请求超时等策略。使用云服务或专业WAF大多数云服务提供商如AWS Shield、Cloudflare、阿里云DDoS高防的WAF都具备检测和缓解慢速攻击的能力。将流量引经过这些服务可以过滤掉恶意连接。Web服务器软件选型与配置优化换用Nginx如前所述Nginx架构上更抗此类攻击。Apache配置优化如果必须用Apache确保使用eventMPM它结合了进程和事件驱动并合理配置ThreadsPerChild、MaxRequestWorkers和超时参数。设置连接限制使用mod_evasiveApache或limit_conn_zoneNginx模块限制单个IP的并发连接数和请求频率。部署入侵检测系统IDS使用像Suricata或Snort这样的IDS配置规则来检测异常的慢速连接模式并发出警报。6.3 从本次实验中学到的防御启示通过亲手发起攻击你直观地感受到了一个配置不当的服务是多么脆弱。这反过来强调了安全基线配置的重要性最小化原则Web服务器不应开放不必要的端口工作进程数应按照实际负载合理配置而非盲目调高。超时策略设置合理的连接和请求超时时间既不影响正常用户体验又能及时清理僵尸连接。监控与告警建立对网络连接数、服务器响应时间等关键指标的监控设置阈值告警以便在攻击早期就能发现。分层防御不要指望单一一台服务器能抵御所有攻击。网络架构上应实现分层防御从网络边界防火墙、WAF到应用服务器自身层层设防。7. 实验总结与延伸思考完成整个实验后关掉Metasploit任务 (jobs -K)停止DVWA容器 (sudo docker stop 容器ID)。回顾整个过程从环境搭建、原理学习、工具使用到效果验证和问题排查你完成了一次完整的、以学习为目的的攻防演练。这个实验的价值远不止于学会使用一个Metasploit模块。它更像一把钥匙帮你打开了理解应用层DDoS攻击、HTTP协议细节和服务器并发模型的大门。基于这个基础你可以进行更多延伸探索变体攻击研究Slowloris有多个“亲戚”比如Slow POST缓慢发送HTTP POST请求体、Slow Read缓慢读取服务器响应。尝试在Metasploit中搜索相关的DoS模块理解它们的差异。编写自己的PoC如果你懂一点Python可以尝试用socket库手动编写一个简单的Slowloris攻击脚本。这能让你对TCP保活、HTTP协议格式有更底层、更深刻的认识。防御方案实战在同一个实验环境里尝试部署一个Nginx作为反向代理放在DVWA Apache前面。然后再次发动Slowloris攻击观察Nginx的抵抗能力。你还可以尝试调整Nginx的client_header_timeout、client_body_timeout等参数看对攻击效果的影响。集成到自动化测试在授权的渗透测试中如何将Slowloris这类DoS测试安全、可控地纳入自动化扫描流程这涉及到测试时机、强度控制和结果评估等一系列工程化思考。最后我必须再次强调法律与道德的边界。所有技术都具双面性我们在自己完全控制的实验环境中研究攻击技术是为了更好地构建防御。未经授权对任何非自有系统进行测试都是非法且不道德的行为。希望你能将这次实验中获得的知识和技能用于建设更安全的网络环境。