【安全工具】projectdiscover之naabu 端口扫描器源码学习

ProjectDiscovery组织开源了很多自动化扫描的内部工具和研究,它们都是基于Go语言编写,并且在实际渗透中有极大的作用。我非常喜欢这个组织开源的软件,它也是我学习Go语言的动力之一,所以计划写一个系列文章来研究下它们的代码。

介绍

几个特性:

基于syn/connect两种模式扫描

多种输入类型支持,包括HOST / IP / CIDR表示法。

自动处理多个子域之间的重复主机

Stdinstdout支持集成到工作流中

易于使用的轻量级资源



扫描方式

扫描相关的代码在 v2/pkg/scan目录

cdn check

顾名思义,跟踪一下,发现cdn检查调用的是github.com/projectdiscovery/cdncheck中的项目。

通过接口获取一些CDN的ip段,判断ip是否在这些ip段中





connect扫描

naabu的connect扫描就是简单的建立一个tcp连接



syn扫描

syn扫描只能在unix操作系统上运行,如果是windows系统,会切换到connect扫描。

syn扫描的原理是只用发一个syn包,节省发包时间,而完整的tcp需要进行三次握手。

获取空闲端口

初始化时,获取空闲端口,并监听这个端口



监听网卡

获取网卡名称

SetupHandlerUnix 监听网卡



从网卡中过滤数据包 tcp and dst port %d and tcp[13]=18

%d 即第一步获取的空闲端口,tcp[13]=18 即tcp的第十三位偏移的值为18,即仅抓取TCP SYN标记的数据包。

监听数据

通过pcap监听数据




如果dstport为我们监听的端口,并且标志位是 syn+ack,就将端口和ip加入到结果中。

发送数据包

核心内容是从之前监听的tcp发送。





其他

修改ulimit

大多数类UNIX操作系统(包括Linux和macOS)在每个进程和每个用户的基础上提供了系统资源的限制和控制(如线程,文件和网络连接)的方法。 这些“ulimits”阻止单个用户使用太多系统资源。


修改ulimit,只针对unix系统

fdmax.go




随机IP PICK


ipranger 实现就是来自masscan的随机化地址扫描算法

随机化地址扫描

在读取地址后,如果进行顺序扫描,伪代码如下


但是考虑到有的网段可能对扫描进行检测从而封掉整个网段,顺序扫描效率是较低的,所以需要将地址进行随机的打乱,用算法描述就是设计一个打乱数组的算法,Masscan是设计了一个加密算法,伪代码如下


随机种子就是i的值,这种加密算法能够建立一种一一对应的映射关系,即在[1...range]的区间内通过i来生成[1...range]内不重复的随机数。同时如果中断了扫描,只需要记住i的值就能重新启动,在分布式上也可以根据i来进行。

如果对这个加密算法感兴趣可以看 Ciphers with Arbitrary Finite Domains 这篇论文。

可缓存的hashmap

ipranger中使用了github.com/projectdiscovery/hmap/store/hybrid

看了下代码,是一个带缓存功能的hashmap,也带有超时时间。

所有添加的目标(ip)会加入到缓存中,让我想到ksubdomain中也有实现类似的功能,不过是在内存中进行,导致目标很多的时候内存操作会有点问题。如果用这个库应该可以解决这个问题 。

总结

naabu的代码架构很清晰,一个文件完成一个功能,通过看文件名就知道这个实现了什么功能,所以看代码的时候很轻松,naabu也模仿masscan中的部分代码,将它go化,值得学习。

但是从代码来看,naabu只是实现了在linux上的syn扫描,在Windows上会使用三次握手的tcp连接(基于pcap,可以实现在windows上组合tcp发包的,但naabu没有实现),所以在windows上扫描速度和一般扫描器几乎无差别。

naabu的目标添加是先循环读取目标一遍,如果目标cidr地址很大,会造成很多内存占用(虽然也会有硬盘缓存),如果边读取边发送就没有这种烦恼,但naabu不是这样的。

关注私我获取【网络安全学习攻略

你可能感兴趣的:(【安全工具】projectdiscover之naabu 端口扫描器源码学习)