CBCTF 2023
本文最后更新于 71 天前,其中的信息可能已经有所发展或是发生改变。

去年在打招新赛,今年在当出题人

这儿只写了我的题,完整WriteUps参见: Github

总结,我的题都是简单题啊,怎么没有人做啊

Web

CNCTF 2023

Welcome to CNCTF 2023

可恶,这运维是一秒都干不下去了,你来运维

  • 对CTFd的源代码进行了一些删减,再加上公共靶机,很害怕环境被破坏,删掉了很多函数,就剩了个架子

出这玩意儿,主要某天在搭CTFd+ctfd-whale看到赵总(好像是吧,忘记了)说后台有ssti的可能性,确实有啊,很简单的利用,刚好新生赛,那就拿来玩玩

  • 思路很简单啊,就登陆,然后后台ssti,结果大部分人似乎连登录都搞不定,我还发了密码字典,这个题本意没有让选手在线爆破,而是找出hash值离线碰撞
@auth.route("/login", methods=["POST", "GET"])
@ratelimit(method="POST", limit=10, interval=5)
def login():
    ...
  • 这儿限制了频率,给了10000个密码,如果很多人同时做的话,直接爆破是不可能出的(结果后期没人做了,一个人用四台靶机也不是不能出)
  • 在附件中给了数据库,直接从user表中提取出admin的密码hash
  • 我图省事,直接010了,也可以把docker启动起来,连上去select一下不也行(我发现很多人不会用docker,然后呢也不愿意突击学一下
  • 然后呢,撞就完事儿了啊,这有啥难的,但这块儿可能会有一个问题,如果你尝试用这个hash去加密同一个值,会发现两次的值不一样
  • 所有你用==去判断这辈子都出不了,得用verify
  • 然后就写脚本爆就完事了
from passlib.hash import bcrypt_sha256
from tqdm import tqdm


data = open("something.txt", "r", encoding="utf-8").read().split("\n")
for i in tqdm(data):
    if bcrypt_sha256.verify(i, "$bcrypt-sha256$v=2,t=2b,r=12$6lJafyh73K/pqYCF9vHMwe$Pb9EPytqNZgpbzEsgG6Qp5/mvm9PaMK"):
        print(i)
        exit(0)
  • 再就后台一个ssti,注入点在
  • 到这儿是个人都该会了,不说了,简单题啊,发现好多人思路有些乱,提示你登陆,给了密码字典,限制了访问频率,肯定想办法找hash撞么,再不济本地起一个docker把频率限制取消掉,也比撞公共靶机强啊,还有的选手似乎意识不到密码会存在哪,或者不仔细看附件,docker-compose.yml啥的都给的清清楚楚,附件和公共靶机的环境一模一样,装个docker,docker compose up -d,不就起了,唉,还好还是有解的

Misc

大地之母

  • 社工,没得说

JBN

  • 一个磁盘取证,很干净的磁盘,一个vmdk,这不瞬间两个思路,要么分区工具直接看文件,或者拿这块儿磁盘重新构建一个虚拟机
  • 这儿本来是没打算设密码的,结果创建的时候忘记了,题刚上就给了个hint,弱口令,密码是password
  • 桌面那么大个xshell,肯定和他有关了,为了让选手想到要获取它的明文ssh密码,还专门给了靶机,如果你直接nc就能看到ssh的字样
  • 好,接下来就是找密码了,xshell里就一个ssh凭证,直接去Document目录找session(附件让我删了,我拿实际的xshell举个例子
C:\Users\JBN\Documents\NetSarang Computer\7\Xshell\Sessions
  • 默认目录,然后搜个工具解密码
https://github.com/JDArmy/SharpXDecrypt
  • 这块儿由于在虚拟机里,没有C#的环境,要么把环境配了,要么把session复制出来解,然后又会出现一个新的问题,你会发现解出来是乱码,那么就要想,是不是哪出了问题,看看工具的源代码
// https://github.com/JDArmy/SharpXDecrypt/blob/main/C%23/XClass.cs
public static string Xdecrypt(Xsh xsh, Utils.UserSID userSID)
{
    string password = null;
    if (!enableMaterPasswd)
    {
        if (xsh.version.StartsWith("5.0") || xsh.version.StartsWith("4") || xsh.version.StartsWith("3") || xsh.version.StartsWith("2"))
        {
            byte[] data = Convert.FromBase64String(xsh.encryptPw);
            byte[] Key = new MD5CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes("!X@s#h$e%l^l&"));
            byte[] passData = new byte[data.Length - 0x20];
            Array.Copy(data, 0, passData, 0, data.Length - 0x20);
            byte[] decrypted = RC4.Decrypt(Key, passData);
            password = Encoding.ASCII.GetString(decrypted);
        }
        else if (xsh.version.StartsWith("5.1") || xsh.version.StartsWith("5.2"))
        {
            byte[] data = Convert.FromBase64String(xsh.encryptPw);
            byte[] Key = new SHA256Managed().ComputeHash(Encoding.ASCII.GetBytes(userSID.SID));
            byte[] passData = new byte[data.Length - 0x20];
            Array.Copy(data, 0, passData, 0, data.Length - 0x20);
            byte[] decrypted = RC4.Decrypt(Key, passData);
            password = Encoding.ASCII.GetString(decrypted);
        }
        else if (xsh.version.StartsWith("5") || xsh.version.StartsWith("6") || xsh.version.StartsWith("7.0"))
        {
            byte[] data = Convert.FromBase64String(xsh.encryptPw);
            byte[] Key = new SHA256Managed().ComputeHash(Encoding.Default.GetBytes(userSID.Name + userSID.SID));
            byte[] passData = new byte[data.Length - 0x20];
            Array.Copy(data, 0, passData, 0, data.Length - 0x20);
            byte[] decrypted = RC4.Decrypt(Key, passData);
            password = Encoding.Default.GetString(decrypted);
        }else if (xsh.version.StartsWith("7"))
        {
            string strkey1 = new string(userSID.Name.ToCharArray().Reverse().ToArray()) + userSID.SID;
            string strkey2 = new string(strkey1.ToCharArray().Reverse().ToArray());
            byte[] data = Convert.FromBase64String(xsh.encryptPw);
            byte[] Key = new SHA256Managed().ComputeHash(Encoding.Default.GetBytes(strkey2));
            byte[] passData = new byte[data.Length - 0x20];
            Array.Copy(data, 0, passData, 0, data.Length - 0x20);
            byte[] decrypted = RC4.Decrypt(Key, passData);
            password = Encoding.Default.GetString(decrypted);
        }
    }
    else
    {
        Console.WriteLine("  MasterPassword Enable !");
    }
    return password;
}
  • 一个RC4,密码是拼接起来的sha256,拼的是电脑用户名和SID,所以你复制出来SID肯定变了,用户名也变了,好,又是两个选择,写脚本,或者在虚拟机里搞,我选择写脚本
from base64 import b64decode
from hashlib import sha256
from Crypto.Cipher import ARC4

sid = b"S-1-5-21-3379787759-218951813-3166628723-1000"
name = b"JBN"
pwd = b"hEmTIaYScRHT3tDqLgQnh6hlr6mbKatbTmg2a1+InOc7jyOTVUwbbZEKBIxVIXk98I1Nor4RAVzQjEuxZVI="
key1 = name[::-1] + sid
key2 = key1[::-1]
key = bytes.fromhex(sha256(key2).hexdigest())
data = b64decode(pwd)
pwd = ARC4.new(key).decrypt(data[:len(data) - 0x20])
print(pwd)
  • 这不就得到密码了,连上靶机,cat flag 结束
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇