Whois 简单来说,就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人、域名注册商、域名注册日期和过期日期等)。通过域名Whois服务器查询,可以查询域名归属者联系方式,以及注册和到期时间。通常情况下,whois信息均为真实信息,通过whois信息可以找到域名注册人的很多真实信息,像电话,邮箱,NS记录,是对网站进行社工非常好的信息来源,对于安全从业人员来说,快速获取whois信息,能够帮助自己掌握目标网站的很多有用信息。
而whois信息通常是保存在各级域名注册机构中,平常我们要查询whois信息都是通过godaddy、name.com、万网、新网等域名注册商网站通过查询页面提交域名进行查询,既慢又不能批量查询,太费劲了,这里我就把我珍藏很久的一个PS function贡献给大家,这个脚本支持140多种后缀的域名进行查询,尤其是一些生僻的域,找一个能支持这个域注册的注册商就不容易了,现在你不需要再为这个事情发愁了。
老规矩,先上代码,然后对关键操作进行解释:
=====文件名:Get-whois.ps1===== Get-WhoIs { [CmdletBinding()] ( [Parameter(Position=0, ValueFromRemainingArguments=$true)] []$query, []$server, []$NoForward ) { $TLDs = DATA { @{ = , = , = , = , = = = = = = , = = = = = = = , = = ,, = = = , = , = , = = = , = , = = = , = = = , = = = = ,, = , = , = = , = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = } } $EAP, $ErrorActionPreference = $ErrorActionPreference, $query = $query.Trim() ($query ) { ($query ) { $query = } (!$server) { $server = } } (!$server) { $server = $TLDs.GetEnumerator() | { $query (+$_.name) } | -Expand Value | Get-Random } (!$server) { $server = } $maxRequery = 3 { $client = System.Net.Sockets.TcpClient $server, 43 { $stream = $client.GetStream() $data = [System.Text.Encoding]::Ascii.GetBytes( $query + ) $stream.($data, 0, $data.Length) $reader = System.IO.StreamReader $stream, [System.Text.Encoding]::ASCII $result = $reader.ReadToEnd() ($result ) { (!$NoForward) { (!$cachedResult) { $cachedResult = $result $cachedServer = $server } $server = $matches[1] $query = ($query -split )[-1] $maxRequery-- } { $maxRequery = 0 } } { $maxRequery = 0 } } { ($stream) { $stream.Close() $stream.Dispose() } } } ($maxRequery 0) $result ($cachedResult ($result -split ).count 5) { $cachedResult } $ErrorActionPreference = $EAP } }
函数里定义了三个参数,两个[string]类型,一个[switch]类型,分别用于接收要进行whois查询的域名,指定whois域名服务器,以及是否允许将查询请求转发到其他域名解析服务器。随后创建了一个枚举值的哈希表,目的是用于存储不同域名后缀和whois服务器的对应关系,因为不同的域名后缀对应的域名信息是存储在不同的服务器上的。需要强调的是像.com、.net、.org、.info这几个注册量特别大的域名后缀指定了多个whois服务器,避免查询量过大无法有效返回结果的问题。
接下来通过New-Object创建一个System.Net.Sockets.TcpClient的TCP对象,连接上面指定的whois服务器的43端口用于查询whois信息,在通过一个System.IO.StreamReader对象接收whois信息返回的数据,并对数据进行解析。除此之外再加上try{}cache{}finally{}进行容错处理,在数据解析是也用到了正则表达式用于匹配目标字符串。
程序的运行方法有如下四种:
get-whois dnspod.com
先看看dnspod在被腾讯收购后有没有更改whois信息,貌似鹅厂没有改过
get-whois jd.com –NoForward get-whois n 128.11.5.98 -server whois.arin.net
作者: 付海军
出处: 版权:本文版权归作者和博客园共有 转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢 要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任 个人网站: