效果图
在压缩包里面有中文的使用说明 为什么用英文仅仅是觉得控制台打印中文不好看 英文都是连蒙带猜加谷歌翻译的
压缩包里面有两个exe 一个内置了默认配置200K 一个不带配置30多K
工具的两个配置文件 修改至nmap的两个配置文件[nmap-server-probes]和[nmap-services]
扫描默认使用TCP连接方式 虽然有提供SYN方式 但是并不建议使用
因为SYN并没有使用第三方库 采用的系统原始套接字方式 而原始套接字系统使用有限制Server系统上勉强使用 PC系统上从XP就开始有限制了WIN7开始完全禁止
而且SYN我只做了扫描端口开放情况 其他什么都没有 因为用IOCP异步建立TCP连接速度也不差 再复用一下端口就不怕本地端口不够用的情况了
但是目前如果直接这样用
xxx.exe -h 192.168.0.0/24 -p 1-65535
可能会造成内存溢出 因为大量的不存在主机和不存在的端口 会一直占用资源 直到timeout 而在timeout这段时间类新的连接还在不断的创建 会造成内存不断叠加 可能就懵逼了
在极端情况下能承受多少台ip全端口扫描 我也不清楚 反正一个C段试过了 下次再看看怎么改进比较好 所以如果ip比较多的情况下 要扫描的端口有很多加上 -i [ICMP]指令 则只扫描存活主机
xxx.exe -h 192.168.0.0/24 -p 1-65535 -i
我把Nmap的[nmap-server-probes]缩减成了几千行压缩进了exe里面 发现nmap中有许多两条一模一样的正则 而且我也不用匹配那么细的版本 所以缩减了
同时也修改了一些nmap的探测数据包 比如探测HTTP的
nmap的:
Probe TCP GetRequest q|GET / HTTP/1.0\r\n\r\n|
我的:
PROBE_DATA [TCP] {HEAD / HTTP/1.0\r\n\r\n|GET / HTTP/1.0\r\n\r\n}
优先发送HEAD不行再使用GET
但是考虑到扩展型 这些正则我肯定是没法去收集更新的所以程序提供了 -cn 指令来转换 nmap 现有的配置文件
在测试的时候发现nmap某处逻辑视乎有点问题
我先写了一个程序监听1521端口来模拟是oracle的服务
if (++i == 4) sock.Send(Encoding.Default.GetBytes("\0\x20\0\0\x02\0\0\0\x016\0\0\x08\0\x7f\xff\x01\0\0\0\0\x20"));
上面有个(++i == 4)的判断 意思是 当第四个连接接入的时候我才发送这段数据 这是一段oracle的指纹信息 其他时候都不给对方发送数据
nmap 扫我的时候 第一次他识别到是1521端口 然后优先采用oracle的探测包往我的端口发送数据 然后我没鸟他 它又创建连接给我发送[\r\n\r\n]继续没鸟他 然后他继续发[GET / HTTP/1.0 \r\n\r\n]...到了第四次的时候 我返回数据包给 他没识别出来 依然继续发送后面的探测数据包 然后就悲剧了。。他就会继续不停的用其他包来发送探测。。
我猜测他接收数据包的时候 去匹配的时候只匹配了该数据包节点下的正则 所以他的第四个包是[OPTIONS / HTTP/1.0\r\n\r\n] 在这个数据探测包的节点下面并没有oracle的正则 他并没有去匹配以前发送过数据探测节点下面的正则 这样就有可能造成一旦漏了一个数据包 那么这个机会就被永久错过了 直到探测结束也没有结果 然而这段时间是赤裸裸的浪费了 因为确实是有可能因为网络原因 导致数据没有收到或者没有即时的被收到认定为了timeout
当然也可能是nmap觉得既然错过了开始的数据包 即使后面发送其他的比如GET 对方也会认为是一个错误的数据包不鸟自己 而且也无法确定是错过了还是确实对方没有数据包返回 就没去匹配以前节点的正则 虽然是一个错误的数据包过去 但是不排除对方会返回一个带oracle指纹的错误信息
也有可能是我测试有问题
虽然扫描的时候可以扫描UDP协议 但是却没有 -u或者-sU 这样参数来指定UDP扫描
真相就是 确实没有这个功能 之所以能扫描 那是因为配置文件[config_probes.st]中存在[PROBE_DATA [UDP] {...}这样的配置
在扫描时候比如遇到 53 端口 在扫描TCP端口的同时 发现配置文件中 53 端口有一个DNS(UDP)的探测包 于是就顺带以UDP方式发送出去了
而nmap的-sU则全部端口使用UDP数据包去探测扫描 我的是在扫描TCP的时候如果遇到该端口有UDP所使用的协议就[顺带]扫描
关于UDP扫描 下个版本考虑
其他也就没啥了好说的了
- ST-PScan-1.0.zip 下载