CLDAP 反射放大攻击分析

64 阅读3分钟

简介

轻量目录访问协议(LDAP)被定义在RFC2251(LDAPv3)中,由于LDAP是以TCP字节流的方式进行数据传输,其必要的绑定操作和频繁的数据搜索查询会在一定程度消耗较多的TCP连接资源,于是IETF在1995年发布了面向无连接的轻量目录访问协议(CLDAP),官方文档为RFC1798

LDAP

服务端搭建

openldap

  • 命令行指定源hub.rat.dev
  • 拉取镜像
[root\@localhost workspace]# docker pull hub.rat.dev/osixia/openldap
[root\@localhost workspace]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

hub.rat.dev/osixia/openldap latest 31d1d6e16394 4 years ago 257MB
  • 运行
    • 默认账号admin
    • 密码123456
    • 组织mytest
    • 域名mytest.com
[root@localhost workspace]# docker run \
    -d \
    -p 389:389 \
    -p 636:636 \
    -v /usr/local/ldap:/usr/local/ldap \
    -v /var/openldap/ldap:/var/lib/ldap \
    -v /var/openldap/slapd.d:/etc/ldap/slapd.d \
    --env LDAP_ORGANISATION="mytest" \
    --env LDAP_DOMAIN="mytest.com" \
    --env LDAP_ADMIN_PASSWORD="123456" \
    --name openldap \
    --hostname openldap-host\
    --network bridge \
    hub.rat.dev/osixia/openldap

[root@localhost workspace]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

1bd94c0e4478 hub.rat.dev/osixia/openldap "/container/tool/run" 5 seconds ago Up 4 seconds 0.0.0.0:389->389/tcp, :::389->389/tcp, 0.0.0.0:636->636/tcp, :::636->636/tcp openldap

phpldapadmin

  • 拉取镜像
[root@localhost workspace]# docker pull hub.rat.dev/osixia/phpldapadmin
[root@localhost workspace]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

hub.rat.dev/osixia/phpldapadmin latest dbb580facde3 4 years ago 309MB
  • 运行
    • 注意Ip和端口(按需设置)
    • 192.168.11.102
    • 18080
[root@localhost workspace]# docker run \
  -p 18080:80 \
  --privileged \
  --name myldap \
  --env PHPLDAPADMIN_HTTPS=false \
  --env PHPLDAPADMIN_LDAP_HOSTS=192.168.11.102 \
  --detach hub.rat.dev/osixia/phpldapadmin
  
[root@localhost workspace]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

82bf5635ac67 hub.rat.dev/osixia/phpldapadmin "/container/tool/run" 5 seconds ago Up 4 seconds 443/tcp, 0.0.0.0:18080->80/tcp, :::18080->80/tcp myldap

image.png

image.png

Go客户端

使用tcp协议,先进行绑定,再发起searchRequest请求。

  • main.go
package main

import (
        "fmt"
        "log"

        "github.com/go-ldap/ldap/v3"
)

func main() {
        // 连接 LDAP 服务器
        l, err := ldap.DialURL("ldap://192.168.11.102:389")
        if err != nil {
                log.Fatal(err)
        }
        defer l.Close()

        // 绑定操作(添加这部分)
        bindDN := "cn=admin,dc=mytest,dc=com" // 替换为实际绑定DN
        password := "123456"            // 替换为实际密码
        if err := l.Bind(bindDN, password); err != nil {
                log.Fatalf("绑定失败: %v", err)
        }


        // 构建 SearchRequest
        searchRequest := ldap.NewSearchRequest(
                "dc=mytest,dc=com", // The base dn to search
                ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
                "(objectClass=*)", // The filter to apply
                []string{"dn", "cn"}, // A list attributes to retrieve
                nil,
        )

        // 执行搜索请求
        sr, err := l.Search(searchRequest)
        if err != nil {
                fmt.Println("search failed.")
                log.Fatal(err)
        }

        // 遍历搜索结果
        for _, entry := range sr.Entries {
                fmt.Printf("DN: %s, Common Name (CN): %s\n", entry.DN, entry.GetAttributeValue("cn"))
        }
}

  • 编译运行
[xiaofeng@localhost cldap]$ go build main.go
[xiaofeng@localhost cldap]$ ./main
DN: dc=mytest,dc=com, Common Name (CN): xf
DN: cn=aaaa bbbbbbbb,dc=mytest,dc=com, Common Name (CN): aaaa bbbbbbbb

  • 报文分析
    • bindRequest报文 image.png
    • bindResponse报文 image.png
    • searchRequest报文 image.png
    • searchResEntry报文 image.png
    • searchResDone报文 image.png

CLDAP

Windows 10 AD LSD

  • 点击 "开始" 按钮,搜索 "启用或关闭 Windows 功能",然后打开它并完成安装

image.png

  • 点击 "开始" 按钮,找到 "Windows 管理工具",然后打开 "AD LDS 管理工具"。

image.png

  • 创建 AD LDS 实例

image.png

rootDSE请求

rootDSE条目在AD服务配置时创建,且允许未经身份验证的客户端对服务器的配置状态、功能和扩展属性进行查询,也被称作“AD ping”

  • bindRequest报文 image.png
  • searchRequest报文 image.png
  • 反射放大报文

image.png

  • 放大倍数 请求包长度81,响应包长度2978,放大倍数36

参考