简介
CHARGEN(Character Generator Protocol)是一种调试和测试工具,它在 TCP 和 UDP 协议的 19 端口上运行。CHARGEN 服务会产生字符流,当攻击者利用伪造的源 IP 地址向 CHARGEN 服务器发送请求时,服务器会将大量的字符流发送给伪造的源 IP 地址,从而实现反射放大攻击。
原理
CHARGEN 反射放大攻击的原理很简单:
- 攻击者伪造受害者的 IP 地址,向互联网上的 CHARGEN 服务器发送请求。
- CHARGEN 服务器接收到请求后,产生大量的字符流,并将这些字符流发送给伪造的源 IP 地址,即受害者。
- 由于 CHARGEN 服务器产生的字符流远大于攻击者发送的请求,因此可以实现流量放大。
- CHARGEN 反射放大攻击的放大倍数取决于 CHARGEN 服务器产生的字符流大小。
chargen服务
- yum install xinetd
- vi /etc/xinetd.d/chargen-dgram //disable的配置从yes修改为no
- service xinetd restart
Go客户端
package main
import (
"fmt"
"net"
"os"
)
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, "Usage: %s <target>\n", os.Args[0])
os.Exit(1)
}
target := os.Args[1]
addr, err := net.ResolveUDPAddr("udp", target+":19")
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit(1)
}
conn, err := net.DialUDP("udp", nil, addr)
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit(1)
}
defer conn.Close()
// CHARGEN 不需要发送任何数据
_, err = conn.Write([]byte{})
if err != nil {
fmt.Fprintf(os.Stderr, "Write error: %s", err.Error())
os.Exit(1)
}
// 读取响应数据
buffer := make([]byte, 1024)
n, _, err := conn.ReadFromUDP(buffer)
if err != nil {
fmt.Fprintf(os.Stderr, "Read error: %s", err.Error())
os.Exit(1)
}
// 输出响应数据
fmt.Printf("Received %d bytes:\n%s", n, string(buffer[:n]))
}
测试运行
- 发送目的端口19的请求,且不需要负载数据
- 产生了1024长度的响应负载数据,从而具备放大的效果
- 负载数据为随机数据
[xiaofeng@localhost chargen]$ go build main.go
[xiaofeng@localhost chargen]$ ./main 127.0.0.1
Received 1024 bytes:
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+
BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,
CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-
DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-.
EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./
FGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0
GHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./01
HIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./012
IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123
JKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./01234
KLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./012345
LMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456
MNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+
[xiaofeng@localhost chargen]$
[xiaofeng@localhost chargen]$
[xiaofeng@localhost chargen]$ ./main 127.0.0.1
Received 1024 bytes:
NOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./012345678
OPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789
PQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789:
QRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789:;
RSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789:;<
STUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789:;<=
TUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789:;<=>
UVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789:;<=>?
VWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789:;<=>?@
WXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789:;<=>?@A
XYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789:;<=>?@AB
YZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789:;<=>?@ABC
Z[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789:;<=>?@ABCD
[\]^_`abcdefghijklmnopqrstuvwxyz{|}!"#$%&'()*+,-./0123456789
-
请求
-
响应
总结
CHARGEN 反射放大攻击是一种古老的攻击方式,但仍然有效。为了保护您的服务免受 CHARGEN 反射放大攻击,请务必禁用不必要的 CHARGEN 服务,并配置防火墙规则。