附件:attach.zip
一道流量分析题,一共三个问:
- 找到 flag
- 找到 admin 的密码
- 找到 iv 值
前面的大部分流量是无意义的目录/文件扫描,关键是后面的 WinRM 加密流量
GitHub 上有现成的 winrm 流量解密脚本,需要 admin 的密码或者 NTLM Hash
设置过滤器:
data-text-lines and http.response.code == 200
找到访问 /mz.log 的响应内容(像是 mimikatz 抓密码的日志?),里面有 admin 的 NTLM Hash,可以用工具解出来第二问答案是 admin
用这个 hash 解密 winrm 流量得到一组密文明文和一段 AES 加密脚本,注意如果直接解密整个流量包可能出错,可以先过滤 winrm 的流量然后导出特定分组
import base64
from Crypto.Cipher import AES
def pkcs7padding(text):
bs = AES.block_size # 16
length = len(text)
bytes_length = len(bytes(text, encoding='utf-8'))
padding_size = length if(bytes_length == length) else bytes_length
padding = bs - padding_size % bs
padding_text = chr(padding) * padding
return text + padding_text
def pkcs7unpadding(text):
try:
length = len(text)
unpadding = ord(text[length-1])
return text[0:length-unpadding]
except Exception as e:
pass
def aes_encode(key, content):
import iv
key_bytes = bytes(key, encoding='utf-8')
iv = iv.iv
cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
content_padding = pkcs7padding(content)
aes_encode_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
result = str(base64.b64encode(aes_encode_bytes), encoding='utf-8')
return result
key = '99754106633f94d3'
data = ''
mi = aes_encode(key, data)
print(mi)
Code Snippet 1:
encrypt.py
c1:cExAFo22QSzk/IGDRZ06zEB3QInt/1vCOB+Hv/iwpa4=
m1:HelloworldTestRemoteLoginwin
c2:Yq8RtQ7mGXDTMWCxCKwJUlAmvLQFIxBh0RiOprrIa0/Wo8/4uOtjOwVrwCSyFUBb
Code Snippet 1:
encrypt.txt
现在我们有一组对应的明文密文,AES 使用的是 CBC 加密模式,而且拿到了 key,足以反推 iv 的值
- 随便构造一个 iv,解密密文 c1 得到 fake_text
- 将 fake_text、iv 以及已知的明文 m1(先 padding)逐个字节异或,得到的就是真正的 iv
修改一下 encrypt.py 解出 iv,回答第三问
...
key = "99754106633f94d3"
data = "HelloworldTestRemoteLoginwin"
fake_iv = "a" * 16
m = aes_decode(key, "cExAFo22QSzk/IGDRZ06zEB3QInt/1vCOB+Hv/iwpa4=", fake_iv)
iv = ""
for i in range(16):
iv += chr(m[i] ^ ord(fake_iv[i]) ^ ord(pkcs7padding(data)[i]))
print(iv)
# 3be1a0e448f0c838
然后用真正的 iv 解密密文 c2 即可得到 flag