寻找0day来入侵Apple
发布日期:2024-05-19 浏览次数: 专利申请、商标注册、软件著作权、资质办理快速响应热线:4006-054-001 微信:15998557370
文章来源: EDI安全
#入门
我们将重点放在关键发现上,例如PII暴露或访问Apple服务器/内部网络。这些是我们认为Apple会最感兴趣的错误类型。
#侦查和指纹
在查看侦察数据并确定可能正在运行的服务时,我们发现Lucee支持的CMS上运行的三台主机。
由于CMS和Lucee都可以轻松地在本地托管,因此它们是我们入侵的良好目标。我们选择关注Lucee,因为它公开了管理面板并具有漏洞历史记录。
可以在三台不同的Apple主机上访问Lucee的管理面板。两个正在运行一个过时的版本,另一个正在运行一个相当新的版本。
https://facilities.apple.com/(最新版本)
https://booktravel.apple.com/(旧版本)
https://booktravel-uat.apple.com/(旧版本)
#苹果的WAF行为
要利用我们将在下面讨论的漏洞,我们需要了解Apple所使用的WAF,更重要的是,Facilities.apple.com上的前端服务器如何与之交互。
苹果的WAF非常痛苦。它通过URL(查询参数)阻止几乎所有尝试的路径 SQLi。
Facilities.apple.com上的前端服务器(反向代理)配置为仅显示来自状态代码为200和404的后端服务器的响应。如果在后端获得任何其他状态代码,则前端服务器将改为提供403 ,这与触发WAF时的响应相同。
#LUCEE配置错误
在本地测试Lucee时,我们遇到了严重的错误配置,它使攻击者可以直接访问经过身份验证的CFM(ColdFusion)文件。这使我们可以执行许多已认证的操作,而完全未经认证。
request.admintype在CFM文件中点击变量/属性后,由于我们未通过admin身份验证,因此执行流程将停止。但是,执行该检查之前的所有代码。因此,我们必须先找到具有某种错误的文件,然后再将其击中request.admintype。
我们使用这三个文件在Lucee安装上获得完整的预认证/未认证RCE:
· imgProcess.cfm(在较早版本中不可用)
· admin.search.index.cfm
· ext.applications.upload.cfm
#尝试失败
imgProcess.cfm中的Sweet&Simple RCE
为了复制Apple的安装,我们获得了运行相同版本的Lucee的本地副本。imgProcess.cfm没有任何参数的打开使我们的安装出现异常。在苹果服务器上打开该文件,我们得到了403,表示该文件存在。我们只需要指定正确的参数/值即可。否则,后端服务器将引发一个例外,前端服务器将为此服务403。
参数错误-
正确的参数-
该文件具有路径遍历漏洞,可以使用我们给定的内容在服务器上的任何位置创建文件。
这需要一个查询参数,file并使用以下行将其创建为文件
{temp-directory}/admin-ext-thumbnails/__{our-input}。
我们的输入可以通过post参数定义imgSrc。
该目录必须在进行路径遍历之前存在,因为Linux要求在进行遍历之前必须存在路径。expandPath创建不存在的路径并以字符串形式返回该路径。因此,传递file=/../../../context/pwn.cfm将创建目录并遍历webroot中的上下文目录,从而在此处为我们提供了一个ezz RCE。
但是,即使有此错误,我们也无法在Apple的情况下利用它,因为WAF会阻止../in查询参数。该endpoint明确要求file参数为查询参数(url.file,但form.imgSrc)。如果两者都是form或post参数,则不会触发WAF。我们仍然可以使用该endpoint来创建具有我们在某个目录中控制的名称和内容的文件,而无需触发WAF。
现在怎么办?我们如何避免触发WAF?
admin.search.index.cfm允许我们指定目录并将其内容复制到所需位置。但是,复制功能非常棘手,实际上不会复制文件内容,也不会保留文件扩展名。
该endpoint采用两个参数:
· dataDir
· luceeArchiveZipPath
dataDir是您要将文件复制到通过luceeArchiveZipPath参数指定的路径。如果该路径不存在,则会创建该路径。我们可以在这里通过绝对路径。
既然复制功能不是标准的,那么要更深入地研究负责此功能的代码。
我们注意到了这个CFML标签:
< cfdirectory action = “ list ” 目录= “#luceeArchiveZipPath#” filter = “ *。*。cfm ” name = “ qFiles ” sort = “ name ” />
它列出了luceeArchiveZipPath目录中的文件。filter属性表示仅列出格式为*。*。cfm的文件。该查询的结果存储在“ qFiles”变量中。
接下来,遍历每个文件(将其存储在变量currFile中),将文件名中的“ .cfm”出现替换为空字符串“”,并将此更新的文件名存储在currAction变量中。因此,如果我们有一个文件test.xyz.cfm,它将变为test.xyz。
< CFSET currAction =替换(qFiles。名,' .CFM ',' ') />
然后,它检查dataDir目录中是否存在诸如“ test.xyz.en.txt”或“ test.xyz.de.txt”之类的文件名。同样,dataDir变量是用户控制的。如果此文件不存在,它将用空格替换文件名中的点('。'),并将其保存到pageContents.lng.currAction变量中。
< cfif fileExists('#dataDir ## currAction#。#lng#.txt ') >
< CFSET pageContents [ LNG ] [ currAction ] = FILEREAD('#DATADIR ## currAction#。#LNG#.TXT ',' UTF-8 ') />
< cfelse > <!---确保在搜索文件名时也会找到该页面--->
< cfset pageContents [ lng ] [ currAction ] = “#replace(currAction,'。',' ')#“ /> cfif >
稍后,将创建文件
test.xyz。
- 上一篇:记一次反制追踪溯本求源
- 下一篇:抓取HASH的10001种方法