Pull to refresh
«Лаборатория Касперского»
Ловим вирусы, исследуем угрозы, спасаем мир

Батники против эксплойтов

«Лаборатория Касперского» corporate blog
Доброго времени суток, многоуважаемый %USERNAME%. Меня зовут Голованов Сергей, и я всё еще являюсь ведущим вирусным аналитиком в «Лаборатории Касперского». Я понимаю, что название этого поста в корпоративном блоге компании может вызвать смех, грусть, а у некоторых даже эпилептический припадок, но дайте мне всё объяснить.

Я понимаю, что для всех батники выглядят как нечто очень простое и со времен AUTOEXEC.BAT уже практически забытое, в то же время эксплойты, если вы конечно не профессиональный исследователь уязвимостей, выглядят очень сложно и практически неправдоподобно, особенно для некоторых разработчиков. Но! В данном посте я постараюсь перевернуть эти представления и рассказать, что всё как будто наоборот. Батники чуть легче и сильнее по функционалу brainfuck'а, а эксплойты не страшнее сортировки пузырьком на basic'е.

image

(Осторожно! 3 МБ иллюстрированного потока сознания и куча скриптов)

Как я до этого дошел?


Мне тут на глаза попалась коробка с Windows 7 x64 c минимальными системными требованиями в 2 ГБ оперативной памяти! И я тут подумал, неужели во всех этих гигабайтах не найдётся пары килобайт кода, которые могли бы защитить пользователей от такой напасти, как эксплойты и Drive-by? Это бич всех ОС от MS уже лет пять! Должны быть там средства для хоть какой-то защиты? Но как их заюзать, да еще и стандартными средствами? С помощью батников. А как? Чтобы это понять, нужно прочитать эту простыню до конца. 8)

Теория


В упрощенной теории срабатывания эксплойтов всё выглядит так: «что-то где-то посмотрели, что-то где-то послали, что-то где-то запустилось». В реальной жизни это часто выглядит так: пользователь, гуляя по интернетам, попадает на честно взломанный сайт, где ему вместе с полезной информацией отдают или JavaScript или редирект на JavaScript, который, анализируя USER-AGENT, информацию о плагинах и т.д. выдаёт пользователю эксплойт, который точно у пользователя сработает. После этого на машину пользователя сгружается троянец, запускается, прописывается в системе и начинает делать свои грязные дела.

image

Завалявшаяся картинка от Google Anti-Malware Team о Drive-By для визуалов,
читающих на языке вероятного противника


(-СГ. Юля, подправь, пожалуйста, по смыслу следующее предложение, чтобы было понятно, и удали этот комментарий. -Редактор. По смыслу??? Да я после «выделяет себе память» уже ничего не понимаю. Сам подправь и удали этот комментарий.)

Если копнуть чуть глубже, то оказывается, что в таких эксплойт-паках часто (практически всегда) полезная нагрузка выделяет себе память в процессе жертвы, ищет нужные системные функции, сохраняет файл из интернета на локаль и делает CreateProcess или очень редко — ShellExecute, при этом проблемы повышения привилегий перекладываются на то, что скачали. Всё в принципе просто и понятно. И чего с этим делать? Хватать за пятую точку за слабые места! Во всей этой схеме есть одно уязвимое место: неважно, какое приложение пробили, главное — запустить файл с троянцем. Таким образом, получается, что нам просто-напросто надо сделать так, чтобы на компьютере пользователя лишние файлы не запускались, и сделать это нужно стандартными средствами.

Стандартные средства


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

image

Наглядная схема SRP (Software Restriction Policies) от Microsoft

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

Батник


Итого: наш батник должен создать пользователя со стандартными правами, затем модифицировать эти права для запуска только определённого ПО и, наконец, сделать это прозрачно и удобно для пользователя. Начнем-с…

1. Создать пользователя. Халява.

net user saferun_user Passw0rd /add

Имя пользователя и пароль здесь указаны только для примера, их надо будет обязательно разбавить %random%’ами, чтобы не оказалась, что у нас у всех пользователей батника одинаковые имена пользователей и пароли на машинах. А то получится этакий Backdoor.Bat.Hren.a, его еще детектировать придется…)))

2. Модифицировать права. Э… а вот тут уже есть проблемы

По-хорошему назначать права на исполнение нужно AppLocker'ом с помощью PowerShell’a, например так:

PS C:\> Get-ApplockerFileInformation -Directory 'C:\Program Files (x86)\Adobe\' -Recurse -FileType Exe | New-ApplockerPolicy -RuleType Publisher -User SafeRun_user -RuleNamePrefix Adobe -Optimize -Xml > Adoby.xml
PS C:\> Set-AppLockerPolicy –XmlPolicy Adoby.xml


Однако, вся эта хитрая хрень «is only available in Ultimate and Enterprise versions of Windows 7». Поэтому как альтернативу в Home версии Windows 7 можно использовать Parental Control (ссылка на форум — я не шучу), который хранит информацию о том, какие программы можно запускать в:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Parental Controls\Users\UID\App Restrictions

Значит, политики в топку, ибо неудобно, будем использовать ACL, тем более что, начиная с Vista’ы, появилась замечательная команда ICACLS. В принципе всё, что написано дальше, может быть спроецировано и на XP c помощью XCACLS, но по умолчанию такой команды в XP нет, и входит она только в пакет Resource Kit.

Итого, в Windows 7 cначала вынесем пользователя из группы по умолчанию, чтобы ограничить его возможности благодаря групповым разрешениям создавать файлы где попало:

net localgroup users saferun_user /delete

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

icacls %USERPROFILE% /deny saferun_user:(OI)(IO)(WDAC,WO,X)

(-Редактор. Ты бы еще здесь попросил меня чего-нибудь проверить и подправить. Комментарии не забудь убить.)

Параметры «(OI)(IO)» как бы говорят нам, что все файлы, находящиеся в указанной папке, наследуют права родителя, которые, собственно, Deny Execute. Проверяем, что выставленные права работают:

C:\Users\Golovanov>runas /user: saferun_user cmd.exe
Enter the password for saferun_user:
Attempting to start cmd.exe as user “saferun_user" ...
C:\Windows\system32> cd %temp%
C:\Users\saferun_user\AppData\Local\Temp>%windir%notepad.exe
C:\Users\saferun_user\AppData\Local\Temp>copy c:\windows\notepad.exe .
1 file(s) copied.
C:\Users\saferun_user\AppData\Local\Temp>.\notepad.exe
Access is denied.


Итого: Notepad.exe из папки Windows работает, а если его скопировать в папку TEMP и запустить, то ACCESS IS DENIED. Всё ОК. Идём дальше.

3. Удобство использования

Для удобства использования нам нужно обеспечить поддержку прозрачного запуска для максимального количества разнообразных браузеров под новым пользователем. Делать это предлагаю так:

1. Скопировать профайл браузера текущего пользователя к новому пользователю. Например, для Firefox’а так:

xcopy /E /I /C /Y /Q /H /R %APPDATA%\Mozilla\* C:\Users\saferun_user\AppData\Roaming\Mozilla\

2. Создать в папке с браузером VBS файл, в котором прописать запуск Runas браузера. Делать это нужно через VBS, чтобы обойти ограничение по приёму пароля в STDIN к Runas’у. Прекрасный Microsoft сделал это, чтобы повысить защищенность своей ОС. Как обычно, защищенность осталась под вопросом, а геморроя прибавилось. VBS файл при этом будет выглядеть, например, так:

Option explicit
Dim oShell
set oShell= Wscript.CreateObject("WScript.Shell")
oShell.Run "RunAs /noprofile /user:saferun_user Firefox.exe"
WScript.Sleep 1000
oShell.Sendkeys "Passw0rd"
oShell.Sendkeys "{ENTER}"
Wscript.Quit


Маленький комментарий. В интернетах пишут, что Sendkeys в некоторых версиях отсутствует или запрещен, однако у меня на Windows 7 Professional, Ultimate и Home всё работает. Продолжаем.

3. Создать ярлык на новосозданный VBS файл c иконкой браузера.

Set oWS = WScript.CreateObject("WScript.Shell")
sLinkFile = "C:\firefox_saferun.LNK"
Set oLink = oWS.CreateShortcut(sLinkFile)
oLink.TargetPath = "C:\Program Files (x86)\Mozilla Firefox\firefox.vbs"
oLink.IconLocation = "C:\Program Files (x86)\Mozilla Firefox\firefox.exe,0"
oLink.WorkingDirectory = "C:\Program Files (x86)\Mozilla Firefox\"
oLink.Save

4. Заменить новым ярлыком все уже имеющиеся у пользователя ярлыки на браузеры. Шутка. Положим ярлыки в отдельную папку на рабочем столе, а там пользователь пусть сам решает.

Листинг батника


Итого вроде всё ОК, осталось это всё причесать и оттестить.

::Writed by: Sergey.Golovanov at kaspersky.com for habrahabr.ru
@echo on
@Echo This batch file will create a new user for browsers with no rights to run downloaded from Internet files. 
Pause
::Setup new user::
set safeusername=saferun_user_%random%
set safepassword=%random%Ai%random%
echo Login: %safeusername% 
echo Password: %safepassword%
net user %safeusername% /delete
del Browserlist4saferun.txt
net user %safeusername% %safepassword% /add

::init new user profile::
echo Option explicit > init_new_user_profile.vbs
echo Dim oShell >> init_new_user_profile.vbs
echo set oShell= Wscript.CreateObject("WScript.Shell") >> init_new_user_profile.vbs
echo oShell.Run "RunAs /profile /user:%safeusername% ping" >> init_new_user_profile.vbs
echo WScript.Sleep 1000 >> init_new_user_profile.vbs
echo oShell.Sendkeys "%safepassword%" >> init_new_user_profile.vbs
echo oShell.Sendkeys "{ENTER}" >> init_new_user_profile.vbs
echo Wscript.Quit  >> init_new_user_profile.vbs
call cscript init_new_user_profile.vbs 
ping -n 10 localhost >> nul
del init_new_user_profile.vbs 

::Setup privileges for new user::
net localgroup users %safeusername% /delete
icacls c:\users\%safeusername%\ /deny %safeusername%:(OI)(IO)(WDAC,WO,X)  

::Setup browsers::
:FindOpera
if exist %APPDATA%\Opera\ xcopy /E /I /C /Y /Q /H /R %APPDATA%\Opera\* C:\Users\%safeusername%\AppData\Roaming\Opera\
if exist "%Programfiles%\Opera\Opera.exe" goto run4opera
if exist "%Programfiles(x86)%\Opera\Opera.exe" goto run4operax86
Goto FindFireFox
:run4opera
echo Opera^|%Programfiles%\Opera>> Browserlist4saferun.txt
Goto FindFireFox
:run4operax86
Set Browsername=Opera
echo Opera^|%Programfiles(x86)%\Opera>> Browserlist4saferun.txt
Goto FindFireFox
:FindFireFox
if exist %APPDATA%\Mozilla\ xcopy /E /I /C /Y /Q /H /R %APPDATA%\Mozilla\* C:\Users\%safeusername%\AppData\Roaming\Mozilla\
if exist "%Programfiles%\Mozilla Firefox\Firefox.exe" goto run4Firefox
if exist "%Programfiles(x86)%\Mozilla Firefox\Firefox.exe" goto run4Firefoxx86
Goto FindChrome
:run4Firefox
echo Firefox^|%Programfiles%\Mozilla Firefox>> Browserlist4saferun.txt
Goto FindChrome
:run4Firefoxx86
echo Firefox^|%Programfiles(x86)%\Mozilla Firefox>> Browserlist4saferun.txt
Goto FindChrome
:FindChrome
If exist %LOCALAPPDATA%\Google\Chrome\Application\chrome.exe goto run4chrome
Goto FindIE
:run4chrome
::// Can work for some versions of Chrome by not stable. Dissabled for performance. 
::xcopy /E /I /C /Y /Q /H /R %LOCALAPPDATA%\Google\Chrome\* C:\Users\%safeusername%\AppData\Local\Google\Chrome\
::for /r C:\Users\%safeusername%\AppData\Local\Google\Chrome\ %%C in (*.exe) do icacls %%C /grant %safeusername%:(X)
::for /r C:\Users\%safeusername%\AppData\Local\Google\Chrome\ %%C in (*.dll) do icacls %%C /grant %safeusername%:(X)
::echo Chrome^|C:\Users\%safeusername%\AppData\Local\Google\Chrome\Application\>> Browserlist4saferun.txt
Goto FindIE
:FindIE
::// TODO A lot of XCOPYs
if exist "%LOCALAPPDATA%\Microsoft\Internet Explorer" (
xcopy /E /I /C /Y /Q /H /R "%USERPROFILE%\Favorites\*" "C:\Users\%safeusername%\Favorites\"
xcopy /E /I /C /Y /Q /H /R "%LOCALAPPDATA%\Microsoft\Internet Explorer\*" "C:\Users\%safeusername%\AppData\Local\Microsoft\Internet Explorer\"
xcopy /E /I /C /Y /Q /H /R "%LOCALAPPDATA%\Microsoft\Windows\History\*" "C:\Users\%safeusername%\AppData\Local\Windows\History\"
xcopy /E /I /C /Y /Q /H /R "%APPDATA%\Roaming\Microsoft\Windows\Cookies\*" "C:\Users\%safeusername%\AppData\Roaming\Microsoft\Windows\Cookies\"
)
if exist "%Programfiles(x86)%\Internet Explorer\iexplore.exe" goto run4iex86
if exist "%Programfiles%\Internet Explorer\iexplore.exe" goto run4ie
:run4iex86
echo IExplore^|%Programfiles(x86)%\Internet Explorer>> Browserlist4saferun.txt
goto MakeLinks
:run4ie
echo IExplore^|%Programfiles%\Internet Explorer>> Browserlist4saferun.txt

::Make links::
:MakeLinks
rd /s /q %USERPROFILE%\Downloads\Browser
rd /s /q %USERPROFILE%\Desktop\SafeLinks
mklink /d %USERPROFILE%\Downloads\Browser C:\Users\%safeusername%\Downloads
mkdir %USERPROFILE%\Desktop\SafeLinks
echo on
For /f "tokens=1,2 delims=|" %%A in (Browserlist4saferun.txt) do (
echo Option explicit > "%%B\%%A.vbs"
echo Dim oShell >> "%%B\%%A.vbs"
echo set oShell= Wscript.CreateObject^("WScript.Shell"^) >> "%%B\%%A.vbs"
echo oShell.Run "RunAs /user:%safeusername% %%A.exe" >> "%%B\%%A.vbs"
echo WScript.Sleep 1000 >> "%%B\%%A.vbs"
echo oShell.Sendkeys "%safepassword%" >> "%%B\%%A.vbs"
echo oShell.Sendkeys "{ENTER}" >> "%%B\%%A.vbs"
echo Wscript.Quit  >> "%%B\%%A.vbs"
echo Set oWS = WScript.CreateObject^("WScript.Shell"^) > "%USERPROFILE%\Desktop\SafeLinks\%%A.lnk.vbs"
echo sLinkFile = "%USERPROFILE%\Desktop\SafeLinks\%%A_saferun.LNK" >> "%USERPROFILE%\Desktop\SafeLinks\%%A.lnk.vbs"
echo Set oLink = oWS.CreateShortcut^(sLinkFile^) >> "%USERPROFILE%\Desktop\SafeLinks\%%A.lnk.vbs"
echo oLink.TargetPath = "%%B\%%A.vbs" >> "%USERPROFILE%\Desktop\SafeLinks\%%A.lnk.vbs"
echo oLink.IconLocation = "%%B\%%A.exe,0" >> "%USERPROFILE%\Desktop\SafeLinks\%%A.lnk.vbs"
echo oLink.WorkingDirectory = "%%B\" >> "%USERPROFILE%\Desktop\SafeLinks\%%A.lnk.vbs"
echo oLink.Save  >> "%USERPROFILE%\Desktop\SafeLinks\%%A.lnk.vbs"
) 
for /r %USERPROFILE%\Desktop\SafeLinks\ %%p in (*.vbs) do cscript %%p
for /r %USERPROFILE%\Desktop\SafeLinks\ %%v in (*.vbs) do del %%v
:: Open Explorer with links::
explorer %USERPROFILE%\Desktop\SafeLinks\

:: Create Uninstall::
echo @echo off > uninstall_%~n0.bat
echo net user %safeusername% /del >> uninstall_%~n0.bat
echo rd /s /q %USERPROFILE%\Downloads\Browser >> uninstall_%~n0.bat
echo rd /s /q %USERPROFILE%\Desktop\SafeLinks >> uninstall_%~n0.bat
echo rd /s /q C:\Users\%safeusername%\ >> uninstall_%~n0.bat
echo For /f "tokens=1,2 delims=|" %%%%A in (Browserlist4saferun.txt) do del "%%%%B\%%%%A.vbs" >> uninstall_%~n0.bat
echo del Browserlist4saferun.txt >> uninstall_%~n0.bat
echo del %%0 >> uninstall_%~n0.bat

:Exit

Тестирование


Ну-с, а теперь попробуем, как это всё работает в дикой природе:

1. Выключаем антивирус и даунгрейдим, например, JAVA (чета мне сразу не по себе стало).

2. Копипастим батник из листинга.

3. Сохраняем его как saferun.bat, делаем глубокий вдох и кликаем на него два раза.

4. Мигают консоли и открывается окно эксплорера. Смотрим на окно с ярлыками и много думаем.

5. Выбираем любой браузер. Идём на Youtube, проверяем, что всё работает, кликается и т.д.

6. Теперь идём на Google и ищем «Самый популярный браузер рунета» (это мне сестра показывала, как скачать порно-блокер бесплатно). Кликаем на несколько ссылок, и наш компьютер начинает подозрительно трещать. Ждём минуту. Вроде ничего страшного не произошло. Смотрим в Process Explorer и видим, что наш браузер запустил JAVA.exe, который успешно унаследовал нашего нового пользователя.
image


7. Теперь идём во временную директорию нового пользователя и видим там следующее…
image


8. Проверяем права на файл «____991.exe»
image


9. Отрываем cmd.exe под созданным пользователем. Пароль для него можно посмотреть, например, в VBS скрипте рядом с EXE’шником браузера
image


10. Делаем cd %temp% в новой консольке и пишем «.\____991.exe». Жмём Enter!
image


11. УРА-УРА!!! Это победа.
image

12. Кому интересны подробности, то

C:\Users\saferun_user_31714\AppData\Local\Temp>d:\md5.exe ____991.ex
____991.ex : 04DA16B5447D8F2B4BD23AFD469FB153

Если бы этот файл запустился, то мы бы увидели веселые картинки и просьбу поработать с платёжным терминалом.

Вместо заключения


image

Итого наш батник будет очень полезен для защиты от Drive-by атак и эксплойтов при работе с Windows 7 как из-под админа, так и под простым пользователем. Да, у него есть теоретическое ограничение на полезные нагрузки с повышением привилегий, но такое в дикой природе благо редко встречается. Плюсы при работе с батником — его можно очень быстро править и добавлять в него поддержку новых программ, таких как почтовые клиенты, офисные программы и т.д. Настройка, гибкость, клёвость и крутость очень важны, и мы в ЛК это прекрасно понимаем.

Спасибо большое, что дочитали этот поток сознания автора до конца и еще ни разу не нажали на минус. 8) Удачи!

ПС. Данный батник не имеет никакого отношения к SafeBrowser’у, входящему в продукты ЛК.
ППС. Батник создаёт очень удобный Uninstall — на случай если что-то вдруг пошло не так.
ПППС. Как обычно в комментариях тусуется доброжелательный пользователь k1k, который выдаёт себя за автора статьи. Так оно и есть. Спасибо!
Tags:
Hubs:
Total votes 134: ↑121 and ↓13 +108
Views 59K
Comments Comments 73

Information

Founded
Location
Россия
Website
www.kaspersky.ru
Employees
1,001–5,000 employees
Registered