通过发现“坏词”功能的频率来发现代码中的漏洞;找到从你控制的输入到危险函数的路径;向程序输入错误的行为;首先让我们看看如何找到危险函数,根据经验,80%的错误出现在大约20%的代码中。由于发现新漏洞通常需要透彻理解代码,因此决定关注哪20%至关重要。根据我的经验,“坏词”出现频率最高的地方,发现漏洞的机会就更大。在这篇文章中,我将通过一个小故事向大家展示寻找漏洞的思路。Terraform是一种用于构建、更改和合并基础架构的安全高效的工具。用Go语言开发。Terraform可以管理现有的流行服务并提供定制解决方案。最近在一次渗透测试工作中,在看一大段Terraform资料的时候,无意中看到了这行代码:driver.raw_exec.enable=1本来以为这段代码没有发现漏洞的可能,但是当出现上面奇怪的一行代码时。我不得不停下来弄清楚他们是什么意思,负责什么操作。事实证明,它正在配置一个来自Hashicorp的名为Nomad的操作调度程序。HashiCorp由MitchellHashimoto和ArmonDadgar共同创立,总部位于美国旧金山。致力于为企业提供服务,通过数据中心管理技术研发,让开发者通过工具搭建完整的开发环境,提高开发效率。Nomad是一个集群管理器和调度器,专为微服务和批处理工作流而设计。Nomad具有分布式、高可用性和可扩展性,可扩展到跨数据中心和区域的数千个节点。Nomad提供了一个通用的工作流程来跨基础设施部署应用程序。开发人员使用声明性操作规范来定义应如何部署应用程序以及需要哪些资源要求(CPU、内存、硬盘)。Nomad执行这??些操作并寻找可用资源来运行应用程序。调度算法确保满足所有约束,并在主机上部署尽可能多的应用程序以优化资源利用率。和其他渗透测试人员一样,我很快就认识了Nomad。果然,我发现了这行代码的问题所在,官方文档解释了它的作用:“这允许您在没有隔离的情况下运行操作,出于安全原因,默认情况下禁用隔离。“当我快速完成我可以构建的最简单的Nomad模块时,我非常高兴,并且在几分钟内,我就可以以root身份和大量凭据访问该模块。在Nomad之前我从未听说过它,更不用说这个配置选项了,那么是什么让我想深入挖掘呢?这是悬停在同一段代码上的两个安全异常词的组合,即“raw”和“exec”。这些异常词可以帮助你找到你的代码中最安全关键的部分代码,以便您可以将注意力集中在最重要的地方。常见异常词汇1.rawRaw表示您正在访问较低级别的抽象,当您在较高级别执行安全控制时,允许用户绕过此“原始”接口它们成为一个漏洞。示例:CAP_NET_RAW是一项Linux功能,允许您创建原始套接字并使用它们来绕过典型的进程隔离限制。Nomad中的raw_exec驱动程序允许您创建在容器外运行的操作游牧代理特权。许多ORM都有rawQuery或rawSQL方法,允许您直接执行查询。ORM生成的Queries通常是不可注入的,但是当使用“原始”接口时,如何组织SQLi取决于用户。2.eval|exec|run将用户输入与用动态语言(Javascript、SQL、bash等)编写的代码相结合。通常会导致注入攻击,攻击者可以将代码作为输入提交,从而导致解释器行为异常。运行此代码通常称为“执行”、“评估”或“运行”。示例:没有隔离的raw_exec运行Nomad操作;execute(sql)在许多python数据库驱动程序中运行sql查询;exec(code)是一个运行传递给它的代码的python方法;eval(code)是很多动态语言都提供的函数,比如Javascript运行传递给它的代码,Python也有eval函数,但它只针对表达式;这个函数会返回很多误报,因为正如SteveYegge预测的那样,似乎每个动词都通过run()、execute()或justDoIt()方法变成了名词。3.过程|系统|打开|执行|spawn这些词可以表示子进程的创建,如果子进程生成了一个shell,就可以注入shell命令。即使它直接调用execve系统调用,您仍然可以向程序添加或修改参数。示例:python中的subprocess模块;节点中的child_process模块;golang中的os/exec包;python中的os.system方法;在ruby??中打开模块;4.特权|权限|能力|角色|rbac|政策|授权|claims将帮助您找到负责向用户、容器、进程、文件、EC2实例等授予权限的代码,使用任何高权限对象来操纵您的命令,甚至完全绕过authz。示例:docker--privileged标志为容器功能赋予主机root权限;linux内核将root权限划分为您可以分配给程序的“功能”,允许它创建原始套接字、调试您不拥有的进程或绕过文件ACL。Kubernetes使用一个名为RBAC(基于角色的访问控制)的api扩展来授权对k8s资源的访问。k8s的全称是kubernetes。这个名字大家应该都不陌生。k8s是一种用于容器服务的便携式容器安排。管理工具,越来越多的企业拥抱k8s,目前k8s已经主导了云业务流程,推动了微服务架构等热门技术的普及和落地,发展得如火如荼。许多云提供商使用术语“角色绑定”来向委托人授予一组权限;JWT具有“声明”,可告知用户用户的权限,用户使用jwt.ParseWithClaims等函数验证它们。5.反映|类|常量化|forName很多编程语言允许你通过名字查找函数、类、方法、变量等(甚至实例化/调用它们),这通常被称为“反射”。如果用户可以控制要调用的方法的名称或要返回的变量的名称,则可能导致程序运行异常。示例:在Javascript中反射对象;rubyString#constantize方法;javaClass.forName方法;klass是通过反射查找的类的通用变量名称(因为“类”往往是保留字);6.泡菜|亚姆|序列化|元帅|objectinput这些词表明程序可能正在使用支持复杂对象的格式反序列化数据,这可能允许攻击者读取文件、发送HTTP请求,甚至执行任意代码,具体取决于序列化格式和运行时可用的对象(类JVM类路径、python中sys.path上的包等)。示例:python的pickle格式;节点序列化包;大多数YAML解析器;Java的ObjectInputStream;php的反序列化功能;与解析器的功能一样,攻击者可以输入解析器识别的元字符来改变解析器的行为。主要区别在于,您不是使用动态语言运行代码,而是使用解析器来访问文件或URL等资源。示例:控制URL解析器的输入可能导致SSRF、绕过代理限制、非斜线格式化等;控制文件路径解析器的输入可能会导致LFI、RFI和本地文件读/写;8.不安全|不安全|危险有时,API开发人员喜欢通过在名称中包含“不安全”或“不安全”来提醒人们注意危险的API。示例:Rust中的不安全{};Go语言编写的TLS套件中的InsecureSkipVerify;react中dangerouslySetInnerHtml(),React主要用于构建UI。您可以在React中传递各种类型的参数,例如帮助您呈现UI的声明性代码、静态HTMLDOM元素、动态变量,甚至是交互式应用程序组件;Go包中不安全;9.待办事项|修复我|xxx随着代码的发展,开发者会添加注释来提醒自己实现功能,修复bug,或者清理一些自己不喜欢的代码。有时,这些注释可能会引导您发现您可以利用的重要错误、缺失的功能等。示例:我曾经在Apache服务器的Web根目录中发现一个todos.txt文件,其中包含一长串未修补的安全漏洞。还有一次,我发现了一条提到功能问题的FIXME评论。事实证明,这是一个非常难以发现的漏洞,但利用ReDoS漏洞却微不足道。10.词合并|clone通常表示一个对象、dict、map等正在与另一个对象合并或被克隆成一个新的对象,这会导致一些有趣的安全问题,例如Javascript原型污染漏洞、大量分配漏洞等。示例:_.merge在LoDash中;_.clone在LoDash中;11.分配|free这是手动内存管理正在进行的好线索。这是出了名的难以修复,并可能导致诸如缓冲区溢出、释放后使用、双重释放等错误。示例:malloc();自由的();ObjectiveC中的[objectalloc]消息;12.AES|订阅服务|动态服务代理|数据加密系统|加拿大广播公司|欧洲央行|访问控制|加密系统而不是使用更高级别的抽象。有许多微妙的方式可以不安全地使用它们,因此请仔细阅读并咨询密码学家。示例:aes.NewCipher(key);新的RSAPrivateKey(keyBytes);HMAC.new(秘密,digestmod=SHA256);13.JWT|JKS|JWK??|JKU…JSONWebTokens是一种安全传输数据的标准,在现代应用程序堆栈中非常常用,有很多不安全的方式使用它们,因此值得关注处理JWT的代码.JWT常见问题:没有算法;操纵alg标头;不核实aud或iss的声明;不验证过期(exp和nbf声明)签名但不加密敏感数据;示例:JWTVerifier;jwt.ParseWithClaims;jwt.验证;14。单词密码|私人|代币|秘密|钥匙|授权是您可能已硬编码到存储库中的密钥的很好示例,例如API密钥、数据库密码、加密密钥等。示例:BEGINRSAPRIVATEKEY;AWS的“秘密访问密钥”;Django的SECRET_KEY设置;15.验证|验证这些词通常表示正在执行业务/安全规则,但请仔细检查这些词以验证输入,因为这也可能导致漏洞。他们试图禁止的输入类型也可以为您提供有关潜在漏洞的线索。示例:16.XML|练习|萨克斯|树|路径|DocumentBuilder解析攻击者控制的XML可能会导致本地文件读取、拒绝服务攻击等一系列安全问题。示例:DocumentBuilderFactory.newInstance();SAXParserFactory.newInstance();xml.etree.元素树;
