nmap

通用参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 禁止DNS反向解析
-n
# 反向解析域名
-R
# 使用系统域名解析器
--system-dns
# ipv6
-6
# 路由跟踪
--traceroute
# 速度快慢 从0到5,侵入性增加,速度加快
-T0-5
# 展示扫描细节
-v
# 全面扫描,速度较慢,容易被发现
-A
# 指定目标文件
-iL host.txt
# 调试:跟踪发送的报文
--packet-trace
# 列举接口
--iflist
# 指定网口
-e eth0
# 保存结果 默认格式
-oN res.txt
# grep 格式
-oG res.txt
# 中断扫描之后,从日志中恢复
--resume res.txt
# XML 保存
-oX res.xml
# 保存所有格式各一份
-oA

主机存活

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Ping
nmap -sn 192.168.99.1/24
nmap -sP 192.168.99.1/24
# ARP ping
nmap -PR 192.168.99.1/24
# ICMP Ping types
nmap -PE/-PP/-PM
# TCP ACK
nmap -PA port 192.168.99.1/24
# TCP SYN
nmap -PS port 192.168.99.1/24
# UDP
nmap -PU port 192.168.99.1/24
# SCTP INT
nmap -PY port 192.168.99.1/24

端口扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 时序选择,从0到5,侵入性增加
nmap -T0-5
# 端口排序扫描,不随机端口
nmap -r
# 指定端口
nmap -p 445
# 端口,协议指定
nmap -p T:22,U:445
# 扫描nmap-services中的1000个端口,也可以--data-dir指定service文件
nmap -F
# 指定1000端口中的前100个
nmap --top-ports 100
# 扫描一定概率以上的端口
nmap --port-ratio
# 全端口扫描
nmap --allports
# TCP Connect
nmap -sT
# TCP SYN
nmap -sS
# TCP ACK 不能判断端口是否打开,只能判断是否过滤
nmap -sA
# TCP 窗口扫描
nmap -sW
# TCP Maimon
nmap -sM
# 自定义TCP flags
--scanflags SYNACKURG
# UDP
nmap -sU
# 隐蔽
nmap -sN / -sF / -sX
# 空闲扫描,使用僵尸主机迷惑目标
nmap -sI www.baidu.com:80 192.168.99.1
# IP协议扫描,用来确定目标开放了哪些协议
nmap -sO
# FTP Bounce
nmap -b

服务及操作系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 服务识别
-sV
# 指定识别强度,强度越高,识别越准,消耗时间越长
--version-intensity 0~9
# 轻量级扫描,对应 --version-intensity 2
--version-light
# 重量级扫描,对应 --version-intensity 9
--version-all
# 显示详细版本
--version-trace
# 判断是否为RPC端口,通常结合其他扫描指令使用
-sR
# 操作系统探测
-O
# 仅对具有打开或关闭端口的主机探测操作系统
--osscan-limit
# 无法准确识别的时候,从最接近的数据中大胆猜测
--osscan-guess / --fuzzy

优化扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 调整并行扫描组的大小
--min-hostgroup 30 192.168.99.1/24
--max-hostgroup 30 192.168.99.1/24
# 调整探测报文并行度
--min-parallelism 100
--max-parallelism 1
# 调整探测报文超时时间,单位毫秒,一般max范围100-1000ms
--min-rtt-timeout 100ms
--max-rtt-timeout 1000ms
--initial-rtt-timeout 1000ms
# 放弃响应缓慢的主机
--host-timeout 100ms
# 调整探测报文的时间间隔
--scan-delay 1s
--max-scan-delay 30s

绕过 IDS,Firewalls

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 报文分段
-f
# 指定偏移大小,需要为8的倍数
--mtu 16
# 指定虚假IP,在版本探测和TCP扫描时无效
-D ip1,ip2
# 随机生成
-D RND:11
# 源地址欺骗,同空闲扫描
-sI
# 源端口欺骗
--source-port 53
-g 53
# 指定发包长度,通常TCP 40Bytes,ICMP ECHO 28Bytes
--data-length 30
# 目标主机随机排序
--randomize-hosts
# MAC 地址欺骗
--spoof-mac
# 随机指定
--spoof-mac 0
# 从指定厂商生成一个
--spoof-mac huawei

NSE 脚本

官方脚本用法

官方所有脚本

基础

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 显示脚本帮助
--script-help
# 显示某个分类所有脚本的帮助信息
--script-help intrusive | less
# 脚本目录增加脚本后更新数据库
--script-updatedb
# debug
--script-trace
# 批量运行多个脚本
# 运行指定分类的所有脚本, 所有分类:auth, broadcast, brute, default, discovery, dos, exploit, external, fuzzer, intrusive, malware, safe, version, vuln
--script default,safe,myscripts # myscripts是自定义的脚本目录
# 执行default分类的脚本
-sC
# 执行所有仅用于 host,不依赖于端口的 default 分类的脚本
-sn -sC
# 运行所有非 intrusive 分类的脚本, intrusive 是一些比较危险的侵入式脚本
--script "not intrusive"
# 运行以 http 开头的脚本
--script "http-*"
# 复杂组合
--script "(default or safe or intrusive) and not http-*"

信息搜集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 获取地理位置,对CDN无效
--script ip-geolocation-*
# whois
--script whois-domain
--script whois-ip
# 搜集EMAIL,默认会对端口扫描,所以时间较长,如果不想端口扫描,使用-p指定一个端口
--script http-grep
# IP反查域名,都是请求在线服务查询
--script hostmap-bfk / hostmap-rotex / hostmap-crtsh
# DNS查询
# 暴力破解
--script dns-brute --script-args dns-brute.threads=10
# zone transfer测试
--script dns-zone-transfer --script-args dns-zone-transfer.domain=<domain>,dns-zone-transfer.server=<dnsserver>
--script dns-zone-transfer --script-args "dns-zone-transfer.domain=vulhub.org" -Pn -p 53 localhost
# 检索信息系统
--script membase-http-info
# HTTP headers
-p 80 --script http-headers
# 目录结构探测
--script http-sitemap-generator
# SSL
-p 443 --script ssl-enum-ciphers
# SSH
-p 22 --script ssh-hostkey

漏洞测试

SMB

1
2
3
4
--script smb-security-mode -p 445
--script smb-check-vulns -p 445
# 暴力破解
--script smb-brute -p 445

web 漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# XSS
--script http-stored-xss
# SQLI
--script http-sql-injection
# HTTP brute
--script http-brute
# wordpress brute
--script http-wordpress-brute --script-args userdb=user.txt,passdb=pass.txt,http-wordpress-brute.threads=10
# joomla brute
--script http-joomla-brute
# git 泄露
--script http-git
# 备份文件查找
--script http-backup-finder

SNMP

1
2
3
4
5
6
7
8
# SNMP信息泄露
-sU -p 161 --script snmp-win32-services / snmp-win32-shares / snmp-win32-users / snmp-win32-software
# 网络状态
-p 161 --script snmp-netstat
# 系统进程
-p 161 --script snmp-processes
# 暴力破解
-p 161 --script snmp-brute

MYSQL

1
2
3
4
5
6
7
8
9
10
# MYSQL 如果不指定用户名密码,会使用 mysql-brute, mysql-empty-password发现的
--script mysql-databases --script-args mysqluser=root,mysqlpass=root
# 弱口令探测
--script mysql-brute
# 空密码探测
--script mysql-empty-password
# 列举变量
--script mysql-variables
# 安全配置审计
--script mysql-audit --script-args mysql-audit.username=root, mysql-audit.password=root, mysql-audit.filename='nselib/data/mysql-cis.audit'

ORACLE

1
2
# ORACLE 暴力破解
-p 1521 --script oracle-brute --script-args oracle-brute.sid=test,userdb=user.txt,passdb=pass.txt

MSSQL

1
2
3
4
5
6
7
8
# MSSQL 暴力破解
-p 1433 --script mssql-brute --script-args userdb=user.txt,passdb=pass.txt
# 空密码探测
--script ms-sql-empty-password
# 读取数据
--script ms-sql-tables --script-args mssql.username='',mssql.password=''
# 命令执行
--script ms-sql-xp-cmdshell --script-args mssql.username='',mssql.password='',ms-sql-xp-cmdshell.cmd='ipconfig'

Postgresql

1
2
# postgresql 暴力破解
-p 5432 --script pgsql-brute

FTP

1
2
3
4
# FTP 暴力破解
-p 21 --script ftp-brute --script-args userdb=user.txt,passdb=pass.txt
# 匿名访问测试
-p 21 --script ftp-anon

POP3

1
-p 110 --script pop3-brute

SMTP

1
2
-p 25 --script smtp-brute
-p 25 --script smtp-enum-users

VNC

1
2
-p 5900 --script vnc-brute
-p 5900 --script vnc-info

Redis

1
--script redis-* -p 6379 -Pn

编写

元数据

1
2
3
4
5
6
7
8
9
10
description = [[
Attempts to find the owner of an open TCP port by querying an auth
(identd - port 113) daemon which must also be open on the target system.
]]


author = "Diman Todorov"

license = "Same as Nmap--See https://nmap.org/book/man-legal.html"

categories = {"default", "safe"}

Rule

规则 描述
prerule() 在扫描所有主机之前,运行一次
hostrule(host) 扫描每批主机后,将运行,只判断 host
portrule(host, port) 扫描每批主机后,将运行,同时判断 host,port
postrule() 在扫描所有主机之后,运行一次。
1
2
3
4
5
6
7
8
9
10
11
portrule = function(host, port)
local auth_port = { number=113, protocol="tcp" }
local identd = nmap.get_port_state(host, auth_port)
return identd ~= nil
and identd.state == "open"
and port.protocol == "tcp"
and port.state == "open"
end

-- 利用shortport库判断端口和服务
portrule = shortport.port_or_service({80, 443}, {"http", "https"})

Action

主要代码放在Action

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
action = function(host, port)
local owner = ""

local client_ident = nmap.new_socket()
local client_service = nmap.new_socket()

local catch = function()
client_ident:close()
client_service:close()
end

local try = nmap.new_try(catch)

try(client_ident:connect(host.ip, 113))
try(client_service:connect(host.ip, port.number))

local localip, localport, remoteip, remoteport =
try(client_service:get_info())

local request = port.number .. ", " .. localport .. "\r\n"

try(client_ident:send(request))

owner = try(client_ident:receive_lines(1))

if string.match(owner, "ERROR") then
owner = nil
else
owner = string.match(owner,
"%d+%s*,%s*%d+%s*:%s*USERID%s*:%s*.+%s*:%s*(.+)\r?\n")
end

try(client_ident:close())
try(client_service:close())

return owner
end