├── images ├── 0w7yLIDpJA28cdkbDs7lY1A-iXAtfRiM8rQLYKu8lGQ.png ├── 7_Xe5uQz95r9IQKXeORyBs8_z-RVVdMLTK3CLWaEoHs.png ├── QU2K3KvSCbaeKi23DB_aI1Q7euTkZ4shcaNfiYMrYTw.png ├── UQX_nonjGMkoAu6KRbUXCQLcEe2gRfnjtwa4q2o908Y.png ├── i5JIhzJXG3pb1kmTnTyX6cDXKzwKIBQaq7MLEKcgsKU.png ├── oyPApp_LF1N_vWec19XqtrDwYWStrNnOOoDMvtGFyMo.png ├── pl8xWAKr4zp8K8DaNaQc7_zA9Rw_YRx5sOez_Kn927c.png ├── tRHCzZJ8YivrYVo3L5WWlNhQZFy4HpCFk7e50otYJbo.png └── vyZYgO1FFU0ufl-Zj9zqcbMY-Pme3fQL4cvB2NXFyPQ.png └── readme.md /images/0w7yLIDpJA28cdkbDs7lY1A-iXAtfRiM8rQLYKu8lGQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Young873/xnmap/HEAD/images/0w7yLIDpJA28cdkbDs7lY1A-iXAtfRiM8rQLYKu8lGQ.png -------------------------------------------------------------------------------- /images/7_Xe5uQz95r9IQKXeORyBs8_z-RVVdMLTK3CLWaEoHs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Young873/xnmap/HEAD/images/7_Xe5uQz95r9IQKXeORyBs8_z-RVVdMLTK3CLWaEoHs.png -------------------------------------------------------------------------------- /images/QU2K3KvSCbaeKi23DB_aI1Q7euTkZ4shcaNfiYMrYTw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Young873/xnmap/HEAD/images/QU2K3KvSCbaeKi23DB_aI1Q7euTkZ4shcaNfiYMrYTw.png -------------------------------------------------------------------------------- /images/UQX_nonjGMkoAu6KRbUXCQLcEe2gRfnjtwa4q2o908Y.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Young873/xnmap/HEAD/images/UQX_nonjGMkoAu6KRbUXCQLcEe2gRfnjtwa4q2o908Y.png -------------------------------------------------------------------------------- /images/i5JIhzJXG3pb1kmTnTyX6cDXKzwKIBQaq7MLEKcgsKU.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Young873/xnmap/HEAD/images/i5JIhzJXG3pb1kmTnTyX6cDXKzwKIBQaq7MLEKcgsKU.png -------------------------------------------------------------------------------- /images/oyPApp_LF1N_vWec19XqtrDwYWStrNnOOoDMvtGFyMo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Young873/xnmap/HEAD/images/oyPApp_LF1N_vWec19XqtrDwYWStrNnOOoDMvtGFyMo.png -------------------------------------------------------------------------------- /images/pl8xWAKr4zp8K8DaNaQc7_zA9Rw_YRx5sOez_Kn927c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Young873/xnmap/HEAD/images/pl8xWAKr4zp8K8DaNaQc7_zA9Rw_YRx5sOez_Kn927c.png -------------------------------------------------------------------------------- /images/tRHCzZJ8YivrYVo3L5WWlNhQZFy4HpCFk7e50otYJbo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Young873/xnmap/HEAD/images/tRHCzZJ8YivrYVo3L5WWlNhQZFy4HpCFk7e50otYJbo.png -------------------------------------------------------------------------------- /images/vyZYgO1FFU0ufl-Zj9zqcbMY-Pme3fQL4cvB2NXFyPQ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Young873/xnmap/HEAD/images/vyZYgO1FFU0ufl-Zj9zqcbMY-Pme3fQL4cvB2NXFyPQ.png -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # xnmap:比nmap更专注于服务识别的工具 2 | 3 | ### 前言 4 | 5 | 在进行端口及服务方面信息收集时,常规方式是用masscan进行端口开放检测,然后再用nmap对开放端口进行具体的服务识别。 6 | 7 | 但nmap在服务识别时有两个明显硬伤: 8 | 9 | 1. nmap不支持多ip的不同端口扫描。 10 | 11 | 假如已有masscan扫描结果或者已用其他方式收集到一批开放的端口,现在想对这些开放端口做详细的服务识别时,目前的方式都是用脚本调nmap进行一个一个的扫描。但这样又会造成一个问题,使用单线程扫描速度会很慢,而多线程扫描的话又会同时启动多个nmap进程,占用大量资源。 12 | 13 | 2. nmap会漏掉或者误报一些很明显的服务 14 | 15 | 如下图所示,两个http服务,用nmap识别,一个没识别出来,一个识别错误。假如只依赖nmap的识别结果导出http资产,必然会遗漏大量的http资产。 16 | 17 | 18 | 19 | ![image](images/i5JIhzJXG3pb1kmTnTyX6cDXKzwKIBQaq7MLEKcgsKU.png) 20 | 21 | ![image](images/7_Xe5uQz95r9IQKXeORyBs8_z-RVVdMLTK3CLWaEoHs.png) 22 | 23 | 24 | 25 | ![image](images/0w7yLIDpJA28cdkbDs7lY1A-iXAtfRiM8rQLYKu8lGQ.png) 26 | 27 | ![image](images/QU2K3KvSCbaeKi23DB_aI1Q7euTkZ4shcaNfiYMrYTw.png) 28 | 29 | 30 | 31 | ### nmap识别错误的原因 32 | 33 | 简单来说nmap识别主要服务主要依靠`nmap-service-probes`和`nmap-services`两个文件: 34 | 35 | * `nmap-service-probes`:服务识别所使用的规则库 36 | * `nmap-services`:端口的默认服务 37 | 38 | nmap在识别时逐个检测规则是否命中,如果命中则返回对应服务信息,如果没命中,则返回端口对应的默认服务,如果默认服务也没有,那么就是unknown。 39 | 40 | 至于为什么nmap有上万条规则都识别不出来http,是因为每条规则都设置的特别复杂,像`^http \d\d\d`这种简单的规则是没有的。╮(╯▽╰)╭ 41 | 42 | ### xnmap服务识别工具 43 | 44 | #### 简介 45 | 46 | xnmap利用nmap规则库编写的专门用于服务识别的工具。 47 | 48 | * 支持多ip不同端口的批量识别 49 | * 支持nmap的所有服务规则和默认端口规则(对于端口的默认服务会增加default/xxx标记) 50 | * 每个端口都会扫描内置的所有规则,并输出所有的识别结果(nmap识别到一种就会返回) 51 | * 增加了一些简单有效的识别规则,比nmap原规则识别率高很多 52 | * 支持masscan的-oL文件结果的扫描,可联动masscan进行扫描。 53 | 54 | #### 使用方法 55 | 56 | 57 | ![image](images/pl8xWAKr4zp8K8DaNaQc7_zA9Rw_YRx5sOez_Kn927c.png) 58 | 59 | 60 | 61 | 参数: 62 | 63 | * \-f : 扫描的端口文件(文本格式,每行一条,`#`开头的行不扫描,单行格式为: 127.0.0.1:80) (支持masscan的-oL格式) 64 | * \-i : 扫描目标 65 | * \-n : 扫描线程,即同时扫描目标的数量 66 | * \-pn : 探针线程,即同一目标同时发送的探针数量 67 | * \-t : 超时时间 68 | * \-o : 保存结果文件,保存格式仅支持json 69 | * \-retry : 设置发现端口关闭时重新尝试次数 70 | * \-silent : 仅在控制器输出结果 71 | * \-open : 仅输出开放状态的端口 72 | * \-json :控制台输出json格式的结果 73 | * \-baner : json格式时输出banner 74 | 75 | 使用示例 76 | 77 | ```bash 78 | ./xnmap -h 79 | ./xnmap -i 109.244.212.224:10011 -json 80 | ./xnmap -i 109.244.212.224:10011,220.196.133.78:80,220.196.133.78:443 -json -pn 200 81 | ./xnmap -f port.txt -json -pn 200 -n 50 -o res.json 82 | ./xnmap -f port.txt -json -pn 200 -n 50 -retry 1 -silent -banner 83 | 84 | # 联动masscan进行端口开放扫描及服务识别 85 | masscan -p 1-65535 221.226.63.130 -oL massscan_out.txt --rate=3000 && ./xnmap -f masscan_out.txt 86 | ``` 87 | 88 | #### 工具截图 89 | 90 | ![image](images/tRHCzZJ8YivrYVo3L5WWlNhQZFy4HpCFk7e50otYJbo.png) 91 | 92 | ![image](images/oyPApp_LF1N_vWec19XqtrDwYWStrNnOOoDMvtGFyMo.png) 93 | 94 | 95 | 96 | ![image](images/vyZYgO1FFU0ufl-Zj9zqcbMY-Pme3fQL4cvB2NXFyPQ.png) 97 | 98 | 99 | 100 | ![image](images/UQX_nonjGMkoAu6KRbUXCQLcEe2gRfnjtwa4q2o908Y.png) 101 | 102 | 103 | 104 | --------------------------------------------------------------------------------