LDAPX是一款功能强大且灵活的LDAP代理,可以帮助广大研究人员动态检查和转换其他工具生成的所有 LDAP 数据包。
Golang
由于该工具基于Go开发,因此我们首先需要在本地设备上安装并配置好最新版本的Go环境。
接下来,广大研究人员可以直接使用下列命令将该项目源码克隆至本地:
git clone github.com/Macmod/ldapx
然后切换到项目目录中,使用下列命令完成工具代码的安装和构建:
cd ldapx
go install .
发布版本
我们还可以直接访问该项目的Releases页面下载预编译版本的LDAPX。
$ ldapx -t LDAPSERVER:389 [-f MIDDLEWARECHAIN] [-a MIDDLEWARECHAIN] [-b MIDDLEWARECHAIN] [-l LOCALADDR:LOCALPORT] [-o MIDDLEWAREOPTION=VALUE] [...]
参数命令
-f:将对所有适用的请求应用过滤中间件;
-a:将把 AttrList 中间件应用于所有适用的请求;
-b:将对所有适用的请求应用 BaseDN 中间件;
-e:将把 AttrEntries 中间件应用于所有适用的请求;
-o:可以多次指定,用于指定中间件的选项;
-F:指定转发数据包(请求)的详细程度;
-R:指定反向数据包(响应)的详细程度;
-x:可用于指定用于连接目标的 SOCKS 代理;
在过滤器、属性列表和 baseDN 中应用多个中间件
$ ldapx -t 192.168.117.2:389 -f OGDR -a Owp -b OX
使用 shell
我们还可以使用构建 shell 来动态更改中间件(set命令)或模拟 LDAP 查询(test命令):
输出统计数据
要查看数据包统计信息,包括每个 LDAP 操作通过代理传递的数据包数量,请使用show stats命令:
show stats
-> Target]
Packets Received: 14
Packets Sent: 14
Bytes Received: 1464
Bytes Sent: 1464
Counts by Type:
Bind Request: 1
Search Request: 12
Modify Request: 1
<- Target]
Packets Received: 149
Packets Sent: 149
Bytes Received: 177045
Bytes Sent: 177045
Counts by Type:
Bind Response: 1
Search Result Entry: 129
Search Result Done: 12
Search Result Reference: 6
Modify Response: 1
以代码库形式使用
package main
import (
"fmt"
filtermid "github.com/Macmod/ldapx/middlewares/filter"
"github.com/Macmod/ldapx/parser"
)
func main() {
query := "(&(cn=john)(sn=doe))"
fmt.Printf("Original Query: %sn", query)
myFilter, err := parser.QueryToFilter(query)
if err != nil {
fmt.Errorf("error parsing query")
}
// FilterToString can be used to show
// the internal representation of the parsed filter
fmt.Println(parser.FilterToString(myFilter, 0))
// Applying the OID middleware
obfuscator := filtermid.OIDAttributeFilterObf(3, false)
newFilter := obfuscator(myFilter)
newQuery, err := parser.FilterToQuery(newFilter)
if err != nil {
fmt.Errorf("error converting filter to query")
}
fmt.Printf("Changed Query: %sn", newQuery)
}
输出结果:
Original Query: (&(cn=john)(sn=doe))
Filter Type: 0
AND Filter with 2 sub-filters:
Filter Type: 3
Equality Match - Attribute: cn, Value: john
Filter Type: 3
Equality Match - Attribute: sn, Value: doe
Changed Query: (&(2.005.4.03=john)(2.005.04.004=doe))
过滤器
func YourFilterMiddleware(args) func(parser.Filter) parser.Filter
BaseDN
func YourBaseDNMiddleware(args) func(string) string
属性列表
func YourAttrListMiddleware(args) func([]string) []string
属性条目
func YourAttrEntriesMiddleware(args) func(parser.AttrEntries) parser.AttrEntries
中间件代码样例
func EqExtensibleFilterObf(dn bool) func(parser.Filter) parser.Filter {
// For every leaf in the filter...
return LeafApplierFilterMiddleware(func(filter parser.Filter) parser.Filter {
switch f := filter.(type) {
// If the leaf is an EqualityMatch
case *parser.FilterEqualityMatch:
// Replace it with an ExtensibleMatch with an empty MatchingRule
// optionally adding a DNAttributes (Active Directory ignores DNAttributes)
return &parser.FilterExtensibleMatch{
MatchingRule: "",
AttributeDesc: f.AttributeDesc,
MatchValue: f.AssertionValue,
DNAttributes: dn,
}
}
return filter
})
}
然后在以下位置注册config.go即可:
var filterMidFlags map[rune]string = map[rune]string{
...
'x': "EqExtensible",
...
}
// In SetupMiddlewaresMap:
filterMidMap = map[string]filtermid.FilterMiddleware{
...
"EqExtensible": filtermid.EqualityToExtensibleFilterObf(false),
...
}
本项目的开发与发布遵循MIT开源许可协议。
LDAPX:
https://github.com/Macmod/ldapx
原文始发于微信公众号(FreeBuf):如何使用LDAPX动态检查和转换LDAP数据包
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论