CHARGEN 反射放大攻击分析

132 阅读2分钟

简介

CHARGEN(Character Generator Protocol)是一种调试和测试工具,它在 TCP 和 UDP 协议的 19 端口上运行。CHARGEN 服务会产生字符流,当攻击者利用伪造的源 IP 地址向 CHARGEN 服务器发送请求时,服务器会将大量的字符流发送给伪造的源 IP 地址,从而实现反射放大攻击。

原理

CHARGEN 反射放大攻击的原理很简单:

  1. 攻击者伪造受害者的 IP 地址,向互联网上的 CHARGEN 服务器发送请求。
  2. CHARGEN 服务器接收到请求后,产生大量的字符流,并将这些字符流发送给伪造的源 IP 地址,即受害者。
  3. 由于 CHARGEN 服务器产生的字符流远大于攻击者发送的请求,因此可以实现流量放大。
  4. CHARGEN 反射放大攻击的放大倍数取决于 CHARGEN 服务器产生的字符流大小。

chargen服务

  • yum install xinetd
  • vi /etc/xinetd.d/chargen-dgram //disable的配置从yes修改为no
  • service xinetd restart

image.png

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

  • 请求 image.png

  • 响应

image.png

总结

CHARGEN 反射放大攻击是一种古老的攻击方式,但仍然有效。为了保护您的服务免受 CHARGEN 反射放大攻击,请务必禁用不必要的 CHARGEN 服务,并配置防火墙规则。

参考