Kali Linux——侦察

308 阅读55分钟

当你进行渗透测试、道德黑客或安全评估时,这些工作通常都有一定的参数。这些参数可能包括目标范围的完整定义,但也常常没有明确的界定。你需要确定你的目标——包括系统和人员目标。为了做到这一点,你需要进行侦察。使用 Kali Linux 提供的工具,你可以收集大量关于公司及其员工的信息。

攻击不仅可以针对系统和运行其上的应用程序,还可以针对人。虽然在进行渗透测试或红队演练时,你不一定会被要求进行社会工程攻击,但这是一个可能性。毕竟,社会工程攻击如今是最常见的初始访问途径之一。尽管每年的统计数据有所不同,但包括 Verizon 和 Mandiant 在内的一些估计表明,今天很多公司的数据泄露事件都是社会工程攻击导致的。

在本章中,我们将首先从远距离寻找信息,以避免目标意识到你在做什么。然而,最终你需要与目标接触,因此我们将逐步接近企业拥有的系统。最后,我们将介绍一个重要的概念:端口扫描。虽然这将为你提供关于系统和其上运行的应用程序的详细信息,但从其他工具和技术中收集的信息将帮助你更广泛地理解你的目标。

什么是侦察?

也许我们最好从侦察的定义开始,这样我们可以确保在同一个起点上理解这个概念。根据 Merriam-Webster 字典,侦察是“收集信息的初步调查”,这个定义还进一步暗示了它与军事的联系。考虑到我们在信息安全领域的讨论方式,这个军事的关联并不完全无关紧要。我们常谈论军备竞赛、攻击、防御,当然,还有侦察。我们在这里的目的是尝试收集信息,以便让我们的测试工作(作为攻击者或对手)变得更加容易。虽然在测试过程中,你可以尽可能多地尝试各种方法,但一般来说,测试并不是一项无限制的活动。我们必须谨慎使用时间,最好在开始时花一些时间了解我们面对的情况,而不是在后期浪费大量时间盲目尝试。

当你开始收集关于目标的信息时,通常最好不要制造太多噪音。你应该在不直接接触目标的情况下开始远程调查。显然,这会因不同的参与情况而异。如果你在一家公司工作,可能不需要保持安静,因为每个人都知道你在做什么。然而,你可能需要使用我们将讨论的相同战术,来确定你的公司留下了什么样的印记。你可能会发现你的公司正在向公共渠道泄露很多不应该泄露的信息。你可以利用开源情报工具和战术,帮助保护你的公司免受攻击。

操作安全(OPSEC)

你可能听过“Loose lips sink ships”这个表达,最早来源于二战。这句话简洁地总结了操作安全(OPSEC)的意义:与任务相关的关键信息必须保密,因为任何信息泄露都可能危及任务的安全。当涉及到军事任务时,这种保密性甚至扩展到军人的家庭。如果某个家庭成员透露他们的亲人被部署到了某个特定的地理位置,并且这个亲人可能有特定的技能,别人可能就能推测出军事行动的内容。两个加两个,就能推算出一些信息。同样,当关于公司公开的信息过多时,敌对方(无论他们的性质如何)可能会推断出很多关于公司的细节。实施必要的操作安全(OPSEC)措施对于防止攻击者接近并保护公司免受竞争对手信息泄露至关重要。

了解公司最关心的攻击者类型也非常重要。你可能担心知识产权被竞争对手盗取,或者担心来自有组织犯罪和寻求机会的国家行为者的更广泛的攻击。了解这些区别有助于你确定哪些信息需要保密,哪些信息可以公开。

良好的 OPSEC 实践可以帮助防止我们在本章中讨论的某些侦察技术。

如果我们仅考虑网络攻击,我们可能会认为端口扫描和服务扫描已经足够。然而,全面的安全测试可能涵盖的内容远不止于此,除了“通过开放端口能否突破系统”的技术性攻击外,还可能包括操作响应、人机交互、社会工程等多方面内容。最终,企业的安全态势受许多因素的影响,而不仅仅是哪些服务暴露在外部世界。因此,为了准备安全测试,侦察的工作远不止端口扫描这么简单。

互联网的一个伟大之处在于它提供了如此多的信息。你与互联网连接并互动的时间越长,你的足迹就越多。这对于个人和企业都适用。以社交网络为例,仅仅作为起点,你的在线存在感如何?你散布了多少关于自己的信息?作为公司的员工又如何?除此之外,互联网还存储着为了保持运行和便于我们操作而必需的信息,包括域名、联系方式、公司详情、地址等,这些都是在进行安全测试时非常有用的数据。

随着时间的推移,定位这些信息的重要性催生了许多工具,使得从存储这些信息的地方提取它们变得更加容易。这些工具包括一些已存在一段时间的命令行工具,还包括网站、浏览器插件和其他程序。有如此多的信息来源,特别是随着越来越多的人在线,收集信息的地方也越来越多。我们不会一一列举所有通过不同网站收集信息的方法,虽然有很多网站可以使用。我们将重点介绍 Kali 中可用的工具,并简要讨论你可以添加到 Firefox 浏览器中的扩展(Kali 默认使用 Firefox 浏览器)。

开源情报

不久之前,找到一个在网上有显著存在的人,比找到一个完全不了解互联网的人还要难。这种情况在短时间内发生了反转。即便是那些避开社交网站,如TikTok、Facebook、X(Twitter)、Instagram等的人,仍然会在网上留下痕迹。这种现象的根源之一是,许多公共记录已经被上传到网络上。此外,任何曾经拥有过家用电话的人,也可以在网上被找到。这包括那些原本并不需要互联网的人。那些在网上存在较长时间的人,其痕迹则更加深远。就我个人而言,我的网络足迹已经长达几十年。

什么是开源情报?
开源情报指的是从公开来源获取的信息,不论这些信息是否属于被认为是公共的政府记录(如房地产交易),或者其他如邮件列表档案等被认为是开源信息的来源。当你听到“开源”这个词时,可能会想到软件,但它同样适用于其他类型的信息。开源意味着信息来自一个自由获取的地方。这不包括一些提供收费信息的站点,它们提供有关个人的详细信息。

你可能会问,为什么要使用这些开源情报?这不是为了跟踪别人。当你进行安全测试时,使用开源情报有许多原因。首先,你可以收集有关IP地址和主机名的详细信息。如果你被要求进行完整的红队测试,也就是说,你是作为外部人员进行测试,并且没有获得关于目标的详细信息,目的是实现事先商定的目标,那么你就需要知道你要攻击的是什么。这意味着你需要找到需要攻击的系统。同时,这也意味着要识别出公司内部的员工,因为他们可能是最容易访问的渠道。社会工程学常常是获得访问权限的一个有效手段。

如果你是某个公司的安全专家,你可能会被要求识别该公司及其高层员工的外部网络足迹。公司可以通过减少信息泄漏来降低潜在的攻击风险,尽管这种信息泄漏无法完全避免。至少,关于域名、IP地址及其DNS记录等信息会对外公开。如果这些信息不公开,消费者和其他公司(如供应商和合作伙伴)将无法访问这些资源。

搜索引擎可以为我们提供大量信息,是一个很好的起点。但由于互联网上有如此多的网站,你很快就会被搜索结果淹没。一种方法是缩小搜索范围。虽然这与Kali的直接关系不大,且许多人已经知道这个方法,但它是一个重要的话题,值得我们快速回顾。当你进行安全测试时,你会进行大量的信息搜索。使用这些搜索技巧可以节省你大量的时间,避免翻阅无关的页面信息。

在进行社会工程学攻击时,你需要知道攻击的目标是谁,这意味着要识别目标公司中的员工。社交网站对于收集关于个人的信息非常有用。LinkedIn可以为你提供一个大数据矿库,帮助你识别公司及其员工。求职网站也可以提供很多关于公司的信息。例如,如果你看到某公司在招聘具备Cisco和Microsoft Active Directory经验的员工,你可能就能推测出该公司使用的基础设施类型。像LinkedIn和Facebook等社交网络也能提供一些关于公司和员工的见解。

这是一大堆需要寻找的信息。幸运的是,Kali提供了许多工具,帮助你搜索这些信息。这些程序可以自动从搜索引擎和其他网页上抓取大量信息。像theHarvester这样的工具可以节省你很多时间,而且易于使用。像Maltego这样的程序不仅可以自动抓取大量信息,还能以可视化的方式展示信息,帮助你更容易地发现关联。然而,在我们深入了解这些工具之前,我们应该先看一下如何高效地收集信息的基本方法。

Google黑客攻击

在谷歌推出之前,搜索引擎就已经存在。然而,谷歌改变了搜索的方式,最终超越了之前流行的搜索网站,如AltaVista、Infoseek和Inktomi,这些网站后来都被收购或倒闭。许多其他的搜索引擎也已经不再存在。谷歌不仅成功创建了一个有用的搜索引擎,还找到了一个将其货币化的方式,使公司保持盈利并继续运营。

谷歌推出的一个特性是用户可以使用一组关键词来修改搜索请求,从而得到更加精确的搜索结果。使用这些关键词的搜索有时被称为Google dorks,而使用这些关键词来识别高度特定页面的整个过程被称为Google黑客攻击。这对于收集目标信息来说是一个非常强大的工具。

在与特定目标相关的信息收集中,最重要的关键词之一是“site:”关键词。使用这个关键词时,你告诉谷歌只返回匹配特定网站或域名的结果。如果我使用site

.com,我的意思是我只想查看属于以oreilly.com结尾的网站的页面。这可以包括像blogs.oreilly.com或www.oreilly.com这样的站点。这样,你就可以像每个组织在其自己的网站架构中嵌入了一个谷歌搜索引擎一样使用谷歌,但你能跨多个属于同一域名的网站进行搜索。

注意
尽管你可以像访问一个组织的自有搜索引擎一样进行搜索,但需要注意的是,使用这种技术时,你只会找到可以从互联网访问的页面和网站。你可能也无法找到那些具有互联网可达性但未在互联网上其他地方被引用的网站:例如你无法找到任何内网网站或页面。通常,你必须处于组织内部才能访问这些站点。尽管如此,配置错误可能会发生,搜索引擎的爬虫需要知道这些站点的存在才能访问它们,因此,可能会有人将外部链接指向一个可以从外部访问的内部站点,这样就会暴露出该站点被搜索引擎抓取的风险。然而,作为一般规则,你无法从外部访问到内部站点的详细信息。

你可能还希望限制搜索的文件类型。例如,你可能在寻找电子表格或PDF文档。你可以使用filetype:关键词来将搜索结果限制为特定的文件类型。例如,我们可以将两个关键词结合使用来获取详细的搜索结果。在图3-1中,搜索为site

.com filetype。这将返回谷歌在所有以oreilly.com结尾的站点中识别到的PDF文档,你可以看到前两条结果列出了两个网站。

image.png

你可以考虑将两个其他关键词搭配使用:inurl:intext:。第一个关键词在URL中查找你的搜索词,第二个关键词则在页面文本中查找你的搜索词。通常,谷歌会在与页面相关的各个元素中查找匹配项。而在这里,你告诉谷歌你希望它只在特定位置寻找搜索词。这对于你在查找URL中包含如/cgi_bin/之类内容的页面时非常有用。你还可以指定谷歌仅在页面文本中查找匹配项,方法是使用 intext:,后面跟上你的搜索词。通常情况下,谷歌可能会返回不包含你所有搜索词的结果。如果你希望确保找到所有相关内容,可以使用类似的关键词 allinurl:allintext:

除了这些常用的关键词外,还有其他关键词,谷歌也会不定期地进行调整—例如,谷歌已经取消了 link: 这个关键词。前面提到的这些是你可能会使用的一些主要关键词。需要记住的是,通常你可以将多个关键词组合使用。你也可以使用基本的搜索操作符,比如布尔运算符。你可以使用 ANDOR,例如,告诉谷歌你希望包括两个搜索词(AND)或任意一个搜索词(OR)。你还可以使用引号确保正确的单词顺序。如果我想搜索与自由女神像相关的内容,例如,我会使用 "Statue of Liberty",否则我可能会得到包含 statueliberty 的页面,这可能会得到你不想要的大量页面。

提示
另一个值得注意的谷歌搜索技巧是,有一个有用的搜索查询数据库。这就是谷歌黑客数据库(Google Hacking Database),它由Johnny Long于2004年创建,Long在2002年开始收集有用或有趣的搜索词。目前,谷歌黑客数据库托管在 exploit-db.com 上。搜索词被按类别维护,其中有很多你在为公司进行安全测试时可能会用到的有趣关键词。你可以将数据库中找到的任何搜索词与 site: 以及后面的域名一起使用。这样,你就能通过谷歌黑客攻击发现潜在的漏洞页面和敏感信息。

一个最后的关键词是 cache:,尽管它的使用可能会有限制。你可以通过这个关键词从谷歌的搜索缓存中提取页面,查看该页面上次被谷歌缓存时的样子。由于你无法控制你要查看的具体日期,这个关键词可能不如“时光倒流”(Wayback Machine)那样有效,尤其是在缓存结果方面。然而,如果某个站点因故无法访问,你仍然可以从谷歌的缓存中获取页面。需要注意的是,如果你是因为站点无法访问而使用缓存页面,你无法点击页面中的链接,因为它们仍然指向无法访问的站点。你需要再次使用 cache: 关键词来重新获取该页面。cache: 关键词会显示网站的最新缓存版本,结果会告诉你该缓存副本的存储时间。在我对O'Reilly网站进行测试时,我获得的副本只有几个小时的历史。某些网站的缓存可能不如其他网站那么频繁。尽管你可以使用这个关键词来引用一个网站,但如果你直接使用URL可能会更加有用。如果你有一个指向特定页面的URL,你可以使用该URL从谷歌的缓存中获取该页面。

自动化信息抓取

进行这些搜索可能非常耗时,尤其是当你需要通过许多查询来尽可能获取更多结果时。幸运的是,我们可以使用 Kali 工具来快速获得结果。我们首先要介绍的工具是 theHarvester。这是一个可以利用多个来源来查找信息的程序。它不仅可以使用百度、必应和DuckDuckGo等流行的搜索引擎,还可以访问一些以安全为导向的搜索网站,如 ThreatMiner(一个威胁情报网站)和 DNSDumpster(用于搜索DNS数据的工具)。

以前,theHarvester 可以用来定位关于个人的信息,因为它可以搜索 Pretty Good Privacy(PGP)密钥,这些密钥用于加密电子邮件和其他数据。此外,theHarvester 还可以搜索 LinkedIn。虽然它在找到与某个域名相关的电子邮件地址方面用处不大,但它在识别与域名相关的IP地址和完全合格域名(FQDN)方面非常有效。这个工具可能仍然能够找到电子邮件地址,因为输出结果表明它会寻找这些地址,但在搜索 O'Reilly 域名时并没有返回任何电子邮件地址。

示例 3-1 中,我们使用 theHarvester 和数据源 sitedossier 来查找 oreilly.com 的 FQDN。不同的数据源会返回不同的结果,有些开放源情报(OSINT)来源可能会提供与 oreilly.com 相关的 FQDN 长列表。这个搜索返回了 200 个结果,但如果你自己运行它,可能会得到不同的结果,因为公共系统及其关联的IP地址不是静态的。这里的输出已进行了编辑,以便你能看到不同输出部分的样子。

示例 3-1. theHarvester sitedossier 结果

┌──(kilroy@badmilo)-[~]
└─$ theHarvester -b sitedossier -d oreilly.com
Read proxies.yaml from /home/kilroy/.theHarvester/proxies.yaml
*******************************************************************
*  _   _                                                _         *
* | |_| |__   ___    /\  /__ _ _ ____   _____  ___| |_ ___ _ __  *
* | __|  _ \ / _ \  / /_/ / _` | '__\ \ / / _ / __| __/ _ \ '__| *
* | |_| | | | __/ / __  / (_| | |   \ V /  __/__ \ ||  __/ |    *
*  __|_| |_|___| / /_/ __,_|_|    _/ ___||___/_____|_|    *
*                                                            *
* theHarvester 4.6.0                                         *
* Coded by Christian Martorella                               *
* Edge-Security Research                                     *
* cmartorella@edge-security.com                               *
*******************************************************************
 
[*] Target: oreilly.com
 
My current iter_url: http://www.sitedossier.com/parentdomain/oreilly.com/101
My current iter_url: http://www.sitedossier.com/parentdomain/oreilly.com/201
In total found: 200
{'security.oreilly.com', 'ofps3.vz.oreilly.com', 'chimera.labs.oreilly.com', ↩
'corporate.oreilly.com', 's.radar.oreilly.com', 'apache.oreilly.com', ↩
'access.safari.oreilly.com', 'opengovernment.labs.oreilly.com', ↩
'register.oreilly.com', 'ajax.oreilly.com', 'portal.oreilly.com', ↩
'beautifulcode.wiki.oreilly.com', 'libraries.oreilly.com', ↩
'ormstore-staging.oreilly.com', 'programming-scala.labs.oreilly.com', ↩
'm.bookworm.oreilly.com', 'news.oreilly.com', 'hacks.oreilly.com.', ↩
'macruby.labs.oreilly.com', 'nutshells.oreilly.com', 'etel.wiki.oreilly.com', ↩
'mediaservice.oreilly.com', 'stats.oreilly.com', 'cachefly.oreilly.com', ↩
'scifoo13.wiki.oreilly.com', 'agiledev.97things.oreilly.com', ↩
'conference.oreilly.com', 'community.toc.oreilly.com', ↩
'dev-blogs.oreilly.com', 'ignite.oreilly.com', 'bio.oreilly.com', ↩
'rails-nutshell.labs.oreilly.com',
<snip>
[*] Searching Sitedossier.
                                                    
[*] No IPs found.                                             
                                                    
[*] No emails found.                                          
                                                    
[*] Hosts found: 199
--------------------- 
97things.oreilly.com                                            
academic.oreilly.com                                          
access.safari.oreilly.com                                     
actionscript.oreilly.com                                      
admin.members.oreilly.com                                      
agiledev.97things.oreilly.com                                
ajax.oreilly.com                                             
akamaicovers.oreilly.com                                      
amazon.oreilly.com                                            
androidcookbook.oreilly.com                                  
animals.oreilly.com                                           
annoyances.oreilly.com                                        
answers.oreilly.com                                           
answers.oreilly.com.                                          
answersstage.oreilly.com                                      
apache.oreilly.com                                            
apprenticeship-patterns.labs.oreilly.com                     
apprenticeship.oreilly.com                                    
architect.97things.oreilly.com                               
assets.en.oreilly.com                                        
assets.oreilly.com                                            
atom.oreilly.com                                              
beautifulcode.wiki.oreilly.com                              
bio.oreilly.com                                               
blogs.oreilly.com

示例 3-2 展示了使用 DuckDuckGo 搜索引擎的结果,与 sitedossier 返回的结果相比,DuckDuckGo 提供的列表数量较少。尽管更侧重于侦察和情报收集的网站可以返回数十个结果,但 DuckDuckGo 声称找到了九个主机,然而只列出了其中的五个。

示例 3-2. theHarvester DuckDuckGo 结果

┌──(kilroy@badmilo)-[~]
└─$ theHarvester -d oreilly.com -b duckduckgo
*******************************************************************
*  _   _                                            _             *
* | |_| |__   ___    /\  /__ _ _ ____   _____  ___| |_ ___ _ __  *
* | __|  _ \ / _ \  / /_/ / _` | '__\ \ / / _ / __| __/ _ \ '__| *
* | |_| | | |  __/ / __  / (_| | |   \ V /  __/__ \ ||  __/ |    *
*  __|_| |_|___| / /_/ __,_|_|    _/ ___||___/_____|_|    *
*                                                                 *
* theHarvester 4.3.0                                              *
* Coded by Christian Martorella                                   *
* Edge-Security Research                                          *
* cmartorella@edge-security.com                                   *
*                                                                 *
*******************************************************************

[*] Target: oreilly.com

[*] Searching Duckduckgo.

[*] No IPs found.
[*] No emails found.
[*] Hosts found: 9
 ---------------------
conferences.oreilly.com
learning.oreilly.com
oreilly.com
radar.oreilly.com
toc.oreilly.com

分析:

  • theHarvester 在使用 DuckDuckGo 作为数据源时找到了 9 个主机,但只列出了其中的 5 个。
  • 没有找到任何 IP 地址和电子邮件地址。

搜索多个来源的意义

由于 theHarvester 的不同数据源使用了不同的技术来收集信息,因此通过多方搜索非常有用。在 示例 3-3 中,展示了一个简单的 Python 脚本,该脚本会在命令行提供的域名下,遍历几个不同的数据源进行搜索。这个脚本可以大大增强,如果它是为多个不熟悉其工作原理的用户设计的。对于个人使用而言,这个脚本已经足够有效。最终,你将获得多个文件,包括每个数据源返回结果的 XML 和 HTML 文件。

示例 3-3. 使用 theHarvester 进行搜索的脚本

#!/usr/bin/python

import sys
import os

if len(sys.argv) < 2:
   sys.exit(-1)

providers = [ 'duckduckgo', 'bing', 'baidu', 'dnsdumpster', 'hunter', 'sitedossier' ]

for a in providers:
    cmd = 'theHarvester -d {0} -b {1} -f {2}.html'.format(sys.argv[1], a,  a)
    os.system(cmd)

脚本分析:

  • 这个 Python 脚本接受一个命令行参数作为域名,并使用多个数据源(如 DuckDuckGo、Bing、Baidu 等)搜索该域名的信息。
  • 脚本中的 for 循环会遍历不同的数据源并调用 theHarvester,每次都会生成一个以数据源名称命名的 HTML 文件。
  • 你可以通过修改 providers 列表来添加或删除数据源。如果不想使用 google-profiles,可以将其去掉;如果想使用 Yahoo,可以将其添加进去。

LinkedIn 作为信息来源

LinkedIn 是一个很好的信息来源。你可以使用一个叫做 Crosslinked 的工具来搜索 LinkedIn,虽然这个工具并不包含在 Kali Linux 的软件包中。但由于我们只关注 Kali 提供的工具,我们不再讨论 Crosslinked。

另一个可用的工具是 EmailHarvester,这是 Kali Linux 包存储库中可用的工具。示例 3-4 展示了如何使用 EmailHarvester 在 LinkedIn 上搜索电子邮件地址。你会看到输出中有一个结果计数,虽然最后我们只找到了两个电子邮件地址。这很可能是由于程序化搜索的结果限制。数据源返回的结果数量是有限的,这解释了为什么只能找到这么少的电子邮件地址。

示例 3-4. 使用 EmailHarvester 搜索 LinkedIn

──(kilroy@badmilo)-[~]
└─$ emailharvester -d oreilly.com -e linkedin
[+] User-Agent in use: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1
[+] Searching in Linkedin
[+] Searching in Yahoo + Linkedin: 101 results
[+] Searching in Bing + Linkedin: 50 results
[+] Searching in Bing + Linkedin: 100 results
[+] Searching in Google + Linkedin: 100 results
[+] Searching in Baidu + Linkedin: 10 results
[+] Searching in Baidu + Linkedin: 20 results
[+] Searching in Baidu + Linkedin: 30 results
[+] Searching in Baidu + Linkedin: 40 results
[+] Searching in Baidu + Linkedin: 50 results
[+] Searching in Baidu + Linkedin: 60 results
[+] Searching in Baidu + Linkedin: 70 results
[+] Searching in Baidu + Linkedin: 80 results
[+] Searching in Baidu + Linkedin: 90 results
[+] Searching in Baidu + Linkedin: 100 results
[+] Searching in Exalead + Linkedin: 50 results
[+] Searching in Exalead + Linkedin: 100 results
[+] Emails found: 2
2522@oreilly.com
22@oreilly.com

分析:

  • 使用 EmailHarvester 搜索 LinkedIn 时,搜索了多个数据源(如 Yahoo、Bing、Google、Baidu 和 Exalead)以寻找与 oreilly.com 相关的电子邮件地址。
  • 最终找到了 2 个电子邮件地址:2522@oreilly.com22@oreilly.com

示例 3-5. 使用 EmailHarvester 进行全源搜索

┌──(kilroy@badmilo)-[~]
└─$ emailharvester -d oreilly.com
[+] User-Agent in use: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1
[+] Searching everywhere
[+] Searching in Instagram
[+] Searching in Yahoo + Instagram: 101 results
[+] Searching in Bing + Instagram: 50 results
[+] Searching in Bing + Instagram: 100 results
[+] Searching in Google + Instagram: 100 results
[+] Searching in Baidu + Instagram: 10 results
[+] Searching in Baidu + Instagram: 20 results
[+] Searching in Baidu + Instagram: 30 results
[+] Searching in Baidu + Instagram: 40 results
[+] Searching in Baidu + Instagram: 50 results
[+] Searching in Baidu + Instagram: 60 results
[+] Searching in Baidu + Instagram: 70 results
[+] Searching in Baidu + Instagram: 80 results
[+] Searching in Baidu + Instagram: 90 results
[+] Searching in Baidu + Instagram: 100 results
[+] Searching in Exalead + Instagram: 50 results
[+] Searching in Exalead + Instagram: 100 results
[+] Searching in Yahoo: 101 results
[+] Searching in ASK: 10 results
[+] Searching in ASK: 20 results
[+] Searching in ASK: 30 results
[+] Searching in ASK: 40 results
[+] Searching in ASK: 50 results
[+] Searching in ASK: 60 results
[+] Searching in ASK: 70 results
[+] Searching in ASK: 80 results
[+] Searching in ASK: 90 results
[+] Searching in ASK: 100 results
[+] Searching in Baidu: 10 results
[+] Searching in Baidu: 20 results
[+] Searching in Baidu: 30 results
[+] Searching in Baidu: 40 results
[+] Searching in Baidu: 50 results
[+] Searching in Baidu: 60 results
[+] Searching in Baidu: 70 results
[+] Searching in Baidu: 80 results
[+] Searching in Baidu: 90 results
[+] Searching in Baidu: 100 results
[+] Searching in Twitter
[+] Searching in Baidu + Reddit: 30 results
[+] Searching in Baidu + Reddit: 40 results
[+] Searching in Baidu + Reddit: 50 results
[+] Searching in Baidu + Reddit: 60 results
[+] Searching in Baidu + Reddit: 70 results
[+] Searching in Baidu + Reddit: 80 results
[+] Searching in Baidu + Reddit: 90 results
[+] Searching in Baidu + Reddit: 100 results
[+] Searching in Exalead + Reddit: 50 results
[+] Searching in Exalead + Reddit: 100 results
[+] Emails found: 20
mercedes@oreilly.com
22@oreilly.com
rmendana@oreilly.com
pixel-1687721587520467-web-@oreilly.com
adoption@oreilly.com
santiagocancino@oreilly.com
workwithus@oreilly.com
booktech@oreilly.com
orders@oreilly.com
permissions@oreilly.com
andrewc@oreilly.com
Info@oreilly.com
odewahn@oreilly.com
support@oreilly.com
2522@oreilly.com
pixel-1687721585523016-web-@oreilly.com
corporate@oreilly.com
2B@oreilly.com
bookquestions@oreilly.com
acmsales@oreilly.com

分析:

  • 使用 EmailHarvester 搜索所有可用的数据源时,最终找到 20 个电子邮件地址,其中大部分看起来并非与个人相关。
  • 尽管获取了大量的搜索结果,但这些电子邮件地址对于进行安全测试的实用性可能较低。
  • 这意味着,虽然 Kali Linux 提供了很多有用的工具,但在某些情况下,可能需要回归传统的通过 LinkedIn 网站界面手动搜索电子邮件的方式。

Recon-ng

尽管 Recon-ng 也是用于自动化数据收集的工具,但它的深度足以单独成章。Recon-ng 是一个框架,使用模块来运行。它是作为一种通过搜索多个来源对目标和公司进行侦查的方式开发的。某些来源可能需要你获得程序化的访问权限,这对于 X(Twitter)、Instagram、Google、Bing 等网站来说都是如此。获得访问权限的方式通常是通过获取 API 密钥。一旦你获得了密钥,就可以使用需要 API 访问权限的模块,否则程序会被阻止查询这些网站。这种方式确保这些网站能够知道是谁在尝试查询。当你获得 API 密钥时,通常需要登录网站并提供一些确认信息来证明你的身份。例如,从 X(Twitter)获取 API 密钥时,你需要将手机号码与你的账户绑定,并且该手机号码会经过验证。

大多数用来进行侦查的模块都需要 API 密钥。如果我们再次关注 LinkedIn,Recon-ng 使用 Bing 的 API 密钥来查找 LinkedIn 上的信息。不幸的是,要获取 Bing 的 API 密钥,你需要从 Microsoft 获取一个 Azure 资源。这要求你拥有一个 Azure 账户,并且在执行搜索时会为你使用的计算资源收费。考虑到有其他免费的方法可以获取信息,这可能不是你愿意尝试的方式。示例 3-6 展示了如何安装 Recon-ng 中的模块。

示例 3-6. 安装 Recon-ng 模块

[*] No modules enabled/installed.

[recon-ng][default] > marketplace search linkedin
[*] Searching module index for 'linkedin'...

  +----------------------------------------------------------------------------+
  |   Path                      | Version |     Status    |  Updated   | D | K |
  +----------------------------------------------------------------------------+
  | recon/companies-contacts/ ↩
    bing_linkedin_cache         | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/profiles-contacts/ ↩
    bing_linkedin_contacts      | 1.2     | not installed | 2021-08-24 |   | * |
  +----------------------------------------------------------------------------+

  D = Has dependencies. See info for details.
  K = Requires keys. See info for details.

[recon-ng][default] > marketplace install recon/profiles-contacts/bing_linkedin_contacts
[*] Module installed: recon/profiles-contacts/bing_linkedin_contacts
[*] Reloading modules...
[!] 'bing_api' key not set. bing_linkedin_contacts module will likely fail at runtime. See 'keys add'.

分析:

  • 在没有启用模块的情况下,我们首先通过 marketplace search 命令搜索包含 linkedin 的模块。
  • 找到并安装了 bing_linkedin_contacts 模块。
  • 安装后,提醒没有设置 bing_api 密钥,模块可能在运行时失败,建议通过 keys add 设置密钥。

Recon-ng 使用上下文

Recon-ng 使用上下文来确定可用命令及其含义。你必须先加载一个模块,才能使用它。此外,还需要设置 API 密钥。在 recon/domains-contacts/hunter_io 模块中,我们需要安装模块并设置 API 密钥。示例 3-7 展示了使用该模块搜索域名联系人所需的步骤。

示例 3-7. 使用 Recon-ng 搜索域名联系人

[recon-ng][default] > marketplace install recon/domains-contacts/hunter_io
[*] Module installed: recon/domains-contacts/hunter_io
[*] Reloading modules...
[recon-ng][default] > keys add hunter_io 4ee56b9bffee59a64fa003b7c36f05290ab5ad6c
[*] Key 'hunter_io' added.
[recon-ng][default] > modules load recon/domains-contacts/hunter_io
[recon-ng][default][hunter_io] > info

      Name: Hunter.io Email Address Harvester
    Author: Super Choque (@aplneto)
   Version: 1.3
      Keys: hunter_io

Description:
  Uses Hunter.io to find email addresses for given domains.

Options:
  Name    Current Value  Required  Description
  ------  -------------  --------  -----------
  COUNT   10             yes       Limit the amount of results returned.
                                   (10 = Free Account)
  SOURCE  default        yes       source of input (see 'info' for details)

Source Options:
  default        SELECT DISTINCT domain FROM domains WHERE domain IS NOT NULL
  <string>       string representing a single input
  <path>         path to a file containing a list of inputs
  query <sql>    database query returning one column of inputs

[recon-ng][default][hunter_io] > options set SOURCE oreilly.com
SOURCE => oreilly.com
[recon-ng][default][hunter_io] > run

分析:

  • 我们首先安装了 hunter_io 模块,然后通过 keys add 添加了 hunter_io 的 API 密钥。
  • 之后,我们加载了该模块并通过 options set SOURCE oreilly.com 设置了搜索源(即域名)。
  • 运行 run 命令后,Recon-ng 会根据给定的域名查询 Hunter.io 提供的电子邮件地址。

数据库和报告

当你运行模块时,Recon-ng 会将结果存储到一个数据库中。例如,在运行 PGP 模块时,可能会获取到姓名和电子邮件地址,这些信息会被添加到 Recon-ng 的联系人数据库中。你可以使用 show 命令查看所有获得的结果。此外,还可以使用报告模块,将数据库中的内容导出到文件中。示例 3-8 展示了使用 JSON 报告模块导出结果的过程。

示例 3-8. 使用 JSON 报告模块导出数据

[recon-ng][default] > report json
[+] Select tables to export...
[+] Choose output file location...
[+] Exporting data...

分析:

  • 通过选择 JSON 格式的报告模块,你可以将数据库中的数据导出到 XML、HTML、CSV、JSON 或其他格式的文件中。
  • 运行模块后,数据会被导出到指定的位置,方便进一步的分析或记录保存。

总结:

  • Recon-ng 是一个功能强大的框架,通过使用 API 密钥和模块,可以自动化地从多个来源收集信息。
  • 每个模块都需要相关的 API 密钥,确保能够访问所需的数据源。
  • 通过安装模块、设置参数并运行,你可以将查询结果存储到数据库中,并使用报告模块将其导出为多种格式,便于后续处理。

示例 3-8. Recon-ng 报告模块

[recon-ng][default] > modules load reporting/json
[recon-ng][default][json] > info

      Name: JSON Report Generator
    Author: Paul (@PaulWebSec)
   Version: 1.0

Description:
  Creates a JSON report.

Options:
  Name      Current Value                   Required  Description
  --------  -------------                   --------  -----------
  FILENAME  /home/kilroy/.recon-ng/         yes       path and filename
            workspaces/                               for report output
            default/results.json
  TABLES    hosts, contacts, credentials    yes       comma delineated
                                                      list of tables

[recon-ng][default][json] > run
[*] 223 records added to '/home/kilroy/.recon-ng/workspaces/default/results.json'.
[recon-ng][default][json] >

分析:

  • 我们加载了 reporting/json 模块,并查看了模块的详细信息。

  • JSON Report Generator 模块的功能是创建 JSON 格式的报告。

  • 需要设置两个选项:

    • FILENAME:指定报告的输出路径和文件名。在本例中是 /home/kilroy/.recon-ng/workspaces/default/results.json
    • TABLES:指定要导出的数据库表。可以通过逗号分隔的表名列表来设置(例如,hosts, contacts, credentials)。
  • 运行该模块后,223 条记录被添加到指定的 JSON 文件中,文件路径为 /home/kilroy/.recon-ng/workspaces/default/results.json

Recon-ng 的工作区功能

Recon-ng 支持工作区(workspaces),这意味着你可以将数据进行隔离。你可以直接在数据库中操作数据。例如,如果你在联系人部分有 27 条记录,你可以运行 db delete contacts 1-27 来删除第 1 到第 27 行的数据。执行查询之前,你需要查看所有行并确定行号。查询操作非常简单,例如使用 show contacts 来查看联系人表。

通过使用 Recon-ng,你拥有很多功能,这些功能将随着时间的推移不断变化。随着更多资源的开放以及开发者发现新的数据挖掘方法,你可以期待会有新的模块推出。

Maltego

因为我有很多年的经验,经历了图形用户界面(GUI)尚未普及的时代,所以我一直是命令行用户。当然,Kali中有很多可以使用的命令行工具。不过,也有一些人偏好GUI。到目前为止,我们已经看过了许多能够从公开来源获取大量数据的工具。不过,使用这些工具时,我们没有得到一个直观的方式来了解各个信息之间是如何相互关联的。我们也没有一个简便的方式可以从我们获取到的一个数据点开始,再向其他数据进行扩展。我们可以将theHarvester或Recon-ng获取的联系人列表的输出,输入到另一个模块或工具中,但有时直接选择一个信息点并对其运行其他模块,可能会更加容易。

这就是 Maltego 的用武之地。这个基于GUI的程序,能够执行我们之前所做的一些任务。与其他工具的不同之处在于,Maltego将这些信息以图形化的方式呈现,使得各个实体之间的关系变得一目了然。一旦我们选择了某些实体,我们就可以从中获取更多的详细信息。通过这些信息,我们可以进一步获取更多的细节,进而形成信息的“连锁反应”。

在深入了解Maltego之前,我们需要先了解一些术语,以便你知道自己正在查看的是什么内容。Maltego使用 transform 来执行任务。Transform是用Maltego脚本语言(MSL)编写的代码,通过数据源将一个实体转换成另一个实体。举个例子,假设你有一个主机名实体。你可以应用一个transform,生成一个新的实体,包含与主机名实体关联的IP地址。如前所述,Maltego将信息以图形方式呈现。每个实体都是图中的一个节点。

我们将使用Maltego的社区版,因为它已经包含在Kali中,尽管Paterva也提供商业版。社区版限制了我们可以安装到Maltego中的transform数量。商业版提供了更多来自不同来源的transform。然而,社区版仍然可以安装多个transform。在 图3-2 中,你可以看到transform包的列表

image.png

Maltego的核心是已安装的transform。然而,你并不需要通过一个接一个地应用transform来完成所有工作。这是通过机器完成的,机器可以从一个起始点开始应用一系列的transform。例如,我们可以获取一个公司的足迹。为我们执行工作的机器包括进行DNS查询并查找系统之间连接的transform。Footprint L3机器执行的transform会根据提供的域名获取邮件交换器和名称服务器记录。从那里,它会根据主机名获取IP地址,并进一步扩展,寻找相关的主机名和IP地址。

要启动一个机器,你只需要点击“Run Machine”按钮,选择你想要运行的机器,然后提供机器所需的信息。在图3-3中,你可以看到启动机器的对话框,图上方是带有“Run Machine”按钮的Machines标签页。

image.png

在这个过程中,机器会要求指导如何选择包括哪些实体,以及排除哪些实体;当机器完成时,你将得到一个图形。这不是你可能习惯的那种图形。它是一个有向图,展示了实体之间的关系。在我们运行的机器所生成的图形的中心,我们可以看到我们开始时使用的域名。从那里辐射出去的是各种实体。每个实体的图标表示它的类型。例如,像网络接口卡的图标表示IP地址实体。其他实体可能看起来像系统堆栈,属于DNS和MX记录,这取决于它们的颜色。在图3-4中,你可以看到一个Maltego图的示例。

image.png

通过右键点击每个实体,你可以获得一个上下文菜单。你将能够查看可以应用于该实体的变换(transforms)。例如,如果你有一个主机名但没有相应的IP地址,你可以使用变换来查找该IP地址。你还可以,如图3-5所示,从与该实体相关的区域互联网注册局获取信息。这将是由ThreatMiner提供的whois变换。

每次你应用一个变换时,图形会变得更大。你拥有的变换越多,你可以获取的数据也越多。如果你从一个单一实体开始,不久之后你就能获得大量信息。这些信息将以有向图的形式呈现,你可以看到实体之间的关系,并且可以轻松点击任何实体来获取更多的细节,包括关联的实体,既有入站的,也有出站的。这使得你能够清晰地看到实体之间是如何相互关联的,以及数据来源于哪里。

如果你是那种喜欢通过可视化关系来获取全貌的人,可能会喜欢使用Maltego。当然,你也可以通过其他方式获取Maltego提供的相同信息,只不过那样做会更加繁琐,肯定需要更多的敲打键盘。

image.png

DNS侦察与whois查询

互联网的世界实际上围绕着DNS运转。这也是为什么DNS漏洞会被如此重视的原因。如果没有DNS,我们每个人都得把庞大的主机表记在脑海里,因为我们需要记住所有使用的IP地址,包括那些不断变化的地址。毕竟,这正是DNS最初诞生的原因。在DNS之前,一个单一的hosts文件存储了IP地址与主机名之间的映射。每当网络上新增一个主机时——而且请记住,那时网络上的主机通常是大型的多用户系统——hosts文件就必须更新,然后发给每个人。这是不可持续的。因此,DNS应运而生,分担了存储所有主机与IP地址映射的任务,并进行分发。

DNS最终与IP地址息息相关。这些IP地址是分配给公司或组织的。因此,我们需要谈论区域互联网注册局(RIR)。当你试图了解目标的范围时,使用DNS侦察与whois工具查询RIR是密切相关的。虽然它们在一起使用非常有帮助,但在侦察的目的下,我们首先来看DNS侦察,因为我们将利用一些输出结果来喂入RIR的查询。

DNS侦察

DNS是一个分层系统。当你进行DNS查询时,你会发送请求给一个离你较近的服务器。这个服务器通常是缓存服务器,之所以称之为缓存服务器,是因为它会缓存收到的响应。这样对于后续的相同信息请求,响应会更快。当你查询的DNS服务器接收到请求后,如果你查询的主机名不在缓存中,它将开始寻找信息来源。它可能会一路向上查找,直到到达根服务器,而本地DNS服务器应该有这些服务器的IP地址。根服务器提供顶级域名服务器的地址,这些服务器存储了与顶级域名相关的详细信息,例如 .net.com.org,以及数百个其他顶级域名。

当你阅读FQDN(完全限定域名)时,它是包含域名的名称(例如,www.oreilly.com,其中包含主机名www和域名oreilly.com)。你从尾部开始查看。FQDN的最右侧部分是顶级域名(TLD)。与TLD相关的信息存储在根服务器中。如果我们的DNS服务器要查找www.oreilly.com,它会从.com TLD的根服务器开始查找。它需要做的是找到oreilly.com的服务器。这个逐步询问一个服务器后另一个服务器的过程称为迭代查询,只要发起查询的服务器是直接联系每一个后续服务器的。这与递归查询不同,后者是中间服务器代表发起系统进行一些查询。

注意事项

FQDN有时可能难以理解,因为“域名”这一概念对一些人来说较难把握。域名有时作为单一服务器或系统的标识符,意味着它与一个IP地址映射。举个例子,像oreilly.com这样的域名有时会映射到与Web服务器(如www.oreilly.com)相同的IP地址,但这并不意味着它们总是一样的。域名是oreilly.com,它有时可以带有一个像主机一样的IP地址。像wwwmail这样的名称是主机名,如果本地DNS配置知道要查看你所属的域名,它们也可以单独使用。为了准确指出主机名属于哪个域,我们使用FQDN,它包括了系统的名称以及该主机所属的域。

一旦DNS服务器获得了.com的TLD(顶级域名)服务器,它会向该服务器查询与oreilly.com相关的信息。获得该域名的名称服务器后,它会向名称服务器发出另一个查询,询问有关www.oreilly.com的信息。它所查询的服务器是我们正在寻找的域的权威名称服务器。当你向自己的服务器请求信息时,你得到的是一个非权威的答案。尽管它最初来自于一个权威服务器,但由于它已经通过本地服务器传递,所以不再被视为权威的答案。每个域都有配置了权威服务器。例如,oreilly.com域配置了六个权威服务器。如果你向其他任何服务器查询oreilly.com域的信息,得到的将是一个非权威答案。

获取IP地址的一种方法是使用host工具。它快捷且简单。除了你请求的信息之外,它不会提供很多其他信息。其他工具则能让你对查询的服务器拥有更多的控制。示例3-9展示了使用host工具查询FQDN www.oreilly.com的实例。

示例3-9. 使用host工具
┌──(kilroy@badmilo)-[~]
└─$ host www.oreilly.com
www.oreilly.com is an alias for www.oreilly.com.edgekey.net.
www.oreilly.com.edgekey.net is an alias for e4619.g.akamaiedge.net.
e4619.g.akamaiedge.net has address 104.104.104.60

尽管如此,我们还可以使用其他工具从DNS服务器获取更多信息。这些工具为侦察提供了更多的控制能力。

使用nslookup和dig

我们可以使用nslookup工具查询DNS服务器。如果你没有指定其他服务器,它会向你配置的DNS服务器发出查询请求。在示例3-10中,我们展示了使用nslookup查询本地DNS服务器的情况。在响应中,我们得到了一个非权威的答案,你可以看到查询使用的名称服务器。

示例3-10. 使用nslookup工具
┌──(kilroy2badmilo)-[~]
└─$ nslookup www.oreilly.com
Server:         192.168.1.1
Address:        192.168.1.1#53

Non-authoritative answer:
www.oreilly.com canonical name = www.oreilly.com.edgekey.net.
www.oreilly.com.edgekey.net     canonical name = e4619.g.akamaiedge.net.
Name:   e4619.g.akamaiedge.net
Address: 104.104.104.60

在这个查询中,本地服务器提供了答案,但它告诉我们这是一个非权威答案。我们得到的是一系列别名,最后通过展开这些别名得到了IP地址。要获取权威响应,我们需要向该域的权威名称服务器发出请求。为此,我们可以使用另一个DNS查询工具dig,并向它请求名称服务器记录。示例3-11展示了这个过程。

示例3-11. 使用dig工具
┌──(kilroy@badmilo)-[~]
└─$ dig ns oreilly.com

; <<>> DiG 9.18.13-1-Debian <<>> ns oreilly.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58242
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 13

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;oreilly.com.                   IN      NS

;; ANSWER SECTION:
oreilly.com.            3600    IN      NS      a3-67.akam.net.
oreilly.com.            3600    IN      NS      a1-225.akam.net.
oreilly.com.            3600    IN      NS      a4-64.akam.net.
oreilly.com.            3600    IN      NS      a20-66.akam.net.
oreilly.com.            3600    IN      NS      a16-65.akam.net.
oreilly.com.            3600    IN      NS      a13-64.akam.net.

;; ADDITIONAL SECTION:
a3-67.akam.net.         5997    IN      A       96.7.49.67
a3-67.akam.net.         59586   IN      AAAA    2600:1408:1c::43
a1-225.akam.net.        89047   IN      A       193.108.91.225
a1-225.akam.net.        89488   IN      AAAA    2600:1401:2::e1
a4-64.akam.net.         9596    IN      A       72.246.46.64
a4-64.akam.net.         13503   IN      AAAA    2600:1480:9000::40
a20-66.akam.net.        7359    IN      A       95.100.175.66
a20-66.akam.net.        8658    IN      AAAA    2a02:26f0:67::42
a16-65.akam.net.        6725    IN      A       23.211.132.65
a16-65.akam.net.        59139   IN      AAAA    2600:1406:1b::41
a13-64.akam.net.        88094   IN      A       2.22.230.64
a13-64.akam.net.        55852   IN      AAAA    2600:1480:800::40

;; Query time: 56 msec
;; SERVER: 192.168.1.1#53(192.168.1.1) (UDP)
;; WHEN: Mon Jun 26 18:31:23 EDT 2023
;; MSG SIZE  rcvd: 436

通过使用dig,我们可以直接获得与oreilly.com相关的名称服务器的详细记录,包括它们的IP地址和其他相关信息。

此时,我们可以继续使用dig,但为了清楚地看到结果之间的差异,我们将回到使用nslookup。当我们再次运行nslookup时,我们指定要查询的服务器。在这种情况下,我们将使用示例3-10中列出的一个名称服务器。我们通过将名称服务器添加到之前使用的命令行末尾来实现这一点。示例3-12展示了这一过程。

示例3-12. 使用nslookup并指定DNS服务器
┌──(kilroy@badmilo)-[~]
└─$ nslookup www.oreilly.com a3-67.akam.net
Server:         a3-67.akam.net
Address:        2600:1408:1c::43#53

www.oreilly.com canonical name = www.oreilly.com.edgekey.net.
www.oreilly.com.edgekey.net     canonical name = e4619.g.akamaiedge.net.
┌──(kilroy@badmilo)-[~]
└─$ nslookup e4619.g.akamaiedge.net.
Server:         192.168.1.1
Address:        192.168.1.1#53

Non-authoritative answer:
Name:   e4619.g.akamaiedge.net
Address: 104.104.104.60

在这个查询中,原始查询返回了一个别名,因此为了得到IP地址,我们需要查询最终FQDN(e4619.g.akamaiedge.net)的IP地址。我们可以继续深入挖掘,了解g.akamaiedge.net域的权威服务器,但它可能会给出与非权威答案相同的结果。你可能会注意到,g.akamaiedge.net不仅包括akamaiedge.net域名,还包含一个子域名g。在左边第一个点之前的字符集合是主机名,之后的部分是域名,这使得gakamaiedge.net的一个子域名。

当我们获得FQDN的IP地址时,我们可能能够使用该IP地址来识别属于我们目标的其他IP地址。然而,要做到这一点,我们需要从DNS跳出一个层次。接下来,我们将通过使用whois程序来获取有关目标的更多详细信息。我们将在“使用whois”部分进行说明。

自动化DNS侦察

使用像hostnslookup这样的工具可以为我们提供很多详细信息,但逐个获取这些信息可能会非常耗时。与其手动使用这些工具逐一查询,我们可以使用其他程序一次性获取大量信息。使用这些工具的一个挑战是,它们通常依赖于执行区域传输的能力。DNS中的区域传输仅仅是下载与某个区域关联的所有记录。在名称服务器的上下文中,区域是一个相关信息的集合。以oreilly.com域名为例,它可能被配置为一个区域。在这个区域中,将包含所有属于oreilly.com的记录,如Web服务器地址、邮件服务器和其他记录。

由于启动区域传输是进行公司侦察的有效方法,因此通常不会被允许。区域传输的存在一部分是为了让备份服务器请求从主服务器进行区域传输,从而保持同步。因此,在大多数情况下,除非你的系统特别允许启动区域传输并获取数据,否则你将无法获得区域传输。

不过,别担心。尽管一些工具期望能够执行区域传输,但我们仍然可以使用其他工具来获取有关主机的详细信息。其中之一是dnsrecon,它不仅尝试进行区域传输,还会使用字典列表测试主机。要将字典列表与dnsrecon一起使用,你需要提供一个文件,里面包含一些主机名,这些主机名将会被添加到你指定的域名后面。常见的主机名包括wwwmailsmtpftp等,也有一些是特定服务的名字。然而,dnsrecon附带的字典列表中有超过1,900个名称。通过使用这个字典列表,dnsrecon有可能发现你没有想到的主机。

这一切假设你的目标在其公开可用的DNS服务器中有这些主机。DNS的一个优点是它是层次化的,但也是本质上断开的。因此,组织可以使用拆分DNS(Split DNS)。这意味着组织内部的系统可以指向对域名权威的DNS服务器。存储在内部DNS服务器中的主机及其IP地址可能与外部世界所看到的DNS服务器中的不同。这包括公司不希望外部方知道的主机。因为根服务器不知道这些名称服务器的信息,所以外部用户无法查询这些主机,除非直接访问内部名称服务器,而这通常是无法从组织外部访问的。

尽管如此,你不应该因此而放弃使用dnsrecon。仍然有很多信息可以获取。在示例3-13中,你可以看到运行dnsrecon工具对我拥有的一个使用Google Apps for Business的域进行扫描时的部分结果。在输出中,你可以看到需要用来告诉Google我是该域的注册人并且有控制DNS条目的TXT记录。你还可以看到域的名称服务器。这是部分输出,因为使用该工具会生成大量的输出。为了获得这些输出,我使用了命令dnsrecon -d cloudroy.com -D /usr/share/dnsrecon/namelist.txt

示例3-13. 使用dnsrecon收集DNS信息
┌──(kilroy@badmilo)-[~]
└─$ dnsrecon -d cloudroy.com -D /usr/share/dnsrecon/namelist.txt
[*] std: Performing General Enumeration against: cloudroy.com...
[!] Wildcard resolution is enabled on this domain
[!] It is resolving to 208.91.197.39
[!] All queries will resolve to this list of addresses!!
[*] DNSSEC is configured for cloudroy.com
[*] DNSKEYs:
[*]     NSEC3 KSk RSASHA256 03010001930e1f6af3a8c51cfa966fcf ↩
        b1694c4af2533242a0797c55edb22276 a870275ca3a5dc330e48b7a46212e3a1 ↩
        4fdf05e1f7fdee5c0b8ef75be967b3ec da1563e3b7087beee282ce007e5e52c9 ↩
        fdd41dd7a3208f798244e906a34c0409 4691d0dd59d463e0fd051e4a9156657d ↩
        201f21ebd48836302a0e08d907320702 376d462806d3792bad565ab8bf8718dc ↩
        297b64f585f797a3de682051f8fe07e2 9964c86cdcba96d0827b534c575a0c1d ↩
        b3baf3e3644058886f481e7452b7477a 17371d761126a9aa43218abfa1d754f5 ↩
        937fcecf865950e1dd316a51c503d0da 1e0a6e2f9ccb8d52740a4e19df7c308a ↩
        d96e12e03989f05a63d5803e6f20da49 e79bd583
[*]     NSEC3 ZSK RSASHA256 03010001b8b61cdba5b05ba524f92a36 ↩
        c4a46d8a925fe65f0db41c3de586956b 03d9f37a82b5c78095bd6651c22c2f0d ↩
        c44be348f04b31e33175fbc7c1dac2b3 3bf1e520d8bc40fed15faef8ce162537 ↩
        f2ea00bb587f2353a5586285cd619a9b 65545fc0db75dd8a3e5e5bba9de57cb3 ↩
        02adf14002dc005539a1139b366ae52a 1ba30a05
[*]      SOA ns-cloud-a1.googledomains.com 216.239.32.106
[*]      SOA ns-cloud-a1.googledomains.com 2001:4860:4802:32::6a
[*]      NS ns-cloud-a1.googledomains.com 216.239.32.106
[*]      NS ns-cloud-a1.googledomains.com 2001:4860:4802:32::6a
[*]      NS ns-cloud-a2.googledomains.com 216.239.34.106
[*]      NS ns-cloud-a2.googledomains.com 2001:4860:4802:34::6a
[*]      NS ns-cloud-a3.googledomains.com 216.239.36.106
[*]      NS ns-cloud-a3.googledomains.com 2001:4860:4802:36::6a
[*]      NS ns-cloud-a4.googledomains.com 216.239.38.106
[*]      NS ns-cloud-a4.googledomains.com 2001:4860:4802:38::6a
[*]      MX alt3.aspmx.l.google.com 142.250.27.27
[*]      MX alt4.aspmx.l.google.com 142.250.153.26
[*]      MX aspmx.l.google.com 172.253.122.26
[*]      MX alt1.aspmx.l.google.com 209.85.202.26
[*]      MX alt2.aspmx.l.google.com 64.233.184.27
[*]      MX alt3.aspmx.l.google.com 2a00:1450:4025:401::1a
[*]      MX alt4.aspmx.l.google.com 2a00:1450:4013:c16::1a
[*]      MX aspmx.l.google.com 2607:f8b0:4004:c08::1a
[*]      MX alt1.aspmx.l.google.com 2a00:1450:400b:c00::1b
[*]      MX alt2.aspmx.l.google.com 2a00:1450:400c:c0b::1b
[*]      A cloudroy.com 208.91.197.39
[*]      TXT cloudroy.com google-site-verification=rq3wZzkl6pdKp1nwWX_ ↩
BItql6r1qKt34QmMcqE8jqCg
[*]      TXT cloudroy.com v=spf1 include:_spf.google.com ~all
[*] Enumerating SRV Records
[+] 0 Records Found

此输出展示了dnsrecon工具如何获取有关cloudroy.com域的DNS信息,包括TXT记录、MX记录、A记录以及与域相关的名称服务器信息等。这只是部分结果,实际使用时可能会获得更多的输出。

虽然从MX记录中可以看出,TXT记录更清楚地表明该域名正在使用Google的托管服务。这并不是说仅仅通过查找TXT记录就能得出这个结论。在某些情况下,组织可能会更换托管服务商,或者不再使用需要TXT记录的服务,但并没有删除这个TXT记录。由于保留该记录在DNS区域中并不会造成任何危害,组织可能会在不再需要时仍然保留这些“废弃”记录。即使知道他们曾经使用过这些服务,也可能透露出一些信息,因此使用像dnsrecon这样的工具来提取尽可能多的DNS信息,在进行测试时可能是有用的。

示例3-13中的输出显示该域已启用邮件保护,这可能是识别一些常见邮件保护机制的最简单方法之一。其中一个常见的保护机制是发件人策略框架(Sender Policy Framework,SPF)。在第二个TXT记录中可以看到,使用了SPF版本1,并引用了spf.google.com来处理SPF。你还可以看到,该域启用了DNS安全性,包括该域的密钥。

区域互联网注册管理机构(RIR)

互联网是分层的。所有分配的数字——无论是注册端口号、IP地址块,还是自治系统(AS)号——都由互联网名称与数字地址分配机构(ICANN)负责分配。ICANN又将其中的一些分配任务交给区域互联网注册管理机构(RIR),这些机构负责不同地区的管理。以下是目前全球存在的RIR:

  • 非洲网络信息中心(AFRINIC)负责非洲。
  • 美国互联网号码注册中心(ARIN)负责北美、南极洲以及加勒比部分地区。
  • 亚太网络信息中心(APNIC)负责亚洲、澳大利亚、新西兰以及其他邻近国家。
  • 拉丁美洲和加勒比网络信息中心(LACNIC)负责中南美洲以及加勒比部分地区。
  • 欧洲IP网络协调中心(RIPE NCC)负责欧洲、俄罗斯、中东和中亚地区。

这些RIR负责管理这些区域的IP地址以及AS号。AS号是公司进行路由所需的。每个AS号分配给一个足够大的网络,以便与互联网服务提供商和其他组织共享路由信息。AS号由边界网关协议(BGP)使用,BGP是互联网中用于路由的协议。在组织内部,通常使用其他路由协议,包括开放最短路径优先(OSPF),但BGP是用于在一个AS与另一个AS之间共享路由表的协议。

使用whois

要获取来自任何RIR的信息,我们可以使用whois工具。这个命令行程序在任何Linux发行版中都可以找到。使用whois,我们可以识别网络块的所有者。示例3-14展示了一个whois查询,查找网络8.9.10.0的所有者。响应显示了该整个块的提供者。您在此示例中看到的是一个大地址块。这类大块通常属于从最初分配地址时就拥有它们的公司,或者是服务提供商。

示例3-14. 查询网络块的whois命令

┌──(kilroy@badmilo)-[~]
└─$ whois 8.9.10.0

#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/resources/registry/whois/tou/
#
# If you see inaccuracies in the results, please report at
# https://www.arin.net/resources/registry/whois/inaccuracy_reporting/
#
# Copyright 1997-2023, American Registry for Internet Numbers, Ltd.
#

NetRange:       8.0.0.0 - 8.127.255.255
CIDR:           8.0.0.0/9
NetName:        LVLT-ORG-8-8
NetHandle:      NET-8-0-0-0-1
Parent:         NET8 (NET-8-0-0-0-0)
NetType:        Direct Allocation
OriginAS:
Organization:   Level 3 Parent, LLC (LPL-141)
RegDate:        1992-12-01
Updated:        2018-04-23
Ref:            https://rdap.arin.net/registry/ip/8.0.0.0

OrgName:        Level 3 Parent, LLC
OrgId:          LPL-141
Address:        100 CenturyLink Drive
City:           Monroe
StateProv:      LA
PostalCode:     71203
Country:        US
RegDate:        2018-02-06
Updated:        2023-04-07
Comment:        USAGE OF IP SPACE MUST COMPLY WITH OUR ACCEPTABLE USE POLICY:
Comment:        https://www.lumen.com/en-us/about/legal/acceptable-use-policy.html

当较大的块被拆分时,whois查询不仅会告诉你正在查找的块的所有者,还会显示父块以及它的来源。让我们再看一个8.0.0.0–8.255.255.255范围中的子块。示例3-15展示了该块的一个子集。如您所见,这个块属于谷歌。然而,在此输出之前,您会看到与早期示例相同的块,其中Level 3 Communications拥有8.块的一半。

示例3-15. 显示子块的whois查询

NetRange:       8.8.8.0 - 8.8.8.255
CIDR:           8.8.8.0/24
NetName:        LVLT-GOGL-8-8-8
NetHandle:      NET-8-8-8-0-1
Parent:         LVLT-ORG-8-8 (NET-8-0-0-0-1)
NetType:        Reallocated
OriginAS:
Organization:   Google LLC (GOGL)
RegDate:        2014-03-14
Updated:        2014-03-14
Ref:            https://rdap.arin.net/registry/ip/8.8.8.0

OrgName:        Google LLC
OrgId:          GOGL
Address:        1600 Amphitheatre Parkway
City:           Mountain View
StateProv:      CA
PostalCode:     94043
Country:        US
RegDate:        2000-03-30
Updated:        2019-10-31
Comment:        Please note that the recommended way to file abuse complaints is 
located in the following links.
Comment:
Comment:        To report abuse and illegal activity: https://www.google.com/contact/
Comment:
Comment:        For legal requests: http://support.google.com/legal
Comment:
Comment:        Regards,
Comment:        The Google Team
Ref:            https://rdap.arin.net/registry/entity/GOGL

我们可以使用此信息来获取我们找到的IP地址(例如Web服务器或邮件服务器)所属的整个块的所有者。在某些情况下,如O'Reilly的Web服务器,块属于服务提供商,因此我们无法从该块获得其他目标。然而,当你找到一个属于特定公司的块时,你会得到多个目标IP地址。这些IP块将对后续的更积极侦察有所帮助。与此同时,您还可以使用dig或nslookup查找属于这些IP地址的主机名。

从IP查找主机名需要组织配置反向区域。要从IP地址查找主机名,必须为每个IP地址配置指向记录(PTR)。然而,值得注意的是,反向查找和正向查找之间不一定存在关系。如果www.foo.com解析为1.2.3.42,这并不意味着1.2.3.42一定会反向解析为www.foo.com。IP地址可能指向具有多种用途的系统,且这些用途可能有多个名称与之对应。

被动侦察

通常,侦察工作可能涉及对目标基础设施的探索。然而,您不一定需要主动探测目标网络。像端口扫描这样的活动(我们稍后会讨论)可能会很吵,吸引对你行为的注意。在你还没有准备好真正发起攻击时,你可能不想引起这种注意。你可以通过与暴露的系统进行正常的交互,继续以被动的方式收集信息。例如,你可以只是浏览组织的网页并收集信息。我们可以使用程序p0f来实现这一点。

p0f通过监视流量并从经过的数据包中提取潜在的有趣数据来工作。这可能包括来自头部的相关信息,尤其是源地址、目标地址和端口。在示例3-16中,你可以看到p0f提取了操作系统的细节。你还可以看到,通信的一方的HTTP服务器版本已被识别,因为它是从服务器返回的头部中提取的。这是可能的,因为通信是未加密的。p0f无法从加密的通信流中提取信息。

示例3-16. p0f的输出

.-[ 192.168.1.253/54072 -> 192.168.1.15/80 (syn) ]-
|
| client   = 192.168.1.253/54072
| os       = Linux 2.2.x-3.x
| dist     = 0
| params   = generic
| raw_sig  = 4:64+0:0:1460:mss*44,7:mss,sok,ts,nop,ws:df,id+:0
|
`----

.-[ 192.168.1.253/54072 -> 192.168.1.15/80 (syn+ack) ]-
|
| server   = 192.168.1.15/80
| os       = ???
| dist     = 0
| params   = none
| raw_sig  = 4:64+0:0:1460:mss*45,7:mss,sok,ts,nop,ws:df:0
|
`----

.-[ 192.168.1.253/54072 -> 192.168.1.15/80 (mtu) ]-
|
| server   = 192.168.1.15/80
| link     = Ethernet or modem
| raw_mtu  = 1500
|
`----

.-[ 192.168.1.253/54072 -> 192.168.1.15/80 (uptime) ]-
|
| client   = 192.168.1.253/54072
| uptime   = 31 days 10 hrs 49 min (modulo 49 days)
| raw_freq = 1001.18 Hz
|
`----

.-[ 192.168.1.253/54072 -> 192.168.1.15/80 (uptime) ]-
|
| server   = 192.168.1.15/80
| uptime   = 14 days 3 hrs 45 min (modulo 49 days)
| raw_freq = 1000.11 Hz
|
`----

.-[ 192.168.1.253/54072 -> 192.168.1.15/80 (http request) ]-
|
| client   = 192.168.1.253/54072
| app      = ???
| lang     = none
| params   = anonymous
| raw_sig  = 1:Host:User-Agent,Connection,Accept,Accept-Encoding,Accept-Language, ↩
Accept-Charset,Keep-Alive:
|
`----

.-[ 192.168.1.253/54072 -> 192.168.1.15/80 (http response) ]-
|
| server   = 192.168.1.15/80
| app      = Apache 2.x
| lang     = none
| params   = none
| raw_sig  = 1:Date,Server,?Set-Cookie,?Set-Cookie,?Expires,?Cache-Control,↩
?Pragma,?Location,?Content-Length,Content-Type:Connection,Keep-Alive, ↩
Accept-Ranges:Apache/2.4.55 (Ubuntu)
|
`----

使用p0f的一大挑战是,它依赖于观察经过系统的流量。你需要与目标系统进行交互,才能执行被动侦察。由于你与公开可用的服务交互,你不太可能被注意到,而且远程系统也不会知道你正在使用p0f进行侦察。你没有与远程服务进行积极的互动来获取更多细节。你只会获得服务愿意提供的内容。

你最可能获得信息的一方是本地端。这是因为它可以从MAC地址中查找信息,提供供应商的详细信息,从而让你看到正在通信的设备类型。像其他数据包捕获程序一样,有一些方法可以使流量到达你的系统,而不需要直接定向到你的系统,这可以通过集线器、交换机的端口镜像甚至伪造来实现。MAC地址来自第2层头部,当数据包跨越第3层边界(路由器)时,头部会被去除。当数据包通过下一个网络接口发送时,会重新添加一个新的头部。

尽管使用像p0f这样的工具进行的被动侦察只能获取服务和系统愿意提供的有限信息,但使用p0f可以减少手动提取这些详细信息的工作量。使用p0f的最大优势是,你可以快速提取细节而不需要自己做这些工作,同时你也没有主动探测目标系统。这有助于你避免被目标监控系统或团队发现。

端口扫描

一旦你完成了尽可能多的被动信息收集,而没有主动且高调地探测目标网络,你可以进入“制造噪音”的阶段,开始进行端口扫描。这通常通过端口扫描器来完成,尽管扫描不一定需要产生大量流量和噪音。端口扫描利用网络协议从远程系统中提取信息,以确定哪些端口是开放的。我们使用端口扫描来确定远程系统上运行的应用程序。开放的端口可以告诉我们很多关于这些应用程序的信息。最终,我们要找的是进入系统的方式。开放的端口就是我们的入口。

一个开放的端口意味着有应用程序在该端口上监听。如果没有应用程序在监听,那么该端口将不会开放。端口是我们在传输层进行寻址的方式,这意味着你会常看到应用程序使用TCP或UDP来满足它们的传输需求,这取决于应用程序的要求。两个传输协议的共同点是可用端口的数量。总共有65,536个可能的端口值(0到65,535)。

在扫描端口时,你不会看到任何客户端端口被使用。例如,你不能扫描我的桌面计算机并确定我与网站、电子邮件服务器以及其他服务的连接。你只能探测到那些有监听程序的端口。当你打开与另一个系统的连接时,你的端口不会处于监听状态。相反,你的操作系统会从你正在通信的服务器接收一个传入的数据包,并基于四元组的信息(源和目标IP地址以及端口)来确定哪个应用程序在等待该数据包。

由于两种传输协议之间存在差异,端口扫描的工作方式也不同。最终,你的目标是找出开放的端口,但获得这些信息的方式不同。Kali Linux附带了端口扫描工具。端口扫描的事实标准是nmap,因此我们将在解释扫描类型后使用它,并且还会介绍其他高效的扫描工具,用于快速扫描非常大的网络。

TCP 扫描

TCP 是一种面向连接的协议。由于它是面向连接的,这意味着对话的双方会跟踪通信的过程,因此可以认为通信是有保障的。不过,这种保障仅限于两个端点的控制下。如果在这两个系统之间的网络中发生了某些问题,通信并不能保证能够成功传输,但你可以确保知道何时传输失败。此外,如果一个端点没有收到传输,发送方也会知道。

因为 TCP 是面向连接的,它通过三次握手来建立连接。TCP 端口扫描通常利用这一三次握手来判断端口是否开放。如果向服务器发送一个 SYN 消息(即三次握手的开始),且端口开放,服务器将响应一个 SYN/ACK 消息。如果端口未开放,服务器则会响应一个 RST(重置)消息,表明发送方应停止发送更多消息。这清楚地告诉发送方,端口不可用。

进行端口扫描的挑战之一,尤其是 TCP 扫描,便是防火墙或其他端口阻断机制。当发送消息时,防火墙或访问控制列表(ACL)可能会阻止消息传输,从而使发送主机处于不确定的状态。没有响应并不能表明端口是开放的或关闭的,因为如果防火墙或 ACL 直接丢弃了传入的消息,可能根本就没有响应。

另外,TCP 端口扫描的一个特点是,协议规定了除了 SYN 和 ACK 标志之外,还可以使用其他头标志。这为向远程系统发送其他类型的消息提供了机会,以查看它们的响应。系统将根据配置的标志以不同方式作出响应。

UDP 扫描

UDP 是一种简单的协议。它没有连接,也没有交付或通知的保障。因此,UDP 扫描可能更加具有挑战性。考虑到 UDP 是一种简单的协议,这可能看起来有些违反直觉。

对于 TCP,协议定义了交互方式。客户端预计会发送带有 SYN 标志的消息到 TCP 头部。当该消息到达一个开放端口时,服务器会回应 SYN 和 ACK 消息。客户端再响应一个 ACK 消息。这保证了通信的双方都知道对方的存在。客户端通过 SYN/ACK 知道服务器是响应的,而服务器通过 ACK 响应知道客户端没有被伪造。

UDP 没有规定的交互方式。该协议没有任何头部字段提供任何状态或连接管理信息。UDP 主要提供的是一个传输层协议,让应用程序能够在其上运行时不受干扰。当客户端发送消息到服务器时,是否响应完全取决于应用程序。由于缺少 SYN/ACK 消息来指示服务器已收到通信,客户端可能无法知道端口是否开放。没有响应可能仅仅意味着客户端发送的消息未被理解,也可能意味着应用程序发生了故障。

在执行 UDP 端口扫描时,扫描器无法确定没有响应是否意味着端口关闭。因此,扫描器通常需要重新发送消息。由于 UDP 在网络中可能被优先级降低,消息可能需要一段时间才能到达目标并返回。这意味着扫描器通常会在重新发送之前等待一段短时间。这个过程可能会进行几次,因为目标是确保彻底排除端口是否开放。

这种行为与 TCP 消息没有响应时的扫描行为类似。这可能是防火墙丢弃消息的结果。与其收到 RST 消息或 ICMP 响应,扫描器只能假设发送的消息丢失了。这意味着需要重试。重试可能会耗费时间,尤其是在扫描超过 65,000 个端口时。每个端口可能需要重试多次。扫描 UDP 端口的复杂性就在于缺乏响应所带来的不确定性。

使用 nmap 进行端口扫描

今天的事实标准端口扫描工具,也是第一个成为主流的工具是 nmap。到现在,nmap 已经存在了超过 20 年,并且出现在了许多大制作电影中,如《黑客帝国》。它已经成为一个如此重要的安全工具,以至于其他端口扫描工具也仿照 nmap 的命令行选项进行开发。虽然你可能对端口扫描工具有一些了解,nmap 提供的功能远不止是简单的端口探测。

从端口扫描开始,我们可以看看 nmap 是如何执行 TCP 扫描的。在这之前,重要的是要意识到,TCP 扫描有多种类型。即使在进行 SYN 消息扫描时,也有几种不同的实现方式。首先是一种简单的 SYN 扫描:nmap 发送一个 SYN 消息并记录端口是开放还是关闭。如果端口关闭,nmap 会收到一个 RST 消息并继续进行扫描。如果端口开放,nmap 会收到一个 SYN/ACK 消息,然后会发送一个 RST 消息,以让接收端关闭连接,而不是保持连接。这种扫描方式有时称为半开扫描。

在全连接扫描中,nmap 会完成三次握手,然后再关闭连接。这种扫描的一个优势是应用程序不会看到半开的连接。因此,它可能比半开连接更不容易引起监控系统或团队的怀疑。全连接扫描和半开扫描的结果没有差别,主要取决于哪种方式更加礼貌,并且可能不那么容易被察觉。在示例 3-17 中,你可以看到全连接扫描的部分结果。在这个示例中,我使用 nmap 扫描整个网络。/24 标识告诉 nmap 扫描 192.168.86.0 到 192.168.86.255 所有的主机。这是表示范围的一种方式。如果你需要,你也可以提供地址范围或列表。你还会看到使用了 -T 5 参数,这个参数设置了扫描的速率。值为 5 表示 nmap 应尽可能快地执行扫描。如果你将其设置为 1,请求会被非常缓慢地发送,这在避开检测时可能非常有用。

示例 3-17. 全连接 nmap 扫描

┌──(kilroy@badmilo)-[~]
└─$ sudo nmap -sT -T 5 192.168.1.0/24
Nmap 扫描报告(192.168.1.1)
主机已启动(延迟 0.0056 秒)。
未显示:987 个关闭的 TCP 端口(连接被拒绝)
端口      状态    服务
22/tcp    过滤    ssh
23/tcp    过滤    telnet
53/tcp    开放    domain
80/tcp    开放    http
111/tcp   过滤    rpcbind
139/tcp   开放    netbios-ssn
443/tcp   开放    https
445/tcp   开放    microsoft-ds
5000/tcp  开放    upnp
8200/tcp  开放    trivnet1
20005/tcp 开放    btx
49152/tcp 开放    unknown
49153/tcp 开放    unknown
MAC 地址: 80:CC:9C:DD:71:F2 (Netgear)

Nmap 扫描报告(192.168.1.15)
主机已启动(延迟 0.0053 秒)。
未显示:995 个关闭的 TCP 端口(连接被拒绝)
端口      状态    服务
22/tcp    开放    ssh
25/tcp    开放    smtp
80/tcp    开放    http
111/tcp   开放    rpcbind
443/tcp   开放    https
MAC 地址: 1C:69:7A:66:64:2A (EliteGroup Computer Systems)

Nmap 扫描报告(192.168.1.78)
主机已启动(延迟 0.016 秒)。
未显示:979 个关闭的 TCP 端口(连接被拒绝)
端口      状态    服务
6/tcp     过滤    unknown
9/tcp     过滤    discard
425/tcp   过滤    icad-el
544/tcp   过滤    kshell
1175/tcp  过滤    dossier
1556/tcp  过滤    veritas_pbx
2106/tcp  过滤    ekshell
2121/tcp  过滤    ccproxy-ftp
2144/tcp  过滤    lv-ffx
2602/tcp  过滤    ripd
2604/tcp  过滤    ospfd
2920/tcp  过滤    roboeda
3052/tcp  过滤    powerchute
3690/tcp  过滤    svn
5633/tcp  过滤    beorl
6580/tcp  过滤    parsec-master
10566/tcp 过滤    unknown
13782/tcp 过滤    netbackup
32780/tcp 过滤    sometimes-rpc23
49158/tcp 过滤    unknown
49165/tcp 过滤    unknown
MAC 地址: E2:43:49:15:DF:19 (Unknown)

在输出中,nmap 不仅提供了端口号,还给出了服务名称。这个服务名称来自于 nmap 知道的服务标识符列表,它与在该端口上运行的实际应用程序无关。nmap 可以通过获取应用程序的响应来确定端口上运行的服务。nmap 还提供了基于 MAC 地址的厂商 ID 查找。这个厂商 ID 可以帮助你识别设备。例如,第一个地址对应的是 TP-Link Technologies,TP-Link 生产网络硬件,如无线接入点和路由器设备。

你可能注意到我没有指定要扫描的端口。默认情况下,nmap 会扫描最常用的 1000 个端口。这使得扫描比扫描全部 65,536 个端口要快,因为绝大多数端口并不会被使用。如果你想指定端口,可以使用范围或列表。如果你想扫描所有端口,可以使用命令行选项 -p-,这会告诉 nmap 扫描所有端口。nmap 还有一个默认的扫描速度,这个速度决定了发送消息之间的延迟。如果你想设置不同的速率,可以使用 -T 参数并指定一个 0 到 5 之间的值。默认值是 -T 3。如果你希望扫描速度慢一些,可以设置较低的值,以限制带宽,或者如果你想要避免被发现,可以降低速度。如果你不关心被发现并希望扫描更快,可以提高速率。

尽管还有其他类型的TCP扫描,这些方法在大多数情况下已经能够提供良好的扫描结果。其他扫描方式主要用于规避检测或进行防火墙测试,尽管这些方法已经被广泛知晓多年。接下来,我们可以继续使用nmap进行UDP扫描。你可以像TCP扫描一样调整速率。即使你提高了速率,UDP扫描仍然会面临重传问题。相较于普通扫描,增加速率后UDP扫描会更快,但它仍然比TCP扫描慢。你可以在示例3-18中看到UDP扫描的输出。

示例 3-18. nmap的UDP扫描

┌──(kilroy@badmilo)-[~]
└─$ sudo nmap -sU 192.168.1.0/24
Starting Nmap 7.94 ( https://nmap.org ) at 2023-06-26 19:08 EDT

Nmap scan report for 192.168.1.1
Host is up (0.0049s latency).
Not shown: 500 closed udp ports (port-unreach), 496 open|filtered ↩
udp ports (no-response)
PORT     STATE SERVICE
53/udp   open  domain
67/udp   open  dhcps
137/udp  open  netbios-ns
1900/udp open  upnp
MAC Address: 80:CC:9C:DD:71:F2 (Netgear)

Nmap scan report for 192.168.1.10
Host is up (0.0044s latency).
Not shown: 801 open|filtered udp ports (no-response), 197 closed ↩
udp ports (port-unreach)
PORT    STATE SERVICE
111/udp open  rpcbind
137/udp open  netbios-ns
MAC Address: 1C:69:7A:F1:2A:E0 (EliteGroup Computer Systems)

注意 在我的网络上,TCP扫描所有系统的时间大约不到五分钟,因此没有网络延迟。相比之下,UDP扫描耗时了110分钟,几乎两小时。为了让UDP扫描能够这么快地返回,我不得不大幅提高速率,使网络流量更快地传输。

虽然nmap可以进行端口扫描,但它还有其他功能。例如,你可以使用nmap执行操作系统检测。它是基于已知操作系统的指纹来进行的。此外,nmap还可以运行脚本。这些脚本是基于已识别为开放端口的服务,并且是用Lua编写的。虽然nmap自带的脚本提供了许多功能,但你也可以根据需要添加自己的脚本。运行脚本时,你只需告诉nmap你想运行的脚本名称。你也可以运行一组脚本,正如示例3-19所示。在这种情况下,nmap将运行所有以http开头的脚本。如果nmap检测到常见的web端口开放,它将针对该端口调用不同的脚本。这个扫描请求将捕获所有可用的基于web的脚本。在此时的运行中,共有138个脚本。

示例 3-19. 使用nmap运行脚本

┌──(kilroy@badmilo)-[~]
└─$ sudo nmap -sS -T 3 -p 80 -oN nse-out.txt --script http* 192.168.1.15
Starting Nmap 7.94 ( https://nmap.org ) at 2023-06-27 19:40 EDT
NSE: Warning: Could not load 'http-brute.nse': no path to file/directory: ↩
http-brute.nse
Pre-scan script results:
|_http-robtex-shared-ns: *TEMPORARILY DISABLED* due to changes in Robtex's API. ↩
See https://www.robtex.com/api/
NSE: [http-form-brute] usernames: Time limit 10m00s exceeded.
NSE: [http-form-brute] usernames: Time limit 10m00s exceeded.
NSE: [http-form-brute] passwords: Time limit 10m00s exceeded.
Nmap scan report for 192.168.1.15
Host is up (0.0097s latency).

PORT   STATE SERVICE
80/tcp open  http
|_http-csrf: Couldn't find any CSRF vulnerabilities.
| http-form-brute:
|   Accounts: No valid accounts found
|_  Statistics: Performed 3980 guesses in 600 seconds, average tps: 6.3
|_http-slowloris: false
|_http-favicon: Unknown favicon MD5: 69C728902A3F1DF75CF9EAC73BD55556
| http-vhosts:
|_128 names had status 302
| http-form-fuzzer:
|   Path: / Action: login.php
|     username
|       string lengths that caused errors:
|         309106
|       integer lengths that caused errors:
|_        304092, 308800
|_http-devframework: Couldn't determine the underlying framework or CMS. Try ↩
increasing 'httpspider.maxpagecount' value to spider more pages.
| http-headers:
|   Date: Wed, 28 Jun 2023 10:57:57 GMT
|   Server: Apache/2.4.55 (Ubuntu)
|   Set-Cookie: security=low; path=/
|   Set-Cookie: PHPSESSID=6p5qtnekffolip8bek4akmqk3p; expires=Thu, 29-Jun-202310:57:57 GMT; Max-Age=86400; path=/; HttpOnly; SameSite=1
|   Expires: Tue, 23 Jun 2009 12:00:00 GMT
|   Cache-Control: no-cache, must-revalidate
|   Pragma: no-cache
|   Connection: close
|   Content-Type: text/html;charset=utf-8
|
|_  (Request type: HEAD)
|_http-config-backup: ERROR: Script execution failed (use -d to debug)
|_http-malware-host: Host appears to be clean
|_http-date: Wed, 28 Jun 2023 10:57:58 GMT; -1s from local time.
MAC Address: 1C:69:7A:66:64:2A (EliteGroup Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 49765.40 seconds

从示例中可以看到,扫描被限制在单一主机和单一端口。如果我打算运行基于HTTP的脚本,完全可以将搜索范围限制在HTTP端口上。你也可以对常规的1,000个端口进行扫描,但这将花费很多时间且结果不太有用。而且,你将不得不查看所有输出,寻找web服务器的脚本输出。

除了进行端口扫描和运行基本的脚本,nmap还可以提供有关目标和运行服务的信息。如果在命令行中指定-A选项,nmap将进行操作系统检测和版本检测。它还会根据发现的开放端口运行脚本。最后,nmap还会执行一次Traceroute,帮助你了解从你的主机到目标主机的网络路径。

高速扫描

nmap 可能是事实上的端口扫描工具,但并不是唯一可用的工具。在某些情况下,您可能需要扫描大规模的网络。nmap 高效,但它并未针对非常大规模的网络进行优化。一个为扫描大规模网络而设计的工具是 masscan。masscan 和 nmap 的一个主要区别是,masscan 使用异步通信:该程序会发送一条消息,而不是等待响应返回,而是继续发送。它会使用程序的另一部分来等待响应并记录它们。它能够以极高的速度进行传输,使其能够在几分钟内扫描整个互联网。相比之下,使用 nmap 扫描一个本地的 /24 网络(最多 254 个主机)的速度要慢得多。

masscan 可以接受不同的参数,但它也接受 nmap 可以接受的参数。如果您知道如何操作 nmap,您可以很快上手 masscan。masscan 和 nmap 的另一个区别,您可以在示例 3-20 中看到,是需要指定端口。nmap 会假设使用一组端口,而 masscan 则不会假设任何端口。如果您在没有指定要扫描的端口的情况下运行 masscan,它会提示您指定要扫描的端口。在示例 3-20 中,我设置它扫描前 1,500 个端口。如果您只关心 443 端口(意味着该系统很可能运行一个基于 TLS 的 Web 服务器),您可以指定只扫描 443 端口。只扫描您关心的端口将为您节省大量时间。值得注意的是,对比 nmap 执行的 SYN 扫描,运行 masscan 扫描相同网络所用的时间要显著更长。

示例 3-20. 使用 masscan 进行高速扫描

┌──(kilroy@badmilo)-[~]
└─$ sudo masscan -sS --ports 1-1500 192.168.1.0/24
Starting masscan 1.3.2 (http://bit.ly/14GZzcT) at 2023-06-27 22:30:33 GMT
Initiating SYN Stealth Scan
Scanning 256 hosts [1500 ports/host]
Discovered open port 80/tcp on 192.168.1.22
Discovered open port 853/tcp on 192.168.1.118
Discovered open port 443/tcp on 192.168.1.1
Discovered open port 22/tcp on 192.168.1.15
Discovered open port 445/tcp on 192.168.1.144
Discovered open port 445/tcp on 192.168.1.1
Discovered open port 53/tcp on 192.168.1.1
Discovered open port 53/tcp on 192.168.1.194
Discovered open port 853/tcp on 192.168.1.113
Discovered open port 853/tcp on 192.168.1.55
Discovered open port 53/tcp on 192.168.1.55
Discovered open port 53/tcp on 192.168.1.236
Discovered open port 443/tcp on 192.168.1.15

您可以使用一个多用途工具进行端口扫描,并控制消息发送间隔的时间。与 masscan 使用异步方法加速扫描不同,hping3 允许您指定数据包之间的间隔时间。这虽然不具备真正的高速扫描能力,但 hping3 具有执行许多其他任务的强大功能。hping3 允许您通过命令行参数自定义数据包。使用 hping3 作为扫描工具的挑战在于,它更像是一个过于活跃的 ping 程序,而不是一个旨在重现 nmap 等工具功能的实用程序。

然而,如果您想对单个主机进行扫描和探测以确定其特征,hping3 是一个出色的工具。示例 3-21 展示了对 10 个端口的 SYN 扫描。-S 参数告诉 hping3 设置 SYN 标志。我们使用 -p 标志来指示要扫描的端口。通过在 -p 标志后添加 ++,我们告诉 hping3 按端口号递增扫描。我们还可以通过 -c 标志来设置端口的数量。在这个例子中,hping3 将扫描 10 个端口并停止。最后,我们可以使用 -s 标志和端口号设置源端口。在这个扫描中,源端口并不重要,但在某些情况下,它可能会影响结果。

示例 3-21. 使用 hping3 进行端口扫描

root@rosebud:~# hping3 -S -p ++80 -s 1657 -c 10 192.168.86.1
HPING 192.168.86.1 (eth0 192.168.86.1): S set, 40 headers + 0 data bytes
len=46 ip=192.168.86.1 ttl=64 DF id=0 sport=80 flags=SA seq=0 win=29200 rtt=7.8 ms
len=46 ip=192.168.86.1 ttl=64 DF id=15522 sport=81 flags=RA seq=1 win=0 rtt=7.6 ms
len=46 ip=192.168.86.1 ttl=64 DF id=15523 sport=82 flags=RA seq=2 win=0 rtt=7.3 ms
len=46 ip=192.168.86.1 ttl=64 DF id=15524 sport=83 flags=RA seq=3 win=0 rtt=7.0 ms
len=46 ip=192.168.86.1 ttl=64 DF id=15525 sport=84 flags=RA seq=4 win=0 rtt=6.7 ms
len=46 ip=192.168.86.1 ttl=64 DF id=15526 sport=85 flags=RA seq=5 win=0 rtt=6.5 ms
len=46 ip=192.168.86.1 ttl=64 DF id=15527 sport=86 flags=RA seq=6 win=0 rtt=6.2 ms
len=46 ip=192.168.86.1 ttl=64 DF id=15528 sport=87 flags=RA seq=7 win=0 rtt=5.9 ms
len=46 ip=192.168.86.1 ttl=64 DF id=15529 sport=88 flags=RA seq=8 win=0 rtt=5.6 ms
len=46 ip=192.168.86.1 ttl=64 DF id=15530 sport=89 flags=RA seq=9 win=0 rtt=5.3 ms

--- 192.168.86.1 hping statistic ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 5.3/6.6/7.8 ms

与端口扫描器不同,端口扫描器会告诉您哪些端口是开放的,而使用 hping3 时,您需要自己解读响应结果以确定是否找到了开放的端口。在查看每行响应时,您可以看到 flags 字段。第一条返回的消息中,SYN 和 ACK 标志已设置,这表示端口是开放的。如果查看 sport 字段,您会看到开放的端口是 80。虽然它给出了源端口,但请记住您看到的是响应消息。在发送消息时,80 是目标端口,但在响应中,它成为了源端口。

其他响应消息显示 RST 和 ACK 标志被设置。由于响应中的 RST 标志被设置,我们知道端口已关闭。使用 hping3,您可以设置任何您想要的标志。例如,您可以执行 Xmas 扫描,设置 FIN、PSH 和 URG 标志。它被称为 Xmas 扫描,因为所有这些标志设置时,数据包看起来像是一棵有灯的圣诞树。您需要想象启用一个标志就像点亮一盏灯,才能理解这个名字。要进行 Xmas 扫描,您可以通过命令行设置所有这些标志,如 hping3 -F -P -U。当我们将这些消息发送到之前相同的目标时,目标会在 81 到 89 端口上响应 RST 和 ACK 标志。端口 80 没有任何响应,因为它是开放的,但 RFC 793 建议类似的数据包应当被丢弃,因此没有响应。

如前所述,hping3 还可以用于发送高速消息。有两种方式可以实现这一点。第一种是使用 -i 标志和一个数值。一个简单的数值将是等待时间(以秒为单位)。如果您希望速度更快,可以使用 -i u1,例如,表示等待仅一微秒。u 前缀表示单位是微秒。第二种方式是使用命令行上的 --flood 开关。这告诉 hping3 尽可能快速地发送消息,而不管是否等待响应。

服务扫描

最终,您想要获得的是在开放端口上运行的服务。端口本身通常会提供很多信息,但并非总是如此。有时,服务会运行在非标准端口上,尽管这种情况不常见。例如,您通常会期望看到 SSH 在 TCP 端口 22 上。如果 nmap 发现端口 22 开放,它会表示已找到 SSH 服务。如果 nmap 发现端口 2222 开放,它不会知道该怎么判断,除非您明确指定进行版本扫描,通过抓取协议的横幅来获取应用程序版本。

与此不同,amap 不会对端口背后的服务做假设。相反,它包含了一个关于协议如何响应的数据库,因此,为了确定实际监听该端口的应用程序,它会向端口发送触发请求,然后查找响应数据库中的信息。

在示例 3-22 中,您可以看到 amap 的两次运行。第一次是针对默认端口上的 Web 服务器进行扫描。毫不意外,amap 告诉我们协议匹配 HTTP。在第二次运行中,我们对端口 8383 进行探测,这个端口出现在对目标的端口扫描中。端口 8383 在端口扫描中显示为 http,因为这是该端口的知名服务,或者至少是先前为该端口注册的服务。然而,这并不是一个常见端口,而且仅仅因为某个服务已经与端口注册,并不意味着该端口上实际运行的就是该应用程序。因此,我们可以使用 amap 帮助我们找出可能在该端口上运行的应用程序或服务。

示例 3-22. 从 amap 获取应用程序信息

┌──(kilroy@badmilo)-[~]
└─$ sudo amap 192.168.1.219 80
amap v5.4 (www.thc.org/thc-amap) started at 2023-06-28 18:16:39 -APPLICATION MAPPING mode

Protocol on 192.168.1.219:80/tcp matches http
Protocol on 192.168.1.219:80/tcp matches http-apache-2
Protocol on 192.168.1.219:80/tcp matches http-iis

Unidentified ports: none.

amap v5.4 finished at 2023-06-28 18:16:40
┌──(kilroy@badmilo)-[~]
└─$ sudo amap 192.168.1.219 8383
amap v5.4 (www.thc.org/thc-amap) started at 2023-06-28 18:18:14 -APPLICATION MAPPING mode

Protocol on 192.168.1.219:8383/tcp matches http
Protocol on 192.168.1.219:8383/tcp matches http-apache-2
Protocol on 192.168.1.219:8383/tcp matches ssl

Unidentified ports: none.

amap v5.4 finished at 2023-06-28 18:18:20

使用 SMB 协议收集信息

一些协议可以用来收集目标主机的信息。其中一个是服务器消息块(SMB)协议,这是用于 Windows 网络上文件共享的协议,也可以用于远程管理 Windows 系统。可以使用一些工具扫描使用 SMB 进行文件共享的系统。一个这样的工具是 smbmap,它可以列出系统上所有共享的资源。示例 3-23 显示了使用 smbmap 对一个 macOS 系统进行扫描,该系统使用 SMB 在网络上共享文件。通常,共享资源并不会不加认证地提供。因此,您必须提供登录信息才能获取共享资源。如果您已经有了用户名和密码,可能不需要像 smbmap 这样的工具。

示例 3-23. 使用 smbmap 列出文件共享

┌──(kilroy@badmilo)-[~]
└─$ smbmap -u kilroy -p obScurePW123! -H 192.168.1.10
[+] IP: 192.168.1.10:445   Name: 192.168.1.10
        Disk                                               Permissions Comment
        ----                  ----------- -------
        homes                 READ, WRITE Home Directories
        media                 READ ONLY   Media directory
        print$                READ ONLY   Printer Drivers
        IPC$                  NO ACCESS   IPC Service (bobbie server (Samba, Ubuntu))
        kilroy                READ, WRITE
        Home Directories      READ, WRITE

另一个可以查找这些 SMB 共享和其他使用该协议共享的信息的工具是 enum4linux。这个脚本封装了与 Samba 软件包一起使用的程序,Samba 实现了 Linux 上的 SMB 协议。您也可以直接使用这些程序。例如,您可以使用 smbclient 与远程系统进行交互。示例 3-24 显示了使用 enum4linux 从运行 Samba 的 Linux 服务器获取用户列表。这可能包括与 smbmap 在示例 3-23 中一样列出共享资源。

示例 3-24. 使用 enum4linux

┌──(kilroy@badmilo)-[~]
└─$ sudo enum4linux -U 192.168.1.10
Starting enum4linux v0.9.1 ( http://labs.portcullis.co.uk/application/ ↩
enum4linux/ ) on Wed Jun 28 18:25:51 2023

 ====================( Target Information)=====================

Target ........... 192.168.1.10
RID Range ........ 500-550,1000-1050
Username ......... ''
Password ......... ''
Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none


 =======( Enumerating Workgroup/Domain on 192.168.1.10)=========
[+] Got domain/workgroup name: WASHERE
 ========( Getting domain SID for 192.168.1.10 )================
Domain Name: WASHERE
Domain Sid: (NULL SID)

[+] Can't determine if host is part of domain or part of a workgroup
================( Users on 192.168.1.10 )======================
index: 0x1 RID: 0x3e8 acb: 0x00000010 Account: kilroy   Name: Ric Messier   Desc:

user:[kilroy] rid:[0x3e8]

这只是 enum4linux 的其中一个功能,但您可以看到,通过使用 SMB 协议,它能够提取大量信息。这是可能的,因为 SMB 在一定程度上会在本地网络上公开信息,因为这些信息对其他可能想要利用被查询服务器提供的服务的系统很有帮助,比如共享资源列表等。

手动交互

尽管用于收集信息的自动化工具非常有用,但有时你需要亲自深入了解协议,直接与其交互。这意味着打开连接到服务端口并发出协议命令。你可以使用的一个程序是 telnet 客户端。它不同于 Telnet 协议或 Telnet 服务器。虽然 telnet 客户端用于与 Telnet 服务器交互,但它实际上只是一个可以打开到远程服务器的 TCP 连接的程序。你只需要提供一个端口号给 telnet。在示例 3-25 中,我使用 telnet 打开了与一个简单邮件传输协议(SMTP)服务器的连接。

示例 3-25:使用 telnet 与邮件服务器交互

┌──(kilroy@badmilo)-[~]
└─$ telnet 192.168.1.15 25
Trying 192.168.1.15...
Connected to 192.168.1.15.
Escape character is '^]'.
220 bobbie ESMTP Postfix (Ubuntu)
EHLO wubble.com
250-bobbie
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING
MAIL FROM: foo@foo.com
250 2.1.0 Ok
RCPT TO: root@localhost
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Hi,
This is me.

.
250 2.0.0 Ok: queued as 43AB04343C14

使用 telnet 客户端时,它默认连接到端口 23,这是标准的 Telnet 端口。然而,如果我们提供一个端口号,例如 25,就可以让 telnet 打开到该端口的 TCP 连接。一旦连接打开(已明确显示),你就可以开始输入协议命令。由于这是一个 SMTP 服务器,你看到的是一个扩展 SMTP(ESMTP)会话。我们可以通过这种方式收集信息,包括 SMTP 服务器的类型(Postfix)以及可用的协议命令。虽然这些都是 SMTP 命令,但服务器并不要求实现它们。例如,VRFY 命令用于验证地址,这可能用于枚举邮件服务器上的用户。这通常不是组织希望远程用户能做的事情,因为它可能暴露出攻击者可以利用的信息。因此,他们可能会禁用这个命令。

我们从服务器接收到的第一条消息是服务横幅。某些协议使用服务横幅来宣布有关应用程序的详细信息。当像 nmap 这样的工具收集版本信息时,它会查找这些服务横幅。不过,并非所有协议或服务器都会发送带有协议或服务器信息的服务横幅。

telnet 并不是唯一可以与服务器交互的命令。你还可以使用 netcat,通常通过命令 nc 来实现。我们可以像使用 telnet 一样使用 nc。在示例 3-26 中,我打开了与位于 192.168.86.1 的 Web 服务器的连接。与 telnet 不同,nc 不会显示连接已打开。如果端口关闭,你会收到一条 "Connection refused"(连接被拒绝)的消息。如果没有收到这条消息,你可以假设连接已打开,并且可以开始输入命令。你会看到一个 HTTP/1.1 请求被发送到远程服务器。一旦请求发送,空行表示头部已结束,接下来服务器就会开始返回响应。

示例 3-26:使用 nc 与 Web 服务器交互

┌──(kilroy@badmilo)-[~]
└─$ nc 192.168.1.219 80
GET / HTTP/1.1
Host: 192.168.1.219

HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Sun, 19 Mar 2023 09:10:48 GMT
Accept-Ranges: bytes
ETag: "bccfeab1425ad91:0"
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Wed, 28 Jun 2023 22:37:59 GMT
Content-Length: 1116928

<html>
<head>
        <style>
                body {
                        background:url('hahaha.jpg') no-repeat center center;
                        min-height: 100%;
                        background-color: black;
                }
        </style>
</head>
<body>

输出显示了响应头以及网页内容的初始部分。由于该页面还包括一个较大的二进制块,因此在你看到的片段中省略了它。与 telnet 相比,使用 nc 的一个优势是 netcat 可以用来设置一个监听器。这意味着你可以创建一个接收网络流量的端口,只要有连接到你设置监听的端口的请求,netcat 就会接收数据。此外,telnet 使用的是 TCP 协议。默认情况下,nc 也使用 TCP,但你可以让 nc 使用 UDP。这使得你可以与使用 UDP 协议的服务进行交互。

总结

信息收集将对你后续的工作有所帮助,它还可以用来发现潜在的漏洞,特别是在信息泄露方面。即使你最终只想进行攻击,花时间进行信息收集也会带来回报。以下是本章的一些重要要点:

  • 你可以利用公开的资源获取有关目标的信息。
  • 可以使用 Maltego 自动收集公开可用的信息。
  • 像 theHarvester 这样的工具可以用来自动收集有关电子邮件地址和人员的详细信息。
  • 域名系统(DNS)可能包含关于目标组织的很多详细信息。
  • 区域互联网注册机构(RIRs)可以提供大量关于 IP 地址及其所有者的信息。
  • nmap 程序不仅可以用于端口扫描,还可以用于收集操作系统和应用程序版本的详细信息。
  • 端口扫描最终是用来找出哪些应用程序在这些端口上监听。
  • 应用映射工具可以用于收集版本信息。
  • 你可以使用 telnet 或 nc 从远程系统收集应用程序的详细信息,如服务横幅等。

有用资源

  • Cameron Colquhoun 的博客文章《开源情报简史》
  • Sudhanshu Chauhan 和 Nutan Kumar Panda 的演示文稿《开源情报工具》
  • 《开源情报自动化》 by Robert Layton 和 Paul Watters(Elsevier,2015)
  • 《黑客网络情报》 by Sudhanshu Chauhan 和 Nutan Kumar Panda(Syngress,2015)