目录

基本使用

用法尽量看官方文档,网上很多文章中的内容可能并不准确。

扫多个地址用空格分隔。

root@gbb:~# nmap ip1 ip2

扫描一个 list 文本,文本内的地址要以空格、tab、或换行分隔。

root@gbb:~# cat 1
www.baidu.com
www.raingray.com
172.16.4.0/24
172.16.4.195-254
root@gbb:~# nmap -iL 1

常用选项:

  • -A,用来检测操作系统(-O)及其服务版本探测(-sV)
  • -sS (TCP SYN 扫描),发送 syn 服务器返回 syn-ack 就证明服务器端口存活。当 SYN 扫不了就用下面 TCP/UDP 选项
  • -sT,扫 TCP,TCP 会建立完整 TCP 连接。这里给个短选项使用技巧,都是以 -s 开头的选项可以写作,-sSV 就等同于 -sS -sV 两个选项。
  • -sU,扫 UDP。在实际扫描过程中很容易只关注 TCP 忽略 UDP,但最好都要扫,不要错过目标暴露的缺口。
  • -n,不对 ip 进行反向解析,避免解析浪费时间。
  • -p,-p 用于指定端口,比如 -p 80,-p 1-1000,-p- 等同于 -p 1-65535
  • -Pn,跳过主机发现的过程,不管主机是不是存活,直接进行端口扫描、版本检测或操作系统检测。在老版本中 -P0 也是一样的作用。
  • --open,仅显示开放(或可能开放)的端口
  • -sn(-sP),在老版本 nmap 中叫 -sP,发送 ICMP 探测主机存活,不进行端口扫描。
    -sn 会发送 icmp echo 请求、tcp syn to port 443、tcp ack to port 80和 icmp timestamp 请求组成。当由非特权用户执行时,只有 SYN 包被发送(使用连接调用)到目标上的端口 80 和 443。当特权用户试图扫描本地以太网上的目标时,除非指定了 --send ip,否则将使用 arp 请求。
  • -oN filename,将结果输出到文件,也可以叫做扫描日志。
  • --resume filename,恢复中断的扫描,人家是按照你上次扫描的日志(-oN filename)进度接着扫。
  • -T,调整扫描速度,一共五个挡位,默认为 T3,一般网络良好情况下使用 T4。在 T3 及以上级别都会被 IDS/IPS 检测到流量。
  • -vv,显示扫描详细日志。

下面给出使用实例。

用 nmap 先收集一个段存活的主机的地址,然后针对性的进行扫速度会快。

nmap -PU 145.1.51.12/24 -On activeHostResult

不进行主机存活测试,优先扫常用端口对 TCP Syn 扫描 1-65535,UDP 123、161、53、5060 已经打开的端口。

nmap -Pn -n --open -sS -sU -r -p T:1-65535,U:123,161,53,5060 -iL activeHostResult

nmap 要想扫描指定文件里的端口怎么办?只能写 Shell 脚本循环,或者 -p 1,2,3,4,5,6,7 这样指定,虽然有点长也能起作用。

NES

调用 NES 脚本,在线文档 https://nmap.org/nsedoc/scripts/

Kali 中脚本目录 /usr/share/nmap/scripts/,Windows 对应的也是 Nmap 安装目录中 scripts 目录。

nmap --script=vuln #可以扫漏洞,调用时不用加文件后缀。
nmap -sC #等同于 --script=default 可以拿 --script-help=default 来看都用了哪些脚本。

常用脚本介绍
...

脚本编写

...

常用套路

使用 whatweb 来探测存活应用。

whatweb

帮你把所有域名或 IP 测试一遍能不能访问(80 or 443)

  • -i,读取文件
  • -p title,筛选出有 title 字段的页面

一个坑是,在使用 awk 处理数据可能会有问题,这时可以把 color 取消掉 --color=never

用 Nmap 扫描结果取出 IP。

awk '{print $5}' scan_result_file | grep ^[0-9] > xx_ip

取出端口

awk -F '/' '{print $1}' scan_result_file | grep ^[0-9] | sort -n  | uniq > xx_port

将 IP 后面添加冒号用于 whatweb 扫描。

sed -i 's/$/:/g' xx_ip

使用 whatweb 进行 Web 应用发现,碰到 443(https)怎么处理?不可能直接访问 443 端口吧,这样会报错的!其次这里逻辑有问题它测试的次数是基于 port 数量的一一对应,并不是每个 IP 都会测试 xx_port 中所有端口。

cat xx_port | xargs -n 1 whatweb -p title --no-errors --color=never -i xx_ip --url-suffix | grep -v '\[ Unassigned' > xx_active

#扫描单个 IP 的话直接在后面加上冒号就行
cat xx_port | xargs -n 1 whatweb --color=never -p title  xx.xx.xx.xx: --url-suffix

这个脚本是对 nmap 扫描结果处理的改进版,用循环来解决每个 IP 探测指定文件中的端口。

#!/bin/bash

# get ip
awk '{print $5}' $1 | grep ^[0-9].[0-9].[0-9].[0-9] > process_nmap_ip && sed -i 's/$/:/g' process_nmap_ip

# get port
awk -F '/' '{print $1}' $1 | grep  ^[0-9] | grep -v service | sort -n | uniq > process_nmap_port

if [ $? -eq 0 ]
then
    echo "port address process complete"
else
    echo "port address process fialed"
fi

# get active web applications
line=`wc -l process_nmap_ip | awk '{print $1}'`

while [ $line -gt 1 ]
do
    for ip in `cat process_nmap_ip`
    do
        cat process_nmap_port | xargs -n 1  whatweb -p title --no-errors --color=never $ip --url-suffix |\
    grep -v '\[ Unassigned' >> whatweb-micro-active
    line=$[ $line - 1 ]
    done
done

if [ $? -eq 0 ]
then
    echo "whatweb test completed"
else
    echo "whatweb test failed"
fi

挑出 4XX、5XX 等错误页面用 https 访问一次,避免因为网络问题导致的错误。

grep -v '404' | awk '{print $1}' | sed 's/http/https/g' | xargs -n 1 whatweb -p title --no-errors --color=never | grep -v '\[ Unassigned' >> active

其实这个完全可以用 Python 多线程写个脚本代替 whatweb,有空再补充。

一些常用套餐

周期性扫描,用日期作为文件有区分扫描结果。

nmap --open -n -Pn -sS -p- -T4 -iL ip > result-`date +%Y%m%d`

参考链接

最近更新:

发布时间:

摆哈儿龙门阵