El sitio web de Caption está protegido mediante un servidor de caché, un proxy y un firewall para aplicaciones web. Planeo aprovecharme de una vulnerabilidad de contrabando de texto plano HTTP/2 (h2c) para acceder a páginas que de otro modo no serían visibles. Además, realizaré una inyección de HTML con el objetivo de robar la cookie de administrador, lo que me permitirá ampliar mi acceso a través del contrabando. A partir de esto, obtendré acceso a una instancia de CopyParty y explotaré una vulnerabilidad de cruce de directorios para leer una clave SSH, lo que me dará control sobre la máquina. Para obtener privilegios más altos, utilizaré una inyección de comandos en un manejador de logs. y por ultimo escalado con thrift
vemos que hay dos web una en el puerto 80 y una en el puerto 8080 vemos tambien un dominio por lo que o añadimos a el etc/hosts
ahora la voy a hacer un whatweb a las dos paginas webs
no vemos informacion critica por lo que vamos para dentro
en http://caption.htb vemos lo siguiente
no hay mucho en lo que tocar por lo que voy directo a hacer un fuzzing con disearch por ejemplo
no sale nada interesante por lo que vamos a ver la del puerto 8080. vemos un gitbucket sin mas vemos un usuario root
si vamos a uno de los git veremos uno llamado update acces contro y si miramos los cambios veremos lo siguiente
una contraseña que si la ponemos en el puesrto 80 ganamos acceso
ahora vemos apartados interesantes en especial uno llamado logs y otro downloas que nos da un 404 este sitio es vulnerable a H2C Smuggling por lo que podriamos usar la siguiente erramienta para efectuarlo de forma mas facil https://github.com/BishopFox/h2csmuggler
que pasa que al ejecutar
basicamente necesitamos una cookie para ello si capturamos la peticion en firewalls o en home veremos lo siguiente
Al analizar los resultados del Burp Suite, observamos un archivo JavaScript que obtiene recursos dinámicamente de una URL interna, utilizando el parámetro utm_source. Esto presenta una oportunidad para probar una posible manipulación inyectando cabeceras HTTP o cargas útiles para redirigir el JavaScript a una URL de recursos personalizada y ver si podemos anular la URL interna original.
Además, la respuesta incluye una cabecera X-Cache con un valor de MISS, que normalmente genera Varnish para indicar una pérdida de caché (probablemente la primera visita a la página web). La cabecera Cache-Control: public, max-age=120 revela que la caché caduca y se actualiza cada 2 minutos, lo que proporciona un breve margen para probar el comportamiento relacionado con la caché.
por lo que la forma de aprovecharnos de esto es la siguiente
nos ponemos en con un server python con el siguiente exploit para sacar la cookie
y añadiremos la siguiente cavecera
veremos que se cambia la el link y que nos llega la cookie con la que podemos ver los logs
vemos ace ping a un puerto que es el 3923 el cual nosotros no vimos en nmap porque es local con el directorio downloads tenemos un parametro url al cual podemos apuntar por lo quevamos a probar
vemos cosas intereantes principalmente el .cpr que pasa si apunto al etc/passwd?
pues que lo vemos por lo que ahora es cuestion de ver si sacamos el id_rsa de margo
y ya estaria lo demas norma el chmod 600 y para dentro
root
ejecutamos un linpheass
vemos lo siguiente. un escript go que levanta el puerto 9090 con un servidor thrift
como vemos es root el que lo esta ejecutando
para poder comunicarnos necesitamos tener nuestro propio servidor thrift
para ello vamos a hacer lo siguinet en la maquina victima
entramos y ejecutamos el siguiente comando para establecer la conexion
y ahora ese archivo nos lo pasamos a nuestra mquina local de la siguiente forma
una vez con el archivo nos hacemos que el puerto 9090 sea el de la maqina
ahora devemos crear en la mquina victima un log maligno:
lo dejamos en /tmp por ejemplo
ahora en nuestra maquina ejecutamos el siguiente comando
y se nos genera un directorio gen_py
nos metemos dentro
y vamos hay vamos a crear el exploit que sera este:
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
import sys
sys.path.append('/home/zzero/caption/exploits/gen-py')
# Import the generated code
from log_service import LogService
def main():
# Create a socket to the Thrift server
transport = TSocket.TSocket('127.0.0.1', 9090)
# Use a buffered transport for better performance
transport = TTransport.TBufferedTransport(transport)
# Use the binary protocol (consistent with Go server)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
# Create a client to use the protocol encoder
client = LogService.Client(protocol)
# Open the connection
transport.open()
# Call the ReadLogFile method on the server
file_path = "/tmp/pwn.log"
result = client.ReadLogFile(file_path)
# Print the result
print(f"Server response: {result}")
# Close the connection
transport.close()
if __name__ == "__main__":
main()