CCTF 2016 WriteUp(部分)

上周参加了CCTF,也算是练了一段时间以来第一次正式打比赛并打完了全程的,最后结果拿了个11名,还算满意,毕竟是第一次。但这次比赛强队确实不多,而且我们队和别人的差距也是很大了,毕竟也还不到半年时间,还有太多东西要学,慢慢来吧,正确明年之前能够凭实力打进一次线下赛。
先贴一下大神的wp:http://bobao.360.cn/ctf/detail/159.html
在贴贴我们自己的wp把。

WEB 350

给了一个静态的页面,扫了扫也没发现什么东西,

这里写图片描述

然后后来给了一个hint,说是找博客,好吧,疯狂寻找群里管理员们的博客,最后在github上找到了Pocky Nya,然后在repositories找到了目标网址

这里写图片描述

然后先把源码也下载下来,简单读了之后,大部分地方都有身份验证,而且获取参数地方也就两个,都没法XSS,后来意外中发现了源代码的background.py的’/kamisama/posts/add’这里是没有身份验证的,如下:

class AddPostHandler(BaseHandler):
    @tornado.web.authenticated
    def get(self):
        self.background_render('add_post.html', post=None)

    def post(self):
        title = self.get_argument('title', None)
        content = self.get_argument('content', None)
        tags = self.get_argument('tags', '').strip().split(',')
        if not title or not content:
            return self.redirect('/kamisama/posts/add')

        post = self.orm.query(Post.title).filter(Post.title == title).all()
        if post:
            return self.write('<script>alert("Title has already existed");window.history.go(-1);</script>')
        self.orm.add(Post(title=title, content=content, created_time=date.today()))
        self.orm.commit()
        return self.redirect('/kamisama/posts')

所以就可以伪造添加文章的数据包,然后设置存储型XSS获取管理员的cookie。如下所示:

这里写图片描述

因为考虑到万一设在content里面管理员看不到就不好了,所以我把XSS设置在了title上面,虽然有点毒瘤,不过这样子就能百分百的获取到管理员的Cookie了,很快就有人登录了,结果第一次获取到的不是管理员的,是其他人获取之后登录的,虽然确实拿到cookie了,但是里面并没有flag,结果花费了N久又把各种代码重读了一遍,发现在background.py里面的SignInHandler中确实是把flag写进了cookie的,所以我又提交了一次上面的payload,这一次成功获取到了正确的cookie,如下:

username=2|1:0|10:1461405568|8:username|12:cG9ja3lueWE=|2821528813698c6ee9c1650c8420cfb4da968ec97ae080e65c07542f0d249df0;flag=434354467b434f44455f41554449545f425553544552537d

然后按照ascii码转一下就出flagCCTF{CODE_AUDIT_BUSTERS}

WEB 300

用之前获取到的cookie登录之后,访问pocky.loli.club:41293/diaries目录,能够看到新的提示说是telegram上布置了一个机器人,同时给出了机器人的lua代码,然后我们就去telegram社工一下pockynya就搜到了这个账户

这里写图片描述

然后根据它博客里面给出的给的lua代码如下:

do

local function run(msg, matches)
  if matches[1] ~= '!minecraft' then
    operation = matches[1]
  else
    return "!minecraft start|stop|restart"
  end
  if string.find(operation, '&') or string.find(operation, '|') or string.find(operation, '`') then
    return "Invalid operation " .. operation
  end
  local t = io.popen('cd /home/telegram && ./mc ' .. operation)
  local a = t:read("*all")
  return a
end

return {
  description = "loli.club minecraft bot!",
  usage = "!minecraft start|stop|restart",
  patterns = {
    "^!minecraft$",
    "^!minecraft (.*)$"
  },
  run = run
}

end

所以我们可以用;断开前面的命令,然后就能执行我们的命令了,如下:

!minecraft ;xxx

后面的xxx处就可以插入我们的命令行代码,最后的flag就在../wwwroot/flag里面
如图:

这里写图片描述

所以flag就是CCTF{TELEGRAM_BOT_AND_Lf}

MISC 1

给了一个图片,在图片最后的32位有很连续的一堆字母,如下

这里写图片描述

base64解码一下得到flag,ctf{we1c0me t0 anmactf!}

MISC 2

这里,在第5560的内容里面发现这样的东西
type s4cr4t.txt
所以接下来这就是我们需要的文件内容,是个Base64编码的东西,解码之后是这个,CCTF{do_you_like_sniffer},根据它的格式,他还需要的是MS打头的漏洞编码,根据随便谷歌MS SMB 漏洞 溢出了一下,试了几个之后就试出来了最后确切的漏洞编号就是MS08067,所以最后答案就是MS08067CCTF{do_you_like_sniffer}

re1:

IDA反编译后查看,发现运行要求包含三个参数,且在其中随机选一个进行测试,这里注意md5_custom函数没有用处….

这里写图片描述

经过check函数测试

这里写图片描述

取内存中找下:发现字串f2332291a6e1e6154f3cf4ad8b7504d8
这里写图片描述

尝试提交,成功
flag:CCTF{f2332291a6e1e6154f3cf4ad8b7504d8}

re2:

一个.net程序,使用Reflector反编译,得到代码
这里写图片描述

发现这就是个和本地端口通信的程序,于是先去关闭了防火墙,在通过RAWPCAP本地回环抓包即可
这里写图片描述

得到flag::CCTF{7eb67b0bb4427e0b43b40b6042670b55}

re3:

一个简单的反汇编
发现就是两个字符串的比较

这里写图片描述

尝试将上面那个字符串提交,发现正确.
flag:CCTF{789101112131415123456}

true-or-false

两个linux程序,通过IDA反汇编,发现两个程序开始时都会调用system两次,通过ascll码知道了false会将自己覆盖到true上,true会将自己删除.
然后在false里发现了print_f函数,反汇编+凯撒加密就得到了结果的flag
PPGS{yvahk-enva-ova}
\\\\\\\\\\
CCTF{linux-rain-bin}

difffffffffffuse

通过IDA观察反编译出的C语言.
总共有3000个函数,3个函数为一周期。但是其中有一些周期中的,第二个函数是直接提取数据,第三个函数移位存在微小差异。通过把汇编代码提取出来生成txt文件,然后用python读取文件模拟生成c程序,即把这3*1000个函数中的第二个函数都扒取出来,生成second.c文件

程序最后会将这3000个函数加密后的40字节与现有的40字节相比较,于是我们在IDA中把这40个字节抓取出来

    0x83    0xec    0x5f    0xa2    0x93    0xce    0xa3    0xfb   
    0x5a    0x17    0x06    0xff    0x13    0x2d    0xd7    0xc4
    0xbe    0xce    0x8d    0x6a    0xb8    0x15    0x26    0xfc
    0x84    0x01    0x94    0x44    0xf8    0xd7    0x23    0x1c
    0x4b    0xc2    0x31    0x04    0xa6    0x33    0x08    0x57

每一个字符的加密是独立运行的,也就意味着我们可以针对每一个字符进行单独的爆破,看看加密后的数据是否相同,通过简单爆破,最终得到flag:
CCTF{1f_Y0u_W4nNa_R3vEn93_____purpleroc}

神秘文件1

拿到forensic.7z后解压得到level1与mem.vmem两个文件,观察文件开头,经过百度后得出level1为硬盘文件,mem为内存文件
恰巧本人有一个空硬盘,于是将硬盘格式化,用bootice将level1写入了硬盘,如图所示

这里写图片描述

发现硬盘被Bitlocker加密,由于存在忘记密码的可能,Bitlocker提供了文件恢复密码机制,密码为48位纯数字
这里写图片描述

考虑了恢复密码在内存中的可能性后,用winhex打开mem,在其中搜索Bitlocker没有找到,想起了恢复密码id提示为F2298561,搜索后找到有关内容

这里写图片描述

发现内存中的数据很多情况用00隔开,于是搜索F2298561的16进制数,每两个数用00隔开,最后找到了48位数字密码
这里写图片描述

为046409-191059-605495-680889-626109-111617-371668-451517
这里写图片描述

解锁成功!拿到flag CCTF{U_m4st_G00d_4t_F0nr4n51c}

BEST_EZ_MISC

拿到名为reverze.zip的压缩包,用winhex看了一下,很容易想到是zip伪加密

这里写图片描述

将pk 01 02 后的第5个字节改为00,发现可以解压,得到reverse

打开看了一下,发现是摩丝电码,解密后得到0,9字符串,程序跑了一下算上空格一共2048个字符,由于题目提示结果是个图片,于是尝试不同的像素来观察,最终得到如图所示结果

这里写图片描述

虽然不是很清楚,但是颠倒一下很容易看出flag: ctf{pixelnice}

misc100T2

很简单的流量分析,打开以后尝试搜索ctf直接得到结果

这里写图片描述

flag为ctf{anma_qwe3_as34_gty6}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章