我正在尝试创建一个易受攻击的环境来演示 ADCS ESC8 漏洞是如何工作的。为此,我创建了一个实验室,其中包含一台安装了 Active Directory 的 Windows Server 2016 计算机。我还安装并配置了 ADCS。
我正在尝试从外部 Kali Linux 机器进行 ldapsearch,但它不起作用。这是我使用的代码:
ldapsearch -x -H ldaps://192.168.217.131 -D "<dc-user>@emergentes.ad" -w '<password>' -b "DC=emergentes,DC=ad"
我一直不断收到以下错误:
ldap_url_parse_ext(ldaps://WIN-QDH2EF0M0FR.emergentes.ad) ldap_create ldap_url_parse_ext(ldaps://WIN-QDH2EF0M0FR.emergentes.ad:636/??base) ldap_sasl_bind ldap_send_initial_request ldap_new_connection 1 1 0 ldap_int_open_connection ldap_connect_to_host:TCP WIN-QDH2EF0M0FR.emergentes.ad:636 ldap_new_socket: 3 ldap_prepare_socket:3 ldap_connect_to_host:尝试 192.168.217.131:636 ldap_pvt_connect: fd: 3 tm: -1 async: 0 尝试连接:连接成功 TLS:对等证书不受信任或已撤销 (0x42) TLS:无法连接:(未知错误代码)。 ldap_err2字符串 ldap_sasl_bind(SIMPLE):无法联系 LDAP 服务器 (-1)
另一方面,如果我切换到 ldap 而不是使用 ldaps,它就可以工作。这让我想到:也许我没有正确配置 LDAP。这是一个很好的假设,但如果我从域控制器执行
ldaps://WIN-QDH2EF0M0FR
,它就会成功工作。
我的问题可能是什么?
您正在测试来自两个不同系统的连接,并且您没有提到有关将 AD CS root CA 证书部署到外部 Kali 系统的任何内容。一般来说,如果 TLS 客户端尚未“信任”颁发 CA,则它没有任何方法来验证服务器的证书。
使用 Linux 发行版的说明在系统范围内安装 CA 证书(例如,如果 Kali 是基于 Debian 的,则可能使用
update-ca-certificates
,或者如果是 Fedora,则可能使用 trust anchor <path>
)。
或者,仅为 libldap 工具指定 CA,如
man ldap.conf
中所述(通过系统范围配置、或用户级配置或环境变量)。
您在 ldapsearch 示例与“来自域控制器”示例中使用不同的 URL。对于 TLS 证书验证来说,这是一个“显着差异”,因为证书的 CN/SAN 直接与 URL 中指定的主机名进行比较,因此同一证书可能对一个 URL 有效,但对另一个 URL 无效。 (这就是 TLS 证书的全部要点!) 一般情况下,尤其是 AD CS,证书是针对主机名(而不是 IP 地址)颁发的,因此证书可能仅对
WIN-QDH2EF0M0FR
有效,但
不适用于
192.168.217.131
。
(更不用说使用 TLS SNI,客户端甚至可能接收完全不同的证书,具体取决于它从服务器请求的主机名。我不认为 AD LDAP 使用 SNI,但仍然如此。)
通常 libldap 使用 OpenSSL 或 GnuTLS,因此运行手动 TLS 连接以获取更多信息:
gnutls-cli SERVER -p PORT
openssl s_client -connect SERVER:PORT -verify_hostname SERVER -status
(我认为在最新的 OpenSSL
openssl s_client -connect SERVER:PORT -status
中可能就足够了,但旧版本肯定需要手动给出 -verify_hostname。)