虽然比赛时只做出来一道题,但确实玩的挺开心的,所以记录一下
oh-my-grafana 该题用到了Grafana应用中最为广泛的一个CVE漏洞CVE-2021-43798,可以未授权通过Grafana的插件实现任意文件读取。
通过搜索获取到Grafana的配置文件路径/etc/grafana/grafana.ini,在里面翻到了管理员的帐号和密码(一开始我还以为不会这么简单,还去读取了一下Grafana的数据库,/var/lib/grafana/grafana.db)
然后利用后台的数据库查询工具,查询Grafana的数据库获得flag。
oh-my-notepro 打开网站后是一个简单的笔记界面,创建账户登录进去之后就可以写笔记并且查看笔记:
点进去笔记详情页,很容易发现URL格式为/view?note_id=at8k8cdp6874vqcvzifietexy4gtnpey,尝试修改为不存在的note_id,产生报错,发现后端是Flask而且开启了调试模式,查看错误代码发现是SQL查询错误:
于是尝试注入,发现轻松注进去,没有任何过滤:
但是翻看了一阵子数据库之后发现没什么有用的信息,且数据库为USAGE权限所以没法提权。翻看了一下其他的功能点,整个网站的功能也十分单一并没有发现额外的功能,所以接着把关注点放在了Flask的调试模式上。
注意到在报错代码的右侧有个小按钮,名为Open an interactive python shell in this frame,也就是可以直接起一个Python shell,但是需要一个Debug PIN才能解锁。
于是搜索发现这个PIN可以直接生成,参考文章https://www.daehee.com/werkzeug-console-pin-exploit/。文章中提到这个PIN是由四个公共变量和两个私有变量经过哈希生成的,也就是下面这一段:
1 2 3 4 5 6 7 8 9 10 11 probably_public_bits = [ 'web3_user',# username 'flask.app',# modname 'Flask',# getattr(app, '__name__', getattr(app.__class__, '__name__')) '/usr/local/lib/python3.5/dist-packages/flask/app.py' # getattr(mod, '__file__', None), ] private_bits = [ '279275995014060',# str(uuid.getnode()), /sys/class/net/ens33/address 'd4e6cb65d59544f3331ea0425dc555a1'# get_machine_id(), /etc/machine-id ] probably_public_bits中的用户名和Flask包路径分别在数据库和调试信息中可以获取到,接下来就剩下这两个私有的变量需要读取对应的文件才能获取到。一开始尝试用MySQL的LOAD_FILE来包含文件但是一直返回空值,赛后经群友指点学到了一个新的MySQL语法LOAD DATA(https://dev.mysql.com/doc/refman/5.7/en/load-data.html),可以直接将文件中的数据读取至表中。因为这个语句没法制定读进哪个列,所以读进已有的表似乎可能性不大(第一列都是ID,数据类型一转换就没了),尝试创建一个新表,发现可以创建,于是通过写入新表的方式可以获取到这些信息,Payload如下:
1 2 3 4 /view?note_id=';create table test(`name` varchar(4096) null)--+ /view?...