数字中国2023|数字网络安全人才挑战赛出题思路

关于怎么出这两道题其实想了很久,如何将我最近学习的东西放在CTF当中来考察,而且难度适中,不恶心人的题。我个人比较反感Misc题中加一堆乱七八糟抽象的编码和脑洞极大的题目,为了难而难,失去了当初Misc题目开拓思维、学习新知识的初衷,所以这次的题目只要通过自己的研究和学习就可以很快的解出来。

AreYouOK

因为之前了解了一些关于蓝牙的知识,恰好手头有一个小米手环可以用来测试,所以这道题目就应运而生。题目名称玩了一下雷总裁的梗😇

题目描述

在一次神秘行动中,特工张纪星的手机遭到了破坏,不过好在还有小米手环,组织向他的手环发送了行动指令,你能协助分析其中的㊙️吗?
flag{Battery_Message}

题目考点

1. 小米手环BLE日志分析
2. ATT协议分析
3. Morse解密

Flag

flag{72_SZZGVME50}

解题思路

题目附件打开后发现是一个乱码的log日志文件,猜测是没有正常解析。

搜索后发现可以用Wireshark打开:

发现有两台设备通信,HUAWEI P10 Plus和小米手环Mi Band 5:

刚开始两台设备进行了认证通信,之后HUAWEI P10 Plus请求读取小米手环的电量,句柄为0x007e,Opcode为0x0a:

紧接着,HUAWEI P10 Plus收到了小米手环5的返回包,里面涵盖了电量等信息:

此时小米手环的电量为0x48,转为十进制为72,那么小米手环5的电量为72。
继续往下看,发现HUAWEI P10 Plus有一个Write的操作,句柄为0x007e,Opcode为0x12,这是Alert Notification Service的通信过程。

除此之外,可以看到HUAWEI P10 Plus还有另外一个Write的操作,句柄为0x0026,Opcode为0x52,这是Immediate Alert的通信过程。



而在Immediate Alert通信的过程中,可以发现有三种Value,相对应的Morse如下表所示:

Value 0x00 0x01 0x02
Morse . - /
可以写脚本将所有通信过程打印出来,并转化为Morse电码:
# -*- coding:utf8 -*-
import pyshark

pcap = pyshark.FileCapture('1.pcap', display_filter = 'btatt.opcode == 0x52')

flag = ''

for pkt in pcap:
    opcode = str(pkt.btatt.value)
    if opcode == '00':
        flag += '.'
    elif opcode == '01':
        flag += '-'
    elif opcode == '02':
        flag += '/'

print(flag)

# .../--../--../--./...-/--/./...../-----


最终结果为flag{72_SZZGVME50}

Beyond

去年在HW中遇到了一个0day事件的流量分析,所以正好简化了一下出了这道题目,当时也是爆了很久key🤪

题目描述

在某个国家级行动中,作为蓝队研判一哥的张纪星捕获到了一个神秘流量,直觉告诉他这不简单,于是他将这个流量保存了下来,你能协助他发现其中的㊙️吗?

题目考点

1. 冰蝎4.0自定义加密算法流量分析
2. 冰蝎Key爆破
3. AES解密

Flag

flag{404c601a8ca9d44d586f7b93ba236b12}

解题思路

题目附件使用Wireshark打开后发现是一段经过加密的流量:

起初,有ICMP协议的流量,分析后发现是攻击者发送Ping命令确认主机存活状态,之后有很多垃圾干扰流量:

经过仔细分析后发现,有一个.index.php的shell在进行通信:

追踪TCP流后可以看到是经过加密的流量,加密后的结果很像base64。



分析后得知,这个是冰蝎V4.0的流量,服务端是PHP,使用默认的aes算法,但是由于默认使用的是aes128的算法,会导致密文长度恒是16的整数倍,可以对默认算法做一个简单修改,在密文最后最加一个magic尾巴,随机产生一个随机长度的额外字节数组,简称aes_with_magic算法。
在解密之前,首先看一下冰蝎Payload流转的流程图:

1、本地对Payload进行加密,然后通过POST请求发送给远程服务端;
2、服务端收到Payload密文后,利用解密算法进行解密;
3、服务端执行解密后的Payload,并获取执行结果;
4、服务端对Payload执行结果进行加密,然后返回给本地客户端;
5、客户端收到响应密文后,利用解密算法解密,得到响应内容明文。

由上述流程可知,一个完整的传输协议由两部分组成,本地协议和远程协议。由于客户端使用Java开发,因此本地协议的加解密算法需要用Java实现。远程协议根据服务端语言类型,可能为Java、PHP、C#、ASP。无论用哪种语言,同一个名称的传输协议,本地和远程的加解密逻辑应该是一致的,这样才能实现本地加密后,远程可以成功解密,远程加密后,本地同样也可以解密(因此如果修改默认的aes协议的key,则需要同时修改本地和远程的加密函数和加密函数中的key)。
然后再来看一下PHP的加密函数:

function Encrypt($data)
{
    $key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond
    $encrypted=base64_encode(openssl_encrypt($data, "AES-128-ECB", $key,OPENSSL_PKCS1_PADDING));
    $magicNum=hexdec(substr($key,0,2))%16; //根据密钥动态确定魔法尾巴的长度
    for($i=0;$i<$magicNum;$i++)
    {
        $encrypted=$encrypted.chr(mt_rand(0, 255)); //拼接魔法尾巴
    }
    return $encrypted;
}

那么可以写脚本来还原加密之后的流量,密钥选择top500来爆破即可:

import re
import base64
import hashlib
from Crypto.Cipher import AES

def Decrypt(key, data):
    magicNum = int(key[:2], 16) % 16 # 魔数长度
    data = data[:len(data) - magicNum] # 去掉魔数

    c = AES.new(key, AES.MODE_ECB)
    decodebs = base64.b64decode(data)

    return c.decrypt(decodebs)

def Key_Brute(data):
    with open('top500.txt', 'rb') as f:
        plain = [i.strip() for i in f.readlines()]

    for i in plain:
        md5_enc = hashlib.md5(i).hexdigest()
        try:
            key = md5_enc[:16].encode()
            AES_dec = Decrypt(key, data).decode('utf-8')
            cmd = re.findall(r'[\s\S]\$cmd=\"(.*?)\"', AES_dec)
            if cmd:
                # print('[*] Crack Success!!!' + '\n' + '[*] The Key is ' + md5_enc[:16] + '\n' + '[*] Decode Text:' + '\n' + AES_dec)
                print('[*] Crack Success!!!' + '\n' + '[*] Key: ' + i.decode('utf-8') + '\n[*] Webshell Key: ' + md5_enc[:16])
                payload = base64.b64decode(cmd[0]).decode('utf-8')
                print('[*] Payload: ' + payload)
            break
        except Exception as e:
            print('[-] Crack Failed')

if __name__ == '__main__':
    data = 'Sy//Wq2O8Sp1pH90xOmXGUvMrKLvDdOLiaxdMwROqzYTMnVHnObV/5RlkD7Ei0QN975k27SEzykXWZbrymREHOJ4eaI7xYibAI8y2TkG1BeL1Xslr84MBRogy8Yx9Smr9QVcY8SxpkMxIpedv1+svUbJ+/H9aeKaJVtkVeHyz6dWAt1jJwwtS8YwNWeDc6A5i9rw5FzWElQ3Iv8A9b4j7pj60CQ+9vx51xlarVBrMSwjRuuH8okcsSDkfcrILaHixbsAjhM4ri6jjXS31F/gOIcavMFQMxr+vd8xRYoD9F39Brd+cRdVi9+I+vybhTNmGbHfYTIw1WYSEAnRR5ic9HT/clJqeYgr6+t5cC1TtxekJRaYuzaKVOsEkE45KQzNjngNgWJTunWdA7WXf1NvJBUpD+/pRIlUVGy6iqG5TSDR5X7vXc+MmX47JCt4qDeGuUOYOUZy3jULNT0SvFzmYIZBCgx/RjzGwy9aukdqZ8DbukQX6HsGhuEXjBKnalEoS3RfPj3KSDUg4O/DuHObFhTWsMgR2jHL5rM85/IBUFSswPxaSgLhcpa88LUpMLL//r5+B+ltI1+xpmm5Xy1mqkxNeYKPyoF504Drs1Lc7fHm5DpylO+4qiERbYSOLHmIKlAbnSjv25FJl3cK1Vl2haddnOOwEMLjb6HFqKhTia0iTO2RbUu0bzBFynVXmFMu/8+fcjGUqJc2nI9BLP55aBDj5bqniJ6gig8o34k/5XhOoocUQS+vKxzKuHGldHF8G3PI484pBShS46V8Vd3Os+rZsVXHAlQ4q6zZahyPZS1Xpk14KGyAC2utfuufIndSE2YyChZsmHsS3QaUBTtb4t7ee6eFaVEkoByBkBkJCmTUa7gbRLCTKZwvQNCvz/uZfueXx5FTWs+ffyi+5QIOeaLfER7Xvy7MsHAToTmjWrmuld0aoFSSPtD1O/36VvsdXKhHlegzkA0ZUV8somT4NpUFWgIQ97+O0iiTtAGZcttNnq+E9xeXfiun+l4NC737xbDfb4wKgX+GkypD216dS5F5u8UmkVqgUIxqFpC3IiRVjI8SSF2UhZekxMLp774GmAninZUHc11OoZ0xu6MxXjZPPuTH6DAIChvR15mCefvyGlm+BFYgb3ntPcZwPquFtVwtBjp7bRu9NMdkGeArrbUIObhmU4/DbyEhb8yDverGYMb1gp8AcqOhLEoAN5SLiaz75tymCOQJ9a05uIjRW/Ob6g0ctXcxraU7hKtS6nPOc5sC6YZzyM2FhFMvUoV7axVyWdbNDo5Z/LV4GuB9UISV44aJOlJhfyBixqbot4FeSy9j8LIAZA2UVELkJehAYA0F48ZinVOtH6qHmG6Cde6iJ6fReNZykK125so1vXN4BpB71aGLSM+IhtIhcR/xl4kHPO5vmMfw4+A7rRMF/WE9Jnh23e1mEJpAizxXt/VVf8v6EChx2Ktr8dtwmijpbURPxhG6B4llWfy3JbRUXfVNgq892tx2TthxVWvviIjem4qchv3bbkyKoyIiXHZBzVQBARVJIa+ZTTkfp0bRQYg8jrGEyryENgYGmCHfgwDD0Amk+m28BUX9ewHkqnXWp0Nonb5eMBJrClyoF90BX5LNO4rIh5w98uwwP25vduYF3rdOr5iQTn4jc1VZ6DUZ4CY+nmMent5onaQGnn/42EFckUQgtNgF7H8PxSzfUlLYT10r5saFi49LvF3I2vR+YNEiaOOkcndFGLGlGfSGpu2SQUlUFhWJZs9AX68bRQ+LGjPA8YWXQY69IsOwQaSU02NJ0ZVt9X+1P8BbfPXSCUXDGGlZkF8B7hx2gg5ytwarh6hP2mJkIFTYVQK+CISToxEqnQ10DuaImIFaE0IoZg1o1z2tdRiDqoquhsToTSfAKvoHItWBo44M1GhmP/b6+yAUk4XXCvGzB62/E/aAwmR4MLagT0/c1MaqxhDBEXgWTJKY9CaSBW+rgmR6pXmuiYCinVGBNlRXa3S3oSkXKWRxyvS86KxL02saWkrS1gX56wMcdP6E0I3s6rCzaFPZnBD871MUnXITpeNAV2IURROPSn/tZM8EX6qaXlhfh2Qt1XWIr7offNYuHhyuSZvE7/+Mluk1qs2c9WwQe6mBSGuszZygxw/GS10iZP1tXiU/NXcC+SKY6hjF+WdWkDAud2ENs7t7RtqI0omITjYpSX+cyBLWPOzOJK7DEna09Y/d2tGBNqwtrEFyTFbv7CI5lA1sqTSQ//xpKCCNc19LrqQpiecMbvDRsJXRy62QzNxeFs4K4ffG4ayESPhlF6lOaOq159gquVa9LbRJ0sa8j1FvYFduQvBmFDWsZ+W1XP2i3A1tSDeiyRFuStoGazCqCN3DvelUaOS2gTUfrxQjnYzKAWFykc5xjV4YM1v1yyx+X7FaHJAjUNLYI96NcvzRnBD871MUnXITpeNAV2IURU0qua4EWx3Tzk2RBXdgRh6yLuskfY83HBqZv5M6jePoh87hzKVMZbullYBgv29BhE8eXuBUHd3pWn9ZRVLu1gcdaLW6Wxa/EL4k5bYzzIZev2VOEXrcN5pZm5tJOYiR+CVxbiOiWxvDg8NQpocUupC8FY8YRU5eTPDJs0q4Omydz4GuhlZoyB5l8wOZhsUSNF1vmB9KTTMaaicG4e1BgwVwdc9Da7yhhPyC2lMfEdVUbf5RN26CoHvpVFP9lQyyt2FtOdXKTVt99rFRbzSsf0fGYMb1gp8AcqOhLEoAN5SLqUTqghLbtax4hL297sBYgWIZ3kJem282OuMevN4sfwMBGW7ivKUe5xCXImE/Ecwd83Dg2YP/6c8UzZcPMho5vku/wsQh/uUa9DdjQJ2bZR/bkESmBIdLs6biRiBQbfGJcb9w28YmQVtorv6D96uEb5se8mCB293sq2+BDEqAmG7LzfvHl9kFX3d19ZB/gFWLNm/Gds2ae2Jylm73aSIkxsce/R49r7+gnAACJYzav4KnN09bNrj6aSCYXPHssqqsLx6JG8qY/7pE6xPcSzbDQCWVYtekseV/e9Ptcc+JGuu4i28C8uhio3NbYlcUZp7be/7Q3kaZSa5PaVVdHarB0ILj7xfm2r3y2XOD+TXHzAga23zpRXxnUdd69hcl1Y2EDywX82hWKEZFm9jaDuioJBFniBi4Z+g4yT67QP8X/pUK/dthr9Eaa/YySWDndslnBWMAv4V7WpYjykDtTAwvnetrVG65Gjfg8FjppIYP2b03EdsX7s0FGAKXfI6YnChi/wjNp6ky4KhM4CROQeIerWYKE1/mVqtVP8GM5YiYwP7Lk44bOBSgfu8d7pog6AIFGihXAmTEzOTxudd7QXr4mm/VhnEGNyrqnl2sCWvATOPmZIrxfYpfiL8MXmQJ91ukQbFD8VCykPUPS70mDSCENE+zvC/QmBXj7dIHCKMd9b2xdaB5MtHYKJuapO6sFoy9F4UvudLPCuYBv+7qdlXNGHCbHLZgmlfGvOZsYJXR+fiXpb/ocLZrmkp+hATikFw9F4UvudLPCuYBv+7qdlXNGJqQ2py1UKBZ1WBie3EgrAHuGvjYRKNaworL4PQ2CES5mM8G83O0D0Uq6YyT33j3LRHeYuTEwDlzUrzMW/7f0pG8wl8BhJhjVzUCffPerXTW8Te8g7WW2jNCuDaEPMLbTGZIUvp610JeqthmTyYc7N92vA/b5RIYqFwgXvXD2o6MSkJtKTpFtBmAdSTHM4gUfOUmvWh7L6TQ9x7K8QzXei/3C2EsnsAu5pP0mIpRBUItj1zKIm7FLInu3rq3gaTBFbSVneH0fvCMnRMogQYQjU/BkCwyVlMjAg/PnbYJ75ZiD51deiA4zmSPgmlK9heoGMfC73pEwYWjWzv/oQpENOQP4wPdYkb0G4lVQyszhgw9gBqmDAqR0wnlTinARqYvHOdGxgeDSD6rmKyJBjRKY9wB6qkpbsQeXh2ZONNWcatcG5cOHcFTRSQde8b13rCiD/uwysxn52GasdFVyDVfqFe2JJZnWuyW2xfGGWqa0ZR7jQgWPRtmssy27TdSNxDmiwcGg8Y16l/HSRhXJ6Inap1F8DihkTLL77CADcxKNzeW4infd81Uo8F3W2H0eJRHprmz4iWXKP5sdPHIjovLNek5pZbVL8ZGHksa12SRVzjHQZavDcMjrbbMeXc22RRCxnybTD3TeOyzM158l1Z5wACfc6oXFbzai5T302ppOEMSN/E+TrWt4gdwTMoLpdKrqiWo2m+ymXoCG3PaPBAMq/tdJmKbPpTYcMmxZfOTHmOjCHGKbL2pTr/IfJ1WjO32VNnFy0Og1+P7QG5o0Bx/8X8hnECG6b5YGbBPzvKJaMTDKHxvWfZ7kdrFIDrSUHUSQno3vzqYH3o+/p/zU+urgtuK+XE/wXyGwHSjVrtE3aP1NKULBkB6AZob6WMkwTjrV11/txCUNTAiVXkXo1s4Jta8iTotqrwMQ8KHOdB13B6lbgP3K+bfOHyQ/xGJSuadV4VUkU72kTZ+VgfwBD2WzzPtBe/VtwWrkA0datqsFFtpmp1W4OB7mNuVdZWDaCBDkmX0dsOBUsdLSpMFAC00Yd/eDj+1pFVOTsy4L48gpOqVRHpuvt60buK5b7iewS56qD8DdaCTZ51hcVuQmGPGS28b/ONmeAP4QazQUEZzJ0dYYYRd59opwmaCbWgcB2ZqcA==....A......'
    Key_Brute(data)

解密之后的流量为:


所以最后的flag{404c601a8ca9d44d586f7b93ba236b12}
如果大家在复现的过程中遇到什么问题可以和我交流🫡