WebGoat全通关:A2-Cryptographic-Failures
Crypto Basics #
实验一:HTTP Basic Auth #
这种模式流行于 HTTP 的早期,密码和用户名只做了编码而未做加密
Authorization: Basic d2ViZ29hdDoxMjM0NTY=
webgoat:passw0rd
实验二:IBM WebSphere Application Server XOR encoding #
根据资料,XOR 的密钥始终是 ________________(长度和明文等长)
{xor}Oz4rPj0+LDovPiwsKDAtOw==
databasepassword
实验三:哈希 #
第一个哈希
21232F297A57A5A743894A0E4A801FC3
看长度是 MD5
hashcat -m 0 hash.txt /usr/share/wordlists/rockyou.txt
admin
第二个哈希
2BB80D537B1DA3E38BD30361AA855686BDE0EACD7162FEF6A25FE97BF527A25B
看长度是 SHA256
hashcat -m 1400 hash.txt /usr/share/wordlists/rockyou.txt
secret
实验四:从 PEM 文件提取 RSA 私钥并对 n 签名 #
HTTPS 的基本流程:
- 客户端向服务端请求它的证书
- 客户端依据本机安装的权威证书验证证书签名链,从而决定服务端是否可信
- 客户端从证书读取服务端的公钥
- 客户端生成一些用于对称加密密钥的随机值,用服务端的公钥加密并发送给服务端
- 两边根据约定的算法同步产生对称加密密钥
- 使用对称加密密钥加密 HTTP 报文进行通讯
签名三要素:数据、签名、证书
提取 RSA 密钥
from Crypto.PublicKey import RSA
with open('key.pem', 'r') as fp:
key = RSA.import_key(fp.read())
print(hex(key.n)[2:])
使用 RSA 签名
from Crypto.Hash import SHA256
from Crypto.Signature import pkcs1_15
message = hex(key.n)[2:]
signature = pkcs1_15.new(key).sign(SHA256.new(message.encode()))
print(base64.b64encode(signature).decode())
实验五:AES 加解密 #
场景:Linux 文件系统中某文件保存了密码
环境搭建:
docker run --rm --name test -d webgoat/assignments:findthesecret
docker exec -u root -it test /bin/bash
在 /root/default_secret 存了 AES-CBC 的密钥
ThisIsMySecretPassw0rdF0rY0u
echo "U2FsdGVkX199jgh5oANElFdtCxIEvdEvciLi+v+5loE+VCuy6Ii0b+5byb5DXp32RPmT02Ek1pf55ctQN+DHbwCPiVRfFQamDmbHBUpD7as=" | openssl enc -aes-256-cbc -d -a -kfile default_secret
Leaving passwords in docker images is not so secure