编写C#查询证书域名小工具

责声明">
在渗透的侦察阶段,全面的信息集合对于渗透的后续实现尤为重要。 除了通过子域爆破,搜索引擎查询等收集目标资产信息,对于打开443端口HTTPS服务的网站,我们还可以通过HTTPS证书收集子域和兄弟...
渗透的侦察阶段,全面的信息集合对于渗透的后续实现尤为重要。 除了通过子域爆破,搜索引擎查询等收集目标资产信息,对于打开443端口HTTPS服务的网站,我们还可以通过HTTPS证书收集子域和兄弟域。 例如,通过查看浏览器证书功能列中的详细信息,您可以找到许多使用该证书的域名: DNS名称=developers.weixin.qq.com
DNS名称=ad.weixin.qq.com
DNS名称=game.weixin.qq.com
DNS名称=as.weixin.qq.com
DNS名称=hk.open.weixin.qq.com
DNS名称=open.weixin.qq.com
DNS名称=api.weixin.qq.com
DNS名称=sz.api.weixin.qq.com
DNS名称=long.open.weixin.qq.com
DNS名称=mp.weixinbridge.com
DNS名称=servicewechat.com
DNS名称=hk.mp.weixin.qq.com
DNS名称=sz.mp.weixin.qq.com
DNS名称=hk.api.weixin.qq.com
DNS名称=sh.api.weixin.qq.com
DNS名称=sz.open.weixin.qq.com
DNS名称=a.weixin.qq.com
DNS名称=mp.weixin.qq.com 以下共享是编写一个C#小工具,自动获取证书中的兄弟域名。 首先通过Socket连接服务器HTTPS服务下载证书。 TcpClient 客户端 = 新  TcpClient() client.Connect(“mp.weixin.qq.com”,  443); //使用SslStream类存储流 SslStream  ssl =  new  SslStream(client.GetStream(),  false,  new  RemoteCertificateValidationCallback(ValidateServerCertificate),  null); 尝试 { ssl.AuthenticateAsClient(主机); } //catch (AuthenticationException  e) 捕获 (例外  e) { 的Debug.WriteLine(e.Message); ssl.Close(); client.Close(); 返回 证书; } //获取证书,关闭 证书 = 新  X509Certificate2(ssl.RemoteCertificate); ssl.Close(); client.Close(); 通过调试断点,您可以看到证书的属性,没有DNSName相关 通过搜索我们找到X509Certificate2。 GetNameInfo方法可以获取证书的DNSName,调用方法如下 cert.GetNameInfo(X509NameType.DnsName,false) 运行该程序并获取DnsName Console.WriteLine(“{0}”,cert.GetNameInfo(X509NameType.DnsName,false)); 但是,我们发现使用Microsoft自己的类操作证书只能读取许多“用户可选择的名称”中的一个(最后一个),您需要改变主意。 进一步探索,证书的扩展信息存储在X509Certificate2中。扩展对象, 遍历并观察 Foreach(证书扩展中的X509Extension扩展名)
{
Console.WriteLine(“Oid {0} {1} {2}”,ext.Oid.FriendlyName,ext.Oid.Value,Encoding.Default.GetString(ext.RawData));
} 在RawData中,证书扩展名Oid.FriendlyName是“用户可选择的名称”,存储DNS名称值的列表,从中可以获得与证书相关联的所有兄弟域名的数据。 但是,此列表数据在中间使用不可见的字符分隔。通过转码RawData(ASCII解码),中间分隔符为82,后两位数字表示域名的长度。 如developers.weixin.qq.com 长度为24,转换为十六进制为18 以下是如何处理此问题的方法 如果 (ex.Oid.FriendlyName == “用户可选名称”||  ex.Oid.FriendlyName == “主题 替代 名称”) //为了兼容中文和英文 { Console.WriteLine(“{0}”,  ext.Oid.FriendlyName  + “  -  ”  +  ex.Oid.Value  + “  | ”  +  Encoding.Default.GetString(ext.RawData)); 字符串  dnsnames = “”; //由于RawData是一个Byte数组,这里一个接一个地给Hex 十六进制数据 对于 (int  i =  0;  i <  ext.RawData.Length;  i ++) { Dnsnames  +=  ext.RawData [i] .ToString(“X2”); } Console.WriteLine(dnsnames); //首先通过常规剪切,这里的正则表达式是“82dw”,因为域名是有限的,Hex的第一个数字不是字母,使用“82ww”将是假的 String []  dnsname =  Regex.Split(dnsnames,  @“82dw”,  RegexOptions.None); //逐个恢复域名 Foreach (  dnsname中的字符串  dns ) { 如果为 (dns.Length >  6) { //十六进制到字符串 Var  arr =  Regex.Matches(dns,  @“ww”)。Cast< Match> ()。选择(M=> m.Value); Foreach (变量  m  in  arr) { 字符  c = (字符)Int32.Parse(m,  System.Globalization.NumberStyles.HexNumber); Console.Write(C); } Console.WriteLine( “”); } } } 获取完整的域名列表 这没问题,一个简单的功能与大家分享,我希望能共同进步。 源代码+程序:https://pan.baidu.com/s/1nwa2VyD,可供下载 作者: 斗鱼SRC 
  • 发表于 2018-03-14 00:00
  • 阅读 ( 1563 )
  • 分类:黑客工具

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
黑客

2107 篇文章

作家榜 »

  1. 黑客 2107 文章