-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
74 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
#!/bin/bash | ||
|
||
dd if=/dev/urandom of=/challenge/.key bs=16 count=1 | ||
chmod 600 /challenge/.key |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
You're not going to believe this, but... a Padding Oracle Attack doesn't just let you decrypt arbitrary messages: it lets you _encrypt_ arbitrary data as well! | ||
This sounds too wild to be true, but it is. | ||
Think about it: you demonstrated the ability to modify bytes in a block by messing with the previous block's ciphertext. | ||
Unfortunately, this will make the previous block decrypt to garbage. | ||
But is that so bad? | ||
You can use a padding oracle attack to recover the exact values of this garbage, and mess with the block before that to fix this garbage plaintext to be valid data! | ||
Keep going, and you can craft fully controlled, arbitrarily long messages, all without knowing the key! | ||
When you get to the IV, just treat it as a ciphertext block (e.g., plop a fake IV in front of it and decrypt it as usual) and keep going! | ||
Incredible. | ||
|
||
Now, you have the knowledge you need to get the flag for this challenge. | ||
Go forth and forge your message! | ||
|
||
---- | ||
**FUN FACT:** | ||
Though the Padding Oracle Attack was [discovered](https://www.iacr.org/archive/eurocrypt2002/23320530/cbc02_e02d.pdf) in 2002, it wasn't until 2010 that researchers [figured out this arbitrary encryption ability](https://static.usenix.org/events/woot10/tech/full_papers/Rizzo.pdf). | ||
Imagine how vulnerable the web was for those 8 years! | ||
Unfortunately, padding oracle attacks are _still_ a problem. | ||
Padding Oracle vulnerabilities come up every few months in web infrastructure, with the latest (as of time of writing) [just a few weeks ago](https://www.cvedetails.com/cve/CVE-2024-45384/)! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
#!/opt/pwn.college/python | ||
|
||
import os | ||
|
||
from base64 import b64encode | ||
from Crypto.Cipher import AES | ||
from Crypto.Util.Padding import pad | ||
from Crypto.Random import get_random_bytes | ||
|
||
key = open("/challenge/.key", "rb").read() | ||
cipher = AES.new(key=key, mode=AES.MODE_CBC) | ||
ciphertext = cipher.iv + cipher.encrypt(pad(b"sleep", cipher.block_size)) | ||
|
||
print(f"TASK: {b64encode(ciphertext).decode()}") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
#!/opt/pwn.college/python | ||
|
||
from base64 import b64decode | ||
from Crypto.Cipher import AES | ||
from Crypto.Util.Padding import unpad | ||
from Crypto.Random import get_random_bytes | ||
|
||
import time | ||
import sys | ||
|
||
key = open("/challenge/.key", "rb").read() | ||
|
||
while line := sys.stdin.readline(): | ||
if not line.startswith("TASK: "): | ||
continue | ||
data = b64decode(line.split()[1]) | ||
iv, ciphertext = data[:16], data[16:] | ||
|
||
cipher = AES.new(key=key, mode=AES.MODE_CBC, iv=iv) | ||
plaintext = unpad(cipher.decrypt(ciphertext), cipher.block_size).decode('latin1') | ||
|
||
if plaintext == "sleep": | ||
print("Sleeping!") | ||
time.sleep(1) | ||
elif plaintext == "please give me the flag, kind worker process!": | ||
print("Victory! Your flag:") | ||
print(open("/flag").read()) | ||
else: | ||
print("Unknown command!") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters