记一次渗透测试过程中碰到的Symfony框架的利用

admin 2025年1月16日23:10:05评论7 views字数 2848阅读9分29秒阅读模式

记在一次渗透测试过程中碰到的Symfony框架debug模式下的利用,以及和常规利用不一样的地方。

文章作者:奇安信攻防社区(sky0)

文章来源:https://forum.butian.net/share/4028

1

不是很顺利的Nday利用

在一次渗透测试过程中发现了目标使用了Symfony框架,然后扫了下目录,发现存在app_dev.php 文件,尝试访问

记一次渗透测试过程中碰到的Symfony框架的利用

发现开启了debug模式,Symfony 版本号为2.8.34 php版本5.6.40 也能查看phpinfo页面

记一次渗透测试过程中碰到的Symfony框架的利用

然后在网上搜了一下Symfony debug模式利用,看到了这篇文章https://www.ambionics.io/blog/symfony-secret-fragment

发现是可以利用 /_fragment 去尝试执行命令,但是需要知道一个key,文章里提到了在Symfony <= 3.4.43.中存在一个默认key:ThisTokenIsNotSoSecretChangeIt

然后根据文章生成_hash,发现还是返回403

记一次渗透测试过程中碰到的Symfony框架的利用

当时就以为key被修改了,然后去看了看Symfony 对应版本的代码,发现还存在一个 /_configurator 接口可以利用,我们直接访问/_configurator/final 就可以直接看到配置文件的内容

记一次渗透测试过程中碰到的Symfony框架的利用

结果发现key值没变,那看来应该是自己生成/_hash的地方有问题,再回去细看了一下文章,发现了下面一段话

记一次渗透测试过程中碰到的Symfony框架的利用

估计是要修改成http

python3 -c "import base64, hmac, hashlib; print(base64.b64encode(hmac.HMAC(b'ThisTokenIsNotSoSecretChangeIt', b'http://xxxxx/app_dev.php/_fragment', hashlib.sha256).digest()))"

然后拿生成的_hash再去访问

记一次渗透测试过程中碰到的Symfony框架的利用

发现返回404,说明_hash校验成功了,那就尝试执行system

记一次渗透测试过程中碰到的Symfony框架的利用

发现并没有成功执行,然后以为是环境问题,就自己搭了个环境复现了一下
composer create-project symfony/framework-standard-edition /path 2.8.34

记一次渗透测试过程中碰到的Symfony框架的利用

发现也报错了,但是也是执行到了system的,然后对比了一下两个报错

记一次渗透测试过程中碰到的Symfony框架的利用

发现目标多了一个bundle,刚好也是这个报的错,那就本地安装一下再复现一下。
composer require a2lix/i18n-doctrine-bundle

记一次渗透测试过程中碰到的Symfony框架的利用

在app/AppKernel.php 加入下面一行
new A2lixI18nDoctrineBundleA2lixI18nDoctrineBundle()
那么安装成功后,把请求重放一下。

记一次渗透测试过程中碰到的Symfony框架的利用

发现报错,然后把

vendora2lixi18n-doctrine-bundleA2lixI18nDoctrineBundleDoctrineORMEventListenerControllerListener.php

记一次渗透测试过程中碰到的Symfony框架的利用

这两行注释就好了

记一次渗透测试过程中碰到的Symfony框架的利用

好了,报错也一样了,然后就动态调试了一下

记一次渗透测试过程中碰到的Symfony框架的利用

发现在23行,会获取到我们传入的system字符串,然后list了一下,再去获取controller,也就是在这里list后 $object的值是s,$method的值是ystem,所以getclass(‘s’)报错了。这里的功能应该是获取controller的anontation,然后再做相关操作。

那这里就直接限制了我们只能传入存在的类,不能传入system等方法,然后就去找了一下看Symfony里面有没有什么能够利用的类。也去看了一下生成controller的步骤。
/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php

记一次渗透测试过程中碰到的Symfony框架的利用

最后会调用到/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php

记一次渗透测试过程中碰到的Symfony框架的利用

发现只能生成无参构造函数的类。
所以目前存在2个限制条件
1.类存在无参构造函数
2.只能调用public的方法
然后经过一段时间寻找后,没有发现可以直接执行命令的类(也有可能是没找到)
就转变了一下思路,找能够写文件的地方
/vendor/symfony/symfony/src/Symfony/Component/Filesystem/Filesystem.php

记一次渗透测试过程中碰到的Symfony框架的利用

可以写文件,那就尝试下写shell

记一次渗透测试过程中碰到的Symfony框架的利用

好吧 没权限,那就继续转变思路,我写到/tmp目录,然后文件包含

记一次渗透测试过程中碰到的Symfony框架的利用

没有返回写入失败,那估计写进去了,然后文件包含

记一次渗透测试过程中碰到的Symfony框架的利用

没有包含成功,判断下文件有没有写进去

记一次渗透测试过程中碰到的Symfony框架的利用

文件并没有存在,不知道什么原因导致没有写成功

那就只有试下反序列化了,使用SymfonyComponentYamlInline::parse做反序列化操作,然后打开了phpggc找一下链(几年前的过程,只有几个链)

记一次渗透测试过程中碰到的Symfony框架的利用

发现并没有Symfony 2.8.34的利用链,那就尝试自己挖掘利用链。

2

挖掘反序列化链

/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php

记一次渗透测试过程中碰到的Symfony框架的利用

在__destruct 中执行了该类的close方法,但是在该类中的close为空,那么去找它的子类,然后发现了BufferHandler类

记一次渗透测试过程中碰到的Symfony框架的利用

AbstractHandler.php

记一次渗透测试过程中碰到的Symfony框架的利用

这个类的几个关键

1.用了call_user_func,并且$this->processors我们可控,$record 也是 $this->buffer的值2.调用了父类的handleBatch方法(见5),然后循环调用了handle3.BufferHandler 类将父类的__destruct给重写了,所以不能用这个类来做入口4.close方法调用了flush方法

所以现在梳理一下整个链的调用流程

1.AbstractHandler::__destruct->2.BufferHandler::close->3.BufferHandler::flush->4.AbstractHandler::handleBatch-> BufferHandler::handle->call_user_func

在这个流程中1-3并不能实现,因为BufferHandler重写了__destruct 并不能执行到BufferHandler::close 方法
为了解决这个问题,就去寻找了另一个子类,这里采用的是RollbarHandler

记一次渗透测试过程中碰到的Symfony框架的利用

这里执行了$this->rollbarNotifuer的flush方法,那么就可以用来做中间类去执行到BufferHandler::flush方法,那么整个流程就通了,剩下就是类里面每个值的问题

记一次渗透测试过程中碰到的Symfony框架的利用

最后 成功执行命令
记一次渗透测试过程中碰到的Symfony框架的利用

原文始发于微信公众号(天启互联网实验室):记一次渗透测试过程中碰到的Symfony框架的利用

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月16日23:10:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次渗透测试过程中碰到的Symfony框架的利用https://cn-sec.com/archives/3627184.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息