Logo

Sanity - sanity - 5 points

Join our discord: https://discord.gg/dwYNJ7M

On se connecte et dans le channel #Rules on trouve le flag:

Sanity

Web - Widthless - 50 points (incomplet)

Welcome to web! Let's start off with something kinda funky :)  http://web.chal.csaw.io:5018

Widthless

root@Host-001:~/Bureau/OTA/csaw_quals_2020# wget http://web.chal.csaw.io:5018/
--2020-09-12 07:48:30--  http://web.chal.csaw.io:5018/
Résolution de web.chal.csaw.io (web.chal.csaw.io)… 216.165.2.41
Connexion à web.chal.csaw.io (web.chal.csaw.io)|216.165.2.41|:5018… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 5858 (5,7K) [text/html]
Sauvegarde en : « index.html »

index.html          100%[===================>]   5,72K  --.-KB/s    ds 0,002s  

2020-09-12 07:48:30 (3,24 MB/s) — « index.html » sauvegardé [5858/5858]

root@Host-001:~/Bureau/OTA/csaw_quals_2020# xxd index.html 

En analysant l’hexadecimal, on trouve des caractères ‘invisibles’:

Widthless

Ces caractères sont également visibles si on ouvre index.html avec Vim:

Widthless

On trouve aussi un commentaire ‘zwsp is fun’. Voir https://en.wikipedia.org/wiki/Zero-width_space

Widthless

Ref: https://rawsec.ml/en/HackIT-2018-write-ups/#1-get-going-misc

On va utiliser: https://github.com/offdev/zwsp-steg-js

javascript decode.js:

Widthless

Warning:Les caractères unicode ne sont pas visibles avec cat

root@Host-001:~/Bureau/OTA/csaw_quals_2020# cat decode.js
const ZwspSteg = require('zwsp-steg');

let decoded = ZwspSteg.decode('</html>​​​​‎‏‎​​​');

console.log(decoded);
 
root@Host-001:~/Bureau/OTA/csaw_quals_2020# node decode.js 
b'YWxtMHN0XzJfM3o='

root@Host-001:~/Bureau/OTA/csaw_quals_2020# echo YWxtMHN0XzJfM3o= | base64 -d
alm0st_2_3z

Je pensais que c’était le flag (pas pu vérifier, un membre de mon équipe avait déjà validé le chall…), en fait non :( Voir ici pour la suite.

Crypto - Perfect Secrecy - 50 points

Alice sent over a couple of images  with sensitive information to Bob, encrypted with a pre-shared key. It  is the most secure encryption scheme, theoretically...

2 images image1.png et image2.png sont téléchargeables.

Image 1:

Xor

Image 2:

Xor

Ref:

Xor image1 et image2:

root@Host-001:~/Bureau/OTA/csaw_quals_2020# convert image1.png image2.png -fx "(((255*u)&(255*(1-v)))|((255*(1-u))&(255*v)))/255" C.png
convert-im6.q16: iCCP: profile 'ICC Profile': 'RGB ': RGB color space not permitted on grayscale PNG `image1.png' @ warning/png.c/MagickPNGWarningHandler/1667.
root@Host-001:~/Bureau/OTA/csaw_quals_2020#

On ouvre C.png:

Xor

root@Host-001:~/Bureau/OTA/csaw_quals_2020# echo 'ZmxhZ3swbjNfdDFtM19QQGQhfQ==' | base64 -d
flag{0n3_t1m3_P@d!}root@Host-001:~/Bureau/OTA/csaw_quals_2020# 

Crypto - Modus_Operandi - 100 points (non résolu)

Can't play CSAW without your favorite block cipher!
 nc crypto.chal.csaw.io 5001

Trouver si du CBC ou du ECB est utilisé … ressemble à cryptopals set 2 - 11

Modus

Script: modus_operandi.py

root@Host-001:~/Bureau/OTA/csaw_quals_2020# cat modus_operandi.py 
from pwn import *

#Ref: https://github.com/JesseEmond/matasano-cryptopals/blob/master/src/aes.py
#Ref: https://raywang.tech/2017/03/07/set2_writeup/

def get_blocks(bytes_, blocksize=16):
    return [bytes_[i:i+blocksize] for i in range(0, len(bytes_), blocksize)]
    
def cbc_or_ecb(rep):
	cipher = str(rep)
	cipher = cipher.replace('Ciphertext is:  ','')
	cipher = cipher.replace('ECB or CBC?','')
	#print cipher
	#Ref: https://github.com/JesseEmond/matasano-cryptopals/blob/master/src/set_2/11.py

	blocks = get_blocks(str.encode(cipher))

	unique_blocks = len(set(blocks))

	guess = "ECB" if unique_blocks != len(blocks) else "CBC"

	#print guess
	return guess

def send_payload():
    payload = 'A'*199
    r.sendline(payload)
    rep = r.recv()
    print rep
    print cbc_or_ecb(rep)
    r.sendline(cbc_or_ecb(rep))
    #print r.recv()
    resp = r.recv()
    print 'resp send_payload ' + resp
    #return resp
    
r = remote('crypto.chal.csaw.io', 5001)

print r.recv()

for i in range(200):
	print '======== Essai ' + str(i) + ' ========'
	send_payload()
root@Host-001:~/Bureau/OTA/csaw_quals_2020# 

Je sais pas pourquoi ça plante à la 177e iteration….

Modus

Réponse:

Il fallait itérer 176 fois et créer une chaine avec 0 si ECB et 1 si CBC pour obtenir du binaire. Voir par exemple ce write-up

Poursuivez avec :

- Oneliner Shells

- HTB - Write Up Machine

CC-BY

This work is licensed under a Creative Commons Attribution 4.0 International License.