diff --git a/relatorio/relatorio.tex b/relatorio/relatorio.tex index 54c1666..9cf8d1e 100644 --- a/relatorio/relatorio.tex +++ b/relatorio/relatorio.tex @@ -6,7 +6,7 @@ \setlength{\parindent}{0em} \setlength{\parskip}{2ex} -\title{Practical Assignment \#2} +\title{Practical Assignment \#3} \author{ João Neto -- 2023234004\\[1em] Vasco Alves -- 2022228207 @@ -21,19 +21,20 @@ \newpage \section{Introduction} -Este trabalho tem como objectivo realizar testes de penetração numa aplicação cobaia (o Juicebox) -desenhada para aprendizagem. +% FAZER EM ENGLISH??? +Este trabalho tem como objetivo realizar testes de penetração numa aplicação +cobaia (o \textit{Juicebox}) desenhada para aprendizagem. -\section{Arquitecture considered for both stages} +\section{Architecture Considered for Both Stages} -Utilizamos somente duas máquinas virtuais: um servidor a correr \textit{CentOS 9} -e um cliente a correr \textit{Kali Linux.} O servidor contém o serviço \textit{Apache} -que age como \textit{firewall} através do plugin \textit{ModSecurity} e um servidor -nodejs que contém o Juicebox; a aplicação que vai servir de ``dummy'' (cobaia). +Utilizámos somente duas máquinas virtuais: um servidor a correr \textit{CentOS 9} +e um cliente a correr \textit{Kali Linux}. O servidor contém o serviço \textit{Apache}, +que age como \textit{firewall} através do módulo \textit{ModSecurity}, e um servidor +\textit{Node.js} que aloja o \textit{Juicebox} --- a aplicação que vai servir de cobaia (\textit{dummy}). Vão ser realizadas duas etapas de testes: primeiro, sem WAF (\textit{Web Application Firewall}) -e com foco em explorar vulnerabilidades na aplicação; e depois com uma WAF desenhada para sobreviver -as várias vulnerabilidades que foram encontradas na etapa anterior. +e com foco em explorar vulnerabilidades na aplicação; e, posteriormente, com uma WAF configurada para +mitigar as várias vulnerabilidades que foram encontradas na etapa anterior. \subsection{Network structure} @@ -54,51 +55,169 @@ Juicebox no port 3000 \subsection{Information Gathering} +Utilizámos a política por omissão (\textit{default policy}) para a realização do \textit{Active Scan} através do OWASP ZAP. Com esta abordagem, obtivemos múltiplos alertas automáticos. De forma a priorizar a análise, selecionámos os cinco alertas principais com base no maior nível de risco e grau de confiança reportados pela ferramenta. + +Adicionalmente, realizámos testes de infraestrutura e mapeamento de vetores utilizando ferramentas especializadas: + +\begin{codeblock}{bash}{} +sqlmap -u "http://192.168.1.1:3000/rest/products/search?q=apple" -p q --level=5 --risk=3 --banner +\end{codeblock} + +Ao executar o \textit{sqlmap}, descobrimos que o sistema de gestão de base de dados subjacente é o \textit{SQLite}. + +Paralelamente, realizámos uma descoberta de ficheiros e diretórios através de técnicas de \textit{fuzzing} de URLs no OWASP ZAP recorrendo à lista de permissões da \textit{DirBuster}. Esta exploração revelou os seguintes endpoints publicamente expostos: +\begin{itemize} + \item \texttt{/ftp}: Servidor de armazenamento e transferência de ficheiros exposto. + \item \texttt{/metrics}: Métricas internas da infraestrutura expostas. + \item \texttt{/api-docs}: Documentação e esquemas estruturais da API. +\end{itemize} + \subsection{Configuration and Deployment Management Testing} +\subsubsection*{Enumerate Infrastructure and Application Admin Interfaces} + +Identificámos e testámos o acesso ao endpoint \texttt{/api-docs} (\textit{Swagger UI}), validando que as interfaces de documentação interna do sistema e as definições da API estavam publicamente expostas sem qualquer tipo de controlo de acesso ou autenticação prévia. + +\subsubsection*{Test HTTP Methods} + +Testámos os métodos HTTP permitidos pelo servidor através do envio de pedidos \texttt{OPTIONS}. Verificámos que o servidor aceita métodos potencialmente perigosos ou desnecessários para utilizadores comuns em rotas específicas, expandindo a superfície de ataque da aplicação. + +\subsubsection*{Test File Permission} + +Analisámos as permissões de acesso no diretório \texttt{/ftp}. Verificámos que a falta de restrições rígidas ao nível do sistema de ficheiros permite a qualquer utilizador anónimo listar o conteúdo de diretórios estruturais e descarregar ficheiros não indexados na interface principal da aplicação. + \subsection{Identity Management Testing} +\subsubsection*{Test Role Definitions} + +Efetuámos testes de manipulação de parâmetros do lado do cliente através das ferramentas de programador do navegador. Adicionámos manualmente os cookies \texttt{isAdmin} com o valor \texttt{true} e \texttt{role} com o valor \texttt{admin}. Após a atualização da página, não observámos qualquer escalonamento de privilégios, indicando que a aplicação não valida perfis administrativos com base nestes cookies específicos. + +\subsubsection*{Test User Registration Process} + +Utilizámos o OWASP ZAP para intercetar o tráfego de rede e definir um \textit{breakpoint} no pedido HTTP POST de registo de novos utilizadores. Modificámos o corpo do pedido JSON, injetando manualmente o parâmetro \texttt{"role":"admin"}: + +\begin{codeblock}{json}{} +{ + "email": "johnGomas@gmail.com", + "role": "admin", + "password": "password", + "passwordRepeat": "password", + "securityQuestion": { + "id": 2, + "question": "Mother's maiden name?", + "createdAt": "2026-05-30T12:28:33.216Z", + "updatedAt": "2026-05-30T12:28:33.216Z" + }, + "securityAnswer": "poker" +} +\end{codeblock} + +O servidor backend processou o pedido sem validar se o utilizador possuía autorização para definir o seu próprio perfil, o que resultou na criação bem-sucedida de uma conta com permissões totais de administrador (\textit{Mass Assignment Vulnerability}). + +\subsubsection*{Testing for Account Enumeration and Guessable User Account} + +Ao tentar registar um utilizador com o e-mail \texttt{admin@juice-sh.op}, verificámos que a aplicação devolve uma mensagem de erro explícita indicando que o e-mail já se encontra registado no sistema. Este comportamento confirma a vulnerabilidade de enumeração de contas, permitindo a um atacante mapear quais os e-mails válidos na plataforma. + +\subsubsection*{Testing for Weak or Unenforced Username Policy} + +Após testar vários caracteres especiais no formulário de registo, criámos um utilizador com os seguintes dados nos campos de input: +\begin{itemize} + \item \textbf{E-mail:} \texttt{son'or1=1--@gmail.com} + \item \textbf{Nome/Campos Adicionais:} \texttt{