在渗透的侦察阶段,全面的信息集合对于渗透的后续实现尤为重要。
除了通过子域爆破,搜索引擎查询等收集目标资产信息,对于打开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