😉🌃⛅😉

乍一看,有arp、smb、tls等协议流量

image-20241130102444496

先过滤出smb2流量看看

smb协议主要用于在计算机间共享文件、打印机、串口等

NTLM是一种身份验证机制

image-20241130104443093

smb2爆破

Wireshark分析–SMB2协议包及hashcat爆破_wireshark smb-CSDN博客

通过文章了解到需要构造hash文件

username::domain:NTLM Server Challenge:ntproofstr:不包含ntproofstr的ntlmv2_response值

双击打开这条流量

image-20241130105942945

image-20241130111843833

image-20241130145430674

session id 在header里面

image-20241130151434968

上一条流量

拿到NTLM Server Challenge

image-20241130123031084

ntlmssp.ntlmv2_response:ca32f9b5b48c04ccfa96f35213d63d75010100000000000040d0731fb92adb01221434d6e24970170000000002001e004400450053004b0054004f0050002d004a0030004500450039004d00520001001e004400450053004b0054004f0050002d004a0030004500450039004d00520004001e004400450053004b0054004f0050002d004a0030004500450039004d00520003001e004400450053004b0054004f0050002d004a0030004500450039004d0052000700080040d0731fb92adb0106000400020000000800300030000000000000000100000000200000bd69d88e01f6425e6c1d7f796d55f11bd4bdcb27c845c6ebfac35b8a3acc42c20a001000000000000000000000000000000000000900260063006900660073002f003100370032002e00310036002e003100300035002e003100320039000000000000000000
ntlmssp.ntlmv2_response.ntproofstr:
ca32f9b5b48c04ccfa96f35213d63d75

Server response challenge

ntlmssp.ntlmserverchallenge:
c1dec53240124487
ntlmssp.ntlmv2_response.challenge:
221434d6e2497017
ntlmssp.auth.domain:
.
ntlmssp.auth.username:
tom

组合

tom::.:c1dec53240124487:ca32f9b5b48c04ccfa96f35213d63d75:010100000000000040d0731fb92adb01221434d6e24970170000000002001e004400450053004b0054004f0050002d004a0030004500450039004d00520001001e004400450053004b0054004f0050002d004a0030004500450039004d00520004001e004400450053004b0054004f0050002d004a0030004500450039004d00520003001e004400450053004b0054004f0050002d004a0030004500450039004d0052000700080040d0731fb92adb0106000400020000000800300030000000000000000100000000200000bd69d88e01f6425e6c1d7f796d55f11bd4bdcb27c845c6ebfac35b8a3acc42c20a001000000000000000000000000000000000000900260063006900660073002f003100370032002e00310036002e003100300035002e003100320039000000000000000000

hashcat爆破

hashcat -O -a 0 -m 5600 1.hash rockyou.txt

字典大家随意

#解释
攻击模式 (-a 0): 使用字典攻击模式,逐个尝试字典文件中的密码。
哈希类型 (-m 5600): 指定哈希类型为 NTLMv2,这是 Windows 系统中常用的一种哈希类型。
哈希文件 (1.hash): 指定要破解的哈希文件。
字典文件 (rockyou.txt): 指定用于破解的字典文件,这个文件通常包含大量的常见密码。
#这里当个破解用不着--show
显示结果 (--show): 在破解过程中实时显示破解进度和结果。

image-20241130132749805

babygirl233

要获取这些字段值

image-20241130134959694

必要的信息

用户的明文密码。
用户名 (username) 和域名 (domain)。
捕获的网络包中的 ntProofStr(客户端提供的证明字符串)和 serverChallenge(服务器挑战值)。
加密的会话密钥 (sessionKey)。

获取到了密码然后破解出session key

脚本利用

上面得到sessionkey:5643a37f253b00b2f52df1afd48c1514

from Crypto.Cipher import ARC4
from Crypto.Hash import MD4, MD5, HMAC

password = 'babygirl233'
passwordHash = MD4.new(password.encode('utf-16-le')).hexdigest()
username = 'tom'
domain = '.'
ntProofStr = 'ca32f9b5b48c04ccfa96f35213d63d75'
serverChallenge = 'c1dec53240124487'
sessionKey = '5643a37f253b00b2f52df1afd48c1514'

responseKey = HMAC.new(bytes.fromhex(passwordHash), (username.upper()+domain.upper()).encode('utf-16-le'), MD5).digest()
keyExchangeKey = HMAC.new(responseKey, bytes.fromhex(ntProofStr), MD5).digest()
decryptedSessionKey = ARC4.new(keyExchangeKey).decrypt(bytes.fromhex(sessionKey))
print('Decrypted SMB Session Key is: {}'.format(decryptedSessionKey.hex()))

大致思路

从密码到哈希
用户的明文密码通过特定算法(如MD4)转换成一个固定的哈希值。
这个哈希值将作为后续计算的基础。
生成响应密钥 (Response Key)
使用用户密码的哈希值作为密钥,结合用户名和域名生成一个新的密钥——响应密钥。
生成密钥交换密钥 (Key Exchange Key)
使用上一步生成的响应密钥,结合客户端提供的证明字符串(ntProofStr),生成用于解密会话密钥的密钥——密钥交换密钥。
解密会话密钥 (Session Key)
使用密钥交换密钥作为解密密钥,对加密的会话密钥进行解密,得到最终的明文会话密钥。
#基于对称加密和哈希函数
明文密码 → 哈希
将用户的明文密码通过特定算法(如MD4)转换为一个固定长度的哈希值。
这个哈希值用于后续步骤中的密钥生成。

哈希 → 响应密钥
使用用户密码的哈希值作为输入,结合用户名和域名等信息,通过HMAC-MD5算法生成响应密钥。
响应密钥是一个临时密钥,用于进一步的密钥交换。

响应密钥 → 密钥交换密钥
使用响应密钥和客户端提供的证明字符串(ntProofStr),通过HMAC-MD5算法生成密钥交换密钥。
密钥交换密钥用于解密会话密钥。

密钥交换密钥 → 解密会话密钥
使用密钥交换密钥作为解密密钥,对加密的会话密钥进行解密,得到最终的明文会话密钥。

image-20241130151130816

注意wireshark里面的大小端问题

session key:a3abe4d64394909a641062342ffe291b

session id:0900000000100000

image-20241130151642728

smb流量解密了

image-20241130151719149

发现敏感文件flag.7z

image-20241130151822766

右键追踪tcp流

image-20241130152926148

image-20241130152941638

全部导出

image-20241130153106377

压缩包要密码

还有证书没用上,所以返回去看看rdp和tls流量

image-20241130153129716

1. RDP 中的证书
目的:当您连接到一台 RDP 服务器时,服务器会向客户端发送一个数字证书以证明其身份。如果客户端信任该证书,则可以安全地建立连接。
操作:如果您是服务器管理员,需要将有效的证书安装到 RDP 服务器上,以便客户端能够验证服务器的身份。这通常涉及到从受信任的证书颁发机构(CA)获取证书,并将其安装到服务器的证书存储中。
2. TLS 中的证书
目的:在 TLS 握手过程中,服务器会向客户端发送一个数字证书以证明其身份。客户端会检查该证书是否由可信的 CA 签发,并且证书中的信息是否匹配预期的服务器。
操作:对于 TLS 服务(如 Web 服务器),您需要将证书安装到服务器上,并配置服务以使用这些证书进行 TLS 握手。对于客户端(如浏览器),则需要确保操作系统或应用程序的信任库中包含所有必要的根证书。

注意wireshark的tls证书支持的是.pem格式,用openssl转换

一个 PEM 文件,其中包含用于 RDP 会话的 TLS 加密的 SSL/TLS 证书。

参考文章 分析捕获的 RDP 会话 |haxor.no

更改文件所有者: 你可以将文件的所有者更改为自己,这样就可以导出到windows中了

image-20241130160608511

Enter Import Password::当您创建或导出 .pfx 文件时,通常会设置一个导入/导出密码以保护其中的私钥。在这里,系统提示您输入这个密码,以便能够读取并转换 .pfx 文件的内容。

密码尝试后mimikatz是对的
#不清楚为什么
有位师傅这么说:通过阅读其他师傅的wp,知道这里出题人是用了mimikatz一把梭,所以用mimikatz来作为密码得到密钥文件

image-20241130160930252

可以查看rdp流量了

未解密的状态

image-20241130162816527

解密后状态

image-20241130162620510

image-20241130163405588

image-20241130164653721

可以使用pyrdp工具

但是我没有装成功所以用其他方法,提取加脚本分析

参考链接如下

分析捕获的 RDP 会话 |haxor.no

github.com

image-20241130171029934

例如这里的,可以右键scancode,复制,选里面的列出选中树的所有项目

里面的 rdp.fastpath.scancode.keycode 是对应的键盘码

rdp.fastpath.scancode.release是是否按着,true代表是

tshark -r 1.pcapng -Y "rdp.fastpath.action == 0" -o "tls.keylog_file:./rdp.pem" -T fields -e frame.time -e rdp.fastpath.scancode.keycode -e rdp.fastpath.scancode.release > keyboard_data.txt

解析脚本

def map_keycode(key_code):
    """根据扫描码返回相应的字符或描述"""
    # 特殊键的映射
    special_keys = {
        0x00: 'None',              # No key
        0x01: 'Esc',               # Esc
        0x02: '1',                 # 1
        0x03: '2',                 # 2
        0x04: '3',                 # 3
        0x05: '4',                 # 4
        0x06: '5',                 # 5
        0x07: '6',                 # 6
        0x08: '7',                 # 7
        0x09: '8',                 # 8
        0x0A: '9',                 # 9
        0x0B: '0',                 # 0
        0x0C: '-',                 # -
        0x0D: '=',                 # =
        0x0E: 'Backspace',         # Backspace
        0x0F: 'Tab',               # Tab
        0x10: 'Q',                 # Q
        0x11: 'W',                 # W
        0x12: 'E',                 # E
        0x13: 'R',                 # R
        0x14: 'T',                 # T
        0x15: 'Y',                 # Y
        0x16: 'U',                 # U
        0x17: 'I',                 # I
        0x18: 'O',                 # O
        0x19: 'P',                 # P
        0x1A: '[',                 # [
        0x1B: ']',                 # ]
        0x1C: 'Enter',             # Enter
        0x1D: 'Left Ctrl',         # Left Control
        0x1E: 'A',                 # A
        0x1F: 'S',                 # S
        0x20: 'D',                 # D
        0x21: 'F',                 # F
        0x22: 'G',                 # G
        0x23: 'H',                 # H
        0x24: 'J',                 # J
        0x25: 'K',                 # K
        0x26: 'L',                 # L
        0x27: ';',                 # ;
        0x28: "'",                 # '
        0x29: 'Grave',             # `
        0x2A: 'Left Shift',        # Left Shift
        0x2B: 'Backslash',         # \
        0x2C: 'Z',                 # Z
        0x2D: 'X',                 # X
        0x2E: 'C',                 # C
        0x2F: 'V',                 # V
        0x30: 'B',                 # B
        0x31: 'N',                 # N
        0x32: 'M',                 # M
        0x33: ',',                 # ,
        0x34: '.',                 # .
        0x35: '/',                 # /
        0x36: 'Right Shift',       # Right Shift
        0x37: 'Keypad *',          # Keypad *
        0x38: 'Alt',               # Alt
        0x39: 'Space',             # Space
        0x3A: 'Caps Lock',         # Caps Lock
        0x3B: 'F1',                # F1
        0x3C: 'F2',                # F2
        0x3D: 'F3',                # F3
        0x3E: 'F4',                # F4
        0x3F: 'F5',                # F5
        0x40: 'F6',                # F6
        0x41: 'F7',                # F7
        0x42: 'F8',                # F8
        0x43: 'F9',                # F9
        0x44: 'F10',               # F10
        0x45: 'F11',               # F11
        0x46: 'F12',               # F12
        0x47: 'Num Lock',          # Num Lock
        0x48: 'Keypad 7',          # Keypad 7
        0x49: 'Keypad 8',          # Keypad 8
        0x4A: 'Keypad 9',          # Keypad 9
        0x4B: 'Keypad -',          # Keypad -
        0x4C: 'Keypad 4',          # Keypad 4
        0x4D: 'Keypad 5',          # Keypad 5
        0x4E: 'Keypad 6',          # Keypad 6
        0x4F: 'Keypad +',          # Keypad +
        0x50: 'Keypad 1',          # Keypad 1
        0x51: 'Keypad 2',          # Keypad 2
        0x52: 'Keypad 3',          # Keypad 3
        0x53: 'Keypad 0',          # Keypad 0
        0x54: 'Keypad .',          # Keypad .
        0x5B: 'Left Win',          # Left Windows
        0x5C: 'Right Win',         # Right Windows
        0x5D: 'Menu',              # Menu
        0x5E: 'Right Ctrl',        # Right Control
        0x5F: 'Right Alt',         # Right Alt
    }

    return special_keys.get(key_code, f"Unknown key code: {key_code}")

def process_keyboard_data(data):
    """处理键盘输入数据,返回对应的按键描述"""
    output = []
    for entry in data:
        # 分割扫描码并转换为整数
        key_codes = entry.split(',')
        mapped_keys = [map_keycode(int(code, 16)) for code in key_codes]
        output.append(' '.join(mapped_keys))
    return output

# 示例键盘输入数据
keyboard_data = [
    "0x0f,0x2a,0x36,0x1d,0x1d,0x0f,0x38,0x0f,0x38,0x0f",
    "0x0f,0x2a,0x36,0x1d,0x1d,0x0f,0x38,0x0f,0x38,0x0f",
    "0x0f,0x5b,0x5c,0x2a,0x36,0x1d,0x1d,0x0f,0x38,0x0f,0x38,0x0f",
    "0x14",
    "0x23",
    "0x12",
    "0x2a",
    "0x39",
    "0x08",
    "0x2c",
    "0x39",
    "0x19",
    "0x1e",
    "0x1f",
    "0x1f",
    "0x11",
    "0x18",
    "0x13",
    "0x20",
    "0x39",
    "0x17",
    "0x1f",
    "0x39",
    "0x21",
    "0x28",
    "0x1a",
    "0x2a",
    "0x11",
    "0x17",
    "0x31",
    "0x20",
    "0x18",
    "0x11",
    "0x1f",
    "0x0c",
    "0x2a",
    "0x19",
    "0x1e",
    "0x1f",
    "0x1f",
    "0x11",
    "0x18",
    "0x13",
    "0x20",
    "0x1b",
    "0x2a",
    "0x0a",
    "0x04",
    "0x05",
    "0x08",
    "0x0b",
    "0x02",
    "0x04",
    "0x02",
    "0x09",
    "0x03",
    "0x28",
    "0x1f",
    "0x1d",
    "0x0f,0x2a,0x36,0x1d,0x1d,0x0f,0x38,0x0f,0x38,0x0f"
]

# 处理每行数据
keyboard_output = process_keyboard_data(keyboard_data)

# 将结果写入文本文件
with open('keyboard_output.txt', 'w') as file:
    for entry in keyboard_output:
        file.write(entry + '\n')

print("结果已写入 keyboard_output.txt")

不知道为什么我的kali上的wireshark解析不了证书,rdp流量一直处于加密状态,所以我用windows

tshark -r "1.pcapng" -Y "rdp.fastpath.action == 0" -o "tls.keylog_file:rdp.pem" -T fields -e frame.time -e rdp.fastpath.scancode.keycode -e rdp.fastpath.scancode.release > "keyboard_data.txt"
tshark.exe -r "D:\桌面\1.pcapng" -Y "rdp.fastpath.action == 0" -o "tls.keylog_file:"D:\桌面\rdp.pem"" -T fields -e frame.time -e rdp.fastpath.scancode.keycode -e rdp.fastpath.scancode.release > "D:\桌面\keyboard_data.txt"

#注意路径一定要写对

image-20241130180007898

image-20241130180052261

image-20241130181447525

处理一下,不要时间

image-20241130182051467

成功拿到

最后的答案就是7z的密码是之前windows的密码加上这一串,也就是babygirl2339347013182

花了很久才复现了这道题,只能说菜就多练吧。

环境一直是最烦的,哭了😣😣😣

参考链接👇🏻

2024 强网杯 谍影重重5.0 超详解 - 先知社区

强网杯2024 Writeup - 星盟安全团队

SMB Decryption - TryHackMe :: MWLab — Ladislav’s Malware Lab

2024强网杯-谍影重重5.0_2024强网杯wp-CSDN博客

Analyzing captured RDP sessions | haxor.no

工具安装

RDPY:一款功能强大的RDP远程桌面协议实现工具 - FreeBuf网络安全行业门户

pyrdp/pyrdp/convert at main · GoSecure/pyrdp