Red Cadets [Channel]
234 subscribers
14 photos
1 video
11 files
73 links
Новостной канал с IT/ctf/hack контентом команды Red Cadets
Download Telegram
Список тегов:
#event - информация по олимпиадам/сходкам/конференциям
#writeup - разбор ctf задания
#ctf - все, что связано с ctf (задания, сходки, полезная информация)
#reverse - реверс инжиниринг
#admin - Linux/Windows
#pwn - бинарная эксплуатация
#crypto - криптография
#forensics - форенсика
#web - веб
#practice - площадка для тренировки, игра для прокачки навыков
#pwn #practiсe

Тренировка по эксплуатации линукса и бинарных уязвимостей
https://exploit.education
Удобный сервис для перевода Си -кода в ассемблер с поддержкой большого количества компиляторов и архитектур.

https://godbolt.org/

#reverse #pwn
Как отобразить сегменты бинарника со смещениями и правами:

gdb $ vmmap

#pwn #gdb
#reverse #pwn

Золотая коллекция. Must have из арсенала пывно-реверсера
PWNTOOLS - часть 1

pwntools - это фреймворк и библиотека на python, созданные для удобной работы с сокетами, создания PoC и решения заданий категории pwn. Является очень полезным инструментом по автоматизации и написании эксплоитов. Хотелось бы немного остановиться на его возможностях.

Сам фреймворк опубликован на гитхаб (https://github.com/Gallopsled/pwntools) и имеет документацию (http://docs.pwntools.com/en/latest/) - которая не всегда является полной, иногда приходится читать комментарии в коде и передаваемые в функцию параметры.

=== Установка ===

Ставится просто. С недавних пор стабильно работает на третьем питоне. На windows тоже ставится, но не всегда работает корректно.

pip3 install pwntools

#pwn #pwntools
PWNTOOLS - часть 2

Кроме, как по мне, основного назначения в виде библиотеки на python имеет достаточно интересные утилиты.

=== Консольные утилиты ===

PWN :: ~ » pwn -h                                                                         
usage: pwn [-h]
{asm,checksec,constgrep,cyclic,debug,disasm,disablenx,elfdiff,elfpatch,errno,hex,phd,pwnstrip,scramble,shellcraft,template,unhex,update}

Pwntools Command-line Interface

positional arguments:
{asm,checksec,constgrep,cyclic,debug,disasm,disablenx,elfdiff,elfpatch,errno,hex,phd,pwnstrip,scramble,shellcraft,template,unhex,update}
asm Assemble shellcode into bytes
checksec Check binary security settings
constgrep Looking up constants from header files. Example: constgrep -c freebsd -m ^PROT_ '3 + 4'
cyclic Cyclic pattern creator/finder
debug Debug a binary in GDB
disasm Disassemble bytes into text format
disablenx Disable NX for an ELF binary
elfdiff Compare two ELF files
elfpatch Patch an ELF file
errno Prints out error messages
hex Hex-encodes data provided on the command line or stdin
phd Pwnlib HexDump
pwnstrip Strip binaries for CTF usage
scramble Shellcode encoder
shellcraft Microwave shellcode -- Easy, fast and delicious
template Generate an exploit template
unhex Decodes hex-encoded data provided on the command line or via stdin.
update Check for pwntools updates

optional arguments:
-h, --help show this help message and exit

Описание каждого говорит за себя, но мне пригождалось использовать пока два - cyclic и template.

- cyclic
Это генератор паттернов, т.е. специально сформированных строк, по части которой можно определить смещение до этого куска. Обычно использую в следующей связке - вначале в эксплоите использую функцию cyclic(длина строки), запускаю его на отладку (кому чем удобнее), далее в отладчике смотрю что попало в интересуемую переменную (например это может быть адрес возврата из функции), а затем передаю консольной утилите как pwn cyclic -l aaar. Далее получаю число байт ДО данного участка строки и после этого уже использую его в эксплоите

- template
Данная команда генерирует шаблон для эксплоита. Раньше всегда носил с собой немного прокачанный файлик на все случаи жизни и менял только несколько параметров. Недавно догадался, что можно поменять файл в самой библиотеке. У меня он лежит здесь -> /usr/local/lib/python3.8/dist-packages/pwnlib/data/templates/pwnup.mako

Генерируется следующим образом:
pwn template --host IP --port PORT ./binary > exp.py

#pwn #pwntools
PWNTOOLS - часть 3

=== Команды для запуска эксплоита ===

После того, как шаблон эксплоита сгенерирован, а вы написали необходимый для общения с программой код, могут возникнуть вопросы по его отладке. По дефолту существуют следующие аргументы, которые можно передать эксплоиту, например ./exp.py LOCAL GDB:

- LOCAL - запускается ваш локальный бинарник, который вы указали при создании шаблона и который у вас лежит в той же директории

- LOCAL GDB - запускается отладка через GDB. При этом весь описанный в эксплоите процесс общения остается - ваш скрипт будет ждать, пока программа отправит данные или когда будет готова получить их. При этом вы можете спокойно отлаживать свою программу до нужного момента, а ваш эксплоит будет посылать/получать данные только при переходе на функции i/o.

- DEBUG - показывает в консоли все отправленные/полученные данные. Т.е. нет необходимости добавлять лишние принты в программу, а когда нужно отследить что приходит/уходит - запустить с DEBUG. Эквивалентно написанию в коде эксплоита строки context.log_level = 'debug'.

- SILENT - наоборот запускает программу с минимальным количеством вывода на экран. Эквивалентно написанию в коде эксплоита строки context.log_level = 'error'.

Остальные параметры можно задать самому, как это сделал @mrvos в своем образе. Так он добавил доп. параметры, по которым будет запускаться отладка через QIRA, EDB и IDA Pro.

#pwn #pwntools
PWNTOOLS - часть 4

=== Получение адресов из бинарника ===

Да, можно самостоятельно открыть бинарный файл (libc) в дизассемблере, посмотреть адрес интересующей функи, а потом при необходимости считать каждый раз выражение вида BASE+LOCAL_ADDRESS. Но зачем, если есть pwntools?

Следующий фрагмент кода позволяет автоматом получать адреса с libc:
libc = ELF('./libc.so')
libc.address = LIBC_BASE # устанавливаем слитую базу LIBC
SYSTEM = libc.sym['system'] # адрес SYSTEM с учетом базы
BIN_SH = next(libc.search(b'/bin/sh')) # адрес /bin/sh с учетом базы

#pwn #pwntools
PWNTOOLS - часть 5

=== Шеллкодинг ===

pwntools
имеет встроенный компилятор и генератор шеллкодов. Для этого имеется модуль shellcraft и asm. Далее приведены примеры использования. Не забудьте указать контекст для необходимой архитектуры! - context.update(arch='amd64')

1) Запускаем указанный бинарный файл:
# Генерируем shellcode - валидный код на асме
shellcode = shellcraft.pushstr(b'/bin/some_binary')
shellcode += \
"""
mov rdi, rsp
mov rax, 59
xor rsi, rsi
xor rdx, rdx
syscall
"""
# Получаем скомпилированный набор байтов, который можно отправлять через io.send()
sc = asm(shellcode)

2) Вызываем /bin/sh
shellcode = shellcraft.sh()
sc = asm(shellcode)

3) Выводим содержимое файла
shellcode = shellcraft.cat(b'some_file')
sc = asm(shellcode)

и многое, многое другое

#pwn #pwntools
PWNTOOLS - часть 6

=== Эксплуатируем форматные строки ===

Для эксплуатации форматных строк в pwntools существует множество специальных функций, однако самыми полезными оказались две, ИМХО.

1) Итак, начнем с flat - упаковщика для ваших нагрузок. Его прелесть заключается в том, что вы можете указать различные адреса, по которым вы хотите разместить свои данные, а пустоты между ними он сам заполнит через cyclic.

Давайте лучше посмотрим на примере:
flat({
0: 'AAAAAAAA',
0x10: 1337,
0x25: [0xcafebabe, 0xbadec0de]
})

Получим ->
b'AAAAAAAAcaaadaaa9\x05\x00\x00faaagaaahaaaiaaaj\xbe\xba\xfe\xca\xde\xc0\xde\xba'

Что же здесь произошло? Flat просто разместил все строки, а также перевел числа в le по указанным смещениям, а в пустоты заполнил через cyclic.
Но причем здесь форматные строки? C flat удобно формировать нагрузку для перезаписи через %n. Вот вам пример

Запишем по адресу 0x11223344 число 0xaabbccdd:
flat({
0: '%{}c%10$hhn'.format(0xaa),
'%{}c%11$hhn'.format(0xbb-0xaa),
'%{}c%12$hhn'.format(0xcc-(0xbb-0xaa)-0xaa),
'%{}c%13$hhn'.format(0xdd-(xcc-(0xbb-0xaa)-0xaa)-(0xbb-0xaa)-0xaa),
0x40: [0x11223347, 0x11223346, 0x11223345, 0x11223344]
})

Получим ->
b'%170c%10$hhn%17c%11$hhn%17c%12$hhn%17c%13$hhnaaamaaanaaaoaaapaaaG3"\x11F3"\x11E3"\x11D3"\x11'

Так вы сформируете нагрузку для перезаписи числа по адресу, при этом сможете менять саму форматную строку и не бояться, что аргументы не будут лежать на местах 10, 11, 12 и 13.

2) Также у pwntools есть встроенная функция для генерации форматной строки на перезапись:
fmtstr_payload(offset, writes, numbwritten=0, write_size='byte') → str

offset - смещение первого контролируемого адреса
writes - словарь вида куда_пишем: что_пишем
numbwritten - количество байт, уже напечатанных printf
write_size - режим записи - по байту, по два, по четыре

Пример записи 0xaabbccdd по адресу 0x11223344 (допустим, контролируем 6й аргумент):
a)
fmtstr_payload(6, {0x11223344: 0xaabbccdd}, write_size='byte')
Получим ->
b'%170c%18$hhn%17c%19$hhn%17c%20$hhn%17c%21$hhnaaaG3"\x11F3"\x11E3"\x11D3"\x11'

b)
fmtstr_payload(6, {0x11223344: 0xaabbccdd}, write_size='short')
Получим ->
b'%43707c%13$hn%8738c%14$hnaaaF3"\x11D3"\x11'

c) А int он сформировать не смог -> получил отрицательный паддинг

Таким образом, pwntools позволяет нам облегчить эксплуатацию форматной строки, делая жизнь пывнера чуточку проще =)

#pwn #pwntools
Blind ROP.pdf
1.2 MB
Blind ROP

Пывним бинари без бинаря.

#pwn
Отлаживаем кирой (QIRA) эксплоит с запоминанием предыдущих трасс

1. Вешаем бинарь на сокет кирой:
qira -s ./binary

Это действие повесит ваш бинарь на 0.0.0.0:4000

2. Теперь правим свой темплейт эксплоита (pwn template > exp.py):
def remote(argv=[], *a, **kw):
'''Connect to the process on the remote host'''
if args.QIRA:
io = connect("localhost", 4000)
return io
io = connect(host, port)
if args.GDB:
gdb.attach(io, gdbscript=gdbscript)
return io


3. После этого можем запускать наши сплоиты как
./exp.py QIRA

В конечном итоге имеем возможность запускать сплоит с сохранением трасс в кире, двигаемся влево-вправо по трассам стрелочками (<—, —>)

#pwn #qira