账户模式和server模式有很多相似之处,返回的都是xml格式数据,区别在于,server模式的server地址是可以自己填的,可以自定义,账户模式不是,这个是内置且固定的,而且只支持https协议。我们如果想自己实现这种方式,至少需要两步,第一改变dns解析,指向我们的服务器;第二就是实现https校验,检验不通过https通信也建立不了。
https://bbs.kanxue.com/thread-251584.htm
这个文档已经分析了思路,dns是通过反射修改缓存实现的,https通过修改"sun/net/www/protocol/https/Handler”实现的。
但是jdk21以后由于模块化的验证强了,再调用反射模块会失败,没有采用,优化后的方式是agent方式修改InetAddress的解析返回结果。
对于修改Handler实现感觉影响较大,又看到一篇新的帖子
https://linux.do/t/topic/116435/36
这个方法可以插入到ssl证书链中,调用流程如下
[Java] 纯文本查看 复制代码at java.base/java.security.cert.PKIXBuilderParameters.(PKIXBuilderParameters.java)
at java.base/sun.security.provider.certpath.PKIXExtendedParameters.(PKIXExtendedParameters.java:55)
at java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:218)
at java.base/sun.security.validator.Validator.validate(Validator.java:264)
at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:242)
at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:113)
at com.intellij.util.net.ssl.ConfirmingTrustManager.checkServerTrusted(ConfirmingTrustManager.java:209)
at com.intellij.util.net.ssl.ConfirmingTrustManager.lambda$checkServerTrusted$2(ConfirmingTrustManager.java:179)
at com.intellij.util.net.ssl.ConfirmingTrustManager.withCalculatedCertificateStrategy(ConfirmingTrustManager.java:190)
at com.intellij.util.net.ssl.ConfirmingTrustManager.checkServerTrusted(ConfirmingTrustManager.java:176)
at java.base/sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:1441)
at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1335)
at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(CertificateMessage.java:1226)
at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(CertificateMessage.java:1169)
at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:396)
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:480)
... 34 more
既然可以插入证书认证链,我们就制作一个根证书插入进去,然后用自己根证书制作网站证书了,https认证就通过了。
解决了这两个问题基本就没啥难度了,研究服务器返回的数据自己生成就可以了,为了获得样本,自己还购买了一个学生账户,花了三十来块。
最后效果如下:
Image_1724420546527.gif (204.42 KB, 下载次数: 0)
下载附件
2024-8-24 20:53 上传
附件的插件目录有updns.jar和pki.jar,这两个是dns解析和证书链注入的,其他插件都是ja-netfilter的常见插件了,仅供研究,请及时删除。