Как запустить шеллкод на ядре Linux 5.8+?

Если вам просто нужно получить MAC-адреса для системы и подключиться к интерфейсу, мы можем сделать это с помощью Bash и передать его программе C. Если мы посмотрим в /sys/class/net/*/, то увидим, что имя интерфейса содержится в файле uevent, а MAC-адрес находится в файле address; поэтому мы можем объединить эти два файла вместе для каждого интерфейса. Примечание. :Мой bash не самый красивый, возможно, есть лучший способ сделать это.

[user@headdesk eth0]$ cat /sys/class/net/*/uevent /sys/class/net/*/address | grep -v IFINDEX | column | sed 's/INTERFACE=//'
eth0            fa:16:3e:ac:48:74
lo              00:00:00:00:00:00
1
18.01.2021, 07:57
1 ответ

Поскольку вы запрашиваете исполняемый стек, размещение вашего кода в нем сделает его исполняемым:

int main() {
    const char shellcode[] = "\x48\x31\xc0\xb0\x3c\x48\x31\xff\x48\x83\xf7\x01\x0f\x05";
    (*(void(*)())shellcode)();
}

Кроме того, вы можете изменить защиту страницы на странице (с ), содержащей шелл-код:

#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>

const char shellcode[] = "\x48\x31\xc0\xb0\x3c\x48\x31\xff\x48\x83\xf7\x01\x0f\x05";

int main() {
  long page_size = sysconf(_SC_PAGESIZE);
  void *page_start = (void *) ((long) shellcode & -page_size);
  if (mprotect(page_start, page_size * 2, PROT_READ | PROT_EXEC)) {
    perror("mprotect");
  } else {
    (*(void(*)())shellcode)();
  }
}

Весь смысл изменений, подобных найденному вами , заключается в исправлении целых классов уязвимостей. Даже с описанным выше подходом вы не сможете внедрить код в запущенный процесс и выполнить его, если процесс в какой-то степени не «взаимодействует» (, запрашивая исполняемые стеки ).

3
18.03.2021, 22:36

Теги

Похожие вопросы