渗透测试入门指南与路线规划

转载:https://zhuanlan.zhihu.com/p/55484970

玄魂大佬的文章

 

前言

本文面向入门同学,重点讲学习方法,而不是渗透技巧,请认准需求再往下读。
我本非安全大牛,水平有限,所以自然亲民,和许多渗透测试的初学者打得火热。这其中大部分是大学生,还有工作多年,但一直对网络安全热情不减的热血之人。许多同学一直在努力,但是怎么都找不到一条通顺的路,顺利的入门成长。渗透测试只是计算机科学里面的很小的分支,和其他方向一样,共用着同样的计算机基础知识。
无法入门,对 90% 的初学者而言,其实是基础不够。这里面有少数的学生是刚入大学之门,不知渗透测试为何物,怀着探索神秘世界的心情,面前是一个黑洞。更多的情况,其实是我们的教育出了问题,计算机科学专业(甚至是更直接网络安全专业)的日常教学和实践方式让大多数学生都学无所获。计算机基础没有,直接面对感兴趣的渗透测试这样的上层建筑自然迷茫。
面对这些同学,我自然无法从计算机原理到操作系统原理,再到编译原理,再到编程语言,再到算法和数据结构,再到网络基础,加密解密......这一堆的西给他们补全,然后再来学习渗透测试。不过幸好他们的兴趣还在,可以利用自顶向下的方法,找一个容易的切入点,引导初学者通过自我努力,80% 的自学+20% 的点播的方式,来进入渗透测试的大门。下图即是这种思想的基本学习思路。


了解渗透测试的体系轮廓是第一步,从全景上认识这门技术,避免从一开始就走错方向。
训练的切入点为工具使用,使用工具门槛低、容易上手和产生成就感。在使用工具的过程中培养对渗透测试的流程和基本测试方法的学习,对技术概念和应用架构、协议、原理有一个大致的了解和感性认识。
编程是一个重要的分水岭,但是也要采用容易入门的方式来学习和训练编程,入门即可,尽可抛弃那些难懂的概念。
开发工具和应用,这是在有了编程的基础上,直接上手做功能,在这个过程中加深对编程技能的提升。通过代码来理解工具,理解漏洞,理解应用本身。
在整个过程中,涉及到的计算机基础知识,一些专业的概念,通过多轮循环的方式,逐步加深。当能用代码实现基本的工具,并将这些工具用到实际的渗透测试任务中,我认为入门的任务就完成了。下面我们针对这一基本流程和目标做进一步的拆解。
先看全景再看细节
方法论
所谓全景,就是在埋头苦学之前,先搞清楚整个知识体系的框架结构。否则如盲人摸象,连门在哪都不知道,自然无法入门。


大致需要搞懂的内容如下:

  1. 是什么。需要有一个大致明确的定义;
  2. 搞清楚是什么之后,要搞清楚他的知识体系,有可能你擅长数学,但是它要的是语文,此种情况是否要敬而远之呢?如果知识体系不是问题,那么看一看基本技能要求是什么样的,在没有足够的基础情况下,不要直接触碰那些“高深”的内容,否则最直接的结果就是放弃。
  3. 在全景中去对知识进行划块,粗粒度即可,就好像看一张中国地图,然后再看都包含了哪些省和直辖市。然后去看各个知识块之间的关系,以便在学习过程中搞好先后顺序,是否可以并行学习等。

实践--明确基本流程
具体到渗透测试,我们给一个定义:
渗透测试是在授权情况下对目标系统、应用或者基础设施进行安全性评估的过程。
这里需要注意,核心是测试,不是攻击也不是防御。它是一个过程,不是一个工具,也不是一个技巧或知识点。想要理解渗透测试,就需要从“过程”的角度去展开一个维度,再从一个维度向其他维度去扩展。



上图是我提倡的一个给初学者的渗透测试的基本流程。这个基本流程是渗透测试的方法论,在入门时最好按照这个流程,按部就班的去学习,训练和实战。以流程为入口,划分渗透测试实践的知识范围。
信息收集
流程的第一步为信息搜集。在这一步中,我们尽可能的使用多种信息搜集工具,包括搜索引擎和社会工程学方法。对能收集到的信息,来者不拒。只有建立在足够信息分析的基础上,渗透测试才能游刃有余。因为信息越多,发现漏洞的几率越大。同时对不同应用的信息收集的侧重点也不同。比如 Web 应用和桌面应用,对于 Web 应用,服务器操作系统、Web 服务器类型、Web 后台语言会被首先关注;而对于桌面应用,更多的是关心应用程序本身。
漏洞分析
在搜集了足够的信息之后,首先我们要判断它会存在哪些漏洞。这可以通过搜索引擎,和通用的漏洞扫描工具来完成。通常使用搜索引擎是明智的选择,比如我们在第一步中知道对方站点的编写语言为 PHP 5.3,可以在 Google搜索“PHP 5.3”漏洞。


多专业的 Bug 站点的信息,更值得我们驻足。这样我们就可以针对性的进行漏洞扫描。此时使用专门的漏洞扫描工具比通用工具来得更实际和高效。
攻击
基本上,你能得到的漏洞,都可以找到对应的攻击方法。Kali Linux 中也提供了很多现成的工具,来帮助我们顺利的攻击目标。这一步包含两个方面,一个是利用现有漏洞利用,一个是提权。二者有时候是一回事,比如权限漏洞。
渗透测试和以破坏为目的的黑客行为还是有区别的,测试的目的是证明漏洞的存在,而不是搞破坏。所以有时候攻击成功之后可能测试任务就结束了,当然这和测试目标是紧密相关的。
攻击还包含一个重要的内容,就是如何隐藏攻击行为或者清除攻击痕迹。让对方无法或者说很难通过反追踪技术查找到攻击者。
权限维持
权限维持阶段,是我们成功攻破一个系统后,如何继续保持对系统的控制权限的问题。一般会创建高权限的隐藏账户,或者安装后门程序(包括木马,病毒)。
文档化
文档化不是初学者的强制流程,但是笔者强烈建议我们对每次渗透测试的过程和结果进行文档化处理。这样会形成知识的积累。当然如果你是专业的渗透测试工程师或者手上有渗透测试的项目,那么标准化文档是必不可少的。
实践--明确流程中每个阶段的基本内容


如上图,在每一个阶段,我们都要思考三件事情:

  1. 这个阶段要做是事情是什么?
  2. 有哪些工具可以辅助?
  3. 为什么要这么做?工具实现其功能的原理是什么?漏洞形成的原因是什么?

知识获取途径
知识体系靠想是想不来的,需要先找一个途径去获取这些内容。入门适合看成体系的系列教程,最好的办法是找难度较低的书籍,然后通过搜索引擎找一些好的文章去补充不了解的知识点。本文也会推荐一些书籍和资源供大家进行选择。但是在了解全景体系的这个过程,通过一些概述文章,图书的目录、简介、样章这些免费资源也够用了,毕竟只是做前期了解。比如我们再京东搜索“渗透测试”,会出现一大批书,因为渗透的基本内容就那些,所以各种书的重复内容还是很多的。


我们可以逐一去看目录,利用思维导图或者你喜欢的方式把内容整理出来,比如 Kali linux 渗透测试的艺术 思维导图,Web 渗透测试思维导图,都是对图书内容进行的整理。


方法简单,但是需要你去下力气实践,下面我们继续进行拆解。
实践--流程和渗透测试任务内容和工具
上面我给初学者的一个简化渗透测试流程,在每个流程应该做的事情进行了概述,如何去执行这一阶段的任务,最简单的入门方法是从工具入手。每个阶段都有哪些工具可以使用呢?最简单的办法就是打开 Kali Linux,它已经对工具进行了分类,我们可以在此基础上进行额外的扩展。


Kali Linux 将所带的工具集划分为十四个大类,这些大类中,很多工具是重复出现的,因为这些工具同时具有多种功能,比如 nmap 既能作为信息搜集工具也能作为漏洞探测工具。另外,这里介绍的工具都是系统默认推荐的工具,我们也可以自行添加新的工具源,丰富工具集。根据笔者的经验,绝大多数情况下,系统推荐的工具已经足够使用了。一些专用工具,随着自己经验的丰富,可以逐渐添加进来,最终形成符合自己风格的一套工具。我们以 Kali 为例,对这些工具和对应的任务,结合流程,做简单的介绍。下面是入门阶段需要掌握的内容,工具不是核心是辅助,重要的是理解要做的事情和基本原理。
信息搜集
信息搜集工具集又分为 DN S分析、IDS/IPS 识别、SMB 分析、SMTP 分析、SNMP 分析、SSL 分析、VoIP 分析、VPN 分析、存活主机识别、电话分析、服务指纹识别、流量分析、路由分析、情报分析、系统指纹识别共 15 个小分类。Kali 的这些分类,基本概况了信息搜集阶段我们需要了解的任务内容。如果你有不熟悉的概念可以借助搜索引擎和教程去做大致了解了。


再下一级别的工具就不再列举了,自己去看就可以了。
漏洞分析(探测)
漏洞分析工具集,共分为 6 个小类,分别为 Cisco 工具集、Fuzzing 工具集、OpenVAS、开源评估软件、扫描工具集、数据库评估软件。


漏洞攻击
Kali 中另外几个大类的工具集是按应用场景和类型做的划分,这在我们后面讲的多轮迭代学习过程中,第二第三迭代会非常有用。
Web 程序下主要包含 CMS 识别、IDS/IPS 识别、Web 漏洞扫描、Web 爬行、Web 应用代理、Web 应用漏洞挖掘、Web 库漏洞利用共 7 个类别。


密码攻击主要包括 GPU 工具集、Passing the Hash、离线攻击、在线攻击。


无线攻击包含 RFID/NFC 工具集、Software Defined Radio、蓝牙工具集、其他无线工具、无线工具集。


漏洞利用工具集,主要包含了几个流行的框架,和其他工具。


嗅探、欺骗 包含 VoIP、Web 嗅探、网络欺骗、网络嗅探、语言监控五个工具集。


权限维持
权限维持包含 Tunnel 工具集、Web 后门、系统后门三个子类。


渗透报告
报告工具集,主要用于生成、读取、整理渗透测试报告的工具,包含 Domentation、媒体捕捉、证据管理。


实践--流程和工具与原理


针对原理、工具和内容,需要继续细化,可以进一步组合新的二维坐标系。对于入门学习过程中,我们可以简单的将原理拆分为两个层次:理论理解和编程角度理解。会用,会操作,能讲清楚基本理论,基础协议,这是一个渗透测试认知入门,不代表真正的入门,如果你不从编程的角度来重新审视这些内容,那么永远都上不了一个新台阶。
比如我们在信息搜集阶段做端口扫描,常用的工具为 nmap,使用很简单,但是这个时候需要进一步了解下 nmap 的优势,在原理层面为什么优于其他工具。工具是代码编写出来的,想要完全理解其原理,必须要从编程的角度去分析。网络编程的基础是网络协议,所以对网络协议的学习也要同步进行。在上面的简图中,我画了一道线,懂代码和不懂代码,其实这也是渗透测试人员能力的分水岭。编程是一道障碍,但是必须跨域,同时又不能让编程成为渗透测试入门的阻碍。 基于这些考虑,我一般设计入门迭代方案时,先不考虑编程的,在进入编程学习的同时,也是按入门难度对大部分内容做切割,后面我们再谈这方面的内容。


如上图,继续多维度拆分,工具和渗透测试任务往往是多对多的关系。测试内容和原理之间,仍然要把握编程这条分水岭。下面我们看如何确定学习和练习的内容。
螺旋学习法
方法论
螺旋学习法,换做IT界熟悉的概念就是迭代。基本的理念就是从一个最简单的并且是完整的模型开始,通过多次迭代,不断的去丰富细节和扩展功能。借用网上的几张图: (),结合渗透测试我简单说下螺旋学习法的过程。


首先确定整体和一级组件。对于渗透测试的入门学习而言,我们把前面全景分析的内容归纳一个学习模型出来。


如上图,一个完整的模型包含:原理、工具、编程和实战四个子模块。因为大多数入门者对编程都比较恐惧,我们把编程放到第二个阶段。
每一阶段的练习模式都是反复按照渗透测试的基本流程来,开始遇到的障碍的时候可以跳过,然后下一轮迭代再重点解决。
入门训练分三个大迭代去做。每个大迭代需要对子模块再进行内部模块划分。
接下来你把其中的某些子模块放大,整个渗透测试的领域也会随着你的学习而膨胀起来,如下图。


每一轮迭代我们需要根据自身的情况,顶一个容易掌握的标准,把不能掌握的内容暂时排除在外。因为随着学习迭代的增加,能力和知识水平一直都在增长,所有在第一轮遇到的难点,可能回过头来就会变成容易理解的内容。这样我们一直保持一个低难度学习的状态,不断上升,才不会让你中途放弃。
每一个大迭代中,我们要把所有模块都按低难度学习一遍,以保证渗透测试体系的完整性。同时对子模块做同样的分析,比如这个大迭代中,我要学习 Python 编程,那么需要按照前面说的方法对 Python 编程做全景分析,划分模块,区分难度等级,划分迭代。在我划分的三个大迭代中,第一个迭代不包含编程,二三迭代包含编程,同时会适当的将编程和工具使用,渗透测试任务逐步结合,达到互相融合和促进的效果。
下面我描述下三个迭代的内容。
实践
在具体实践过程中,我通常会推荐从 Web 渗透测试开始。因为当前 Web 应用是最常见的应用开发形式,同时一个完整的 Web 应用,会涉及渗透测试的各个领域。比如下面这张 Web 应用的架构图:


因为 Web 的复杂性,一个完整的 Web 应用渗透会将各个领域交织在一起的,从 Web 应用入手,会拓展到内网,操作系统,硬件,App 各个安全领域。
下面我举例说明的三个迭代学习过程,以 Web 渗透测试入门为基本范围,编程假定 Python 语言为主,工具训练以 Kali 为载体。
第一迭代
以 kali linux 为基础,把系统中所有工具都过一遍。开始动手实践的时候,选一本 Kali 的教材,相关书籍很多,选一本就够用,其他相关知识点,结合搜索引擎做扩展即可。
搭建靶机环境,选择一个网上流行的训练环境(需要能查到题解答案的),推荐 DVWA 和 DVWS。训练目标为熟练使用工具或者手工安装渗透测试基本流程完成对目标漏洞的攻击。
在原理理解层面,需要理解浏览器/服务器应用的基本架构;理解各个阶级各种工具完成任务的概念及作用;掌握基本的攻击方法和流程;理解各种漏洞基本原理。这个时候希望大家尽可能多做一些运维相关的任务,从安装服务器操作系统开始,到配置基本的 Web 服务器(比如配置 Nginx 支持动静态网站),手动大家 DNS 服务器,安装流行的数据库,下载流行的 CMS 部署到自己的实验环境中。 此时我们虽然不会编写 Web 站点,但是下载一个 CMS,按部就班的搭建一个网站还是可以的。这有助于我们理解网站的基本架构,以及 Web 服务程序、Web 应用代码、数据库等是如何组织在一起给用户提供功能的。
第二迭代
通过第一个迭代,我们可以利用工具完成一些简单的渗透测试任务了。有些工具的高级用法可能被你跳过去了,这个时候可以回头看看了。另外是是时候学学 TCP/IP 体系结构了,同时重点学习 HTTP 协议。对常用工具的原理多查找资料,去学习,从协议的角度去分析工具。
这一迭代的核心是编程入门,建议选一本经典的 Python 编程的入门书籍,你大致浏览的全书的内容之后,给自己定一个大概两个月的学习内容,先粗略的筛掉不好理解的东西。我在编写针对性的 Python 黑客编程入门的教程时,会尽可能的对 Python 基础进行裁剪,整个入门课程的各个章节都是对 Python 基础的一个不断的迭代的过程,每个章节都是本着够用就好的原则。相关基础会在实践的环节不断根据需要补充进去。如果想一下把整个 Python 编程的内容学全了再和渗透测试结合,是违背了螺旋学习法的原则的。这个大家要把控好。我个人定制的课程目录供参考(整体内容是完整的,但是每个章节的内容都按入门标准进行了精心设计,详情可以参考。)
Python 黑客编程之极速入门
第一章:Python 编程基础 • Python 简介和开发环境搭建
• 数值类型
• 字符串、列表、元组、字典和集合
• 流程控制
• 函数
• 模块
• 异常处理
• 面向对象编程

第二章:系统级编程与安全 • Python 编程之禅
• 文件和目录
• 线程
• 进程的创建
• 多进程
• 进程内通信 (IPC)
• 实例讲解

实战训练,选择一些专项靶场,比如专门训练 SQL 注入的,对这些专项训练内容继续递归迭代。可参考的同类书籍(不一定是适合你的,可以参考着去搜索):


第三迭代
这一迭代的核心是黑客编程入门,Web 开发基础。黑客编程找一本浅显的 Python 黑客编程的书籍来继续训练(目前市面上能见到的中文书籍都属于入门级别的)。我定制的大纲,可供参考(整体内容是完整的,但是每个章节的内容都按入门标准进行了精心设计,详情可以参考 
第三章:网络安全编程 – 嗅探和注入 • 原始套接字基础
套接字编程
• 服务端和客户端编程
• 无线嗅探
• 数据包注入
• PCAP 分件分析
• 实例讲解

第四章: Web 应用安全 • Web 服务端和浏览器端
• Web 应用模糊测试
• HTML 内容自动分析
• 浏览器模拟
• 攻击 Web Service
• 代理
• 自动化攻击(SQL注入,XSS等)
• 实例讲解

第五章:漏洞利用 • Exploit 开发技术
• 免杀
• 使用 Python 写漏洞利用插件
• 二进制分析
• 自动攻击
• 实例讲解

第六章: 恶意软件分析和逆向工程 • 进程调试
• Pydbg 入门
• 实时应用分析
• 断点调试
• 内存补丁
• 实例讲解

第七章: 自动化攻击 • Python 自动化攻击
• 常用类库和应用
• 实例讲解

第8章: 课程总结和寄语
关于 Web 编程,是你必须要涉及的,入门标准需要你掌握基本的前后端编程基础。前端包括 JavaScript、Html、CSS 的基本使用。后端要求能使用一个 Web 开发框架,编写基本的 Web 站点,能自己阅读靶机的实现代码。在此基础上理解常见漏洞的本质原因,比如 xss,csrf,sql 注入,点击劫持等等。同样,找一本 Web 编程的入门书籍来学习即可,仍要把握螺旋学习的原则,同时定好难度标准,结合你的渗透学习内容,够用即可。
可参考的资料如下:


一些推荐的资源

  1. 书籍(略)
  2. kali linux 视频教程(扫描首页的二维码回复“kali”)

下面的一些电子资源,知乎上不允许分享,订阅号回复“strm”,查看原文获取。

 

  1. kali 电子书 :
  2. Python 入门电子书:
  3. Python 黑客编程电子书:
  4. 靶场:

 

  1. 我个人的一些资源清单(内容庞杂,记住够用即可的原则,不要贪多) 

 

有自学困难症的同学希望多多交流
如果你有自学强烈意愿的话,按照我的规划,一步步去做,肯定可以顺利入门的。
对于那些需要和其他人一起交流学习,遇到问题需要及时指导的同学,我这里也提供了额外的选择。
可以加入qq交流群:550218278 关注微信订阅号:


针对不想自己寻找资料,梳理知识点的同学,我组织人力翻译、原创了一系列教程(之后也会在 GitChat 发布),包括基础训练的《Kali Linux实战手册》,结合选好工作室靶场进行实战训练的《web与内网渗透实战》,黑客编程系列的《Python黑客编程之极速入门》与《Python黑客编程之登堂入室》,面向无线网络的专项教程《无线网络渗透测试实践》,还有结合其他教程的 Web 等基础知识的辅助提升。针对这部分同学,我采用的是社群式学习,不强制教学进度,共同交流,答疑,提升。


了解社群学习方式,订阅号回复“xq”


写在最后
一篇文章,不能将各种细节都展现出来,其实还是留下了很多遗憾。但是基本方法和原理已经讲清楚了,修行在个人。这份入门指导,虽然没有那么高的科技含量,但是是你在网络上看不到的,真正的理念上的指导文章。最后给几点期望:

  1. 起始阶段选择一本书,一种教程去学习就可以了,千万不要变成搜集爱好者
  2. 多轮迭代去学习,遇到难点就跳过去,不要执着。回头再来。
  3. 学会看目录,整理知识要点。
  4. 把编程变成核心。
  5. 练习,练习,再练习。

------------------------------------------------------------------------

posted on 2020-02-02 16:15  a阿军  阅读(1239)  评论(0编辑  收藏  举报

导航