什么是chargen服务?

Chargen 字符发生器协议(Character Generator Protocol)是一种简单网络协议,在RFC 864中被定义。该协议设计的目的是用来调试TCP 或UDP 协议程序、测量连接的带宽或进行QoS 的微调等。它的默认端口为19,分为基于TCP 和UDP 两种方式,TCP 方式下建立连接后,服务器会不断传送任意字符到客户端,直到客户端关闭连接。UDP 方式下每当服务器收到客户端的一个UDP数据包后向客户端返回一个数据包,长度为0~512 字节之间随机值,数据包的负载可以是任意字符。

什么是chargen服务放大DOS攻击?

Chargen 协议的设计初衷是为了网络测试,并没有严格的访问控制和流量控制机制,在UDP 模式下任何人都可以向开放chargen服务的主机请求服务,这种简单的请求- 回复模式使得攻击者可以伪造源发地址信息向chargen服务发送请求,而chargen服务并不会验证源发地址的真伪,会向源发地址发送应答包,这导致该服务可被用来进行DOS攻击。RFC 864中给出chargen应答包的建议大小不超过512字节,但是在实际实现过程中,这个大小并未被严格限制,根据实际测试,在Linux 系统下,对于64 字节的无负载UDP Chargen 请求,系统回复一个1066 字节的UDP 应答报文,流量被放大了15倍,而在Windows 系统下使用同样的请求,回复的UDP 应答报文长度达3259 字节,并产生了分片,流量被放大了50 倍。这使得该服务可以被用来进行放大DOS攻击。

chargen服务放大DOS攻击的检测方法:

chargen服务在linux或是windows系统中默认都是关闭的。如果您发现系统上开放了tcp和udp 19端口的服务,则可能是开放了此服务。

通过检测网络流量中udp 19端口的流量规模可以监测是否存在此类放大攻击。不过根据东南大学对CERNET的流量监测发现实际攻击流量中伴随着大量固定高端端口流量,分析后发现是因为某些路由设备处理windows下chargen服务的应答分片包时出现解析错误,将分片包当作普通UDP包解析了。

chargen服务放大DOS攻击的解决办法:

确认系统是否必须开放chargen服务,如果不是必要服务,请在系统中关闭该服务,具体关闭的办法是:

  • linux系统关闭该服务的办法:

在/etc/inetd.conf 文件中注释掉’chargen’ 服务或者在/etc/xinetd.d/ 目录下将chargen服务对应的文件中的”disable” 属性改为 “yes”。

  • Chargen服务属于Windows系统中的SimpTCP服务,一般情况下Windows系统缺省不会安装该服务,如果已经安全该服务,可以通过如下几种方式关闭服务:
    1. 通过控制面板里的Service控制程序关闭,将Simple TCP/IP service设置为禁用。
    2. 修改系统注册表,将以下两项表项的值设为0HKLM\System\CurrentControlSet\Services\SimpTCP\Parameters\EnableTcpChargenHKLM\System\CurrentControlSet\Services\SimpTCP\Parameters\EnableUdpChargen
    3. 通过系统命令关闭chargen服务,命令如下:net stop simptcp对于那些必须开放chargen服务的主机,为避免被攻击,请使用防火墙限制访问该服务的来源。

参考信息:

  1. RFC 864 文档 http://www.rfc-editor.org/rfc/rfc864.txt
  2. CVE关于此缺陷(CVE-1999-0103)的描述 http://cve.scap.org.cn/CVE-1999-0103.html
  3. 东南大学针对Chargen放大攻击的研究文章 http://www.edu.cn/wlaq_6572/20140701/t20140701_1144624.shtml