jndi ldaps 利用复现与检测
背景
早在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端口即可通过
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