
Cobalt Strike Beacon Object File, реализующий CVE-2020-0796 (SMBGhost) локальное повышение привилегий с двумя путями вооружения для кражи токенов и повышения сеанса.
Это эксперименты Рафаэля с локальным повышением привилегий (LPE) через SMBGhost.
Я начал с исходного кода из Metasploit Framework:
cve-2020-0796: SMBv3 Compression Buffer Overflow (SMBGhost) (CVE 2020-0796) https://github.com/rapid7/metasploit-framework/tree/master/external/source/exploits/CVE-2020-0796 [Лицензия BSD]
И вот что я сделал:
Для этого потребовалось объявить несколько Win32 API в формате MODULE$Function для динамического разрешения функций (Dynamic Function Resolution). С другой стороны, это сократило объём кода для вызова функций из NTDLL, так как DFR берёт это на себя. :)
Я удалил неиспользуемый массив указателей из 1000 элементов в get_handle_addr. Он заставлял cl.exe вставлять функцию __chkstk из-за превышения локальными переменными ограничения в 8 КБ. BOF не имеют этой функции.
Затем я добавил несколько специфичных для Beacon API (например, BeaconPrintf, BeaconInjectProcess и т.д.), чтобы выполнять действия родным для Beacon способом.
Мне пришлось написать несколько функций взамен отсутствующих функций libc (из-за... BOF).
Используйте псевдоним 'smbghost' в Beacon без аргументов, чтобы запустить эту эксплуатацию и повлиять только на токен процесса Beacon. Если эксплуатация удаётся, ваш текущий токен процесса получает суперспособности, которых у него раньше не было. Например, вы можете внедряться в другие процессы (даже в других сеансах рабочего стола) или порождать дочерний процесс под winlogon.exe. Возможно, придётся запускать smbghost несколько раз, поскольку с первого раза эксплуатация срабатывает не всегда.
По желанию используйте 'elevate smbghost', чтобы получить новый сеанс Beacon с помощью API повышения привилегий, доступного в Aggressor Script от Cobalt Strike. Это подходит для быстрой демонстрации, вписывается в рабочие процессы продукта и т.д., но... он внедряется в winlogon.exe. Внедрение в winlogon.exe не является неизменным свойством именно этого повышения. Подозреваю, что все публичные POC делают это, потому что CreateRemoteThread не работает между границами процессов и никто не хочет писать лишний шаблонный код для подмены родительского процесса. winlogon.exe — это лёгкая низко висящая цель для демонстрации того, что мы получили повышенные права.
Чтобы скомпилировать это с помощью Visual Studio:
Используйте make.bat из командной строки x64 Cross Tools.
Это выведет expoit.x64.o в dist/
Я использовал Visual Studio 2013. Другие компиляторы/версии не тестировались. Я не пробовал/тестировал x86.