[2017世安杯] 决赛Writeup

今天折磨了一天感冒和头痛的身躯。。。。写完倒头就睡。。。。

今天决赛分为:

  • 上午的综合渗透(个人更觉得是CTF)因为讲道理貌似三个题目服务器之间是互相不可达的。。。。。
  • 下午的AWD(很不意外 还是只有一题)

上午的综合渗透是三个cms,分别是MetInfo 5.x、骑士CMS、还有一个easycms。。(版本号真的不记得了。。)

首先第一题MetInfo

  • cookie处一个flag
  • robots.txt处一个flag
  • 弱密码admin ---- MetInfo 进入后台
  • 看到有个模版上传, 只允许上传zip等等,后缀限定得很死,发现他里面的模版都是以很多文件的形式存在,那么可以很合理的猜测他这里会有解压这一个操作,所以构造一个一句话,然后打包成zip上传模版,发现php被解压出来在templates目录下,getshell,直接上菜刀,这是一个windows的题,Orz这里就一开始有点难办了。。不太懂windows的命令。
  • 在User目录下的flag4文件夹发现一个flag
  • 在网站部署目录下的upload\file里看到一个flag
  • 另外还有一个忘记在哪找的了。。。是一个名字为flag5.png的文件,hexdump后发现flag5

第二题骑士CMS

  • 服务器设置不当导致部分目录遍历 (不存在index.php index.html的文件夹 具体apache配置项是Directory的Indexes)
  • cookie处一个flag
  • robots.txt处一个flag //貌似是
  • 在遍历的时候发现了PHP的session储存点,翻看之后看到带有admin记录的session值,果断document.cookie="PHPSESSID=xxx"伪造一波,成功登录后台
  • 在后台处发现了模版编辑,是编辑htm文件,但是里面有很多类似于laravel的blade模版引擎的mustache写法,也就是{{ }}之类的,猜测这里是可以直接加入php执行的,直接加入 成功执行,然后就开始getshell翻翻翻flag了
  • apache运行用户叫apache
  • 首先在网站部署根目录下发现一个AAAAAAAAflag.txt文件得到一个flag
  • 其次在服务器根目录下有一个/flag文件夹,虽然是被设置成了700,但是owner是apache,直接chmod 777 后进入目录查看.flag.txt文件得到一个flag
  • 最后执行find / -name flag的时候在/var/lib/mysql/处发现了有一个flag文件夹,这次owner是mysql并没有读权限,cat /etc/group 的时候发现mysql是单独一个组的,这里想到了提权。。。但是没有怎么操作过。。。所以放弃了

附上一部分模版源码:




{#qishi_pageinfo set="列表名:page,调用:QS_index"#}
Welcome 74CMS


















{#include file="header.htm"#}

全部职位分类
    {#qishi_notice_list set="列表名:notice,显示数目:9,标题长度:12,分类:1,填补字符:..."#} {#foreach from=$notice item=list#}
  • {#$list.title#}
  • {#/foreach#}
    {#qishi_news_list set="列表名:news,显示数目:9,标题长度:12,分类:1,填补字符:...,排序:id>desc"#} {#foreach from=$news item=list#}
  • {#$list.title#}
  • {#/foreach#}
    {#qishi_help_list set="列表名:help,显示数目:9,标题长度:12,填补字符:..."#} {#foreach from=$help item=list#}
  • {#$list.title#}
  • {#/foreach#}
选择地区
确定X
最多选 3 项 已选 0
{#qishi_ad set="显示数目:6,调用名称:QS_indexfocus,列表名:ad"#}
    {#section loop=$ad name=list#}
  • {#/section#}
{#qishi_ad set="显示数目:6,调用名称:QS_indexrecommend,列表名:ad"#} {#if $ad#} {#foreach from=$ad item=list#} {#if $list.img_uid>0#} {#else#} {#/if#} {#/foreach#} {#/if#}

紧急招聘

更多>>
    {#qishi_jobs_list set="列表名:jobs,显示数目:10,职位名长度:12,企业名长度:12,紧急招聘:1,排序:refreshtime>desc"#} {#foreach from=$jobs item=list#}
  • {#$list.companyname#}{#$list.jobs_name#}
  • {#/foreach#}
{#qishi_ad set="显示数目:3,调用名称:QS_indextopimg,列表名:ad,文字长度:12"#} {#if $ad#} {#foreach from=$ad item=list#} {#/foreach#} {#/if#} {#qishi_ad set="显示数目:6,调用名称:QS_indexcentreimg,列表名:ad,文字长度:12"#} {#if $ad#}
{#foreach from=$ad item=list#}
![]({#$QISHI.site_template#}images/index/84.gif) {#if $list.jobs#} {#/if#}
{#/foreach#}
{#/if#} {#qishi_ad set="显示数目:10,调用名称:QS_indexcentreimg_230x58,列表名:ad,文字长度:12"#} {#if $ad#}
{#foreach from=$ad item=list#}
![]({#$QISHI.site_template#}images/index/84.gif) {#if $list.jobs#} {#/if#}
{#/foreach#}
{#/if#}

推荐职位Recommended Job

我是招聘单位,我想出现在这里
{#qishi_companyjobs_list set="列表名:comjob_recommend,显示数目:12,显示职位:3,推荐:1,统计职位:1"#} {#foreach from=$comjob_recommend item=list#}
{#$list.companyname#}{#if $QISHI.operation_mode>="2" && $list.setmeal_id>1 #} ![]({#$QISHI.site_dir#}data/setmealimg/{#$list.setmeal_id#}.gif){#/if#}
{#foreach from=$list.jobs item=jobs_li#} {#$jobs_li.jobs_name#} {#/foreach#}
{#/foreach#}
{#qishi_ad set="显示数目:3,调用名称:QS_indexcenter,列表名:ad,文字长度:12"#} {#if $ad#}
{#foreach from=$ad item=list#} {#/foreach#}
{#/if#}

最新职位Latest Job

更多>>
{#qishi_companyjobs_list set="列表名:jobs,显示数目:40,职位名长度:12,显示职位:1,企业名长度:12,排序:rtime>desc"#} {#foreach from=$jobs item=list#}
{#$list.companyname#} {#foreach from=$list.jobs item=li#} {#$li.jobs_name#} {#/foreach#}
{#/foreach#}
{#qishi_ad set="显示数目:3,调用名称:QS_indexfootbanner,列表名:ad,文字长度:12"#} {#if $ad#}
{#foreach from=$ad item=list#} {#/foreach#}
{#/if#}

照片简历Photo Resume

更多>>
{#qishi_resume_list set="列表名:resume,显示数目:7,照片:1,意向职位长度:14,填补字符:...,排序:rtime>desc"#} {#foreach from=$resume item=list#}

{#$list.education_cn#},{#$list.experience_cn#}

{#$list.intention_jobs#}

{#/foreach#}

职位导航Jobs Navigation

1F{#"QS_jobs,76"|qishi_categoryname#} · {#"QS_jobs,77"|qishi_categoryname#}
{#qishi_get_classify set="列表名:subcate,类型:QS_jobs_floor,显示数目:20,id:76_77"#} {#foreach from=$subcate item=list#} {#$list.categoryname#} {#/foreach#}
{#qishi_companyjobs_list set="列表名:comjobs,显示数目:10,显示职位:3,职位分类:76_77"#} {#foreach from=$comjobs item=list#}
{#$list.companyname#} {#foreach from=$list.jobs item=li#} {#$li.jobs_name#} {#/foreach#}
{#/foreach#}
{#qishi_ad set="显示数目:4,调用名称:QS_floor_img1,列表名:ad,文字长度:12"#} {#if $ad#} {#foreach from=$ad item=list#} {#/foreach#} {#/if#}
2F{#"QS_jobs,3"|qishi_categoryname#} · {#"QS_jobs,5"|qishi_categoryname#} · {#"QS_jobs,6"|qishi_categoryname#}
{#qishi_get_classify set="列表名:subcate,类型:QS_jobs_floor,显示数目:20,id:3_5_6"#} {#foreach from=$subcate item=list#} {#$list.categoryname#} {#/foreach#}
{#qishi_companyjobs_list set="列表名:comjobs,显示数目:10,显示职位:3,职位分类:3_5_6"#} {#foreach from=$comjobs item=list#}
{#$list.companyname#} {#foreach from=$list.jobs item=li#} {#$li.jobs_name#} {#/foreach#}
{#/foreach#}
{#qishi_ad set="显示数目:4,调用名称:QS_floor_img2,列表名:ad,文字长度:12"#} {#if $ad#} {#foreach from=$ad item=list#} {#/foreach#} {#/if#}
3F{#"QS_jobs,117"|qishi_categoryname#} · {#"QS_jobs,120"|qishi_categoryname#} · {#"QS_jobs,121"|qishi_categoryname#}
{#qishi_get_classify set="列表名:subcate,类型:QS_jobs_floor,显示数目:20,id:117_120_121"#} {#foreach from=$subcate item=list#} {#$list.categoryname#} {#/foreach#}
{#qishi_companyjobs_list set="列表名:comjobs,显示数目:10,显示职位:3,职位分类:117_120_121"#} {#foreach from=$comjobs item=list#}
{#$list.companyname#} {#foreach from=$list.jobs item=li#} {#$li.jobs_name#} {#/foreach#}
{#/foreach#}
{#qishi_ad set="显示数目:4,调用名称:QS_floor_img3,列表名:ad,文字长度:12"#} {#if $ad#} {#foreach from=$ad item=list#} {#/foreach#} {#/if#}
4F{#"QS_jobs,97"|qishi_categoryname#} · {#"QS_jobs,98"|qishi_categoryname#} · {#"QS_jobs,99"|qishi_categoryname#}
{#qishi_get_classify set="列表名:subcate,类型:QS_jobs_floor,显示数目:20,id:97_98_99"#} {#foreach from=$subcate item=list#} {#$list.categoryname#} {#/foreach#}
{#qishi_companyjobs_list set="列表名:comjobs,显示数目:10,显示职位:3,职位分类:97_98_99"#} {#foreach from=$comjobs item=list#}
{#$list.companyname#} {#foreach from=$list.jobs item=li#} {#$li.jobs_name#} {#/foreach#}
{#/foreach#}
{#qishi_ad set="显示数目:4,调用名称:QS_floor_img4,列表名:ad,文字长度:12"#} {#if $ad#} {#foreach from=$ad item=list#} {#/foreach#} {#/if#}
5F{#"QS_jobs,50"|qishi_categoryname#} · {#"QS_jobs,51"|qishi_categoryname#} · {#"QS_jobs,52"|qishi_categoryname#}
{#qishi_get_classify set="列表名:subcate,类型:QS_jobs_floor,显示数目:20,id:50_51_52"#} {#foreach from=$subcate item=list#} {#$list.categoryname#} {#/foreach#}
{#qishi_companyjobs_list set="列表名:comjobs,显示数目:10,显示职位:3,职位分类:50_51_52"#} {#foreach from=$comjobs item=list#}
{#$list.companyname#} {#foreach from=$list.jobs item=li#} {#$li.jobs_name#} {#/foreach#}
{#/foreach#}
{#qishi_ad set="显示数目:4,调用名称:QS_floor_img5,列表名:ad,文字长度:12"#} {#if $ad#} {#foreach from=$ad item=list#} {#/foreach#} {#/if#}

职场资讯Workplace Information

更多>>
{#qishi_news_category set="列表名:newscategory,资讯大类:1,显示数目:4"#} {#section loop=$newscategory name=nclist#}
    {#qishi_news_list set="列表名:topnews,显示数目:4,标题长度:18,资讯小类:$newscategory[nclist].id,摘要长度:36,填补字符:...,排序:id>desc"#} {#foreach from=$topnews item=toplist#}
  • {#$toplist.title#}
  • {#/foreach#}
{#/section#}
    {#qishi_news_list set="列表名:news_list,显示数目:8,标题长度:12,填补字符:...,排序:click>desc"#} {#section loop=$news_list name=nclist start=1#}
  1. {#$smarty.section.nclist.index#}{#$news_list[nclist].title#}
  2. {#/section#}

友情链接Friendly Link

申请>>
{#qishi_link set="列表名:imglink,显示数目:14,调用名称:QS_index,类型:2"#} {#if $imglink#} {#/if#}
{#include file="footer.htm"#}

第三题easyCMS

  • 这题也是服务器设置不当导致部分目录遍历
  • 进入templates/admin目录时发现title为flag
  • 这题没啥思路了Orz。。。。希望大佬们能解答一下。。。

下午的AWD不出所料又是一道Web题

但是围绕这个Web题主办方开放了三个服务,分别是80端口的http服务,8888端口的由python跑的http服务,6379端口的redis服务
这里三个服务都各有一个洞(赛后询问主办方得知)
根据主办方的赛前公告 getflag的方法是运行位于/usr/tmp目录下的getkey程序即可打印出flag,但是赛后问出题人其实还有另外一个地方有明文flag。。。。。。

  • 首先80端口的一个Drupal反序列漏洞 ,链接 https://paper.seebug.org/334/?spm=5176.app55885.3.2.XT8Apf
    防御方法:及时修改admin密码

  • 其次8888端口是ffmpeg的任意文件读取漏洞,emmm其实不知道这个有啥用。。。但是后来问出题人。。他说本来他也没想到这样用的。。因为其实服务器中还mount了一个虚拟硬盘,里面有明文的flag,所以可以用这个直接读取。。。。//但是个人觉得这个洞。。。。貌似根本补不了,没有这个权限。。。所以emmmmm 大家应该懂
    防御方法:其实这个洞后来想了一下。。。可以写脚本无限访问del去删除,但是这个存在一个竞争的问题,因为操作机与别人攻击的机器是处于水平网络上的,所以如果对面也写脚本请求的话不一定能竞争成功。。

  • 最后是6379端口的redis服务,我是拿了这个洞来打的。。。今天下午又犯蠢了。。ps aux发现redis之后很开心,兴冲冲连上去发现不用密码,输入info命令可以看到redis的配置文件位于 /var/lib/redis/6379/xxx 然后查看自己的配置文件发现有几个命令是被rename或者是移除的,比如migrate flushdb之类的 然后config命令被rename成了ccccooonnnnfig,shutdown被rename成了shutdown_123,然后加了自己的登录密码,自作聪明的上去把绝大多数人的redis down了,想着能美滋滋的收分。。。。。但是突然意识到这个awd是没有checker的!!!!崩溃Orz。。。后来发现甚至有人把自己的80端口的服务都down掉了(不知道他们是如何做到的,因为不提权的话根本不会有权限) 其实这里是可以用redis来进行任意文件写, 因为redis是用root权限运行的,而redis有一个save备份自身的kv对到文件的功能,也就是说,我可以执行以下命令来进行写shell

> ccccooonnnnfig set dir /var/www/html/drupal8/
> ccccooonnnnfig set dbfilename Pr0ph3t.php
> set Pr0ph3t ""
> save

save命令执行之后 redis将会在80网站部署根目录下生成一个内容带有Redis字样的Pr0ph3t.php的文件
然后反弹shell之类的,权限为deamon用户
这里推荐写一个unlink自身的不死马,不会暴露是通过Redis服务写的shell
防御方法:开启redis的密码 以下命令

 > ccccooonnnnfig set requirepass 你的密码

此命令设置后不用重启服务即可生效

相关资料:https://www.leavesongs.com/penetration/write-webshell-via-redis-server.html


写在最后:
其实这次比赛体验。。。大家心里都应该会有数。。。。。就不多说了。。。。

你可能感兴趣的:([2017世安杯] 决赛Writeup)