OSCP备战基础之Network Security

前言

在准备OSCP考试之前,以THM平台巩固被动和主动网络侦察的基本知识。

  • Passive Reconnaissance将学习以下三个用于被动侦察的命令行工具:

    • whois:查询 WHOIS 服务器(WHOIS的含义是域名查询服务)
    • nslookup:查询 DNS 服务器
    • dig:查询 DNS 服务器

    我们可以使用whois工具来查询WHOIS记录,使用 nslookup 和 dig工具来查询 DNS 数据库记录,这些都是公开的记录,因此不会惊动想要渗透的目标。

    • 还将会了解两个在线工具的使用:

      • DNSDumpster
      • Shodan.io

      这两个在线网站服务工具允许我们收集关于目标的信息,并且无需直接连接到目标。

  • Active Reconnaissance学习使用网络浏览器来收集有关目标的更多信息;学习使用一些简单的工具(例如 ping、traceroute、telnet 和 nc)来收集有关网络、系统和服务的信息。

    • 主动侦察从直接连接到目标机器开始,任何此类连接都可能在目标的日志记录中留下客户端 IP 地址、连接时间和连接持续时间等信息;然而,并不是所有的连接都是可疑的,可以尝试让主动侦察活动表现地和常规客户活动类似。

    • 考虑进行网页浏览操作,因为当请求夹杂在数百名合法用户中,没有人会怀疑连接到目标 Web 服务器的浏览器。 当作为红队(攻击者)的一员并且不想惊动蓝队(防守者)时,可以利用此类隐蔽技术来发挥自己的优势。

    • 主动侦查从 Web 浏览器及其内置的开发工具开始;此外还将展示如何将 Web 浏览器“武装”成高效的侦察框架;之后,讨论其他良性工具,例如 ping、traceroute 和 telnet。 所有这些程序都需要与目标连接,因此这些活动都属于主动侦察活动,也能够被目标系统监测到。

  • Nmap Live Host Discovery学习使用工具来发现存活主机

    • 想要定位一个网络时,需要有效的工具来帮助我们处理重复性任务并回答以下问题:

      • 网络中有哪些系统启动了?

      • 这些系统上运行着哪些服务?

      • 介绍Nmap 用于发现活动主机的不同方法:

        • ARP 扫描:此扫描使用 ARP 请求来发现活动主机

        • ICMP 扫描:此扫描使用 ICMP 请求来识别活动主机

        • TCP/UDP ping 扫描:此扫描会将数据包发送到 TCP 端口和 UDP 端口以确定活动主机。

      • 介绍两种扫描器: arp-scan 和 masscan,并解释它们如何与 Nmap 的主机发现部分功能相重叠。

  • Nmap Basic Port Scans学习使用nmap检查哪些端口是打开的和监听的,以及哪些端口是关闭的;重点介绍端口扫描以及 nmap 使用的不同类型的端口扫描。

    • TCP连接端口扫描

    • TCP SYN 端口扫描

    • UDP端口扫描

Passive Reconnaissance (被动侦查)

  • Passive Versus Active Recon (被动侦查VS主动侦查)

    • 侦察(recon)可以定义为收集目标信息的初步调查,这是统一杀伤链中在系统上获得初步立足点的第一步–关于统一杀伤链: https://www.unifiedkillchain.com/

    • 我们将侦察分为:

      1、被动侦察(被动信息收集);

      2、主动侦察(主动信息收集)。

    • 在被动侦察中,将依赖于公开可用的知识,关于这些知识无需直接与目标接触即可从公开可用的资源中进行获取,可以把被动侦察想象成从远处看着目标区域,而不是实际踏进目标区域。

    • 被动侦察包括许多活动,例如:

      • 从公共DNS服务器中查找目标域的 DNS 记录。

      • 查看与目标网站相关的招聘广告。

      • 阅读有关目标公司的新闻。

    • 而在主动侦察中,无法像被动侦察一样谨慎地实现侦察目的,主动侦察需要与目标进行直接接触,可以把主动侦察想象成正在检查门窗上的锁,以及正在检查其他潜在的进入目标的入口点。

    • 主动侦察活动的例子包括:

      • 连接到目标公司的服务器,例如 HTTP、FTP 和 SMTP等。

      • 致电目标公司以尝试获取信息(社会工程学)。

      • 冒充修理工进入目标公司场所。

      考虑到主动侦察的侵入性,你需要在获得适当的法律授权的情况下才能开展相关活动,否则你可能很快就会陷入法律纠纷中。

  • Whois

    • WHOIS是遵循RFC 3912规范的请求和响应协议,WHOIS 服务器在TCP端口43上侦听传入的请求。在现实场景中:域名注册商负责维护其租用域名的WHOIS记录,WHOIS服务器则负责回复与请求的域相关的各种信息。

    • 通过WHOIS我们可以了解:

      • 注册商:域名是通过哪个注册商注册的?

      • 注册人的联系信息:姓名、组织、地址、电话等(如果使用了隐私服务隐藏,则注册人的联系信息将不可见)。

      • 创建、更新和到期日期:域名首次注册的时间是什么时候? 最后一次更新是什么时候?

      • 名称服务器:将请求哪个服务器来解析域名?

    • 要获取以上信息,需要使用 whois 客户端或在线服务。虽然许多在线服务都能够提供whois信息,但是,使用本地 whois 客户端获取信息通常更快、更方便。

    • 通过使用本地的Linux 机器,例如 Parrot 或 Kali,可以轻松地在攻击机终端上访问whois 客户端。基础语法是 whois DOMAIN_NAME,其中DOMAIN_NAME 是尝试想获取更多信息的目标域。

    • 以下是执行 whois tryhackme.com 命令的示例:
        root@ip-10-10-54-120:~# whois tryhackme.com
        Domain Name: TRYHACKME.COM
        Registry Domain ID: 2282723194_DOMAIN_COM-VRSN
        Registrar WHOIS Server: whois.namecheap.com
        Registrar URL: http://www.namecheap.com
        Updated Date: 2021-05-01T19:43:23Z
        Creation Date: 2018-07-05T19:46:15Z
        Registry Expiry Date: 2027-07-05T19:46:15Z
        Registrar: NameCheap, Inc.
        Registrar IANA ID: 1068
        Registrar Abuse Contact Email: abuse@namecheap.com
        Registrar Abuse Contact Phone: +1.6613102107
        Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
        Name Server: KIP.NS.CLOUDFLARE.COM
        Name Server: UMA.NS.CLOUDFLARE.COM
        DNSSEC: unsigned
        URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/
        >>> Last update of whois database: 2023-11-21T14:11:11Z <<<
      
        For more information on Whois status codes, please visit https://icann.org/epp
      
        NOTICE: The expiration date displayed in this record is the date the
        registrar's sponsorship of the domain name registration in the registry is
        currently set to expire. This date does not necessarily reflect the expiration
        date of the domain name registrant's agreement with the sponsoring
        registrar.  Users may consult the sponsoring registrar's Whois database to
        view the registrar's reported date of expiration for this registration.
      
        TERMS OF USE: You are not authorized to access or query our Whois
        database through the use of electronic processes that are high-volume and
        automated except as reasonably necessary to register domain names or
        modify existing registrations; the Data in VeriSign Global Registry
        Services' ("VeriSign") Whois database is provided by VeriSign for
        information purposes only, and to assist persons in obtaining information
        about or related to a domain name registration record. VeriSign does not
        guarantee its accuracy. By submitting a Whois query, you agree to abide
        by the following terms of use: You agree that you may use this Data only
        for lawful purposes and that under no circumstances will you use this Data
        to: (1) allow, enable, or otherwise support the transmission of mass
        unsolicited, commercial advertising or solicitations via e-mail, telephone,
        or facsimile; or (2) enable high volume, automated, electronic processes
        that apply to VeriSign (or its computer systems). The compilation,
        repackaging, dissemination or other use of this Data is expressly
        prohibited without the prior written consent of VeriSign. You agree not to
        use electronic processes that are automated and high-volume to access or
        query the Whois database except as reasonably necessary to register
        domain names or modify existing registrations. VeriSign reserves the right
        to restrict your access to the Whois database in its sole discretion to ensure
        operational stability.  VeriSign may restrict or terminate your access to the
        Whois database for failure to abide by these terms of use. VeriSign
        reserves the right to modify these terms at any time.
      
        The Registry database contains ONLY .COM, .NET, .EDU domains and
        Registrars.
        Domain name: tryhackme.com
        Registry Domain ID: 2282723194_DOMAIN_COM-VRSN
        Registrar WHOIS Server: whois.namecheap.com
        Registrar URL: http://www.namecheap.com
        Updated Date: 2021-05-01T19:43:23.31Z
        Creation Date: 2018-07-05T19:46:15.00Z
        Registrar Registration Expiration Date: 2027-07-05T19:46:15.00Z
        Registrar: NAMECHEAP INC
        Registrar IANA ID: 1068
        Registrar Abuse Contact Email: abuse@namecheap.com
        Registrar Abuse Contact Phone: +1.9854014545
        Reseller: NAMECHEAP INC
        Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
        Registry Registrant ID: 
        Registrant Name: Redacted for Privacy
        Registrant Organization: Privacy service provided by Withheld for Privacy ehf
        Registrant Street: Kalkofnsvegur 2 
        Registrant City: Reykjavik
        Registrant State/Province: Capital Region
        Registrant Postal Code: 101
        Registrant Country: IS
        Registrant Phone: +354.4212434
        Registrant Phone Ext: 
        Registrant Fax: 
        Registrant Fax Ext: 
        Registrant Email: a70a4ff6d25041a48378997194f9e834.protect@withheldforprivacy.com
        Registry Admin ID: 
        Admin Name: Redacted for Privacy
        Admin Organization: Privacy service provided by Withheld for Privacy ehf
        Admin Street: Kalkofnsvegur 2 
        Admin City: Reykjavik
        Admin State/Province: Capital Region
        Admin Postal Code: 101
        Admin Country: IS
        Admin Phone: +354.4212434
        Admin Phone Ext: 
        Admin Fax: 
        Admin Fax Ext: 
        Admin Email: a70a4ff6d25041a48378997194f9e834.protect@withheldforprivacy.com
        Registry Tech ID: 
        Tech Name: Redacted for Privacy
        Tech Organization: Privacy service provided by Withheld for Privacy ehf
        Tech Street: Kalkofnsvegur 2 
        Tech City: Reykjavik
        Tech State/Province: Capital Region
        Tech Postal Code: 101
        Tech Country: IS
        Tech Phone: +354.4212434
        Tech Phone Ext: 
        Tech Fax: 
        Tech Fax Ext: 
        Tech Email: a70a4ff6d25041a48378997194f9e834.protect@withheldforprivacy.com
        Name Server: kip.ns.cloudflare.com
        Name Server: uma.ns.cloudflare.com
        DNSSEC: unsigned
        URL of the ICANN WHOIS Data Problem Reporting System: http://wdprs.internic.net/
        >>> Last update of WHOIS database: 2023-11-21T01:57:01.25Z <<<
        For more information on Whois status codes, please visit https://icann.org/epp
      
    • 从上面的示例中,我们能够看到很多信息,现在按照显示的顺序查看这些信息:

      • 首先,注意到被重定向到 whois.namecheap.com 以获取WHOIS信息,正在维护目标域名的WHOIS记录的是namecheap.com,此外,还可以看到域名的创建日期以及最后更新日期和到期日期等信息。

      • 接下来,通过获取到有关注册商和注册人的信息,可以找到注册人的姓名和联系信息,除非他们使用了某些隐私服务(在现实环境下通常都会使用隐私服务)。

      • 最后,可以看到能够被查询的域名服务器信息,此处的信息有助于之后查找DNS记录。

      我们可以检查收集到的信息以发现新的攻击面,例如考虑社会工程学攻击或技术攻击。根据渗透测试的范围,你可以尝试对管理员用户的电子邮件服务器或 DNS 服务器进行攻击,假设它们归你的客户所有并且也在预定的渗透测试范围之内。

    • 需要注意的是,由于自动化工具会滥用 WHOIS 查询来获取电子邮件地址,因此许多WHOIS服务器会对此采取相应的措施,例如:他们可能会重新编辑电子邮件地址,此外,许多注册人都会设置隐私服务,以保持他们的信息私密性并且能够在一定程度上避免他们的电子邮件地址被垃圾邮件发送者获取。
  • nslookup and dig

    在上一小WHOIS的信息中,我还能够从域名注册商那里获得关于DNS服务器的信息。

    • nslookup: 可以使用nslookup(Name Server Look Up)查找域名的IP地址,该命令的用法是nslookup DOMAIN_NAME,例如 nslookup tryhackme.com。

    • nslookup完整的语法是nslookup OPTIONS DOMAIN_NAME SERVER,这三个主要参数的含义是:

      • OPTIONS (选项)-包含查询类型,例如:可以使用参数 A 用于查询IPv4 地址,使用参数 AAAA 用于查询 IPv6 地址。

      • DOMAIN_NAME (域名)-想要查询的目标域名。

      • SERVER (服务器)-该参数代表要查询的DNS服务器,可以选择任何本地或公共 DNS 服务器进行查询:Cloudflare 提供的DNS是 1.1.1.1 和 1.0.0.1,Google 提供的DNS是 8.8.8.8 和 8.8.4.4,Quad9 提供的DNS是 9.9.9.9 和 149.112.112.112,可以任意选择公共 DNS 服务器,以此替代ISP所分配的本地DNS服务器。

        Alt text

      • 例如,nslookup -type=A tryhackme.com 1.1.1.1(或者输入-type=a因为此参数不区分大小写)可用于返回tryhackme.com使用的所有 IPv4 地址。

        Alt text

      • A 和 AAAA 记录分别用于返回 IPv4 和 IPv6 地址,从渗透测试的角度了解此查找很有帮助。在上面的例子中,从一个域名开始,得到了三个 IPv4 地址,假设这些 IP 地址都在渗透测试的范围内,接下来则可以进一步检查每个 IP 地址的不安全性。

      • 假设你想了解特定域的电子邮件服务器和配置,你可以使用nslookup -type=MX tryhackme.com,例子如下:

        Alt text

        • 可以看到 tryhackme.com 当前的电子邮件配置是使用Google邮件交换服务器。参数MX表示查找目标使用的 Mail Exchange 服务器,注意到当目标邮件服务器发送带@tryhackme.com的电子邮件时,它会先尝试连接到顺序为1的aspmx.l.google.com,如果它正忙或不可用,邮件服务器将尝试连接按顺序排列的下一个邮件交换服务器 alt1.aspmx.l.google.com 或 alt2.aspmx.l.google.com。

        • 从以上信息可以得知:目标使用的是由Google 提供的邮件服务器; 因此,不应期望目标邮件服务器使用的是易受攻击的服务器版本。 但是,在其他情况下,也可能会发现目标邮件服务器并没有得到充分保护或漏洞修补。

    • dig

      • 如果需要更高级的 DNS 查询和附加功能,可以使用dig工具,它是“Domain Information Groper”的首字母缩写词,可以使用 dig 查找 MX 记录并将它们与 nslookup得出的结果进行比较。

      • dig的一般语法是dig DOMAIN_NAME,如果需要指定查询的记录类型,可以使用dig DOMAIN_NAME TYPE,或者使用 dig @SERVER DOMAIN_NAME TYPE 以选择要查询的DNS服务器。

        • SERVER 是要查询的 DNS 服务器。

        • DOMAIN_NAME-是要查找的域名。

        • TYPE-是DNS记录类型,具体类型如前面提供的图表所示。

        Alt text

    • 通过对nslookup 和 dig 的输出结果进行快速比较,可知dig返回了更多信息,例如默认情况下的 TTL(生存时间), 如果要查询的DNS服务器为1.1.1.1,可以使用dig @1.1.1.1 tryhackme.com

  • DNSDumpster – 被动信息收集网站

    • DNS 查找工具(例如 nslookup 和 dig)无法自行查找子域,但是正在检查的域可能包含一些不同的子域,这些子域可以揭示有关目标的更多信息。

      • 例如,如果 tryhackme.com 有两个子域为wiki.tryhackme.com以及webmail.tryhackme.com,可能想了解更多关于这两个子域的信息,因为它们可能保存着关于目标的大量信息。 可能这些子域之一已设置但是没有定期更新,缺乏适当的定期更新通常会导致子域上的服务易受攻击。
    • 为了发现目标的子域,可以考虑使用多个搜索引擎来形成一个公开的子域列表。 一个搜索引擎是不够的; 此外,应该期望通过至少几十个结果来找到有用的数据,发现目标关键子域的另一种方法是依靠暴力查询来查找哪些子域具有 DNS 记录。

    • 为了避免过于耗时的搜索工作,可以使用 能够提供详细的DNS查询信息的一些在线服务,例如DNSDumpster网站。如果在 DNSDumpster 中搜索 tryhackme.com,就会发现典型的DNS查询方式所无法提供的子域blog.tryhackme.com;此外,DNSDumpster 将以易于阅读的表格和图表的形式返回收集到的 DNS 信息;DNSDumpster 还将提供任何收集到的有关监听服务器的信息。

    • 接下来,将在 DNSDumpster 上搜索 tryhackme.com,让你了解一下预期的输出结果。

      在下面示例的结果中,得到了我们正在查找的域的 DNS 服务器列表;DNSDumpster 会将域名解析为 IP 地址,甚至会尝试对其进行地理定位;还可以看到MX记录,DNSDumpster 将目标的所有五个邮件交换服务器解析为各自的 IP 地址,并提供有关所有者和位置的更多信息;最后,还可以看到 TXT 记录以及A记录。

      Alt text

    • DNSDumpster还能以图形化的方式表示收集到的信息,将前面表格中的数据显示为图表:可以看到DNS和MX到它们各自的服务器的分支,同时也能看到相关的ip地址。

      Alt text

    • DNSDumpster有一个功能允许你导出图表,你可以自由操纵图形界面并移动区块。

      Alt text

  • Shodan.io – 被动信息收集网站

    • 当任务是针对特定目标进行渗透测试时,作为被动侦察阶段的一部分,像 Shodan.io 这样的网站服务可以帮助了解有关客户端网络的各种信息,而无需主动连接目标网络。 此外,在防御方面,也可以使用Shodan.io来了解属于自己组织的网络连接情况和暴露的网络设备情况。

    • Shodan.io会尝试连接到所有可在线访问的网络设备,以构建一个连接“物”的搜索引擎,而不是简单的网页搜索引擎。Shodan所发出的请求一旦得到响应,它就会收集与服务相关的所有信息并将其保存在网站数据库中以使其内容变得可搜索。 下图是tryhackme.com在Shodan中的一条信息记录。

      Alt text

      • 该记录显示的是一个网络服务器,如前所述,Shodan.io 会收集与它可以在线找到的任何连接设备相关的信息,在 Shodan.io 上搜索 tryhackme.com 将至少显示上面截图中的记录。 通过Shodan.io的搜索结果,我们可以了解到很多信息,例如:

        • 服务器的IP地址

        • 服务器的托管公司

        • 服务器的地理位置

        • 服务器类型和版本

      • 也可以尝试搜索从DNS查找中获得的 IP 地址,在Shodan的帮助页面上,可以了解 Shodan.io 提供的所有搜索选项。

  • Summary

    Alt text

Active Reconnaissance (主动侦查)

  • Web Browser

    • Web 浏览器可以是一个很方便的工具,尤其是它在所有系统上都很容易使用,可以通过多种方式使用 Web 浏览器来收集有关目标的信息。

    • 在传输层中,Web浏览器使用的端口为:

      • 通过 HTTP 访问网站时默认使用 TCP 端口 80

      • 通过 HTTPS 访问网站时默认使用 TCP 端口 443

      • 由于 80 和 443 是 HTTP 和 HTTPS 的默认端口,因此 Web 浏览器并不会在地址栏中显示它们。但是,也可以使用自定义端口来访问web服务,例如:https://127.0.0.1:8834/ 将通过 HTTPS 协议使用端口8834 连接到 127.0.0.1 (localhost), 如果有 HTTPS 服务器在该端口上侦听,将收到一个网页画面。

    • 在使用浏览器浏览网页时,可以在 PC 上按 Ctrl+Shift+I 或在 Mac 上按 Option + Command + I 来打开 Firefox 上的开发者工具,类似的快捷方式也可以使用在 Google Chrome浏览器 或 Chromium浏览器中。

    • 开发人员工具允许检查浏览器已经接收并与远程服务器发生交换的许多内容。例如,可以查看甚至修改 JavaScript (JS) 文件,检查系统上设置的 cookie 并查看有关站点内容的文件夹结构。

    • 下面是Firefox浏览器中的开发者工具的截图,Chrome中的DevTools(开发者工具)和下图也非常相似。

      Alt text Alt text

    • Firefox 和 Chrome 也有很多插件可以帮助渗透测试,下面是一些例子:

      • FoxyProxy–可让你快速更改用于访问目标网站的代理服务器。 当你使用 Burp Suite 等工具或者需要定期切换代理服务器时,此浏览器扩展程序很方便。

        • 获取 FoxyProxy(安装在Firefox 浏览器中使用):https://addons.mozilla.org/en-US/firefox/addon/foxyproxy-standard/

        Alt text

      • User-Agent Switcher and Manager–用户代理切换器和管理器,使你能够假装正在以不同的操作系统或不同的 Web 浏览器访问网页。换句话说,你可以假装在使用 iPhone 浏览网站,而实际上你是使用 Mozilla Firefox浏览器访问网站。

        • 下载 Firefox 的用户代理切换器和管理器:https://addons.mozilla.org/en-US/firefox/addon/user-agent-string-switcher/

        Alt text

      • Wappalyzer–提供对正在访问的网站所使用的技术的分析结果。 这个扩展程序很方便,当你在像任何其他用户一样浏览网站时就能收集到网站相关信息。

        • 下载适用于 Firefox 的 Wappalyzer:https://addons.mozilla.org/en-US/firefox/addon/wappalyzer/

        Alt text

  • Ping

    • ping 的主要目的是检查是否可以访问远程系统以及远程系统是否可以返回响应到自己机器。 换句话说,最初ping是用来检查网络连接性的; 然而,我门更感兴趣的是它用来检查远程系统是否在线。

    • 简单来说,ping 命令会向远程系统发送数据包,远程系统则会进行回复。 这样就可以断定远程系统是否在线并且网络在两个系统之间(本地和远程)能否正常工作。

    • 更挑剔一点的定义:ping 是将 ICMP Echo 数据包发送到远程系统的命令。如果远程系统在线,ping 数据包被正确路由并且没有被任何防火墙阻止,则远程系统应该会发回一个 ICMP Echo 响应。同样,如果经过正确路由并且没有被任何防火墙阻止,ping 响应 应该会到达之前发出ping命令的系统。

    • 此类命令的目的是在花时间执行更详细的扫描以发现正在运行的操作系统和服务之前确保目标系统在线(存活)。

    • 可以使用 ping MACHINE_IP 或 ping HOSTNAME 对目标机进行检测。在第二条命令中,系统需要在发送 ping 数据包之前将 HOSTNAME 解析为 IP 地址。如果没有在 Linux 系统上指定计数,则需要按 CTRL+C 来强制ping命令停止。

      • 在linux系统上,如果只想发送十个数据包,你可以使用 ping -c 10 MACHINE_IP,这相当于在 MS Windows 系统上执行 ping -n 10 MACHINE_IP。
    • 从技术上讲,ping 属于 ICMP(Internet Control Message Protocol)协议。 ICMP 支持多种类型的查询,这里主要介绍的是ping(ICMP echo/type 8)和 ping reply(ICMP echo reply/type 0),此处只是简单使用ping命令所以并不需要了解 ICMP协议的详细信息。

    • 在下面的示例中,将数据包的总数指定为 5,并且使用 ping MACHINE_IP。MACHINE_IP 对应的目标系统在线并且没有阻塞ICMP 回显请求,此外,数据包路由上的任何防火墙和路由器也没有阻塞 ICMP 回显请求。

      Alt text

      • 在上面的示例中,可以看到目标系统正在响应ping命令。 ping命令的输出结果表明目标在线且可被访问,发送了五个数据包,也收到了五个回复,回复到达本地系统平均需要0.486 毫秒,最大值为 0.922 毫秒。

      • 从渗透测试的角度来看,需要尝试发现这个目标的更多信息,例如:目标的哪些端口是开放的,目标有哪些服务正在运行。

    • 让我们考虑以下情况:关闭目标虚拟机,然后再尝试ping命令。正如你在以下示例中看到的结果,我们没有收到任何来自目标机器的有效回复。

      Alt text

      • 在上面示例中,我们已经关闭了ip地址为10.10.58.15 的目标机器。 对于每个 ping,我们使用的本地系统都以“无法访问目标主机”进行响应,可以看到我们已经发送了五个数据包,但都没有收到回复,这将导致 100% 的数据包丢失。

      • 一般来说,当没有收到 ping 回复时,有一些解释如:

        • 目标机没有响应,可能仍在启动或关闭状态,或者目标操作系统已崩溃。

        • 目标机已从网络中拔出,或者数据包的传输路径中存在网络设备故障。

        • 防火墙被配置为阻止此类数据包。 防火墙可能是在系统本身上运行的一个软件,也可能是一个单独的网络设备,请注意,默认情况下MS Windows 防火墙会阻止 ping命令的数据包。

        • 你的本地系统已从网络中拔出。

  • Traceroute

    • 顾名思义,traceroute(跟踪路由) 命令会跟踪数据包从本地系统传输到另一台主机所采用的路由路径。 如果kali机未安装 traceroute,可以使用 apt install traceroute 进行安装。

    • traceroute的目的是查找数据包从你的系统到目标主机时所经过的路由器或跃点的 IP 地址,此命令还会显示两个系统之间的路由器数量,这些信息很有帮助,因为它指示了本地系统和目标主机系统之间的跃点数(路由器)。 但是,请注意,由于许多路由器使用的是适应网络变化的动态路由协议,所以数据包采用的路由路径可能会发生变化。

    • 在 Linux 和 macOS 上,使用的命令为traceroute MACHINE_IP;在 MS Windows 上,使用的命令为 tracert MACHINE_IP 。traceroute 会尝试通过从本地系统到目标系统的路径发现路由器。

    • 没有直接的方法可以发现从local系统到target系统的路径,但可以依靠 ICMP 来“诱骗”路由器泄露其 IP 地址,可以通过在 IP 标头字段中使用一个小的生存时间 (TTL) 来实现这一点。虽然 TTL 中的 T 代表时间,但 TTL 总体表示数据包在被丢弃之前可以通过的最大路由器/跳数;TTL 并不是最大时间单位数。当路由器接收到一个数据包时,它会将TTL 减一,然后再将其传递给下一个路由器。

    • 如下图所示,IP 包每经过一个路由器,它的 TTL 值就减 1。最初,它以 64 的 TTL 值离开本地系统,经过4个路由器后到达目标系统,TTL值就将变成60。

      Alt text

    • 但是,如果 TTL 达到 0,它将被丢弃,并且一个ICMP Time-to-Live超时消息将被发送给原始发送者。 在下图中,本地系统在发送数据包到路由器之前将 TTL 设置为 1,然后路径上的第一个路由器将 TTL 减 1,导致 TTL 为 0;因此,该路由器将丢弃数据包并发送 ICMP 超时传输错误消息。 请注意,某些路由器配置为在丢弃数据包时不发送此类 ICMP 消息。

      Alt text

    • 在 Linux 上,traceroute命令将首先在 TTL 为 1 的 IP 数据包中发送 UDP 数据报,它会导致第一个路由器遇到 TTL=0 并发送 ICMP Time-to-Live 超时,因此,当TTL 为 1 时将向你显示第一个路由器的 IP 地址。 然后traceroute命令将发送另一个 TTL=2 的数据包,此数据包将在第二个路由器被丢弃……

    • 在以下示例中,从 TryHackMe 的 AttackBox 运行相同的命令 traceroute tryhackme.com,可以注意到不同的运行可能会导致数据包采用不同的路由。

        Traceroute A
        user@AttackBox$ traceroute tryhackme.com
        traceroute to tryhackme.com (172.67.69.208), 30 hops max, 60 byte packets
        1  ec2-3-248-240-5.eu-west-1.compute.amazonaws.com (3.248.240.5)  2.663 ms * ec2-3-248-240-13.eu-west-1.compute.amazonaws.com (3.248.240.13)  7.468 ms
        2  100.66.8.86 (100.66.8.86)  43.231 ms 100.65.21.64 (100.65.21.64)  18.886 ms 100.65.22.160 (100.65.22.160)  14.556 ms
        3  * 100.66.16.176 (100.66.16.176)  8.006 ms *
        4  100.66.11.34 (100.66.11.34)  17.401 ms 100.66.10.14 (100.66.10.14)  23.614 ms 100.66.19.236 (100.66.19.236)  17.524 ms
        5  100.66.7.35 (100.66.7.35)  12.808 ms 100.66.6.109 (100.66.6.109)  14.791 ms *
        6  100.65.14.131 (100.65.14.131)  1.026 ms 100.66.5.189 (100.66.5.189)  19.246 ms 100.66.5.243 (100.66.5.243)  19.805 ms
        7  100.65.13.143 (100.65.13.143)  14.254 ms 100.95.18.131 (100.95.18.131)  0.944 ms 100.95.18.129 (100.95.18.129)  0.778 ms
        8  100.95.2.143 (100.95.2.143)  0.680 ms 100.100.4.46 (100.100.4.46)  1.392 ms 100.95.18.143 (100.95.18.143)  0.878 ms
        9  100.100.20.76 (100.100.20.76)  7.819 ms 100.92.11.36 (100.92.11.36)  18.669 ms 100.100.20.26 (100.100.20.26)  0.842 ms
        10  100.92.11.112 (100.92.11.112)  17.852 ms * 100.92.11.158 (100.92.11.158)  16.687 ms
        11  100.92.211.82 (100.92.211.82)  19.713 ms 100.92.0.126 (100.92.0.126)  18.603 ms 52.93.112.182 (52.93.112.182)  17.738 ms
        12  99.83.69.207 (99.83.69.207)  17.603 ms  15.827 ms  17.351 ms
        13  100.92.9.83 (100.92.9.83)  17.894 ms 100.92.79.136 (100.92.79.136)  21.250 ms 100.92.9.118 (100.92.9.118)  18.166 ms
        14  172.67.69.208 (172.67.69.208)  17.976 ms  16.945 ms 100.92.9.3 (100.92.9.3)  17.709 ms
      

      在上面的 traceroute 输出中,可以看到有14 行编号,每行代表一个路由器/跳。本地系统发送三个 TTL 设置为 1 的数据包,然后发送三个 TTL 设置为 2 的数据包,依此类推。根据网络拓扑,可能会从多达 3 个不同的路由器获得回复,这具体取决于数据包所采用的路由。查看第 12 行,具有列出 IP 地址的第 12 个路由器已经丢弃了 3 次数据包并发送了一个 ICMP 超时传输消息。第 12 行的数据: 99.83.69.207 (99.83.69.207) 17.603 ms 15.827 ms 17.351 ms 显示了每个回复到达我们系统的时间(以毫秒为单位)。

      另一方面,可以看到在第三行只收到了一个回复,输出记录为: 3 * 100.66.16.176 (100.66.16.176) 8.006 ms * 其中的两个星符号表示我们的系统没有收到两条预期的 ICMP 超时传输消息。

      最后,在输出结果的第一行,可以看到离开 AttackBox 的数据包采用不同的路由,可以看到响应 TTL 为 1 的两个路由器,我们的系统从未收到第三条预期的 ICMP 消息。

    • 在 traceroute 程序的第二次运行中,可以注意到这次数据包经过了更长的路由,经过了 26 个路由器。 如果正在对网络中的系统运行跟踪路由命令,则该路由的路径不太可能更改,但是,当数据包需要通过此网络之外的其他路由器时,不能期望路由的路径保持固定。

        Traceroute B
        user@AttackBox$ traceroute tryhackme.com
        traceroute to tryhackme.com (104.26.11.229), 30 hops max, 60 byte packets
        1  ec2-79-125-1-9.eu-west-1.compute.amazonaws.com (79.125.1.9)  1.475 ms * ec2-3-248-240-31.eu-west-1.compute.amazonaws.com (3.248.240.31)  9.456 ms
        2  100.65.20.160 (100.65.20.160)  16.575 ms 100.66.8.226 (100.66.8.226)  23.241 ms 100.65.23.192 (100.65.23.192)  22.267 ms
        3  100.66.16.50 (100.66.16.50)  2.777 ms 100.66.11.34 (100.66.11.34)  22.288 ms 100.66.16.28 (100.66.16.28)  4.421 ms
        4  100.66.6.47 (100.66.6.47)  17.264 ms 100.66.7.161 (100.66.7.161)  39.562 ms 100.66.10.198 (100.66.10.198)  15.958 ms
        5  100.66.5.123 (100.66.5.123)  20.099 ms 100.66.7.239 (100.66.7.239)  19.253 ms 100.66.5.59 (100.66.5.59)  15.397 ms
        6  * 100.66.5.223 (100.66.5.223)  16.172 ms 100.65.15.135 (100.65.15.135)  0.424 ms
        7  100.65.12.135 (100.65.12.135)  0.390 ms 100.65.12.15 (100.65.12.15)  1.045 ms 100.65.14.15 (100.65.14.15)  1.036 ms
        8  100.100.4.16 (100.100.4.16)  0.482 ms 100.100.20.122 (100.100.20.122)  0.795 ms 100.95.2.143 (100.95.2.143)  0.827 ms
        9  100.100.20.86 (100.100.20.86)  0.442 ms 100.100.4.78 (100.100.4.78)  0.347 ms 100.100.20.20 (100.100.20.20)  1.388 ms
        10  100.92.212.20 (100.92.212.20)  11.611 ms 100.92.11.54 (100.92.11.54)  12.675 ms 100.92.11.56 (100.92.11.56)  10.835 ms
        11  100.92.6.52 (100.92.6.52)  11.427 ms 100.92.6.50 (100.92.6.50)  11.033 ms 100.92.210.50 (100.92.210.50)  10.551 ms
        12  100.92.210.139 (100.92.210.139)  10.026 ms 100.92.6.13 (100.92.6.13)  14.586 ms 100.92.210.69 (100.92.210.69)  12.032 ms
        13  100.92.79.12 (100.92.79.12)  12.011 ms 100.92.79.68 (100.92.79.68)  11.318 ms 100.92.80.84 (100.92.80.84)  10.496 ms
        14  100.92.9.27 (100.92.9.27)  11.354 ms 100.92.80.31 (100.92.80.31)  13.000 ms 52.93.135.125 (52.93.135.125)  11.412 ms
        15  150.222.241.85 (150.222.241.85)  9.660 ms 52.93.135.81 (52.93.135.81)  10.941 ms 150.222.241.87 (150.222.241.87)  16.543 ms
        16  100.92.228.102 (100.92.228.102)  15.168 ms 100.92.227.41 (100.92.227.41)  10.134 ms 100.92.227.52 (100.92.227.52)  11.756 ms
        17  100.92.232.111 (100.92.232.111)  10.589 ms 100.92.231.69 (100.92.231.69)  16.664 ms 100.92.232.37 (100.92.232.37)  13.089 ms
        18  100.91.205.140 (100.91.205.140)  11.551 ms 100.91.201.62 (100.91.201.62)  10.246 ms 100.91.201.36 (100.91.201.36)  11.368 ms
        19  100.91.205.79 (100.91.205.79)  11.112 ms 100.91.205.83 (100.91.205.83)  11.040 ms 100.91.205.33 (100.91.205.33)  10.114 ms
        20  100.91.211.45 (100.91.211.45)  9.486 ms 100.91.211.79 (100.91.211.79)  13.693 ms 100.91.211.47 (100.91.211.47)  13.619 ms
        21  100.100.6.81 (100.100.6.81)  11.522 ms 100.100.68.70 (100.100.68.70)  10.181 ms 100.100.6.21 (100.100.6.21)  11.687 ms
        22  100.100.65.131 (100.100.65.131)  10.371 ms 100.100.92.6 (100.100.92.6)  10.939 ms 100.100.65.70 (100.100.65.70)  23.703 ms
        23  100.100.2.74 (100.100.2.74)  15.317 ms 100.100.66.17 (100.100.66.17)  11.492 ms 100.100.88.67 (100.100.88.67)  35.312 ms
        24  100.100.16.16 (100.100.16.16)  19.155 ms 100.100.16.28 (100.100.16.28)  19.147 ms 100.100.2.68 (100.100.2.68)  13.718 ms
        25  99.83.89.19 (99.83.89.19)  28.929 ms *  21.790 ms
        26  104.26.11.229 (104.26.11.229)  11.070 ms  11.058 ms  11.982 ms
      
      • 总而言之,我们可以注意以下几点:

        • 本地系统和目标系统之间的跃点/路由器数量取决于运行 traceroute 的时间。即使在同一网络上或在短时间内重复 traceroute 命令,也无法保证数据包将始终遵循相同的路由路径。

        • 一些路由器会返回一个公共 IP 地址。可以根据预期的渗透测试范围检查其中一些路由器。

        • 一些路由器不会返回 回复信息。

  • Telnet

    • TELNET(电传网络)协议于 1969 年开发,用于通过命令行界面 (CLI) 与远程系统进行通信。命令 telnet 正是使用 TELNET 协议进行远程管理,telnet 使用的默认端口是 23。从安全角度来看,telnet 以明文形式发送所有数据,包括用户名和密码,以明文形式发送可以让任何有权访问通信通道的人轻松窃取登录凭据,telnet 的安全替代方案是 SSH (Secure SHell) 协议。

    • telnet 客户端因其简单性可以用于其他目的:知道了telnet 客户端依赖于 TCP 协议,就可以尝试使用 telnet 连接到目标上基于tcp的任何服务。

    • 使用 telnet MACHINE_IPPORT,可以连接到目标机的TCP 上运行的任何服务,甚至可以交换一些消息,除非这些信息使用了加密。

    • 假设希望发现关于监听端口80的目标Web 服务器的更多信息,可以连接到目标服务器的80端口,然后使用 HTTP 协议进行通信。在此处,无需深入研究 HTTP 协议,只需要发出 GET / HTTP/1.1请求。如果要指定默认索引页面以外的内容,可以发出 GET /page.html HTTP/1.1,它将请求 page.html页面。我们在此处还向远程 Web 服务器指定要使用 HTTP协议的1.1 版本进行通信。

    • 为了获得有效的响应消息,而不是错误消息,还需要为host参数输入一些值 “host: example”并按两次回车键。执行这些步骤之后,目标服务器将提供所请求的索引页面。

      Alt text

      尝试发现已安装的 Web 服务器的类型和版本,例如Server: nginx/1.6.2。 在上面的示例中,因为要与 Web 服务器进行通信,因此使用了基本的 HTTP 命令,如果想连接到邮件服务器,那么需要根据协议使用适当的命令,比如 SMTP 和 POP3。

  • Netcat

    • Netcat(或者简单的nc)有不同的应用,这对渗透测试者来说可能很有价值。Netcat 支持 TCP 和 UDP 协议,它可以充当连接到侦听端口的客户端;或者,它可以充当侦听选择的端口的服务器。因此,它是一个很方便的工具,可以通过 TCP 或 UDP 将其用作简单的客户端或服务器。

    • 可以像使用telnet一样使用netcat连接到目标服务器,输入nc MACHINE_IP PORT收集目标的banner(横幅)信息,这与之前的telnet MACHINE_IP PORT命令非常相似。 请注意,可能需要在 GET 行之后按 SHIFT+ENTER。
        pentester@TryHackMe$ nc MACHINE_IP 80
        GET / HTTP/1.1
        host: netcat
      
        HTTP/1.1 200 OK
        Server: nginx/1.6.2
        Date: Tue, 17 Aug 2021 11:39:49 GMT
        Content-Type: text/html
        Content-Length: 867
        Last-Modified: Tue, 17 Aug 2021 11:12:16 GMT
        Connection: keep-alive
        ETag: "611b9990-363"
        Accept-Ranges: bytes  
      

      在上面显示的输出中,使用 nc MACHINE_IP 80 连接到 MACHINE_IP 的端口 80;接下来,使用GET / HTTP/1.1针对目标服务器的默认页面发出 get请求,还向目标服务器指定我们的客户端支持 HTTP协议的 1.1 版本;最后,需要给host起一个名字,所以添加了一个新的行–host:netcat,在此处可以任意命名host。

      根据收到的输出 Server: nginx/1.6.2 ,可以知道在目标的端口80 上,版本为1.6.2的Nginx正在监听传入的连接。

    • 可以使用 netcat 监听 TCP 端口并连接到另一个系统上的监听端口。在服务器系统上,如果希望打开一个端口并监听它,可以使用nc -lp 1234或者nc -vnlp 1234,这相当于 nc -v -l -n -p 1234,此处字母的确切顺序无关紧要,只要指定的端口号前面带有-p参数就行。

      Alt text

      • 注意:

        • -p 选项应该出现在你要监听的端口号之前。
        • -n 选项将避免 DNS 查找和警告。
        • 小于 1024 的端口号需要 root 权限才能监听。
    • 在客户端,可以使用 nc MACHINE_IP PORT_NUMBER ,当成功建立与目标服务器的连接后,你在客户端键入的任何内容都将在服务器端回显,反之亦然。

    • 考虑以下示例: 在服务器端,设置监听器监听端口 1234 ,可以使用命令 nc -vnlp 1234(与 nc -lvnp 1234 相同)来实现这一点,目标服务器的 IP 地址为 MACHINE_IP,因此可以通过执行 nc MACHINE_IP 1234 从客户端连接到目标服务器,成功完成此连接之后,在 TCP 隧道一侧键入的任何内容都将回显到另一侧。
  • Putting It All Together

    • 可以使用 traceroute 映射出从本地机器到目标机器的路由路径,使用 ping命令检查目标系统是否响应 ICMP Echo,并使用 telnet 尝试连接目标–来检查目标上哪些端口是开放的和可访问的。一个可用的扫描器会在更高级和复杂的级别上执行以上的一系列操作,比如nmap扫描。

      Alt text

    • 调出浏览器中的开发者工具的快捷键:

      Alt text

Nmap Live Host Discovery (Nmap存活主机发现)

  • About Nmap

    Nmap 由网络安全专家和开源程序员 Gordon Lyon (Fyodor) 创建,于 1997 年发布。Nmap 是 Network Mapper 的缩写,是在 GPL 许可下发布的免费开源软件,是用于映射网络、识别活动主机和发现正在运行的服务的行业标准工具。 Nmap 的脚本引擎可以进一步扩展其功能,从指纹识别服务到漏洞利用都有所涉及。

    Nmap 扫描通常会执行下图所示的步骤,尽管许多步骤是可选的并且取决于所提供的命令行参数。

    Alt text

  • Subnetworks

    • 关于网段和子网的术语解释:网段是使用共享介质连接的一组计算机,这些共享介质可以是以太网交换机或 WiFi 接入点;在 IP 网络中,子网通常相当于连接在一起并配置为使用同一路由器的一个或多个网段。网段指的是物理连接,子网指的是逻辑连接。

    • 在下面的网络图中,有四个网段或子网,一般来说,自己的系统将连接到这些网段/子网之一。这些子网有自己的 IP 地址范围,并通过路由器连接到更广泛的网络,根据每个网络的具体情况,可能会有防火墙强制执行安全策略。

      Alt text

      • 上图显示了两种类型的子网:

        带/16的子网,表示子网掩码可以写成255.255.0.0 ,这个子网可以有大约 65,000 台主机。

        带/24的子网,表示子网掩码可以写成255.255.255.0 ,这个子网可以有大约 250 台主机。

      • 作为主动侦察的一部分,希望发现有关一组主机或子网的更多信息。

      • 假设自己连接到与目标系统所在的子网,可以期望自己的扫描器依赖 ARP(地址解析协议)查询来发现活动主机。ARP 查询旨在获取硬件地址(MAC 地址),以便通过链路层进行通信; 但是,也可以使用这个协议来推断目标主机是否在线。如果自己在网络 A 中,则只能使用 ARP 来发现该子网 (10.1.100.0/24) 内的设备。

      • 假设自己连接到的子网与目标系统所在的子网不同,在这种情况下,自己的的扫描器所生成的所有数据包都将通过默认网关(路由器)路由到另一个子网上的目标系统上;但是,ARP 查询并不会被路由,所以ARP查询无法穿过子网路由器(ARP 是链路层协议,ARP 数据包会绑定到对应的子网)。

  • Enumerating Targets

    • 在第一节中提到了可用于扫描的不同技术。在详细解释每个扫描技术并将其用于实时目标之前,需要明确指定要扫描的目标,一般来说,可以提供一个列表、范围或子网当做要扫描的目标。关于目标格式的例子有:

      • list(列表): MACHINE_IP scanme.nmap.org example.com 将扫描 3 个 IP 地址。

      • range(范围):10.11.12.15-20 将扫描 6 个 IP 地址:10.11.12.15、10.11.12.16、…和 10.11.12.20。

      • subnet(子网):MACHINE_IP/30 (30位子网掩码:255.255.255.252)将扫描 4 个 IP 地址。

      • 还可以提供一个文件作为目标列表的输入:nmap -iL list_of_hosts.txt

      • 如果要检查 Nmap 将扫描的主机列表,可以使用 nmap -sL TARGETS,此选项会提供Nmap将要扫描的主机的详细列表并且无需真正去扫描它们;并且,在使用此选项时 Nmap还会尝试对所有目标进行反向 DNS 解析以获取它们的域名。目标的域名可能会向渗透测试者透露各种信息(如果不希望 Nmap 连接到 DNS 服务器,可以添加 -n选项)。

  • Discovering Live Hosts

    • 审视下图中所示的 TCP/IP 层,我们将利用协议来发现活动主机,从下到上,我们可以使用:

      • 来自链路层的 ARP协议

      • 来自网络层的 ICMP协议

      • 来自传输层的 TCP协议

      • 来自传输层的 UDP协议

      Alt text

    • 回顾协议:

      • 此处使用ARP协议有一个目的:向网段上的广播地址发送帧,并要求具有特定 IP 地址的计算机通过提供其 MAC(硬件)地址来响应。

      • ICMP 有多种类型,ICMP ping 使用类型 8(Echo)和类型 0(Echo Reply),如果你想要ping同一子网上的系统,ARP 查询应该在 ICMP Echo 之前。

      • 虽然 TCP 和 UDP 是传输层协议,但出于网络扫描的目的,扫描器可以将特制数据包发送到常见的 TCP 或 UDP 端口,以检查目标是否会响应。 这种方法很有效,尤其是在 ICMP Echo 被阻塞时。

  • Nmap Host Discovery Using ARP

    • 有多种方法可以发现在线主机,当没有提供主机发现选项时,Nmap 遵循以下方法来发现活动主机:

      • 当特权用户尝试扫描本地网络(以太网)上的目标时,Nmap会使用 ARP 请求,特权用户是 root 或属于 sudoers(可以运行 sudo 的用户)。

      • 当特权用户尝试扫描本地网络之外的目标时,Nmap 会使用 ICMP echo请求、发送到端口80的TCP ACK(Acknowledge)、发送到端口443的TCP SYN(Synchronize) 和 ICMP 时间戳请求。

      • 当非特权用户尝试扫描本地网络之外的目标时,Nmap会通过向端口 80 和 443 发送 SYN 数据包来尝试进行TCP 3 次握手操作。

    • 默认情况下,Nmap会使用 ping 扫描来查找活动主机,然后继续对活动主机进行扫描。如果想使用 Nmap 来发现在线主机并且不需要对在线主机进行端口扫描,可以使用nmap -sn TARGETS ,-sn表示仅主机发现。

    • 仅当与目标系统位于同一子网时,才可以进行 ARP 扫描。在以太网 (802.3) 和 WiFi (802.11) 上,需要知道其他系统的 MAC 地址才能与之通信,MAC地址对于链路层标头是必需的,标头包含源 MAC 地址和目标 MAC 地址以及其他字段。

    • 为了获取 MAC 地址,操作系统会发送一个 ARP 查询,有主机回复 ARP 查询即代表该主机已启动,ARP 查询仅在目标与你位于同一子网时才有效,即在同一以太网/WiFi 上。

    • 如果希望 Nmap 只执行 ARP 扫描而不进行端口扫描,可以使用 nmap -PR -sn TARGETS,其中-PR 表示你需要执行ARP 扫描,-sn表示仅主机发现。

    • 以下示例显示的是Nmap仅使用 ARP 进行主机发现而不进行任何端口扫描。可以使用nmap -PR -sn MACHINE_IP/24来发现与目标机器位于同一子网上的所有活动主机。

        pentester@TryHackMe$ sudo nmap -PR -sn 10.10.210.6/24
      
        Starting Nmap 7.60 ( https://nmap.org ) at 2021-09-02 07:12 BST
        Nmap scan report for ip-10-10-210-75.eu-west-1.compute.internal (10.10.210.75)
        Host is up (0.00013s latency).
        MAC Address: 02:83:75:3A:F2:89 (Unknown)
        Nmap scan report for ip-10-10-210-100.eu-west-1.compute.internal (10.10.210.100)
        Host is up (-0.100s latency).
        MAC Address: 02:63:D0:1B:2D:CD (Unknown)
        Nmap scan report for ip-10-10-210-165.eu-west-1.compute.internal (10.10.210.165)
        Host is up (0.00025s latency).
        MAC Address: 02:59:79:4F:17:B7 (Unknown)
        Nmap scan report for ip-10-10-210-6.eu-west-1.compute.internal (10.10.210.6)
        Host is up.
        Nmap done: 256 IP addresses (4 hosts up) scanned in 3.12 seconds
      
    • 在这种情况下,AttackBox 的 IP 地址为 10.10.210.6,它将使用 ARP请求 来发现同一子网上的活动主机。 ARP扫描有效,如下图所示,Nmap 向所有目标计算机发送 ARP 请求,在线的计算机应发送 ARP 回复。

      Alt text

    • 如果查看使用 tcpdump 或 Wireshark 等工具生成的数据包,将会看到类似于下图的网络流量。在图中,Wireshark 显示了与每个 ARP 请求相关的源 MAC 地址、目标 MAC 地址、协议和查询。

      • 源地址是AttackBox 的 MAC 地址,而目标是广播地址,因为不知道目标的 MAC 地址;但稍后能看到目标的 IP 地址,它会出现在 Info 列中。 在图中,可以看到正在请求子网上所有IP地址的MAC地址,从 10.10.210.1 开始。 具有询问的 IP 地址的主机将发送一个带有其 MAC 地址的 ARP 回复,这就是知道它在线的方式。

        Alt text

    • 说到 ARP 扫描,应该提到一个围绕 ARP 查询构建的扫描器:arp-scan,它提供了许多选项来自定义扫描,可以访问 arp-scan wiki 了解详细信息。 一种常见的参数选择是 arp-scan –localnet 或简单的 arp-scan -l, 此命令将向本地网络上的所有有效 IP 地址发送 ARP 查询。 此外,如果自身系统有多个接口,并且有兴趣在其中一个接口上发现活动主机,则可以使用-I指定接口,例如 sudo arp-scan -I eth0 -l 将为 eth0 接口上的所有有效 IP 地址发送 ARP 查询。

      • arp-scan扫描器可以使用 apt install arp-scan 命令进行安装。在下面的示例中,使用 arp-scan ATTACKBOX_IP/24 扫描了 AttackBox 的子网,由于在接近前一条命令 nmap -PR -sn ATTACKBOX_IP/24 的执行时间范围内运行此扫描,因此我们获得了相同的三个实时目标。

          pentester@TryHackMe$ sudo arp-scan 10.10.210.6/24
        
          Interface: eth0, datalink type: EN10MB (Ethernet)
          WARNING: host part of 10.10.210.6/24 is non-zero
          Starting arp-scan 1.9 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
          10.10.210.75	02:83:75:3a:f2:89	(Unknown)
          10.10.210.100	02:63:d0:1b:2d:cd	(Unknown)
          10.10.210.165	02:59:79:4f:17:b7	(Unknown)
        
          4 packets received by filter, 0 packets dropped by kernel
          Ending arp-scan 1.9: 256 hosts scanned in 2.726 seconds (93.91 hosts/sec). 3 responded
        
      • 同样,arp-scan 命令也将生成许多 ARP 查询,可以使用 tcpdump、Wireshark 或类似工具看到这些查询。可以注意到,arp-scan 和 nmap -PR -sn 的数据包捕获产生了相似的流量模式, 下面是 Wireshark 的输出示意图。

        Alt text

  • Nmap Host Discovery Using ICMP

    • 可以 ping 目标网络上的每个 IP 地址,看看谁会使用 ping reply(ICMP 类型 0)响应我们的 ping(ICMP 类型 8/Echo)请求。尽管这将是最直接的方法,但它并不总是可靠的,因为许多防火墙都会阻止 ICMP echo,MS Windows 配置了主机防火墙,默认情况下会阻止 ICMP echo请求。

      Alt text

    • 请记住,如果目标位于同一子网上,则 ARP 查询将先于 ICMP 请求。

    • 要使用 ICMP echo请求来发现活动主机,请添加选项 -PE(如果不想对端口进行扫描,再添加 -sn即可)如下图所示,ICMP echo扫描通过发送 ICMP echo请求来工作,并期望在线目标能够回复 ICMP echo reply 。

    • 在下面的示例中,使用 nmap -PE -sn MACHINE_IP/24 扫描目标的子网,此扫描会将 ICMP echo数据包发送到子网上的每个 IP 地址。希望活动主机能够回复ping消息,但是,请记住有很多防火墙可能会阻止 ICMP。

      • 下面显示了在AttackBox 中使用命令sudo nmap -PE -sn MACHINE_IP/24扫描虚拟机的 C 类子网的结果。

          pentester@TryHackMe$ sudo nmap -PE -sn 10.10.68.220/24
        
          Starting Nmap 7.60 ( https://nmap.org ) at 2021-09-02 10:16 BST
          Nmap scan report for ip-10-10-68-50.eu-west-1.compute.internal (10.10.68.50)
          Host is up (0.00017s latency).
          MAC Address: 02:95:36:71:5B:87 (Unknown)
          Nmap scan report for ip-10-10-68-52.eu-west-1.compute.internal (10.10.68.52)
          Host is up (0.00017s latency).
          MAC Address: 02:48:E8:BF:78:E7 (Unknown)
          Nmap scan report for ip-10-10-68-77.eu-west-1.compute.internal (10.10.68.77)
          Host is up (-0.100s latency).
          MAC Address: 02:0F:0A:1D:76:35 (Unknown)
          Nmap scan report for ip-10-10-68-110.eu-west-1.compute.internal (10.10.68.110)
          Host is up (-0.10s latency).
          MAC Address: 02:6B:50:E9:C2:91 (Unknown)
          Nmap scan report for ip-10-10-68-140.eu-west-1.compute.internal (10.10.68.140)
          Host is up (0.00021s latency).
          MAC Address: 02:58:59:63:0B:6B (Unknown)
          Nmap scan report for ip-10-10-68-142.eu-west-1.compute.internal (10.10.68.142)
          Host is up (0.00016s latency).
          MAC Address: 02:C6:41:51:0A:0F (Unknown)
          Nmap scan report for ip-10-10-68-220.eu-west-1.compute.internal (10.10.68.220)
          Host is up (0.00026s latency).
          MAC Address: 02:25:3F:DB:EE:0B (Unknown)
          Nmap scan report for ip-10-10-68-222.eu-west-1.compute.internal (10.10.68.222)
          Host is up (0.00025s latency).
          MAC Address: 02:28:B1:2E:B0:1B (Unknown)
          Nmap done: 256 IP addresses (8 hosts up) scanned in 2.11 seconds
        
        • 扫描输出显示有八台主机已经被启动,此外,输出结果还显示了这些主机的 MAC 地址。一般来说,并不希望了解目标的 MAC 地址,除非它们与自身系统在同一个子网上。上面的输出表明 Nmap不需要发送 ICMP 数据包,因为它是根据收到的 ARP 响应来确认这些主机已启动。
      • 重复上面的扫描,但是,这一次将使用属于不同子网的系统进行扫描(执行扫描操作的系统不在10.10.68.220/24子网中),扫描结果和上面的扫描相似,但不会显示 MAC 地址。

          pentester@TryHackMe$ sudo nmap -PE -sn 10.10.68.220/24
        
          Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 12:16 EEST
          Nmap scan report for 10.10.68.50
          Host is up (0.12s latency).
          Nmap scan report for 10.10.68.52
          Host is up (0.12s latency).
          Nmap scan report for 10.10.68.77
          Host is up (0.11s latency).
          Nmap scan report for 10.10.68.110
          Host is up (0.11s latency).
          Nmap scan report for 10.10.68.140
          Host is up (0.11s latency).
          Nmap scan report for 10.10.68.142
          Host is up (0.11s latency).
          Nmap scan report for 10.10.68.220
          Host is up (0.11s latency).
          Nmap scan report for 10.10.68.222
          Host is up (0.11s latency).
          Nmap done: 256 IP addresses (8 hosts up) scanned in 8.26 seconds            
        
        • 如果使用 Wireshark 之类的工具查看网络数据包,将看到类似于下图的内容:有一个源 IP 地址位于与目标子网不同的子网上,正在向目标子网中的所有 IP 地址发送 ICMP echo请求,以查看哪个会回复。

          Alt text

    • 由于 ICMP echo请求往往会被阻止,因此还可以考虑使用 ICMP 时间戳或 ICMP 地址掩码请求来判断系统是否在线。

      • Nmap可以使用时间戳请求(ICMP 类型 13)并检查它是否会得到时间戳回复(ICMP 类型 14)以此来判断目标主机是否存活,可以添加 -PP 选项告诉 Nmap 使用 ICMP 时间戳请求。 如下图所示,可以期望得到存活主机的回复。

        Alt text

          pentester@TryHackMe$ sudo nmap -PP -sn 10.10.68.220/24
        
          Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 12:06 EEST
          Nmap scan report for 10.10.68.50
          Host is up (0.13s latency).
          Nmap scan report for 10.10.68.52
          Host is up (0.25s latency).
          Nmap scan report for 10.10.68.77
          Host is up (0.14s latency).
          Nmap scan report for 10.10.68.110
          Host is up (0.14s latency).
          Nmap scan report for 10.10.68.140
          Host is up (0.15s latency).
          Nmap scan report for 10.10.68.209
          Host is up (0.14s latency).
          Nmap scan report for 10.10.68.220
          Host is up (0.14s latency).
          Nmap scan report for 10.10.68.222
          Host is up (0.14s latency).
          Nmap done: 256 IP addresses (8 hosts up) scanned in 10.93 seconds
        
        • 与之前的 ICMP 扫描类似,此扫描将向目标子网中的每个有效 IP 地址发送许多 ICMP 时间戳请求。在下面的 Wireshark 截图中,可以看到一个源 IP 地址正在向每个可能的 IP 地址发送 ICMP 数据包以发现在线主机。

          Alt text

      • 同样,Nmap还可以使用地址掩码查询(ICMP 类型 17)并检查它是否获得地址掩码回复(ICMP 类型 18)以此来判断主机是否存活。可以使用选项 -PM 启用此扫描,如下图所示,存活的主机应该会回复 ICMP 地址掩码请求。

        Alt text

        为了尝试使用 ICMP 地址掩码查询发现活动主机,可以执行命令 nmap -PM -sn MACHINE_IP/24。虽然根据之前的扫描,至少有八台主机已经被启动,但这次扫描的结果却没有返回任何内容,原因是路由上的目标系统或防火墙正在阻止这种类型的 ICMP 数据包。

        因此,有必要学习多种方法来实现相同的结果,如果一种类型的数据包被阻塞,可以选择另一种类型的数据包来发现目标网络和服务。

          pentester@TryHackMe$ sudo nmap -PM -sn 10.10.68.220/24
        
          Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 12:13 EEST
          Nmap done: 256 IP addresses (0 hosts up) scanned in 52.17 seconds
        

        尽管没有收到任何回复,也无法确定哪些主机在线,但必须注意到此扫描会向每个有效 IP 地址发送 ICMP 地址掩码请求并等待回复,而且每个 ICMP 请求都发送了两次,如下面的截图所示。

        Alt text

  • Nmap Host Discovery Using TCP and UDP

    • TCP SYN Ping

      • 可以发送一个将 SYN(Synchronize)标志设置为 TCP 端口(默认为 80)的数据包,然后等待响应。一个开放的端口应该回复一个 SYN/ACK(Acknowledge);一个关闭的端口将导致 RST(Reset)。

      • 在这种情况下,只检查是否会得到任何响应来推断主机是否已启动,端口的具体状态在这里并不重要。下图显示了 TCP 3 次握手通常是如何工作的 。

        Alt text

      • 如果希望 Nmap 使用 TCP SYN ping,可以通过选项 -PS 后跟端口号、范围、列表或它们的组合来实现。 例如,-PS21 将针对端口 21,而 -PS21-25 将针对端口 21、22、23、24 和 25,最后 -PS80,443,8080 将针对三个端口 80、443 和 8080 。

      • 特权用户(root 和 sudoers)可以发送 TCP SYN 数据包,即使端口打开也不需要完成 TCP 3 次握手,如下图所示。 如果端口打开,非特权用户别无选择,只能完成 3 次握手 。

        Alt text

        • 运行nmap -PS -sn MACHINE_IP/24来扫描目标 VM 子网。 正如我们在下面的输出中看到的,能够发现五台主机

            pentester@TryHackMe$ sudo nmap -PS -sn 10.10.68.220/24
          
            Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 13:45 EEST
            Nmap scan report for 10.10.68.52
            Host is up (0.10s latency).
            Nmap scan report for 10.10.68.121
            Host is up (0.16s latency).
            Nmap scan report for 10.10.68.125
            Host is up (0.089s latency).
            Nmap scan report for 10.10.68.134
            Host is up (0.13s latency).
            Nmap scan report for 10.10.68.220
            Host is up (0.11s latency).
            Nmap done: 256 IP addresses (5 hosts up) scanned in 17.38 seconds
          
        • 通过查看下图中 Wireshark 上的网络流量来仔细了解幕后发生的事情。从技术上讲,由于我们没有在 TCP ping 扫描中指定要使用的任何 TCP 端口,因此 Nmap 会使用公共端口; 在这种情况下,它会是 TCP 端口 80,任何侦听端口 80 的服务都应该回复,从而间接表明主机在线 。

          Alt text

    • TCP ACK Ping

      • 这里发送一个设置了 ACK 标志的数据包,必须以特权用户身份运行 Nmap 才能完成此操作,如果以非特权用户身份尝试,Nmap 将会尝试进行TCP 3 次握手操作 。

      • 在默认情况下,此处会使用端口 80,TCP ACK Ping的语法类似于 TCP SYN Ping 。在Nmap中TCP ACK Ping使用的是-PA参数,后面可以跟一个端口号、范围、列表或它们的组合。 例如, -PA21、-PA21-25 和 -PA80,443,8080 ,如果未指定端口,则将使用默认端口 80 。

      • 下图显示任何带有 ACK 标志的 TCP 数据包都应该得到一个设置了 RST 标志的 TCP 数据包。目标会以设置的 RST 标志进行响应,是因为带有 ACK 标志的 TCP 数据包并不是任何正在进行的连接的一部分,此处预期的响应可用于检测目标主机是否已启动 。

        Alt text

        • 运行sudo nmap -PA -sn MACHINE_IP/24来发现目标子网上的在线主机。 我们可以看到 TCP ACK ping 扫描检测到五个主机启动 。

            pentester@TryHackMe$ sudo nmap -PA -sn 10.10.68.220/24
          
            Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 13:46 EEST
            Nmap scan report for 10.10.68.52
            Host is up (0.11s latency).
            Nmap scan report for 10.10.68.121
            Host is up (0.12s latency).
            Nmap scan report for 10.10.68.125
            Host is up (0.10s latency).
            Nmap scan report for 10.10.68.134
            Host is up (0.10s latency).
            Nmap scan report for 10.10.68.220
            Host is up (0.10s latency).
            Nmap done: 256 IP addresses (5 hosts up) scanned in 29.89 seconds
          
        • 如果查看下图所示的网络流量,就会发现许多设置了 ACK 标志的数据包发送到目标系统的 80 端口。 Nmap会将每个数据包发送两次,不响应的系统代表其处于脱机状态或无法访问状态 。

          Alt text

    • UDP Ping

      • 使用 UDP 来发现主机是否在线:与 TCP SYN ping 不同,将 UDP 数据包发送到开放端口预计不会导致任何回复;但是,如果向一个关闭的 UDP 端口发送一个 UDP 数据包,可以得到一个ICMP 端口不可达的数据包,这表明目标系统已启动且可用 。

      • 在下图中,可以看到一个 UDP 数据包被发送到一个开放的 UDP 端口并且没有触发任何响应;但是,当向任何关闭的 UDP 端口发送 UDP 数据包就可能会触发间接指示目标主机在线的响应 。

        Alt text

        • Nmap 使用 -PU 进行 UDP ping操作,UDP ping指定端口的语法类似于 TCP SYN ping 和 TCP ACK ping 。在以下示例中,使用nmap进行 UDP 扫描,发现了五个活动主机 。

            pentester@TryHackMe$ sudo nmap -PU -sn 10.10.68.220/24
          
            Starting Nmap 7.92 ( https://nmap.org ) at 2021-09-02 13:45 EEST
            Nmap scan report for 10.10.68.52
            Host is up (0.10s latency).
            Nmap scan report for 10.10.68.121
            Host is up (0.10s latency).
            Nmap scan report for 10.10.68.125
            Host is up (0.14s latency).
            Nmap scan report for 10.10.68.134
            Host is up (0.096s latency).
            Nmap scan report for 10.10.68.220
            Host is up (0.11s latency).
            Nmap done: 256 IP addresses (5 hosts up) scanned in 9.20 seconds
          
        • 检查生成的 UDP 数据包:在下面的 Wireshark 截图中,可以注意到 Nmap 会将 UDP 数据包发送到最有可能关闭的 UDP 端口。 下图显示 Nmap 使用一个不常见的 UDP 端口来触发 ICMP 目标不可达(port unreachable)错误,以此间接指示目标主机在线 。

          Alt text

  • Masscan

    • Masscan扫描器也会使用和nmap类似的方法来发现可用系统,但是,为了快速完成网络扫描,Masscan 生成数据包的速率非常激进。

    • Masscan的语法和nmap非常相似:-p 后面可以跟一个端口号、列表或范围 。以下是一些示例:

      • masscan MACHINE_IP/24 -p443
      • masscan MACHINE_IP/24 -p80,443
      • masscan MACHINE_IP/24 -p22-25
      • masscan MACHINE_IP/24 ‐‐top-ports 100
    • Masscan的安装:apt install masscan

  • Using Reverse-DNS Lookup

    • Nmap的默认行为会使用反向 DNS 查询在线主机,因为主机名可以透露很多信息,所以这可能是一个有用的步骤;但是,如果不想发送此类 DNS 查询,请使用 -n 跳过此步骤 。

    • 默认情况下,Nmap会查找在线主机;但是,即使是脱机主机,也可以使用选项-R 来查询 DNS 服务器,如果要查询特定的DNS服务器,可以添加 –dns-servers DNS_SERVER 选项 。

  • Summary

    Alt text

    如果只想进行主机发现而不进行端口扫描,可以添加 -sn,如果省略 -sn 参数将使 Nmap 默认对活动主机进行端口扫描 。

    Alt text

Nmap Basic Port Scans Nmap (基本端口扫描)

  • TCP and UDP Ports

    • 就像 IP 地址用于指定网络上的主机一样,TCP 端口或 UDP 端口用于标识在该主机上运行的网络服务。服务器遵循特定的网络协议来提供网络服务,此处可参考的示例包括提供时间、响应 DNS 查询和提供网页等网络服务。

    • 一个端口通常会链接到对应的某个服务,例如,HTTP 服务器默认会绑定到 TCP 端口 80;此外,如果 HTTP 服务器支持 SSL/TLS,它将侦听 TCP 端口 443。(TCP 端口 80 和 443 是 HTTP 和 HTTPS 的默认端口;但是,如果需要,网络服务器管理员可能会选择其他端口号。SSH – 22 DNS – 53 )

    • 在相同的 IP 地址上,任何单个TCP 或 UDP 端口上最多只能有一项服务可以被侦听。

    • 可以简单地将端口分为两种状态:

      • Open:打开的端口表示该端口上有一些服务正在侦听。

      • Closed:关闭的端口表示该端口上没有服务被侦听。

    • 但是,在实际情况中,我们需要考虑防火墙的影响,例如,一个端口可能是开放的,但防火墙可能会阻止数据包。 因此,Nmap 将考虑以下六种端口状态:

      • Open:表示服务正在监听指定的端口。

      • Closed:表示没有服务在监听指定的端口,尽管该端口是可访问的。 关于 “ 可访问 “,意思是它是可访问的并且没有被防火墙或其他安全设备/程序阻止。

      • Filtered:表示由于端口不可访问,Nmap无法判断该端口是打开还是关闭。 这种状态通常是由于防火墙阻止 Nmap 到达该端口,Nmap 的数据包可能会被阻止到达该端口; 或者,响应被阻止到达 Nmap 的主机。

      • Unfiltered:表示虽然端口是可访问的,但 Nmap 无法确定端口是打开还是关闭。 使用 ACK 扫描 (-sA )时可能会遇到此状态。

      • Open Filtered:这意味着 Nmap 无法确定端口是打开的还是被过滤的。
      • Closed Filtered:这意味着 Nmap 无法确定端口是关闭还是过滤。
  • TCP Flags

    • Nmap 支持不同类型的 TCP 端口扫描,要了解这些端口扫描之间的区别,需要查看 TCP 标头。

    • TCP 标头是 TCP 段的前 24 个字节,下图显示了 RFC 793 中定义的 TCP 标头。这个图起初看起来很复杂;但是,其实很容易理解:在第一行,有源 TCP 端口号和目标端口号,可以看到端口号被分配了 16 位(2 个字节);在第二行和第三行中,有序列号和确认号;全图总共 6 行,每行分配了 32 位(4 个字节),一共有 24 个字节。

      Alt text

    • 需要关注的重点是Nmap可以设置或取消设置的TCP标志。以红色突出显示了 TCP 标志,设置标志位意味着将其值设置为 1。

    • 从左到右,TCP 标头标志是:

      • URG:紧急(Urgent )标志表示紧急指针字段是有效的。紧急指针(urgent pointer)指示传入的数据是紧急的,并且设置了 URG 标志的 TCP 段会立即处理,而无需考虑必须等待先前发送的 TCP 段。

      • ACK:确认(Acknowledgement )标志表示确认号是有效的。它用于确认 TCP 段的接收。

      • PSH:推送(Push)标志,要求 TCP 及时将数据传递给应用程序。

      • RST:复位(Reset )标志用于复位连接。另一个设备(例如防火墙)可能会发送它来断开 TCP 连接;当数据发送到主机并且接收端没有服务应答时也会使用此标志。

      • SYN:同步(Synchronize )标志,用于启动 TCP 3 次握手并与其他主机同步序列号。 在建立 TCP 连接时,会随机设置序列号。

      • FIN:发送方没有更多数据要发送。

  • TCP Connect Scan

    • TCP 连接扫描通过完成 TCP 3 次握手来工作。在标准的 TCP 连接建立中,客户端会发送一个设置了 SYN 标志的 TCP 数据包,如果目标端口是打开的,则目标服务器将以 SYN/ACK 响应,最后,客户端再通过发送 ACK 完成TCP 3 次握手。

      Alt text

    • 想了解TCP 端口是否打开,而不是为了建立 TCP 连接:因此,在使用nmap进行TCP连接扫描时,会通过发送 RST/ACK 确认其状态,从而使TCP连接断开。在nmap中你可以选择使用 -sT选项运行 TCP 连接扫描。

      Alt text

    • 需要注意的是,如果你不是特权用户(root 或 sudoer),nmap中的TCP 连接扫描是发现开放的TCP端口的唯一可能选项。

    • 在以下 Wireshark 数据包捕获窗口中,可以看到 Nmap 会发送带有 SYN 标志的 TCP 数据包到各种端口,256、443、143 等。

    • 默认情况下,Nmap 会尝试连接 1000 个最常用的端口。关闭的 TCP 端口会用 RST/ACK 响应 SYN 数据包,以此表明它没有打开,当尝试与它们启动 TCP 3 次握手时,所有关闭的端口都会重复这种模式。

      Alt text

      • 从上图可以注意到 143 端口是开放的,所以它会回复一个 SYN/ACK,然后Nmap 再通过发送一个 ACK 完成了TCP 3 次握手过程。
    • 下图显示了Nmap 主机和目标系统的 143 端口之间交换的所有数据包。前三个数据包是正在完成的 TCP 3 次握手,然后第四个数据包会使用RST/ACK 数据包将TCP连接拆毁。

      Alt text

    • 为了说明 -sT(TCP 连接扫描)的效果,请查看以下命令示例,它将返回 开放状态下的目标端口的详细列表。

        pentester@TryHackMe$ nmap -sT MACHINE_IP
      
        Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 09:53 BST
        Nmap scan report for MACHINE_IP
        Host is up (0.0024s latency).
        Not shown: 995 closed ports
        PORT    STATE SERVICE
        22/tcp  open  ssh
        25/tcp  open  smtp
        80/tcp  open  http
        111/tcp open  rpcbind
        143/tcp open  imap
        MAC Address: 02:45:BF:8A:2D:6B (Unknown)
      
        Nmap done: 1 IP address (1 host up) scanned in 0.40 seconds        
      
      • 请注意,可以使用 -F 启用快速模式并将扫描端口的数量从 1000 个减少到 100 个最常见的端口。值得一提的是,还可以添加 -r 选项以连续顺序扫描端口,而不是随机顺序;当测试端口是否以一致的方式打开时,此选项会很有用。
  • TCP SYN Scan

    • 在Nmap中,非特权用户仅限于使用TCP连接扫描,但是,Nmap默认扫描模式是 SYN 扫描,该扫描模式需要特权(root 或 sudoer)用户才能运行。SYN 扫描不需要完成 TCP 3 次握手;相反,它会在收到服务器的响应后断开连接。

    • 因为没有建立 TCP 连接,所以这降低了扫描被记录的机会,在Nmap中可以使用 -sS 选项来选择这种扫描类型。下图显示了 TCP SYN 扫描如何在未完成 TCP 3 次握手的情况下工作。

      Alt text

      • 以下来自Wireshark的截图显示了TCP SYN 扫描进行的过程,目标的TCP 端口关闭时的行为和在TCP 连接扫描中类似(关闭的目标端口会响应一个RST,ACK)。

      Alt text

    • 为了更好地查看两种扫描(TCP连接扫描和TCP SYN扫描)之间的差异,请参考以下的截图。

      • 在下图的上半部分,可以看到一个 TCP连接扫描 -sT 的流量情况:任何打开的 TCP 端口都需要在Nmap关闭连接之前完成 TCP 3 次握手;在下图的下半部分,我们看到一个 SYN 扫描 -sS 是不需要完成 TCP 3 次握手的,相反,一旦收到来自目标的 SYN/ACK 数据包,Nmap 就会发送一个 RST 数据包来断开与目标端口的连接过程。

      Alt text

    • TCP SYN 扫描是以特权用户运行 Nmap 时的默认扫描模式(以 root 身份运行或使用 sudo),这是一个非常可靠的选择。SYN扫描能够成功地发现之前通过 TCP 连接扫描找到的开放端口,但不会与目标端口建立完全的TCP 连接。

        pentester@TryHackMe$ sudo nmap -sS MACHINE_IP
      
        Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 09:53 BST
        Nmap scan report for MACHINE_IP
        Host is up (0.0073s latency).
        Not shown: 994 closed ports
        PORT    STATE SERVICE
        22/tcp  open  ssh
        25/tcp  open  smtp
        80/tcp  open  http
        110/tcp open  pop3
        111/tcp open  rpcbind
        143/tcp open  imap
        MAC Address: 02:45:BF:8A:2D:6B (Unknown)
      
        Nmap done: 1 IP address (1 host up) scanned in 1.60 seconds
      
  • UDP Scan

    • UDP 是一种无连接协议,因此它不需要任何握手来建立连接。不能保证侦听 UDP 端口的服务会响应数据包,但是,如果将 UDP 数据包发送到关闭的端口,则会返回 ICMP 端口不可达错误(类型 3,代码 3)。 在nmap中,可以使用 -sU 选项执行UDP 扫描,此外,也可以将其与另一个 TCP 扫描结合使用。

    • 如下图显示,如果向一个开放的 UDP 端口发送一个 UDP 数据包,不能期望任何回复;所以,向开放端口发送 UDP 数据包并不会返回任何信息。

      Alt text

    • 但是,如下图所示,如果目标的UDP端口关闭,就能得到一个类型为3(目的地不可达) 的 ICMP 数据包,并且它的代码为3(端口不可达)。

    • 换句话说,不产生任何响应的 UDP 端口会被Nmap声明为处于打开状态下的端口。

      Alt text

    • 在下面的 Wireshark 捕获的效果图中,可以看到每个关闭的端口都会生成一个 ICMP 数据包目标不可达(端口不可达)消息。

      Alt text

      • 查看下面的例子:对目标服务器启动 UDP 扫描是有价值的,一方面,能够得知 111 端口是开放的,另一方面,Nmap 无法确定 UDP 端口 68 是处于打开状态还是过滤状态。

          pentester@TryHackMe$ sudo nmap -sU 10.10.201.97
        
          Starting Nmap 7.60 ( https://nmap.org ) at 2021-08-30 09:54 BST
          Nmap scan report for 10.10.201.97
          Host is up (0.00061s latency).
          Not shown: 998 closed ports
          PORT    STATE         SERVICE
          68/udp  open|filtered dhcpc
          111/udp open          rpcbind
          MAC Address: 02:45:BF:8A:2D:6B (Unknown)
        
          Nmap done: 1 IP address (1 host up) scanned in 1085.05 seconds            
        
  • tips:

    UDP 端口扫描比 TCP 端口扫描花费更长的时间,在上面的例子中,们添加了 -F 标志以加快扫描速度(扫描最常见的100个端口而不是1000);还可以添加-v 以在扫描进行时获取详细信息。

  • Fine-Tuning Scope and Performance

    • 可以指定要扫描的端口,而不是默认的 1000 个端口。指定端口的方式很直观,这是一些例子:

      • 端口列表:使用-p22,80,443 将扫描端口 22、80 和 443。

      • 端口范围:使用-p1-1023 将扫描 1 到 1023 之间的所有端口,而使用 -p20-25 将扫描 20 到 25 之间的端口。

      • 可以使用 -p- 请求扫描所有端口,-p-将扫描所有的65535个端口;如果要扫描最常见的 100 个端口,可以添加 -F;如果使用 –top-ports 10 将检查十个最常见的端口。

    • 可以使用 -T<0-5> 控制扫描时间,其中-T0 是最慢的,而 -T5 是最快的;根据 Nmap 手册页,有六个关于扫描时间的范本:

      • paranoid (0) - paranoid 偏执的

      • sneaky (1) - sneaky 偷偷摸摸的

      • polite (2) - polite 礼貌的

      • normal (3) - normal 正常的

      • aggressive (4) - aggressive 有侵略性的

      • insane (5) - insane 疯狂的

      • 为避免 IDS 警报,建议考虑使用 -T0 或 -T1。其中-T0 选项一次只会扫描一个端口,并会在发送每个探测之间等待 5 分钟,所以可以大概猜出扫描一个目标需要多长时间才能完成。如果不指定任何时间,Nmap 会使用普通的 -T3选项。

      • 注意: -T5 在速度方面是最激进的,但是,由于丢包的可能性增加,使用-T5可能会影响扫描结果的准确性;-T4 经常在 CTF 期间和扫描靶机时使用;-T1 经常在实战中使用,在实战中保持隐蔽性是更重要的。

    • 可以选择使用 –min-rate 和 --max-rate 来控制数据包速率;例如,--max-rate 10 或 --max-rate=10 将确保nmap扫描器每秒发送的数据包不超过 10 个。

    • 此外,还可以使用–min-parallelism 和--max-parallelism 控制探测并行化。Nmap 会探测目标以发现哪些主机是活动的,哪些端口是开放的; 探测并行化的意思是:指定可以并行运行的此类探测的数量。

      • 例如,–min-parallelism=512 将使得 Nmap 保持至少 512 个并行探针;这 512 个探针与主机发现和开放端口有关。
  • Summary

    • 三种类型的扫描方式:

      Alt text

    • 这些扫描类型可以发现目标主机上正在运行的 TCP 和 UDP 服务。

      Alt text

Reference

Passive Reconnaissance 被动侦察

Active Reconnaissance 主动侦查

Nmap Live Host Discovery Nmap 存活主机发现

Nmap Basic Port Scans Nmap 基本端口扫描