Как убить процессы, если не превышены права root и предел nproc?

Это помогает в debian gsettings set org.gnome.settings-daemon.plugins.rfkill active false

1
06.05.2018, 21:06
3 ответа

Если у вас есть учетные данные другого пользователя и учетные данные целевого пользователя можно использовать для изменения файловой системы, вы можете скомпилировать следующую программу, установите бит s и использовать учетные данные другого пользователя для его выполнения.

ПРИМЕЧАНИЕ: исполняемый файл должен принадлежать целевому пользователю, чтобы иметь возможность установить seteuid на uid целевого пользователя.

Первым аргументом программы является uid целевого пользователя.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <errno.h>

int main(int argc, char**argv) {
    if(seteuid(atoi(argv[1])) != 0) {
        printf("seteuid failed... %d", errno);
    }
    if(kill(-1, SIGTERM) != 0) {
    printf("kill failed...%d", errno);
    }

    return 0;
}
0
27.01.2020, 23:46

Когда я вижу теги nproc и "ulimit", я добавляю 2 балла к этому механизму ulimit:

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

Также имейте в виду, что ulimit устанавливается PAM ( grep -r pam_limits.so /etc/pam.d/), поэтому, если у вас есть метод / программа аутентификации, которая не используйте этот модуль PAM, вы можете избежать этого ulimit и сгенерировать kill.

Помимо этих двух решений, которые требуют действий до возникновения проблемы, действительно нет способа отправить сигнал существующей программе без правильного доступа (тот же пользователь, root, setuid или возможность CAP_KILL ).

1
27.01.2020, 23:46

Если nproc достигнуто, ядро не позволит другим процессам работать с учетными данными этого пользователя, как вы узнали. Это означает, что нет удаленного сеанса по SSH, нет su или sudo, даже программы, установленной для их учетной записи.

Это оставляет вас либо с корнем, либо с пользователем, если у него все еще есть рабочий интерактивный сеанс. Поскольку вы исключили root, вам придется надеяться, что у вашего пользователя все еще запущена оболочка. Если это так, в их оболочку должно быть встроено достаточно функциональности, чтобы убить некоторые из оскорбительных процессов. Вам нужно будет использовать встроенные оболочки для итерации через /proc.

Например, если бы я хотел убить все свои оболочки bash, я мог бы сделать что-то вроде этого, в котором используются только встроенные оболочки Bash:

pushd /proc && for pid in *; do
    test "$pid" = "self" && continue        # skip /proc/self
    test -d "$pid" || continue              # skip if not a directory
    test -O "$pid" || continue              # skip if we don't own it
    read cmd < "${pid}/cmdline"
    case "$cmd" in
        *bash*) kill -9 $pid ;;             # or whatever you want to do to it
    esac
done && popd

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

  1. Если лот обработки запущен, расширение * в верхней части цикла может привести к строке, превышающей максимальную длину команды . Если вы столкнетесь с этим, вы можете сократить расширение подстановочного знака с несколькими запусками, используя 1*, 2*, {1..3}* или что-то в этом роде.

  2. /proc/${pid}/cmdline содержит список с разделителями NULL, из которых фактическая команда является лишь одним элементом. Я не знаю способа чистого разбора такой строки, используя только сборки Bash. Поскольку строки обычно завершаются значением NULL, read получит только первый элемент, который может быть или не быть именем команды. Альтернативным подходом было бы итерация по /proc/${pid}/stat или /proc/${pid}/status.

0
27.01.2020, 23:46

Теги

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