信息收集分为主动信息收集与被动信息收集,主动一般是指会与目标进行直接交互之类的信息收集,而被动通常无需与目标进行任何直接的交互。

被动信息收集

被动信息收集也称为开源情报或OSINT,是收集有关目标公开可用的信息的过程。在进行被动信息收集的过程中我们可以通过多种的资源和工具来收集目标的信息,注意这个过程是周期性的而非线性的收集。换而言之,过程之中的任何阶段的搜集情况皆取决于我们之前步骤中所发现的所有内容,再加上各种资源和工具获得信息不同,很难产生标准化的过程,因而称之为周期而非线性的过程。被动信息收集的最终目的是获得能证明的可以扩大攻击面的所有目标信息,能够帮助我们更有效的进行网络钓鱼以及密码本撰写。

在开始讲述如何进行被动信息收集之前,我们需要知道什么是被动而非主动?
在最严格的解释中,被动信息收集时,我们从不会与目标对象进行交流,例如,我们能够从第三方获取信息,但是我们不会直接访问目标的系统和服务器。通过这种方式我们虽然能够高度保密我们的行为和意图,但是也会限制我们所获取的结果。
较为宽泛的解释中,我们可能会与目标进行交互,但是仅限于普通的用户一样进行交互,在此期间我们不会进行对该网站的漏洞测试。

一般而言我们会采用较为宽泛的方式来对目标进行信息收集,在收集时,我们需要注意暴露在社交媒体,目标网站上的所有可用信息,包括但不限于:个人利用公司邮箱进行私人的活动从而留下的痕迹,目标网页上所留下的可能包含的私人信息和邮箱信息。

被动信息搜集的工具与方式

1.whois枚举

whois是一种tcp服务工具,并且是一种数据库类型,能够为我们提供有关的域名的信息,例如名称服务器和注册商信息。
在kali中我们可以通过whois工具进行标准的正向搜索,例如下图收集百度域名(baidu.com)相关的基本信息
whois举例
通过whois查询我们能够发现一些对我们有价值的信息,例如域名注册人信息,服务器名称,当然这是正向查询所能够发现的信息。
除正向查询外,whois客户端还能够执行反向查询,通过我们所能够获取到的关于目标的ip地址,我们能够通过whois查询的方式收集到关于目标的更多信息,例如我们查询站长之家的ip(117.25.139.77)whois反向查询从whois反向查询我们能够得知道关于站长之家网站的一系列信息,当然这只是示范,在实际收集过程中所需要的信息需要自己判断。

2.Google Hacking

谷歌黑客,顾名思义,从johnny long推广的关于谷歌黑客的知识多指如何使用类似于google一类的搜索引擎来获取目标的关键信息,一些漏洞,还有配置错误的网站。

那么我们如何使用谷歌一类的搜索引擎进行信息收集呢?
在谷歌的搜索栏中,我们可以使用特定的搜索字符串和运算符来进行对内容的筛选,优化我们所搜索的内容,通过预算符来将与目标无关或者不感兴趣以及无关紧要的内容筛去。

谷歌搜索字符串
1.“ ”: 搜索提及字词或短语的结果。
2.OR/|: 搜索与 X 或 Y 相关的结果。
3.AND: 搜索与 X 和 Y 相关的结果。
4.-: 搜索未提及字词或短语的结果。
5.*: 匹配任何单词或短语的通配符。
6.( ): 对多个搜索进行分组。
7.define: 搜索字词或短语的定义。
8.cache: 查找网页的最新缓存。
9.filetype/ext: 搜索特定类型的文件(例如 PDF)。
10.site: 从特定网站搜索结果。
11.related: 搜索与给定域相关的网站。
12.intitle: 搜索标题标签中包含特定单词的页面。
13.allintitle: 搜索标题标签中包含多个单词的页面。
14.inurl: 搜索 URL 中包含特定字词的页面。
15.allinurl:搜索网址中包含多个字词的网页。
16.intext: 搜索内容中包含特定单词的页面。
17.allintext: 搜索内容中包含多个字词的页面。
18.weather: 搜索某个位置的天气。
19.stocks: 搜索股票代码的股票信息。
20.map: 强制谷歌显示地图结果。
21.movie: 搜索有关电影的信息。
22.in: 将一个单位转换为另一个单位。
23.source: 在 Google 新闻中搜索来自特定来源的结果。
24.before: 搜索特定日期之前的结果。
25.after: 搜索特定日期之后的结果。
上述为Google常见的一些搜索的指令,如果需要完整了解谷歌搜索指令可以前往谷歌搜索运营商:完整列表(44个高级运营商) (ahrefs.com)

3.Netcraft

netcraft是一个免费的提供各类信息收集的网站,通过这样的网站获取的信息被认为是不产生交互的即为被动信息收集。
netcraft主要功能
dns搜索,能够获取域的信息
1689668220713
基于其数据收集的网站报告
![Pasted image 20230718161926](./信息收集/Pasted image 20230718161926.png)

4.Recon-ng

recon-ng是用于基于web的信息收集的模块化框架。

5.开源代码

在进行信息收集时,我们通常会想办法了解目标所使用的编程语言和架构,在有可能的情况下,开发人员会利用开源项目和在线代码存储库,甚至在一些特例中,开发人员会将敏感数据和凭据提供到公共的存储库。

常用到的开源项目和代码存储库:GitHub,GitLab,SourceForge。

在进行存储库搜索时,我们也可以利用一些工具来提高我们准确搜索出我们想要的信息,例如gitrob和gitleaks,当然上文提到的recon-ng也有对于搜索github的模块,多数工具需要提供令牌才能使用源代码托管程序的api。

6.网络空间搜索引擎

在我们进行目标的信息收集时,我们不能忘记一点,传统网站只是internet的一部分,通常我们还可以使用类似于fofa,zoomeyes,shodan,Quake,hunter一类的网络空间搜索引擎来进行目标收集,通俗的说,Google一类的搜索引擎是查找web服务器内容,而网络空间搜索引擎则是搜索与Internet·连接的设备,并与之交互并显示有关于这些设备的信息。例如下图通过fofa查询与域名baidu.com相关的内容。
通过fofa查询

在查询中我们不难发现fofa列出了ip,服务,和请求包信息,而这些都是被动收集的,无需与目标进行任何交互。在这些信息里面可以让我们快速的了解目标服务器的Internet覆盖范围和获取一些服务的版本以及一些端口信息。

7.一些扫描网站

在一些站点中,我们能够通过其了解一些有关网站或域的安全状况的信息。

7.1 安全标头扫描器分析 HTTP 响应标头 (securityheaders.com)

安全标头网址会扫描并分析http响应标头,并提供对目标站点安全状况的基本分析,这有利于我们了解目标的编码和安全策略,,当然这些标头本身不一定就是漏洞,但是这代表着开发人员和服务器管理人员未熟悉服务器的加固。例如下图扫描baidu.com这个域名
安全标头扫描器

7.2 SSL服务器测试SSL Server Test (Powered by Qualys SSL Labs)

ssllabs网站能够为我们提供ssl服务器测试,该工具是分析服务器的SSL/TLS配置,并和当前最佳的配置进行比较来做出报告,并测试一些与SSL/TLS相关的漏洞。例如下图扫描baidu.com这个域名
ssl扫描器

7.3 pastebinPastebin.com - 自 1 年以来的 #2002 粘贴工具!

pastebin是一个用于存储和共享文本的网站,我们能够从中发现一些有利于我们的目标的信息,例如下图搜索baidu.com相关的信息
pastebin

8.用户信息的收集

除了目标资产和网站的信息外我们还可以收集目标公司员工的信息,通过收集目标公司员工的信息,我们可以创建出针对目标的用户名本与密码本。当然收集用户信息也能为我们进行社会工程学活动时提供一定的便利,增加一些我们在网络钓鱼或者客户端攻击时的成功率,以及获得一些必要的凭据。当然这些行为必须在授权的范围内进行。

8.1 通过邮箱进行收集

在kali中我们可以使用theharvester来从多个数据源中收集电子邮件,名称,,子域,ip和url,例如下图我们使用theharvester来进行对baidu.com这个域的数据收集
theharvester通过数据源收-1

theharvester通过数据源收-2

​ theharvester讲解:
​ 1.工具支持的数据源主要有:
​ anubis, baidu, bing, binaryedge, bingapi, bufferoverun, censys, certspotter, crtsh, dnsdumpster, duckduckgo, fullhunt, github-code,google, hackertarget, hunter, intelx, linkedin, linkedin_links, n45ht, omnisint, otx, pentesttools, projectdiscovery, qwant, rapiddns, rocketreach, securityTrails, spyse, sublist3r, threatcrowd, threatminer, trello, twitter, urlscan, virustotal, yahoo,zoomeye
​ 2.工具的主要选项:
​ -d,–domain            要搜索的公司名称或域名。
​ -l,    –limit                 限制搜索结果的数量,默认=500。
​ -S,  –start                 从结果编号 X 开始,默认 = 0。
​ -g,  –google-dork     使用 Google Dorks 进行 Google 搜索。
​ -p,  –proxies            对请求使用代理,在 proxies.yaml 中输入代理。
​ -s,  –shodan            使用 Shodan 查询发现的主机。
​ –screenshot            对已解析的域进行截图,指定输出目录:–screenshot output_directory
​ -v,  –virtual-host      通过 DNS 解析验证主机名并搜索虚拟主机。
​ -e, –dns-server       用于查找的 DNS 服务器。
​ -f,–filename          将结果保存到 XML 和 JSON 文件。
​ -b, –source             指定搜索的引擎和数据源

8.2 密码转储

1

8.3 社交媒体工具

不难发现几乎所有组织都在社交媒体上保持着某种形式存在,例如公众号,小程序等。目标在社交媒体上所发布的信息可能会在某一些情况下对我们十分有用,例如员工信息,运营情况。

8.3.1 社交搜索者social-searcher社交搜索器 - 免费社交媒体搜索引擎 (social-searcher.com)

社交搜索者

社交搜索着能够为我们提供目标组织所发布的信息以及人们对此的评价,这有助于让我们了解目标在社交媒体上的足迹和范围,当然这不适用于对国内公司的社交发现。
8.3.2 特定站点的搜索工具
针对twitter的twofi
针对LinkedIn的linkedIn2username

9.信息收集框架

9.1OSINT框架OSINT 框架 (osintframework.com)

osint框架是一个包含了许多信息收集工具的网站,我们可以从其中的工具发现更多的信息收集的想法,和找到更多收集信息的方式。
osint框架

9.2Maltego数据挖掘工具Homepage - Maltego

主动信息收集

主动信息收集时我们需要和目标进行直接的交互,在交互中来获取得到我们想要的信息与资料。

主动信息收集的工具与方式

1.DNS枚举

域名系统(DNS),因特网上作为域名和IP地址互相映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。

DNS的分布数据库是以域名为索引的,每个域名实际上就是一棵很大的逆向树中路径,这棵逆向树称为域名空间(domain name space),树的最大深度不得超过127层,树中每个节点都有一个可以长达63个字符的文本标号。

DNS域名解析的过程:

1),在浏览器中输入http://xxxxx.com.cn的域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

2),如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。

3),如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

4),如果要查询的域名,不在本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。

5),如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.cn)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.cn域的这台服务器。这台负责.cn域的服务器收到请求后,如果自己无法解析,它就会找一个管理.cn域的下一级DNS服务器地址(com.cn)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找http://xxxxx.com.cn域服务器,重复上面的动作,进行查询,直至找到http://xxxxx.com.cn主机。

6),如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

1.1 dns服务器交互

在不同的域中,我们通常会发现,其在使用dns服务器时,都会使用不同的dns记录,常见的有NS,A,MX,PTR等,由于DNS的记录中通常包含大量的信息,我们很容易从中发现一些主动收集时有利可图的目标。
常见的DNS记录类型:
NS name-server名称服务器记录包含托管域DNS记录的权威服务器的名称。
A address主机记录,通常记录包含主机名的IP地址。
MX Mail-Exchange邮件交换记录包含负责处理域电子邮件的服务器名称,一个域可以包含多个MX记录。
PTR Pointer指针记录用于反向查询区域,并用于查找与IP地址相关联的记录。
CNAME Canonical-Name规范名称记录用于为其他主机记录创建别名。
TXT Text文本记录通常可以包含任何任意的数据,并且可以用在多种目的上,例如域的所有权验证。
在默认情况下,我们使用kali的host命令来查找域的IP地址即dns的A记录,当然host命令在默认情况下查找A记录,我们可以通过添加其他字段,来查询我们所想要查询的记录,例如下图所示即使如何查找dns的各种记录。
通过host查找dns的各种记录
当然我们也可以通过host命令查找目标是否存在某一主机,例如查找一个主机名为“user01”的服务器,当其返回NXDOMAIN时则说明该主机名不存在于公共的dns记录中。
通过host指令查找某一主机
那么同理我们如何自动化的来实现多个主机名的测试呢?
两种方式,第一种通过正向DSN查找,通过bash我们不难编写出一个自动化的检测主机是否存在于公共DNS记录并检测是否包含有效的主机名的语句,当检测时主机成功将名称解析出了IP,则表明服务器正常运行,反之,则不存在。
首先,我们需要将我们所需要检测的主机名做成一个文本列表,其次我们通过简单的bash代码便可以实现解析每一个主机名。
代码如下:
for ip in $(cat list.txt);do host $ip.域名; done
如图所示我们通过简单的实验便可验证这个代码的可用性
通过bash验证主机名服务器
第二种方式则是通过反向暴力枚举一组分散的IP地址,它们的范围相同(14.119.104.X),如果该域的dns管理员为该域配置了PTR记录,我们则可以用反向暴力枚举扫描近似范围,来请求每一个ip的主机名。
通过设置一个循环我们能够得到一个自动化的语句,然后进行编写bash语句如下:
for ip in $(seq 1 254);do host 14.119.104.$ip;done
通过反向暴力枚举主机名
通过语句的执行,不难发现达到了我们所需要的效果,当然为了方便我们检验是否能反向我们可以添加一些过滤语句,来方便我们查询
for ip in $(seq 1 254);do host 14.119.104.$ip;done|grep -v “not found”

1.2 DNS区域传输

DNS区域传输就是相关DNS服务器之间的数据库复制,其中区域文件从主DNS服务器复制到从属服务器。区域文件包含为该区域配置的所有DNS名称列表。区域传输应仅允许传输到授权的从属DNS服务器。注意,当管理人员错误配置DNS服务器时,任何要求复制DNS服务器区域的人都会收到区域文件,这相当于我们能够获取到目标服务器的所有名称,地址和功能。

1.3 kali中能够进行dns枚举的相关工具
1.3.1 DNSRecon
DNSrecon是用python编写的dns枚举脚本。
dnsrecon功能:
    区域传输 ---- Zone Transfer
    反向查询 ---- Reverse Lookup
    暴力猜解 ---- Domain and Host Brute-Force
    标准记录枚举 ---- Standard Record Enumeration (wildcard,SOA,MX,A,TXT etc.)
    缓存窥探 ---- Cache Snooping
    区域遍历 ---- Zone Walking
    Google查询 ---- Google Lookup
dnsrecon常用参数:
    -t brt  使用内建字典 
    -t std  默认的标准查询 
    -t srv  只查srv记录(AD、voip电话) 
    -t axfr  标准加axfr记录(-a) 
    -t tld  删除并尝试所有顶级域名(IANA) 
    --threads  指定线程数
1.3.2 DNSenum
DNSenum的目的是尽可能收集一个域的信息,它能够通过谷歌或者字典文件猜测可能存在的域名,以及对一个网段进行反向查询。它可以查询网站的主机地址信息、域名服务器、mx record(函件交换记录),在域名服务器上执行axfr请求,通过谷歌脚本得到扩展域名信息(google hacking),提取自域名并查询,计算C类地址并执行whois查询,执行反向查询,把地址段写入文件.
dnsenum常用参数:
    --dnserver <server>   将此DNS服务器用于A,NS和MX查询。
    --enum Shortcut   选项相当于--threads 5 -s 15 -w。
    -h, - help   打印此帮助信息。
    --noreverse   跳过反向查找操作。
    --nocolor   禁用ANSIColor输出。
    --private   在文件domain_ips.txt的末尾显示并保存私有ips。
    --subfile <file>    将所有有效的子域写入此文件。
    -t, - timeout <value>    tcp和udp超时值,以秒为单位(默认值:10秒)。
    --threads <value>   将执行不同查询的线程数。
    -v, - verbose详细:  显示所有进度和所有错误消息。
GOOGLE SCRAPING选项:
        -p, - 页面<值>抓取名称时要处理的Google搜索页面数量,默认值为5页,必须指定-s开关。
强制力量选择:
        -f, - file <file>  从此文件中读取子域以执行暴力破解。
        -u, - update <a | g | r | z>  使用有效子域更新使用-f开关指定的文件。

2.端口扫描

端口扫描是检查远程计算机上的TCP或UDP端口的过程,目的是检测目标上正在运行的服务以及可能存在的潜在攻击媒介。

2.1 TCP/UDP扫描
2.1.1 TCP扫描

简单介绍一下tcp扫描的方式,从最简单的来说TCP端口扫描技术通常称为CONNECT扫描,依赖于TCP的三次握手机制,三次握手机制是为了使两个尝试进行通信的主机可以在传输任何数据之前协商网络tcp套接字连接的参数,从根本上来讲,主机a将TCP SYN数据包发送到主机b的目标端口上,如果目标端口已经打开,那么主机b就会返回一个SYN-ACK数据包作为响应,在主机a接受到数据包后返回ACK数据包以完成握手,如果握手成功完成,则认为目标端口已经打开。
TCP端口扫描工具推荐:
1.御剑高速TCP全端口扫描工具
御剑tcp端口扫描器
2.netcat简单进行端口扫描
netcatj简单端口扫描:nc -nvv -w 1 -z 目标ip 端口起点-端口终点
-w 以秒为单位指定连接超时
-z 用于指定I/O模式,该模式将不发送任何数据并用于扫描

2.1.2 UDP扫描

由于UDP是无状态的,并且不涉及三次握手,大多数UDP扫描程序都普遍使用“ICPMP端口不可达”的消息来判断目标端口的状态,当然当目标端口被防火墙过滤时,这种判断端口是否打开的并不可靠。不过我们任然可以通过netcat进行udp的端口扫描。
netcat的 -u选项就是代表的UDP扫描,以下是简单的netcat进行udp扫描的示例:
nc -nv -u -z -w 1 目标ip 端口范围-端口范围

2.2 常用的功能强大的端口扫描器
1). Nmap

在日常使用中,NMAP TCP扫描将扫描给定计算机上的1000个最流行的端口,如图所示即为常见的nmap扫描。
使用NMAP扫描IP
当然在我们使用nmap的同时,我们可能还需对我们所发出的流量进行监控,用以确认使用nmap扫描会造成多大的流量。iptables命令可以很好的帮助我们监控所发出的流量
入站链:sudo iptables -I INPUT 1 -s 目标IP -j ACCEPT
出战链:sudo iptables -I OUTPUT 1 -d 目标IP -j ACCEPT
计数器清零:sudo iptables -Z
流量检测:sudo iptables -vn -L

1
2
3
4
5
6
7
8
-I 将新规则插入给定链(INPUT/OUTPUT)
-s 指定源IP
-d 指定目标IP
-j 接受流量
-Z 将所有链中的数据包和字节计数器清零
-v 为输出选项添加详细信息
-n 启用数字输出
-L 列出所有链中存在的规则

通过iptables监控流量后探测端口

通过iptables监控的流量

综合iptables的统计信息,我们默认扫描1000个端口产生了832bytes的流量,在此基础上我们再进行一次全端口扫描,看会产生多少的流量,如下图所示
nmap全端口扫描
通过观察全端口扫描产生了约7000kb的流量,这些结果无一不表示着一件事,当我们对c段网络进行扫描时会产生大量的流量,因此,我们需要更加详尽的参数来限制我们所消耗的流量,在下面的nmap常用参数中我会一一提及。

NMAP的常用参数以及使用方式:

  1. 主机发现
    iR:随机选择目标
    -iL:从文件中加载IP地址
    -sL:简单的扫描目标
    -sn:Ping扫描-禁用端口扫描
    -Pn:将所有主机视为在在线,跳过主机发现
    -PS[portlist]:(TCP SYN ping) 需要root权限
    -PA[portlist]:(TCP ACK ping)
    -PU[portlist]:(UDP ping)
    -PY [portlist]:(SCTP ping)
    -PE/PP/PM:ICMP回显,时间戳和网络掩码请求探测
    -PO[协议列表]:IP协议Ping
    -n/-R:从不执行DNS解析/始终解析[默认:有时]
    –dns-servers:指定自定义DNS服务器
    –system-dns:使用OS的dns服务器
    –traceroute:跟踪到每个主机的跃点路径
  2. 扫描技术
    -sS:使用TCP的SYN进行扫描
    -sT:使用TCP进行扫描
    -sA:使用TCP的ACK进行扫描
    -sU:UDP扫描
    -sI:Idle扫描
    -sF:FIN扫描
    -b<FTP中继主机>:FTP反弹扫描
  3. 端口规格和扫描顺序
    -p:扫描指定端口
    –exclude-ports:从扫描中排除指定端口
    -f:快速模式-扫描比默认扫描更少的端口
    -r:连续扫描端口-不随机化
    –top-ports:扫描<number>最常用的端口
  4. 服务/版本探测
    -sV:探测服务/版本信息
    –version-intensity:设置版本扫描强度(0-9)
    –version-all:尝试每个强度探测
    –version-trace:显示详细的版本扫描活动(用于调试)
  5. 脚本扫描
    -SC:等效于 –script=defult
    –script = <lua scripts>,<lua scripts>:以逗号分隔的目录,脚本文件或脚本类别
    –script-args = <n1=v1, n2=v2>:为脚本提供参数
    –script-args-file=文件名:从文件名中加载脚本参数
    –script-trace:显示发送和接受的所有数据
    –script-updatedb:更新脚本数据库
    –script-help=<lua scripts>:显示有关脚本的帮助
  6. 操作系统检测
    -o:启用os检测
    –osscan-limit:将os检测限制为可能的目标
    –osscan-guess:推测操作系统检测结果
  7. 时间和性能
    –host-timeout:设置超时时间
    –scan-delay:设置探测之间的时间间隔
    -T <0-5>:设置时间模板,值越小,IDS报警几率越低
  8. 防火墙/IDS规避和欺骗
    -f:报文分段
    -s:欺骗源地址
    -g:使用指定的本机端口
    –proxies <url,port>:使用HTTP/SOCK4代理
    -data<hex string>:想发送的数据包中追加自定义的负载
    –data-string:将自定义的ACSII字符串附加到发送数据包中
    –data-length:发送数据包时,附加随机数据
    –spoof-mac:MAC地址欺骗
    –badsum:发送带有虚假TCP/UNP/STCP校验和的数据包
  9. 输出
    -oN:标准输出
    -oXXMl:输出
    -oS:script jlddi3
    -oG:grepable
    -oA:同时输出三种主要格式
    -v:信息详细级别
    -d:调试级别
    –packet-trace:跟踪发送和接收的报文
    –reason:显示端口处于特殊状态的原因
    –open:仅显示开放的端口
  10. 杂项
    -6:启动Ipv6扫描
    -A:启动Os检测,版本检测,脚本扫描和traceroute
    -V:显示版本号
    -h:帮助信息
    讲解:
    1. SYN/隐形扫描:
      nmap中首选的扫描方式就是SYN扫描或者‘隐形’扫描,SYN扫描是一种TCP端口扫描方式,原理就是将SYN数据包发送至目标的各个端口,无需完成TCP握手,当端口打开时目标计算机会返回SYN-ACK,告知我们此端口是打开的,此时,端口扫描结束,无需再次发送ACK包即可完成三次握手确认端口的流程,因为三次握手没有完成的缘故,所以信息不会传递到应用程序层,因此也不会出现再任何应用程序的日志中,再加上未完成所产生的数据包少,因此更加的隐秘和高效,当然现如今防火墙更加的完善,因此也不再隐形。
      sudo nmap -sS 目标ip
2). Masscan

Masscan是最快的端口扫描利器,可以在大约6分钟扫描整个互联网,每秒能传输1000万个数据包,可以轻松处理A类或B类子网。

Masscan的常用参数以及使用方式:

  • IP地址范围,有三种有效格式,1、单独的IPv4地址 2、类似”10.0.0.1-10.0.0.233”的范围地址 3、CIDR地址 类似于”0.0.0.0/0”,多个目标可以用都好隔开
  • -p <ports,–ports <ports>> 指定端口进行扫描
  • –banners 获取banner信息,支持少量的协议
  • –rate <packets-per-second> 指定发包的速率
  • -c <filename>, –conf <filename> 读取配置文件进行扫描
  • –echo 将当前的配置重定向到一个配置文件中
  • -e <ifname> , –adapter <ifname> 指定用来发包的网卡接口名称
  • –adapter-ip <ip-address> 指定发包的IP地址
  • –adapter-port <port> 指定发包的源端口
  • –adapter-mac <mac-address> 指定发包的源MAC地址
  • –router-mac <mac address> 指定网关的MAC地址
  • –exclude <ip/range> IP地址范围黑名单,防止masscan扫描
  • –excludefile <filename> 指定IP地址范围黑名单文件
  • –includefile,-iL <filename> 读取一个范围列表进行扫描
  • –ping 扫描应该包含ICMP回应请求
  • –append-output 以附加的形式输出到文件
  • –iflist 列出可用的网络接口,然后退出
  • –retries 发送重试的次数,以1秒为间隔
  • –nmap 打印与nmap兼容的相关信息
  • –http-user-agent <user-agent> 设置user-agent字段的值
  • –show [open,close] 告诉要显示的端口状态,默认是显示开放端口
  • –noshow [open,close] 禁用端口状态显示
  • –pcap <filename> 将接收到的数据包以libpcap格式存储
  • –regress 运行回归测试,测试扫描器是否正常运行
  • –ttl <num> 指定传出数据包的TTL值,默认为255
  • –wait <seconds> 指定发送完包之后的等待时间,默认为10秒
  • –offline 没有实际的发包,主要用来测试开销
  • -sL 不执行扫描,主要是生成一个随机地址列表
  • –readscan <binary-files> 读取从-oB生成的二进制文件,可以转化为XML或者JSON格式.
  • –connection-timeout <secs> 抓取banners时指定保持TCP连接的最大秒数,默认是30秒。

(3.SMB枚举

SMB是指服务器消息块协议(Server Message Block Protocol)–一种客户端-服务器通信协议,用于共享对网络上的文件、打印机、串行端口和其他资源的访问。服务器使文件系统和其他资源(打印机、命名管道、API……等)可供网络上的客户端使用,虽然客户端计算机可能有自己的硬盘以便存储资源,但它们有时候确实需要访问服务器上的共享文件系统和打印机;在这个过程中我们需要用到SMB协议,SMB 协议是一种响应-请求协议,它可以在客户端和服务器之间传输多条消息以建立连接,其中的客户端将使用 TCP/IP(实际上是 RFC1001 和 RFC1002 中指定的 TCP/IP 上的 NetBIOS)、NetBEUI 或 IPX/SPX 连接到服务器。

3.1 NetBIOS服务

NetBIOS服务侦听于139和其他几个UDP端口,注意的是,SMB(TCP端口445)与NetBIOS是两个单独的协议。NetBIOS是一个独立的会话层协议和服务,允许本地网络上的计算机相互通信。尽管SMB在实际上可以在没有NetBIOS的情况下工作,但TCP(NBT)才是向后兼容所必需的,因此这两个服务通常一起启用,因此枚举这两种服务是并行的。
1.常见的nmap扫描方式:
nmap -v -p 139,445 -oG smb.txt 目标ip或网段
2.使用nbtscan工具扫描
sudo nbtscan -r 目标ip或网段
Nbtscan
一个在本地或远程TCP/IP网络上扫描开放的NETBIOS名称服务器的命令行工具。
用法: nbtscan-unixwiz [选项] 目标 [目标…]
目标可以是IP地址,DNS名称或地址的列表范围。
范围可以表示成“192.168.12.0/24”或“192.168.12.64-97”
-V 显示版本信息
-f 显示完整的NBT资源记录响应(推荐)
-H 生成HTTP请求头
-v 开启详细输出调试
-n 不查找响应IP地址的反向名称
-p <n> 绑定UDP端口(默认0)
-m 响应中包含MAC地址 (等同’-f’)
-T <n> 超时不响应 (默认2秒)
-w <n> 次写入后等待秒数 (默认10ms)
-t <n> 每个地址尝试次数(默认1次)
-P 以perl的hashref格式生成结果

3.2 Nmap SMB 脚本

(4.NFS枚举

网络文件系统(NFS)是一种分布式文件系统协议,能够允许客户端计算机上的用户通过计算机网络访问文件,就像在本地储存中访问文件一样,当然一般情况下NFS与UNIX操作系统一起使用,很难不发现两者一起使用的安全性问题是糟糕的,因此我们不难发现全球开放的NFS共享。

4.1 扫描NFS共享

Portmapper和RPCbind都在TCP端口111上运行,RPCbind将RPC服务映射到它们侦听的端口。RPC进程启动时会通知RPCbind,注册正在监听的端口以及期望使用的RPC进程号。当客户端使用特定的RPC程序号与服务器上的rpcbind连接,rpcbind服务会将客户端重定向到合适的端口号(通常为TPC端口2049),一遍可以与请求的服务进行通信。
使用nmap识别portmapper/rpcbind主机
nmap -v -p 111 目标网段或ip
使用rpcinfo之类的nmap的NSE脚本查找可能在rpcbind中注册的服务
nmap -sV -p 111 –script = rpcinfo 目标ip或网段

4.2 Nmap NFS NSE脚本

(5.SMTP枚举

当然我们还可以从易受攻击的邮件服务器收集有关主机或网络的信息,简单邮件传输协议(SMTP)能够为我们枚举出一些有趣的且有利于我们进行渗透的信息。
SMTP命令:

1
2
3
4
VRFY 请求服务器验证电子邮件地址/指定的用户是否存在,由于安全原因,服务器常禁用此命令
EXPN 请求服务器提供邮件列表的成员信息/验证给定的邮箱列表是否存在,常被禁用
MAIL FROM 指定发件人地址
RCPT TO 指定单个的邮件接收人;可有多个RPCT TO;常用在MAIL FROM 命令后

SMTP返回码:

1
2
250 要求的邮件操作完成
550 要求的邮件操作未完成,邮箱不可用

6.SNMP枚举

SNMP(Simple Network Management Protocol) 设计在TCP/IP协议簇上的,为网络节点提供了一个通用的管理方法。对于系统维护人员,SNMP是其必须要掌握的一个工具。同时,如果你是一名BMC工程师,那你也必须掌握这门技术,SNMP常常会被部署在其Linux系统中,专门用于管理BMC所监视的所有系统硬件资源。
当然,SNMP基于UDP,因此容易受到IP欺骗和重放攻击的影响。此外,常用的SNMP 1,2,2c协议不提供流量加密,因此我们可以十分轻松的拦截SNMP信息和凭据。传统的SNMP协议提供较弱的身份验证方案,通常使用默认的公共和私有的社区的数据来进行配置。

SNMP MIB树
SNMP管理信息库(MIB)是一个数据库,其中通常包含与网络管理有关的信息。

6.2 扫描SNMP

1.使用nmap进行扫描打开的snmp端口
sudo nmap -sU -open -p 161 目标ip/目标网段 -oG open-snmp.txt
2.通过oneixtyone工具进行暴力攻击

1
2
3
4
5
6
7
echo public > community
echo private >> community
echo manager >> community

for ip in $(seq 1 254); do eho xxx.xxx.xxx.$ip; do > ips

onesixtyone -c community -i ips
6.3 windows下SNMP枚举

我们可以使用SNMPwalk等工具来探测和查询SNMP值,只要我们至少知道SNMP只读社区字符串,它在大多数情况下是“公共的”。

枚举整一个MIB树
使用下面命令中提供的一些MIB值,我们可以尝试枚举它们对应的值。针对实验室中的已知机器尝试下面的示例,该机器有一个WindowsSNMP端口,并公开了社区字符串“公共”。此命令使用 -c 选项枚举整个MIB树来指定社区字符串,使用**-v** 来指定SNMP版本号以及 -t 10 来将超时时间增加到10秒:

1
2
3
4
5
6
7
kali@kali:~$ snmpwalk -c public -v1 -t 10 10.11.1.14  
iso.3.6.1.2.1.1.1.0 = STRING: "Hardware: x86 Family 6 Model 12 Stepping 2 AT/AT COMPAT
IBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.311.1.1.3.1.1
iso.3.6.1.2.1.1.3.0 = Timeticks: (2005539644) 232 days, 2:56:36.44
iso.3.6.1.2.1.1.4.0 = ""
...

枚举Windows用户

1
2
3
4
5
kali@kali:~$ snmpwalk -c public -v1 10.11.1.14 1.3.6.1.4.1.77.1.2.25  
iso.3.6.1.4.1.77.1.2.25.1.1.3.98.111.98 = STRING: "bob"
iso.3.6.1.4.1.77.1.2.25.1.1.5.71.117.101.115.116 = STRING: "Guest"
iso.3.6.1.4.1.77.1.2.25.1.1.8.73.85.83.82.95.66.79.66 = STRING: "IUSR_BOB"
...

枚举正在运行的Windows进程

1
2
3
4
5
6
7
8
9
10
11
kali@kali:~$ snmpwalk -c public -v1 10.11.1.73 1.3.6.1.2.1.25.4.2.1.2  
iso.3.6.1.2.1.25.4.2.1.2.1 = STRING: "System Idle Process"
iso.3.6.1.2.1.25.4.2.1.2.4 = STRING: "System"
iso.3.6.1.2.1.25.4.2.1.2.224 = STRING: "smss.exe"
iso.3.6.1.2.1.25.4.2.1.2.324 = STRING: "csrss.exe"
iso.3.6.1.2.1.25.4.2.1.2.364 = STRING: "wininit.exe"
iso.3.6.1.2.1.25.4.2.1.2.372 = STRING: "csrss.exe"
iso.3.6.1.2.1.25.4.2.1.2.420 = STRING: "winlogon.exe"
iso.3.6.1.2.1.25.4.2.1.2.448 = STRING: "services.exe"
iso.3.6.1.2.1.25.4.2.1.2.480 = STRING: "lsass.exe"
iso.3.6.1.2.1.25.4.2.1.2.488 = STRING: "lsm.exe"

枚举已打开的TCP端口

1
2
3
4
5
6
kali@kali:~$ snmpwalk -c public -v1 10.11.1.14 1.3.6.1.2.1.6.13.1.3  
iso.3.6.1.2.1.6.13.1.3.0.0.0.0.21.0.0.0.0.18646 = INTEGER: 21
iso.3.6.1.2.1.6.13.1.3.0.0.0.0.80.0.0.0.0.45310 = INTEGER: 80
iso.3.6.1.2.1.6.13.1.3.0.0.0.0.135.0.0.0.0.24806 = INTEGER: 135
iso.3.6.1.2.1.6.13.1.3.0.0.0.0.443.0.0.0.0.45070 = INTEGER: 443
...

枚举已经安装的软件

1
2
3
4
5
6
7
8
9
kali@kali:~$ snmpwalk -c public -v1 10.11.1.50 1.3.6.1.2.1.25.6.3.1.2  
iso.3.6.1.2.1.25.6.3.1.2.1 = STRING: "LiveUpdate 3.3 (Symantec Corporation)"
iso.3.6.1.2.1.25.6.3.1.2.2 = STRING: "WampServer 2.5"
iso.3.6.1.2.1.25.6.3.1.2.3 = STRING: "VMware Tools"
iso.3.6.1.2.1.25.6.3.1.2.4 = STRING: "Microsoft Visual C++ 2008 Redistributable - x86
9.0.30729.4148"
iso.3.6.1.2.1.25.6.3.1.2.5 = STRING: "Microsoft Visual C++ 2012 Redistributable (x86)
- 11.0.61030"
...

(7. Telnet枚举

Telnet 是一种应用程序协议,它允许你使用 telnet 客户端连接到托管 telnet 服务器的远程计算机并在其上执行命令;当telnet 客户端与服务器成功建立连接之后,此时的telnet 客户端将成为一个虚拟终端——以允许你与远程主机进行交互。Telnet 以明文形式发送所有消息,没有特定的安全机制,因此,在许多应用程序和服务中,Telnet 功能的大多数实现已被 SSH 所取代。

telnet使用:
用户想使用 Telnet 协议连接到服务器,只需要在命令提示符环境中输入“telnet”命令即可,然后,用户可以在 telnet 提示符下使用特定的 telnet 命令在远程服务器上执行命令;
使用以下语法连接到 telnet 服务器:

1
telnet \[ip] \[port]