安全测试 nmap 学习和使用 另外问下大佬们是不是用 nmap -p 1-65535 -T4 -A -v --script=all xxx.xxx.xxx.xxx 命令扫描出来后手动分析就可以了?

难以怀瑾 · 2024年03月21日 · 2514 次阅读

参考视频 https://www.bilibili.com/video/BV1Ut411K7QJ?p=3&vd_source=13dd0c4a82a579a2d8aef2ac9bf547bc

xsl 样式参考 https://cloud.tencent.com/developer/article/2201699

1 如何下载

参考此篇文档进行下载安装 https://blog.csdn.net/lj1521195618/article/details/119866338?spm=1001.2014.3001.5506

2 基本操作

  • 扫描之前关闭 vpn 否则出现下图

2.1 列举远程机器开放端口

  • 端口扫描原理

首先判断 nmap 输入的命令行中是否包含域名,如果包含需要利用 DNS 服务器进行域名解析,然后发送 ICMP Echo
Request 来探测主机存活性。存活了再继续扫描。

  • 默认端口扫描 bash nmap scanme.nmap.org

扫描 1000 个常见的端口,需要扫描所有端口则 -p 1-65535

  • 指定 dns 服务器解析域名

使用 Google 的公共 DNS 服务器(8.8.8.8)解析目标域名(scanme.nmap.org),然后对解析出的 IP 地址执行 Nmap 扫描。这是为了公司的 dns 服务器解析不出来域名

nmap --dns-servers 8.8.8.8 scanme.nmap.org
  • 对于禁 Ping 主机使用 使用 -Pn 选项会让 Nmap 忽略对目标主机的 ping 检测,直接对所有目标主机执行端口扫描。这在目标主机阻止 ICMP ping 请求或者管理员想要绕过 ping 检测时非常有用。
nmap -Pn xxx.xxx.xxx.xxx

如政务云相关服务器是禁止 ping 的,不加 -Pn就扫描不到远程机器开放端口

加了 -Pn成功扫描到了远程机器开放端口

  • 扫描指定端口范围
nmap -p 1-65535 xxx.xxx.xxx.xxx

-p 1-65535:这是一个选项,用于指定要扫描的端口范围。在这种情况下,范围是从端口 1 到端口 65535,表示将扫描目标主机上所有可能的 TCP 和 UDP 端口

标识端口号的变量是 16 位的,2 的 16 次方那么就是 65536 个,去掉 0 这个特殊端口,剩下 65535 个

  • 扫描一个或某几个端口 python nmap -p 80,81 xxx.xxx.xxx.xxx
  • 全端口扫描 python nmap -p- xxx.xxx.xxx.xxx
  • 指定协议扫描
    python nmap -p T:43,U:53 xxx.xxx.xxx.xxx -T: tcp 端口 -U:udp 端口 python nmap -p ssh xxx.xxx.xxx.xxx 探测某个协议的端口
  • 端口状态解释

在 Nmap 扫描过程中,您可能会遇到不同的端口状态。下面是一些常见的端口状态及其含义:
open:端口是打开的,表示目标主机上运行着一个服务,并且可以接受连接。
closed:端口是关闭的,表示目标主机上未运行该端口的服务,并且主机拒绝连接。
filtered:端口被过滤了,表示 Nmap 无法确定端口的状态,因为防火墙、网络过滤器或其他设备阻止了 Nmap 的扫描请求到达目标主机。
unfiltered:端口未被过滤,表示 Nmap 能够确定端口是开放或关闭的,但无法确定具体是哪一种状态。
open|filtered:端口可能是开放的,也可能是被过滤的,Nmap 无法确定端口的确切状态。
closed|filtered:端口可能是关闭的,也可能是被过滤的,Nmap 无法确定端口的确切状态。

注意事项

  • Nmap 扫描到的 “closed” 端口并不意味着它们是完全隐藏的或者不可见的。相反,它们是在目标主机上存在的,但是没有运行与之相关联的服务。因此,尽管这些端口处于关闭状态,但它们仍然可以被扫描到,并且扫描程序能够从目标主机获得拒绝连接的响应。
  • open的端口可能是攻击者入侵的目标,因此需要特别关注,而 filtered 状态的端口可能需要进一步的调查,以确定防火墙或过滤器的配置情况。 ### 2.2 识别目标机器服务指纹
  • 识别服务指纹 bash nmap -sV xxx.xxx.xxx.xxx

s服务 V版本

使用 Nmap 对指定的目标 IP 地址进行服务版本检测扫描,以获取目标主机上运行的服务的版本信息。
可以与nmap -sV -p 1-65535 ip 联合使用查看所有端口。

nmap -T4 -A -v xxx.xxx.xxx.xxx

使用 Nmap 对指定的目标 IP 地址进行扫描,设置扫描速度为正常模式,并启用全面扫描(会启用 NSE 所有脚本进行破解)功能,同时打印出更详细的扫描信息如版本号,加密算法方式等。

-T4:这是一个选项,用于设置扫描的速度和对目标系统的影响。-T4 表示设置扫描速度为正常(Normal)模式,即快速扫描。k 可以设置为 1-5
-A:这是一个选项,用于执行 “全面扫描”。-A 选项将启用操作系统检测、服务版本检测、脚本扫描和 traceroute 等功能,以提供更详细的关于目标主机的信息。
-v:这是一个选项,用于设置扫描的详细程度。-v 表示启用详细模式,即更多的信息将被打印出来

2.3 nse

nmap --script auth 

将运行所有属于 auth 类别的脚本来对目标进行扫描

nmap --script <script-name> <target>

运行特定的脚本,可以指定脚本的名称

auth:
负责处理鉴权证书(绕开鉴权)的脚本

broadcast:
在局域网内探查更多服务开启状况,如 dhcp/dns/sqlserver 等服务

brute:
提供暴力破解方式,针对常见的应用如 http/snmp 等

default:
使用-sC 或-A 选项扫描时候默认的脚本,提供基本脚本扫描能力

discovery:
对网络进行更多的信息,如 SMB 枚举、SNMP 查询等

dos: 用于进行拒绝服务攻击

exploit: 利用已知的漏洞入侵系统
external: 利用第三方的数据库或资源,例如进行 whois 解析

fuzzer:
模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞 intrusive: 入侵性的脚本,此类脚本可能引发对方的 IDS/IPS 的记录或屏蔽
malware: 探测目标机是否感染了病毒、开启了后门等信息 safe: 此类与 intrusive 相反,属于安全性脚本

version: 负责增强服务与版本扫描(Version Detection)功能的脚本

vuln:
负责检查目标机是否有常见的漏洞(Vulnerability),如是否有 MS08_067

  • 列举所有 mysql 用户 nmap -p3306 --script=mysql-users.nse --script-args=mysqluser=root xxx.xxx.xxx.xxx
  • 扫描 mysql 相关的脚本 nmap --script=mysql* xxx.xxx.xxx.xxx

2.4 调式模式

-d参数即可打开调试模式
nmap -d xxx.xxx.xxx.xxx

-d 参数用于增加调试输出。当使用-d 参数时,nmap 将输出更多的调试信息,以帮助用户了解扫描过程中发生的情况

总结

nmap -p 1-65535 -T4 -A -v xxx.xxx.xxx.xxx
使用 Nmap 对指定的目标 IP 地址的所有端口进行扫描,设置扫描速度为正常模式,并启用全面扫描(会启用 NSE 所有脚本进行破解)功能,同时打印出更详细的扫描信息如版本号,加密算法方式等
nmap -A 命令将启用一些 Nmap 的主要脚本,并进行更全面的扫描,但不会启用所有 NSE 脚本。具体来说,-A 选项会启用以下操作:

主机发现(Ping 扫描):检测目标主机是否在线。
操作系统检测:尝试识别目标主机运行的操作系统。
版本检测:尝试确定目标主机上运行的服务的版本信息。
脚本扫描:执行一些常见的 Nmap 脚本,如漏洞检测、服务发现等。
虽然-A 选项会启用一些 NSE 脚本,但不会启用所有的脚本。要启用所有的 NSE 脚本,您需要使用--script=all 选项。
-A 选项是-T4、-O、-Pn、-sC 和--script=default 选项的组合。

因此我会使用 nmap -p 1-65535 -T4 -A -v --script=all xxx.xxx.xxx.xxx进行扫描

3 结果分析

扫描完成后,有大量的日志输出需要去分析日志

  • 开放端口是否存在问题 重点分析 open 状态的端口
    是不是有的端口可以直接访问到文件
    是不是有的端口可以没有鉴权直接返回了一些数据
    是不是有点端口直接就下载了文件等

  • 是否存在漏洞
    查看 nse 是否发现漏洞

  • 将 xml 转化为 如下的 html 报告(好向领导汇报需要替换文档的样式)

from lxml import etree

# 读取生成报告的XML文件
tree = etree.parse(r'D:\nmap\zt.xml')

# 读取XSL样式表文件
xslt = etree.parse(r'D:\nmap\new_template2.xsl')

# 创建转换器并应用样式表
transform = etree.XSLT(xslt)
result = transform(tree)

# 将转换结果写入HTML文件
with open('output2.html', 'wb') as f:
    f.write(result)
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册