前言
说到安全就不能不说漏洞,而说到漏洞就不可避免地会说到三座大山:
漏洞分析 漏洞利用 漏洞挖掘
从个人的感觉上来看,这三者尽管通常水乳交融、相互依赖,但难度是不尽相同的。本文就这三者分别谈谈自己的经验和想法。
漏洞分析
漏洞分析相对简单,通常公开的漏洞中就有一两句话描述了漏洞的成因,自己拉代码下来看也就能了解个大概。对于一些自己发现的bug,从崩溃日志中一般也能比较轻松地进行复现和调试。尽管有的bug排查起来相对繁琐,但总归是可以一步步减少范围锁定最终目标的。因此,网上对于漏洞分析的文章很多,一方面分析起来有迹可循,另一方面分析的漏洞也不一定是自己的“原创”漏洞,素材来源更加广泛。
漏洞分析虽然简单,却是每个安全研究人员的必经之路。就像练武中的扎马步、站梅花桩一样,是日积月累的基本功。之前研究内核时有段时间热衷于写漏洞分析的文章,后来随着日渐熟练,写文章记录的速度已经远远跟不上分析的进度,所以现在往往懒得动笔了。
基本功必不可少,但扎马步扎得再稳也不表示你能独步武林。有大佬曾经说过,如果他想的话,可以一天写好几篇分析文章还不带重样的。毕竟,漏洞分析的目的是为了学习、吸收、转化,以史为鉴,最终形成自己独到的理解。
漏洞利用
漏洞利用就相对复杂一点,尤其是对于二进制漏洞,成功的利用需要精巧的内存布局,因此需要对程序涉及到的数据结构要相当的了解。而且并不是所有漏洞都能转换为有效利用的,一般比较容易编写利用的漏洞,我们称之为品相好。对于品相不好的漏洞,我更喜欢将其称之为bug。当然也有人认为 bug 至少造成了程序崩溃,所以可以算一个DoS(拒绝服务)漏洞。
当然漏洞能否利用其实也是和人有关。对于复杂的系统,你认为无法利用的漏洞,大佬就能以一种你没想到的方式利用成功。比如安卓CVE-2019-2025(水滴)漏洞,属于Binder中的一个条件竞争,竞争窗口只有几条汇编指令。漏洞品相相当不好,连CVSS给出的可利用分数(Exploitability Score)也只有1.8分,但360的大佬们也通过玩弄调度器进行稳定利用提权了。
因此,关于漏洞利用的文章也就少了很多。一方面处于负责任披露安全问题的考虑,安全研究人员不会给出完整的利用细节,以免脚本小子滥用;另一方面对于公开的利用,你也总不能跟着写一篇文章灌水,毕竟利用思路很多时候是因人而异的,过于雷同就难免有炒冷饭的嫌疑,除非有一些独到的思考补充,或者有新的利用思路。
很多时候漏洞利用的文章看着看着就变成了漏洞利用分析的文章,这也说明了漏洞利用难度颇高,能独立写出原创利用并进行分享的人不多。就我的感觉而言,漏洞利用更像是另一种形式的软件开发,首先通过漏洞构造原语,然后通过原语实现最终的利用程序。
漏洞挖掘
漏洞挖掘可以说是安全研究人员向往的高地之一,不管你分析了多少漏洞,写了多少利用,如果你没有自己挖掘出过原创的漏洞,那你的安全研究生涯就是不完整的。但是漏洞挖掘这事儿并不是确定性的。漏洞分析只要有漏洞肯定能分析清楚,只不过是时间问题;漏洞利用只要不是明显的无法利用,那至少也存在利用成功的可能性。
漏洞挖掘则不然,即便你盯着某个应用使劲挖,也不能保证有结果,说不定对方根本就没有能触发的漏洞。都说世上没有绝对安全的系统,但是相对安全的系统一抓一大把,至少在出问题之前,你是不知道的。
提升方法
1、收集信息,尽可能的越多越好(主域名、IP段、搜索引擎、GitHub等)。
2、收集好信息后,对收集的信息进行一些扩展,增加信息收集的量(可以用SubDomain工具批量收集厂商域名信息,域名对应IP,数据多了之后,就可以拿来分析域名的真实地址、以及潜在的IP段)。
3、对IP段、子域名等进行大量破解,这里我们要经常收集一些SRC开发常用的端口、以及一些域名的命名习惯(GitHub上面有很多现成的端口,平时收集信息的时候,可以多注意一下)。
4、收集对方的邮箱账号命名习惯(因为好多官方后台都是用内部邮箱账号登录的)
5、一般大厂商主站的漏洞不是很多,挖到漏洞了,也没多少积分,新手遇到这类型站,应该主动绕道,去其他子站看看。
6、逻辑漏洞,这种类型的漏洞非常多,一般各大厂商基本上都存在,有的只是比较隐蔽而已,刚入手的白帽子,有可能觉得这个挖起来比较难,因为这个得对系统有一定的分析了解,不过好的是,这种漏洞一般只要挖洞一个,基本上奖励还是不错的。
7、弱口令、这种漏洞,新入手的白帽子最好提前收集一些弱口令字典,我用的一般是TOP2000。账号收集你可以看他们的邮箱结构,例如:liudehua、liudh、ldh、liudehua+数字等这种格式的账号,遇到只有后台类的系统,大家都可以用收集好的账号+常见的用户名,进行破解。
8、一般发现漏洞之后,可以尝试分析一下漏洞引发的一连串危害,记住一点,弱口令不是仅仅是弱口令问题,有可能系统还存在其他漏洞,这时候我们就可以利用弱口令进入后台之后,分析出他们其他存在的漏洞,例如:上传、注入、逻辑等漏洞,这种的一般危害比较大,被恶意利用了,很容易引发其他的问题。记住:当你们挖到一个弱口令累的漏洞时候,一定不要轻易提交,可以利用弱口令挖掘一些其他的漏洞,如果后台实在没有其他漏洞(有可能也是个人技术问题、挖不到),那你就提交吧(其实也是一种无奈)。
9、底线问题,严于律己,别发现漏洞后,偷偷拿去乱搞。
明确需求,确定方向
网络安全
网络安全 是一个很广的概念,涉及的岗位也是非常多的,有安全服务、安全运维、渗透测试、web安全、安全开发、安全售前等等。可以看看下面每个岗位的要求与自身兴趣能力匹配度再决定最适合自己的方向。
渗透测试/Web安全工程师
主要是模拟黑客攻击,利用黑客技术,挖掘漏洞,提出修复建议;需要用到数据库、网络技术、编程技术、渗透技术等。
任职要求:
1.熟悉渗透测试步骤、方法、流程,具备独立开展渗透工作的能力;
2.熟练掌握WEB安全和漏洞挖掘,熟悉漏洞的原理、方法、利用手段及解决方案;
3.至少掌握一种编程语言,能编写漏洞检测
或利用工具;
4.了解代码安全审计的流程、方法及主流代码审计工具的使用;
5.具备CISP/CISP-PTE/CISP-PTS等信息安全领域相关证书者优先。
安全运维/安全服务工程师
主要是对安全防御体系的运维和应急响应工作。能够熟练配置安全设备,具有极强日志分析能力。需精通渗透技术、安全设备原理,知识面要求广,实战能力强。
任职要求:
1.熟悉Owasp ****0漏洞原理、攻击、防御;
2.熟悉常见安全设备,并能够基于安全设备进行分析、处置;
3.熟悉linux等操作系统,能够开展应急响应工作;
4.熟悉安全评估流程;
5.熟悉各类安全工具,如漏洞扫描、基线检查等工具;
6.持有信息安全相关证书CISP、CISSP、CISA、ISO27001等优先考虑。
安全开发工程师
规划、设计并建立公司应用安全整体架构,识别应用系统在架构设计、开发测试、发布上线、运行维护各个阶段的安全风险,提出有效解决方案并落地实施,公司内部安全平台的设计与开发,持续开发迭代平台。
任职要求:
1.有IT技术从业工作经验;
2.熟练掌握Python/Go/C/C++等至少一种语言,和主流WEB框架;
3.了解Spring Boot、Spring MVC、Vue、JavaScript等常用的设计模式和开源框架,有扎实的开发或开发管理技术基础,自学能力强;
4.熟悉信息安全相关知识,具有国内外知名网络安全公司工作经验者优先;
5.具有CISD/CISP/CISSP等网络和信息安全相关认证证书者优先。
安全售前工程师
与客户沟通接洽,根据己方产品,设计技术方案,满足甲方安全需求。需精通服务器,网络技术,安全设备,攻防技术,并对安全趋势跟踪紧密,表达能力和文档能力。
任职要求:
1.具有良好的沟通表达能力与文档编写能力;
2.拥有信息安全相关从业经验,有网络安全或数据安全产品实施、维护经验,熟悉Linux常见操作令;
3.熟悉网络安全相关法律法规以及重要标准,如数安法、个保法、等保2.0、ISO27001等;
4.熟悉项目招投标过程,能根据招标书要求,独立编制投标书、参加招投标会,进行技术讲解和答疑;
5.加分条件:具有信息安全类公司技术研发工作经验;具有CISSP、CISA、CISP等信息安全类资质认证。
多种方式,联合发力
以web安全方向为例:
第一,可以买一本《白帽子讲web安全》来看着先,作者是吴翰清。先了解常见漏洞的原理,没必要研究的太深,因为光看很难理解,后面结合实践来理解事半功倍。
第二,多看一些安全公众号的文章,和一些博客文章,然后可以试着去做一些ctf的题目,可以拓展你的知识面和帮助你理解,几个较好的ctf平台有bugku、xctf,国外的有hackthebox,不过hackthebox难度较大,不建议一上来就去那里。ctf的题目不应该局限于web题目,其他的都可以做一下,毕竟一些安全比赛题目类型很多。
第三,可以去挖一些公益漏洞,挖之前先看别人怎么挖,挖漏洞是有技巧的,多看文章,可以去了解一下src。
第四,学好python,它是最契合网络安全的语言,可以用他来写脚本进行攻击非常nice。当然了如果可以的话,也要学好java,很多漏洞扫描器都是java写的,逆向方向需要java代码审计能力。也要学好网页设计这门课程,都是基础来的。
第五,web安全的最后都是内网渗透,拿下了一个网站,紧接着要拿下的就是他的主机,Linux基础要学好,这个你前面的积累,也是放到最后的一个。