Список тегов:
#event - информация по олимпиадам/сходкам/конференциям
#writeup - разбор ctf задания
#ctf - все, что связано с ctf (задания, сходки, полезная информация)
#reverse - реверс инжиниринг
#admin - Linux/Windows
#pwn - бинарная эксплуатация
#crypto - криптография
#forensics - форенсика
#web - веб
#practice - площадка для тренировки, игра для прокачки навыков
#event - информация по олимпиадам/сходкам/конференциям
#writeup - разбор ctf задания
#ctf - все, что связано с ctf (задания, сходки, полезная информация)
#reverse - реверс инжиниринг
#admin - Linux/Windows
#pwn - бинарная эксплуатация
#crypto - криптография
#forensics - форенсика
#web - веб
#practice - площадка для тренировки, игра для прокачки навыков
#pwn #practice
Вот кое что посложнее и поинтереснее.
http://www.pwnadventure.com/
http://liveoverflow.com/pwn3/index.html
Вот кое что посложнее и поинтереснее.
http://www.pwnadventure.com/
http://liveoverflow.com/pwn3/index.html
Pwnadventure
Pwn Adventure 3: Pwnie Island
Pwn Adventure 3: Pwnie Island is a limited-release, first-person MMORPG that is,
by design, vulnerable to exploits. It is intended to showcase common game
design and programming…
by design, vulnerable to exploits. It is intended to showcase common game
design and programming…
Удобный сервис для перевода Си -кода в ассемблер с поддержкой большого количества компиляторов и архитектур.
https://godbolt.org/
#reverse #pwn
https://godbolt.org/
#reverse #pwn
godbolt.org
Compiler Explorer
Compiler Explorer is an interactive online compiler which shows the assembly output of compiled C++, Rust, Go (and many more) code.
PWNTOOLS - часть 1
pwntools - это фреймворк и библиотека на python, созданные для удобной работы с сокетами, создания PoC и решения заданий категории pwn. Является очень полезным инструментом по автоматизации и написании эксплоитов. Хотелось бы немного остановиться на его возможностях.
Сам фреймворк опубликован на гитхаб (https://github.com/Gallopsled/pwntools) и имеет документацию (http://docs.pwntools.com/en/latest/) - которая не всегда является полной, иногда приходится читать комментарии в коде и передаваемые в функцию параметры.
=== Установка ===
Ставится просто. С недавних пор стабильно работает на третьем питоне. На windows тоже ставится, но не всегда работает корректно.
pwntools - это фреймворк и библиотека на python, созданные для удобной работы с сокетами, создания PoC и решения заданий категории pwn. Является очень полезным инструментом по автоматизации и написании эксплоитов. Хотелось бы немного остановиться на его возможностях.
Сам фреймворк опубликован на гитхаб (https://github.com/Gallopsled/pwntools) и имеет документацию (http://docs.pwntools.com/en/latest/) - которая не всегда является полной, иногда приходится читать комментарии в коде и передаваемые в функцию параметры.
=== Установка ===
Ставится просто. С недавних пор стабильно работает на третьем питоне. На windows тоже ставится, но не всегда работает корректно.
pip3 install pwntools#pwn #pwntools
GitHub
GitHub - Gallopsled/pwntools: CTF framework and exploit development library
CTF framework and exploit development library. Contribute to Gallopsled/pwntools development by creating an account on GitHub.
PWNTOOLS - часть 2
Кроме, как по мне, основного назначения в виде библиотеки на python имеет достаточно интересные утилиты.
=== Консольные утилиты ===
- cyclic
Это генератор паттернов, т.е. специально сформированных строк, по части которой можно определить смещение до этого куска. Обычно использую в следующей связке - вначале в эксплоите использую функцию
- template
Данная команда генерирует шаблон для эксплоита. Раньше всегда носил с собой немного прокачанный файлик на все случаи жизни и менял только несколько параметров. Недавно догадался, что можно поменять файл в самой библиотеке. У меня он лежит здесь ->
Кроме, как по мне, основного назначения в виде библиотеки на python имеет достаточно интересные утилиты.
=== Консольные утилиты ===
PWN :: ~ » pwn -hОписание каждого говорит за себя, но мне пригождалось использовать пока два - cyclic и template.
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
Это генератор паттернов, т.е. специально сформированных строк, по части которой можно определить смещение до этого куска. Обычно использую в следующей связке - вначале в эксплоите использую функцию
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
=== Команды для запуска эксплоита ===
После того, как шаблон эксплоита сгенерирован, а вы написали необходимый для общения с программой код, могут возникнуть вопросы по его отладке. По дефолту существуют следующие аргументы, которые можно передать эксплоиту, например
- LOCAL - запускается ваш локальный бинарник, который вы указали при создании шаблона и который у вас лежит в той же директории
- LOCAL GDB - запускается отладка через GDB. При этом весь описанный в эксплоите процесс общения остается - ваш скрипт будет ждать, пока программа отправит данные или когда будет готова получить их. При этом вы можете спокойно отлаживать свою программу до нужного момента, а ваш эксплоит будет посылать/получать данные только при переходе на функции i/o.
- DEBUG - показывает в консоли все отправленные/полученные данные. Т.е. нет необходимости добавлять лишние принты в программу, а когда нужно отследить что приходит/уходит - запустить с DEBUG. Эквивалентно написанию в коде эксплоита строки
- SILENT - наоборот запускает программу с минимальным количеством вывода на экран. Эквивалентно написанию в коде эксплоита строки
Остальные параметры можно задать самому, как это сделал @mrvos в своем образе. Так он добавил доп. параметры, по которым будет запускаться отладка через QIRA, EDB и IDA Pro.
#pwn #pwntools
=== Команды для запуска эксплоита ===
После того, как шаблон эксплоита сгенерирован, а вы написали необходимый для общения с программой код, могут возникнуть вопросы по его отладке. По дефолту существуют следующие аргументы, которые можно передать эксплоиту, например
./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) в дизассемблере, посмотреть адрес интересующей функи, а потом при необходимости считать каждый раз выражение вида 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 #pwntoolsPWNTOOLS - часть 5
=== Шеллкодинг ===
pwntools имеет встроенный компилятор и генератор шеллкодов. Для этого имеется модуль shellcraft и asm. Далее приведены примеры использования. Не забудьте указать контекст для необходимой архитектуры! -
#pwn #pwntools
=== Шеллкодинг ===
pwntools имеет встроенный компилятор и генератор шеллкодов. Для этого имеется модуль shellcraft и asm. Далее приведены примеры использования. Не забудьте указать контекст для необходимой архитектуры! -
context.update(arch='amd64')
1) Запускаем указанный бинарный файл:# Генерируем shellcode - валидный код на асме2) Вызываем /bin/sh
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)
shellcode = shellcraft.sh()3) Выводим содержимое файла
sc = asm(shellcode)
shellcode = shellcraft.cat(b'some_file')и многое, многое другое
sc = asm(shellcode)
#pwn #pwntools
PWNTOOLS - часть 6
=== Эксплуатируем форматные строки ===
Для эксплуатации форматных строк в pwntools существует множество специальных функций, однако самыми полезными оказались две, ИМХО.
1) Итак, начнем с flat - упаковщика для ваших нагрузок. Его прелесть заключается в том, что вы можете указать различные адреса, по которым вы хотите разместить свои данные, а пустоты между ними он сам заполнит через cyclic.
Давайте лучше посмотрим на примере:
Но причем здесь форматные строки? C flat удобно формировать нагрузку для перезаписи через %n. Вот вам пример
Запишем по адресу 0x11223344 число 0xaabbccdd:
2) Также у pwntools есть встроенная функция для генерации форматной строки на перезапись:
Пример записи 0xaabbccdd по адресу 0x11223344 (допустим, контролируем 6й аргумент):
a)
Таким образом, pwntools позволяет нам облегчить эксплуатацию форматной строки, делая жизнь пывнера чуточку проще =)
#pwn #pwntools
=== Эксплуатируем форматные строки ===
Для эксплуатации форматных строк в 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
- количество байт, уже напечатанных printfwrite_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
Отлаживаем кирой (QIRA) эксплоит с запоминанием предыдущих трасс
1. Вешаем бинарь на сокет кирой:
Это действие повесит ваш бинарь на
2. Теперь правим свой темплейт эксплоита (
3. После этого можем запускать наши сплоиты как
В конечном итоге имеем возможность запускать сплоит с сохранением трасс в кире, двигаемся влево-вправо по трассам стрелочками (<—, —>)
#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