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 у исполня­емо­го фай­ла:

Опи­сан­ные далее при­меры помогут не толь­ко при зак­репле­нии на машине жер­твы, но и для выяв­ления фак­тов ком­про­мета­ции.

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

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

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

Шелл

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

Windows

Вот как это работа­ет в Windows:

Linux

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

Persistence Шелл

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

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

Windows

Linux

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

Сервисы

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

Для Windows соз­дание служ­бы пот­ребу­ет пра­ва адми­нис­тра­тора.

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

Со­дер­жимое фай­ла:

И запус­каем соз­данную служ­бу:

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

Persistence Сервисы

Задачи

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

Windows

Linux

  • Плю­сы: пережи­вает перезаг­рузку, управля­емый интервал запус­ка.
  • Ми­нус: нуж­ны пра­ва адми­нис­тра­тора/root.
Persistence Windows

In-memory

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

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

Windows

Linux

Внед­рить код мы можем не толь­ко в натив­ные про­цес­сы, но и в интер­пре­тиру­емые, нап­ример интер­пре­тато­ром Python:

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

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

Persistence память

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

Конфиги

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

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

Windows

Linux

Прос­тое и эффектив­ное внед­рение зак­ладки в Windows через RDP:

  • Плю­сы: труд­но обна­ружить анти­виру­сом, пережи­вает перезаг­рузку.
  • Ми­нусы: тре­бует пра­ва адми­нис­тра­тора/root, не под­ходит, если машина за NAT или фай­рво­лом.
Persistence rdp Windows

Особые приемы в Linux

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

LD_PRELOAD

В Linux для того, что­бы в каж­дый запус­каемый про­цесс под­гру­жал­ся нуж­ный нам код, мож­но исполь­зовать перемен­ную LD_PRELOAD:

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

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

rc.local

Один раз пос­ле перезаг­рузки мы можем выпол­нить коман­ды в rc.local.

  • Плюс: пережи­вает перезаг­рузку.
  • Ми­нусы: неуп­равля­емый интервал запус­ка, нуж­ны пра­ва root.

Особые приемы в Windows

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

Дебаггер

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

Как толь­ко victim запус­тит, а затем зак­роет каль­кулятор, ата­кующий при­мет reverse shell.

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

Persistence debug Windows

Gflags

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

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

Autoruns этот спо­соб не обна­ружи­вает, но вы можете про­верить вет­ку реес­тра:

WMI

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

AppInit

В Windows есть инте­рес­ный спо­соб внед­рения биб­лиотек в окон­ные при­ложе­ния с помощью AppInit (они дол­жны исполь­зовать user32.dll).

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

Lsass

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

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

Winlogon

Что­бы каж­дый раз, как кто‑то из поль­зовате­лей вхо­дит в сис­тему, откры­вал­ся шелл, мож­но исполь­зовать механизм Winlogon.

  • Плюс: пережи­вает перезаг­рузку.
  • Ми­нус: неуп­равля­емый интервал запус­ка.
Persistence Winlogon

Netsh

Ути­лита нас­трой­ки сети Netsh тоже поз­воля­ет под­гру­жать про­изволь­ную биб­лиоте­ку. Это откры­вает воз­можность орга­низо­вать через нее импро­визи­рован­ную авто­заг­рузку. Резуль­тат будет выг­лядеть безобид­но, так как пер­воначаль­но вызыва­ется сис­темный ком­понент Windows.

В ито­ге получа­ем такую цепоч­ку: autorun → netsh.exe → meter.dll.

При этом meter.dll будет скрыт от глаз поль­зовате­ля — он уви­дит лишь запуск легитим­ной Netsh, род­ной ком­понент Windows.

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

Office

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

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

Выводы

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

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

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

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

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

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