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

扫多个地址用空格分隔

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 扫不了就用下面 TCP/UDP 选项
  • -sT,扫 TCP,TCP 会建立完整连接
  • -sU,扫 UDP,都是以 -s 开头的选项可以写作,-sSV 就等同于 -sS -sV 两个选项。
  • -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 xx主机存活扫描结果

# 不进行主机存活测试(发送一个icmp和80),优先扫常用端口对TCP syn扫描 1-65535,UDP123、161、53、5060 已经打开的端口
nmap -Pn -n --open -sS -sU -r -p T:1-65535,U:123,161,53,5060 -iL /root/filename

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

挑出错误页面(不一定是 404)用 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,有空再补充。

httpx

一个 http 工具,默认使用 HTTP 1.1 发送请求,当目标存活输出 URL。

首先会用 https 发送请求,无法发送退行至 http。这个工具很好的解决了探测 Web 应用的需求。

选项

  • -l: 在文本中读取目标,内容可以是域名或加上 schema 的完整 URL。
  • -title: 在结果中显示 title
  • -status-code: 显示状态码
  • -content-length: 显示内容长度
  • -H: 指定 Http Header 工具在默认情况下 UA 是带特征的,可以重复指定一个值替换掉
  • -follow-redirects: 有重定向时跟进
  • -no-color: 输出结果不显示颜色,颜色会被当作字符记录在结果中不方便后续文本处理。
  • -silent: 不显示工具 Banner 信息,直接输出结果。
  • -threads: 设置线程。
  • -o: 保存结果。
  • -ports: 指定要扫描的端口。
echo "http://www.jinlz.com:80/bbs/dispbbs.asp?boardid=8&ID=140805&replyID=140805" | ./httpx.exe -title
-status-code -content-length -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" -follow-redirects  -no-color -silent -o resul t.txt

一些常用套餐

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

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

参考链接

标签: none

讨论讨论讨论!