信安之路上很少发布跟开发相关的文章,给人的感觉好像搞安全不需要写代码一样的,其实不是这样的,因为开发相关技术有专门的人去分享,而我们只想专注于安全技术而已,今天就来给大家聊一聊在渗透测试中我们可能需要写的脚本功能,我平时代替手工提升效率使用的语言是 python,所以就以 python 为例贯穿整个渗透过程的功能,也可以作为指导,针对性的去学习和实践。
渗透过程中通常包含信息收集和漏洞利用两个主要部分,在信息收集中,我们要收集目标的外围资产信息,也就是我们在外部可以直接访问的服务器和应用,这其中包括:域名信息、IP 信息、企业内部员工信息、端口开放信息、web 应用信息等。
域名信息包含一级域名的注册信息以及企业对外解析的所有二级域名列表等,注册信息可以通过 whois 的方式去查看,互联网上存在很多网站提供 whois 查询的功能。
获取企业所有二级以上域名的途径很多,比如:
1、通过爬虫的方式去目标网站爬取
2、通过搜索引擎搜索相关数据
3、通过字典进行枚举(dns 解析)
更多方式参见:《二级域名收集的姿势总结》
IP 信息是企业对外开放的所有 IP 列表,越多越好,获取 IP 的途径主要有两种,一种是通过收集到的域名解析出该企业的 IP 列表;第二种是通过 whois 查询这些 IP 信息,看这些 whois 信息中是否包含目标公司的信息,从而确认 IP 的归属,有的时候,whois 中包含的是一个 IP 段,获取你可以通过 IP 获取公司的整个 IP 段。
用户邮箱的收集主要通过搜索引擎寻找那些安全意识不到位公开泄漏的邮箱地址,还可以通过网上泄露的公司相关文档中保存的邮箱地址,更多的方式这里不说了,自己思考吧。
端口信息的获取主要通过扫描的方式,利用前面收集到的 IP 信息,利用端口扫描的方式获取所有开放的端口以及相关服务。
web 应用信息主要是方便我们寻找 web 应用的漏洞,其中包含 web 指纹、服务器信息、目录结构等。
1、如果我们需要测试的域名非常多时候,想要了解这些域名的基础信息,如果一个一个去 whois 查询,是不是会很累?我们能否进行自动化?当然可以,实现的方式也很简单,我们在网络上找一个可以查询域名 whois 信息的网站,查看其查询接口,使用 python 的 requests 库请求接口查询即可,然后写一个 for 循环,自动获取所有域名信息保存,跑完自己查看结果即可。
2、在收集二级域名列表时,我们需要从搜索引擎里提取相关记录,手工复制是不现实的,毕竟大厂的二级以上的域名都是上千上万的,所以我们需要从搜索引擎拿到搜索结果并将二级以上的域名提取出来,请求内容上面已经说了,提取域名主要用到的是 python 的 re 库,学习正则的使用至关重要。
3、收集域名列表除了爬虫、搜索引擎的方式外,还可以用字典枚举,枚举的过程主要用到的是 dns 的解析功能,python 中的 socket 库,其中有个函数 gethostbyname
可以实现你想要的功能,最后准备一份字典就可以开跑了。
4、获取了一大批的 IP 地址,还想扩展更多的 IP,那么就需要对收集到的 IP 进行 whois 查询,Linux 下存在一个工具 whois 直接可以查询 IP 的 whois 信息,效率蛮高的,我们可以用 python 的 os 模块等可以执行系统命令的模块调用 Linux 下的 whois 程序查询你想查的 IP 地址,最后处理查询的所有结果即可。
5、IP 列表和 IP 段获得之后,我们要知道这些 IP 上开放了那些端口和服务,这时就需要对这些 IP 进行端口扫描,最简单的方式就是使用 nmap 来扫描,python 的调用方式跟上面的一样,我们还可以自己写端口扫描工具,其中最核心的是判断 IP 的某个端口是否开放,TCP 的三次握手原理我们要懂,可以用 python 的 socket 库,还可以用 scapy 库构造协议进行检测。
6、在端口扫描的时候,需要加快速度,降低检测的时间,那么就需要用到 python 的 threading 库,使用多线程技术,提升速度,在 guthub 上有很多封装好的 threadpool 库,直接利用就好。
7、对于 web 应用,第一步是要获取基本的信息,我们可以使用 python 的 httplib、urllib、urllib2 等基础库,获取 IP 的 web 端口下的基本信息,包括 header 中的服务器信息、默认首页的标题和内容等。
8、目录结构信息获取的方式第一种是通过爬虫根据网站的链接探测目录结构和文件列表,还可以通过自己收集的字典,进行枚举目录和文件,这里用到的库跟上面的类似,至于收集的全不全,就看你收集的字典够不够好。
经过信息收集模块之后,我们对企业的资产信息有了大概的了解,其中可能会包含存在漏洞的应用,在漏洞利用阶段,需要自动化的地方不多,毕竟漏洞利用是具有破坏性的,大概提一下。
1、网络层面的漏洞利用可以用 scapy 构造协议进行利用
2、web 层面主要是那些与 http 协议相关的库,如:urllib、httplib、requests 等
其他的大家可以补充讨论。
这里提到的东西还是不全面,本文的主要目的是告诉大家,在搞渗透的时候,尽量实现自动化,总结规律,提升工作效率,在有限的生命里做更多的事,懒人是改变世界的主要驱动力,有些时候不要太勤快,容易导致你浪费大量不必要的时间。