背景

早在2021年12月份的时候就想研究一下ldaps的利用,各种原因导致delay了。众所周知,putting off an easy thing makes it hard and putting off a hard thing makes it never。看到最近p牛发了,本着完成 > 完美的原则复现一下,没有什么新的东西,但对于绕过NIDS等纯流量检测的安全产品来说,很有意义。

复现

1、ldaps需要一个有效的证书,复用早期搭建https代理时用的是lets encrypt + certbot申请的证书即可(注意certbot证书更新依赖端口80,不要被占用,否则证书可能会过期)

# 域名A记录对应的 vps上申请
#  sudo certbot certonly --standalone

# 验证一下证书有效(时间没过期)
# openssl s_client  -connect 127.0.0.1:1636  | openssl x509 -noout -dates
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = E6
verify return:1
depth=0 CN = xxxxx.thinkycx.me
verify return:1
notBefore=Aug 17 13:41:00 2024 GMT
notAfter=Nov 15 13:40:59 2024 GMT

2、参考p牛的tls proxy 封装好 ./tls_proxy -l 127.0.0.1:1636 -r 127.0.0.1:1389 -c tmp/fullchain.pem -k tmp/privkey8.pem

3、jndi注入 + ldaps

tls 的nginx stream实现

其实步骤1和2本质上就是tls封装了4层tcp数据,nginx stream模块本身也可以做这一层事情,简单分享一下我的配置,针对其他的tcp流数据转发 + 封装tls都可以复用。链路如下:

1、配置一个nginx stream模块,监听在1443,向后转发给1081端口

    stream {
        upstream backend {
                     server 127.0.0.1:xxxx ;
        }

        upstream backend2 {
            server 127.0.0.1:1081 ;
        }

          log_format proxy4_log_format '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

        server {
		# 监听别的端口也是ok的
        }

        server {
		listen 0.0.0.0:1443 ssl ;
		listen [::]:1443 ssl ;
		ssl_certificate <PATH>/fullchain.pem;
		ssl_certificate_key <PATH>/privkey.pem;

              proxy_pass backend2;

    		access_log /var/log/nginx/tcp_access_1443.log proxy4_log_format;
    		error_log /var/log/nginx/tcp_error_1443.log;
        }
    }

2、将需要用的服务暴露在 1081端口即可通过 :1443访问。也可以试用 ssh -R将远程端口转发到本地。
ssh -NR 127.0.0.1:1081:127.0.0.1:1081 root@<vps-ip>

3、实际测试一下:

  • 本地模拟一个http协议响应返回echo "HTTP/1.1 200 OK\n\nok" | ncat -lvvp 1081
  • curl 发起一个https请求

检测

本质上只是封装了一层tls,对于rasp的检测来说,和ldap利用没有任何区别;对于waf的拦截 和流量安全产品+dns的联动检测来说,补充一下ldaps的特征即可,对于纯流量的检测(NIDS)来说只能基于tls检测了。

参考

1、 https://www.leavesongs.com/PENETRATION/use-tls-proxy-to-exploit-ldaps.html