
Доказательство концепции переполнения SEH с инъекцией произвольной DLL
Концепт-доказательство переполнения SEH с внедрением произвольной DLL
HTTP-сервер Kolibrì 2.0 подвержен переполнению буфера на основе стека. На момент обнаружения эта уязвимость эксплуатировалась простым перезаписыванием указателя инструкций инструкцией JMP ESP, где ESP указывал на шеллкод, размещённый в стеке. Впоследствии было обнаружено, что цепочку SEH можно перезаписать, если отправить более крупную полезную нагрузку. Однако в приложении отсутствуют корректные инструкции POP - POP - RET, которые позволили бы обработчику SE указывать на следующую запись SEH. Это связано с тем, что все соответствующие адреса памяти начинаются с нулевого байта.

Данный эксплойт предлагает выполнение кода через переполнение SEH посредством внедрения DLL. Внедрение произвольной DLL в процесс Kolibrì открывает возможность перезаписать SE-обработчик адресом без нулевых байт, указывающим на инструкцию POP - POP - RET из этой DLL. Очевидно, что этот метод можно использовать только для создания концепт-доказательства, и на него нельзя полагаться, если эксплуатация выполняется для локального повышения привилегий системы. Это связано с тем, что для внедрения DLL в целевой процесс необходимы те же привилегии, что и у этого процесса. В остальном эксплойт работает!

Когда я впервые выложил этот эксплойт, он поддерживал только очень короткие кастомные шеллкоды с жёстко заданными адресами WinExec и ExitProcess. Это было связано с небольшим пространством буфера после перезаписи SEH. Теперь я обновил код эксплойта, разместив шеллкод-егхантер сразу после SEH и поместив яйцо (egg) и шеллкод в заголовок User-Agent веб-сервера. Таким образом, поток выполнения будет перенаправлен с перезаписанного SEH на егхантер, который затем найдёт шеллкод, помеченный яйцом 'w00t'.
Авторство этого метода принадлежит FULLSHADE из этого оригинального репозитория.
https://github.com/FULLSHADE/POPPOPRET-nullbyte-bypass
Всё, что я сделал, — это применил эту идею к данному конкретному CVE.