Введение
В этой лабораторной работе вы узнаете, как злоумышленники обеспечивают постоянный доступ и уклоняются от базовых средств обнаружения. В то время как автоматизированные фреймворки, такие как Metasploit, используют Meterpreter для беспрепятственной миграции полезных нагрузок в стабильные процессы Windows (например, explorer.exe или svchost), в средах Linux требуется иной подход.
Общий принцип не зависит от платформы: злоумышленники предпочитают скрываться внутри долгоживущих, выглядящих обыденно контекстов выполнения, а не в нестабильных или явно подозрительных.
В Linux злоумышленники достигают тех же целей уклонения, выявляя стабильные системные процессы и используя «подмену имени процесса» (Process Name Spoofing) для маскировки своих вредоносных нагрузок. Вы научитесь проводить разведку запущенных процессов, определять доверенные системные компоненты и выполнять полезную нагрузку, которая маскируется под легитимный поток ядра для обхода обнаружения.
Это отчасти вопрос стабильности, а отчасти — человеческого восприятия. Защитники, просматривающие длинные списки процессов, с большей вероятностью пропустят имена, которые сливаются с ожидаемым системным шумом.
Просмотр запущенных процессов (ps)
На этом этапе вы узнаете, как перечислять и анализировать запущенные процессы в системе Linux. Злоумышленники используют эту фазу разведки, чтобы понять окружение и найти легитимные процессы, под которые можно мимикрировать.
Прежде всего, важна инвентаризация. Вы не сможете выбрать правдоподобный процесс для маскировки, если не знаете, как выглядит «норма» на хосте.
Команда ps (process status) — это стандартный инструмент для просмотра активных процессов. Чтобы получить полное представление обо всех процессах, запущенных в системе, можно использовать флаги aux.
Выполните следующую команду в терминале, чтобы просмотреть запущенные процессы:
ps aux | head -n 15
Флаг a показывает процессы всех пользователей, u выводит информацию в удобном для пользователя формате (включая использование CPU и памяти), а x отображает процессы, не привязанные к терминалу. Мы перенаправляем вывод в head -n 15, чтобы отобразить только первые 15 строк для удобства чтения.
Вы должны увидеть вывод, похожий на этот:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 167008 11468 ? Ss 10:00 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S 10:00 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 10:00 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 10:00 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I< 10:00 0:00 [slub_flushwq]
root 6 0.0 0.0 0 0 ? I< 10:00 0:00 [netns]
root 8 0.0 0.0 0 0 ? I< 10:00 0:00 [kworker/0:0H-events_highpri]
root 10 0.0 0.0 0 0 ? I< 10:00 0:00 [mm_percpu_wq]
root 11 0.0 0.0 0 0 ? S 10:00 0:00 [rcu_tasks_rude_]
root 12 0.0 0.0 0 0 ? S 10:00 0:00 [rcu_tasks_trace]
root 13 0.0 0.0 0 0 ? S 10:00 0:00 [ksoftirqd/0]
root 14 0.0 0.0 0 0 ? I 10:00 0:00 [rcu_sched]
root 15 0.0 0.0 0 0 ? S 10:00 0:00 [migration/0]
root 16 0.0 0.0 0 0 ? S 10:00 0:00 [idle_inject/0]
Обратите внимание на процессы в квадратных скобках, такие как [kthreadd] или [kworker/0:0H-events_highpri]. Это потоки ядра. Они крайне стабильны, работают непрерывно и редко проверяются системными администраторами, что делает их идеальными кандидатами для уклонения.
Определение стабильных целевых процессов
На этом этапе вы определите конкретные процессы, которые идеально подходят для уклонения. Стабильный процесс — это обычно системный демон или фоновая служба, которая запускается автоматически и работает в течение длительного времени.
Если полезная нагрузка злоумышленника аварийно завершается, он теряет доступ. Маскируя свою нагрузку под стабильный процесс, он избегает подозрений. В некоторых средах Linux записи kworker легко заметить, и они служат удобным шаблоном для именования, так как их названия выглядят технически обоснованно и сливаются с длинными списками процессов.
Давайте проверим, есть ли в этой среде имена в стиле kworker. Выполните следующую команду:
ps -ef | grep kworker | head -n 5
Флаг -e выбирает все процессы, а -f выводит полный формат списка. Мы используем grep для фильтрации только тех строк, которые содержат «kworker».
Если в среде присутствуют записи рабочих потоков ядра, вы можете увидеть вывод, похожий на этот:
root 8 2 0 10:00 ? 00:00:00 [kworker/0:0H-events_highpri]
root 25 2 0 10:00 ? 00:00:00 [kworker/1:0H-events_highpri]
root 31 2 0 10:00 ? 00:00:00 [kworker/2:0H-events_highpri]
root 37 2 0 10:00 ? 00:00:00 [kworker/3:0H-events_highpri]
root 43 2 0 10:00 ? 00:00:00 [kworker/0:1-events]
Если вы видите только команду grep и никаких реальных записей kworker, это допустимо для данной лабораторной среды. Мы все равно будем использовать привычный стиль именования [kworker/X:Y] на следующем этапе, так как цель — понять, как работает подмена имени процесса, а не полагаться на видимость конкретного потока ядра.
Миграция в стабильный процесс
На этом этапе вы сымитируете миграцию процесса, запустив долгоживущий процесс и подменив его имя.
В папке ~/project для вас подготовлена фиктивная полезная нагрузка malicious_payload.sh, но здесь есть важная деталь Linux. Когда вы запускаете shell-скрипт, в списке процессов обычно отображается интерпретатор, например /bin/bash /home/labex/project/malicious_payload.sh. Такое поведение затрудняет четкое наблюдение за подмененным именем в данной среде.
Чтобы упростить проверку подмены, мы будем использовать простую долгоживущую команду. Концепция безопасности остается прежней: мы даем процессу вводящее в заблуждение имя, чтобы он сливался со списком процессов.
Выполните следующую команду, чтобы запустить замаскированный фоновый процесс:
bash -c 'exec -a "[kworker/u4:2]" sleep 600' &
Часть bash -c запускает новый процесс Bash и выполняет следующую за ней строку команды. exec -a "[kworker/u4:2]" заменяет этот процесс Bash на sleep 600, но указывает операционной системе отображать имя процесса как [kworker/u4:2]. Команда sleep 600 поддерживает процесс активным достаточно долго, чтобы вы могли его проверить. Символ & в конце запускает процесс в фоновом режиме.
Вы увидите небольшой вывод с указанием номера фонового задания и идентификатора процесса (PID), например:
[1] 1337
Ваш замаскированный процесс теперь работает в фоновом режиме и должен отображаться под подмененным именем.
Проверка персистентности и доступа
На этом заключительном этапе вы убедитесь, что ваш замаскированный процесс виден под подмененным именем, а затем завершите его работу.
Найдите процесс по подмененному имени, которое вы назначили на предыдущем этапе:
ps aux | grep "kworker/u4:2"
Вы должны увидеть вывод, похожий на этот:
labex 1337 0.0 0.0 7008 1536 pts/0 S 10:15 0:00 [kworker/u4:2]
labex 1345 0.0 0.0 6480 2272 pts/0 S+ 10:16 0:00 grep --color=auto kworker/u4:2
В этой среде замаскированный процесс — это лишь демонстрация, созданная с помощью sleep, а не настоящий рабочий поток ядра. Важно то, что видимое имя в списке процессов теперь выглядит как доверенный системный компонент.
Наконец, очистите демонстрационный процесс, завершив работу командной строки, содержащей подмененное имя. Выполните следующую команду:
pkill -f "kworker/u4:2"
Вы можете еще раз выполнить ps aux | grep "kworker/u4:2", чтобы убедиться, что замаскированный процесс был успешно завершен.
Резюме
Поздравляем! Вы успешно завершили лабораторную работу по миграции процессов и методам уклонения.
Вы узнали, как злоумышленники анализируют запущенные процессы для выявления стабильных, доверенных системных компонентов. Вы также научились использовать подмену имени процесса (exec -a) для маскировки вредоносной нагрузки под легитимный поток ядра, эффективно имитируя методы уклонения, используемые продвинутыми фреймворками, такими как Meterpreter. Наконец, вы проверили скрытность подмененного процесса и узнали, как правильно завершить его работу. Эти навыки необходимы для понимания того, как постоянные угрозы скрываются в среде Linux.



