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

扫多个地址用空格分隔

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
-n #不对 ip 进行反向解析,避免解析浪费时间。
-p- #等同于-p 1-65535
-Pn #跳过主机发现的过程,不管主机是不是存活,直接进行端口扫描、版本检测或操作系统检测。
--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)进度接着扫。

例子

# 用 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

调用脚本

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。

参考链接

标签: none

讨论讨论讨论!