或者,用于故障排除的灰胡子设施几乎立即被乌合之众武器化。看一看字符生成器协议,它结束了作为DDoS攻击放大器的生命。
1983年5月,Jon Postel为评论员RFC写了一系列六份请求。这本身并不是不规则的。Postel从1969年一直担任RFC的编辑,直到1998年去世,在此期间与人合著了200多本书。在“巫师熬夜的地方”一书中,波斯特尔通过他的外表被介绍到:“他留着浓密的胡须,常年穿凉鞋,一生中从未系过领带。”他被描述为一个后进生和平庸的学生,而在第八章中,他被描述为在一个技术会议的走廊里设计TCP。在他每天影响您的技术贡献中,有TCP/IP的定义、域名服务(DNS)和简单邮件传输协议(SMTP)。波斯特尔定律是他的遗产中经常被引用的一部分:“接受的要自由,发送的要保守。”
这六个Postel RFC是一体的。与典型的RFC票价不同,这些文件很短-有些在一页下面-而且很容易理解。每一份报告都概述了一个“有用的调试和测量工具”,以允许网络运营商测试其他主机的可达性并解决连接问题。它们允许操作员连接到另一台主机并接收一些数据来验证端到端的连通性。回音协议把你想要的都送回来了,白天协议返回了一条小消息,白天协议打印出了当前的日期和时间-你知道了。所有六个现在都过时了。
RFC 864定义了字符生成器协议,该协议“只发送数据而不考虑输入”。这个协议一直默默无闻,直到人们了解到带有伪造源地址的请求可以被用来淹没他们的敌人(或用于LOL)。今天,它只在使用古老的防火墙的旧打印机上实现和启用,希望这些打印机永远不会意外连接到互联网。
该协议以两种风格指定。第一种是基于TCP的、面向流的。它侦听端口19上的连接,一旦建立,将发送连续的字符流。RFC指出,大概当客户端接收到足够的字符并关闭连接时,服务器应该为“粗暴中止”做好准备。
该规范没有直接定义应该返回的字符,尽管它确实提出了一个建议:
一种流行的模式是ASCII打印字符的72个字符行。ASCII字符集中有95个打印字符。将字符排序为有序序列,并从0到94对字符进行编号。将序列视为环,因此字符号0紧跟在字符号94之后。在第一行(第0行)放入编号为0到71的字符。在下一行(第1行)放入编号为1到72的字符,依此类推。在第N行,输入字符(0+N mod 95)到(71+N mod 95)。以回车符和换行符结束每行。
这会在设置动画时产生类似理发师杆状图案的效果。RFC继续提供建议输出的示例,从这八行开始:
在Python中,可以通过遵循这些方向并利用这些字符的顺序位置1来生成此模式:
import syschars=[chr(I)for i in range(32,127)]line=1 When line<;=8:for i in range(72):char=chars[(line+i)%len(Chars)]sys.stdout.write(Char)print()line+=1。
模式生成器就位后,我们可以将其连接到侦听端口19以满足Character Generator ProtocolSpecification的小型TCP服务器。
导入线程导入socketCHARS=[chr(I).encode(';ascii';)for i in range(32,127)]newline=';\r\n';.encode(';ascii&39;)端口=19WIDTH=72 def server()->;无:def生成(客户端)->;None:Line=1 While True:Try:for i in range(Width):char=chars[(line+i)%len(Chars)]client.Send(Char)client.Send(Newline)Exception:client.close()Break line+=1 SOCK=Socket.socket(Socket.AF_INET,Socket.SOCK_STREAM)SOCK.setsockopt(Socket.SOL_Socket,Socket.SO_REUSEADDR,True)SOCK。,Port))SOCK.LISTEN()WHILE TRUE:CLIENT,_=SOCK.ACCEPT()THREAD=Thread.Thread(target=Generate,args=(Client,))线程.start()如果__name__==';__main__';:server()。
运行此服务器(以root身份运行,给定端口19是特权端口),我们可以使用Netcat根据规范测试其功能。下面我们从上面看到相同的图案:
8行之后,Head将终止,Netcat将关闭连接。没有Head的管道,流将继续,直到中断:
哇!现在我们可以呃使用这个有用的调试和测量工具了,我想这个实现基本上是安全的,虽然用处不是很明显。然而,它的UDP对应产品并不安全。下面我们将探讨它是如何工作的,以及它是如何被利用的。
Character Generator协议的UDP风格是面向数据报的,与TCP类似,该风格侦听端口19并使用随机数据进行响应。该规范规定服务器必须发送包含长度为512的随机字符量的应答数据报,而不是连续的数据流。该规范继续解释没有保留历史或状态信息,因此在一个请求和另一个请求之间没有连续性。
此实现在很大程度上与TCP服务器相同,但对协议进行了一些修改。下面我们始终精确返回511个字符,包括回车符和换行符:
导入socketBUFFER_SIZE=4096CHARS=[范围(32,127)内i的chr(I).encode(';ascii';)]MAX=511NEWLINE=';\r\n';.encode(';ascii';)port=19WIDTH=72 def server()->;NONE:def GENERATE()->;NONE。最大值:对于范围内的i(宽度):Reply+=chars[(line+i)%len(Chars)]Reply+=新行+=1返回Reply[:max]SOCK=套接字.socket(Socket.AF_INET,Socket.SOCK_DGRAM)Reply=Generate()sock.bind((';';Port))而True:_,address=sock.recvfrom(Buffer_Size)sock.sendto(Reply,Address)if。
此服务器返回类似的模式,不过是它的截断版本。使用带有-u的Netcat发送UDP数据报,我们可以看到响应:
分布式拒绝服务攻击依赖于受损的计算机系统作为通信源。在早期的互联网中,早期协议和网络设计中的几个缺陷可能被用来产生针对目标的大量流量。早期的攻击SURF 2依赖于广播IP流量和ICMP回应和回应应答的设计来淹没目标网络,在此攻击中,一个伪造的ICMP请求可能导致多台传感器向单个目标发送成百上千个应答的洪流。
UDP是一种无连接协议,它不验证源IP地址,因此,没有任何机制来验证流量的接收服务器将对盲目提供的任何地址做出响应。Chargen作为放大器特别有吸引力,因为一个小请求会产生相对较大的数据量。在上面的示例中,具有单个载体的UDP数据包会产生更大的响应。
$sudo tcpdump端口19-vv-X-c1000-i lo0tcpdump:正在侦听lo0,链路类型为空(bsd环回),捕获大小为262144字节16:45:19.501717 ip(tos 0x0,ttl128,id 61881,偏移量0,标志[无],proto udp(17),长度29,错误校验和0(->;4b14)!)。localhost.63750>;localhost.chargen:[错误的UDP校验和0xfe1c->;0xfebf!]。UDP,长度10x0000:4500 001d f1b9 0000 8011 0000 7f00 0001 E.。0x0010:7f00 0001 f906 0013 0009 fe1c 0A.16:45:19.501800 ip(tos 0x0,ttl128,id1604,偏移量0,标志[无],协议UDP(17),长度541,错误校验和0(->;348a)!)。localhost.chargen>;localhost.63750:[错误的UDP校验和0x001d->;0x5a95!]。udp,长度513 0x0000:4500 021d 0644 0000 8011 0000 7f00 0001 E..D.0x0010:7f00 0001 0013 f906 0209 001d 2122 2324.";#$0x0020:25262728292a 2b2c 2d2e 2f30 3132 3334%&;';()*+,-./01234 0x0030:35363734。?@abcd 0x0040:4546 4748 494a 4b4c 4d4e 4f50 5152 5354 EFGHIJKLMNOPQRST 0x0050:5556 5758 595a 5b5c 5d5e 5f60 6162 6364 UVWXYZ[\]^_`abcd 0x0060:6566 6768 0d0a 2223 2425 2627 2829 2a2b EFGH.."。0x00b0:23242526 2728292a 2b2c 2d2e 2f30 3132#$%&;';()*+,-./012 0x00c0:33343536 3738 393a 3b3c 3d3e 3f40 4142 3456789:;<;=>;?@AB 0x00d0:4344 4546 4748 494a 4b4c 4d4e 4f50 5152 cd。()0x0100:2a2b 2c2d 2e2f 3031 3233 3435 3637 3839*+,-./0123456789 0x0110:3a3b 3c3d 3e3f 4041 4243 4445 46474849:;<;=>;?@ABCDEFGHI 0x0120:4a4b 4c4d 4e4f 5051 5253 5455 5657 5859 JKLMNOPQRSTUSU。?@0x0160:4142 4344 4546 4748 494a 4b4c 4d4e 4f50 abcEFGHIJKLMNOP 0x0170:5152 5354 5556 5758 595a 5b5c 5d5e 5f60 QRSTUVWXYZ[\]^_`0x0180:6162 6364 6566 6768 696a 6b6c 0d0a 2627 abcdefghijkl&。?@ABCDEFG 0x01b0:4849 4a4b 4c4d 4e4f 5051 5253 5455 5657 HIJKLMNOPQRSTUVW 0x01c0:5859 5a5b 5c5d 5e5f 6061 6263 6465 6667 XYZ[\]^_`abcdefg 0x01d0:6869 6a6b 6c6d 0d0a 2728 292a。0x01e0:2f30 3132 3334 3536 3738 393a 3b3c 3d3e/0123456789:;<;=>;0x01f0:3f40 4142 4344 4546 4748 494a 4b4c 4d4e?@ABCDEFGHIJKLMN 0x0200:4f50 5152 5354 5556 5758 595a 5b5c 5d5e OPQRSTUVWXYE。
上面的第一个数据包是请求。它的权重为29个字节。页面中只有一个字节
这个时代的许多协议设计都是在假设大多数学术用户都有一个杂乱无章的花园的情况下编写的。这些网络被设计用来进行研究,后来在没有对最初的假设进行太多修改的情况下商业化,波斯特本人似乎与互联网的扩张背道而驰。1998年,也就是他去世前几个月,他劫持了8台根DNS服务器。虽然他进行这次测试的动机尚不清楚,但据推测,这是对政府和商业入侵他的项目的一种声明。
波斯泰尔作品和这个时代的理想和善意在整个技术设计中呼应。你必须处理垃圾邮件的事实是,SMTP是为一群研究人员编写的,他们每个人都用邮件协调讨论或分享数据或数学笑话或其他任何东西,而没有任何商业化和HOI Polloi的想法。谁在乎人们能不能伪造源地址呢?每个人都有最好的意图。
在研究中,我发现蓝精灵的作者DanMoschuk,被称为Tfreak的人,在2010年突然去世,享年29岁。听到这个消息真令人难过--丹和我在浪费IRC在EFNet上度过的青春和偷来的电话会议期间多次相遇。他聪明、有创造力,总体上对他周围的其他格格不入的人有很好的影响。作为属性,他的出生和死亡日期被添加到FreeBSD日历中,这对我来说很合适。↩︎