\documentclass[11pt,a4paper]{article} \usepackage[portuguese]{babel} \usepackage[lining]{ebgaramond} \usepackage{style} \setlength{\parindent}{0em} \setlength{\parskip}{2ex} \title{Practical Assignment \#3} \author{ João Neto -- 2023234004\\[1em] Vasco Alves -- 2022228207 } \begin{document} \maketitle \newpage \tableofcontents \newpage \section{Introduction} % FAZER EM ENGLISH??? O prof é BR temos que fazer em Brazileiro Este trabalho tem como objetivo realizar testes de penetração numa aplicação cobaia (o \textit{Juicebox}) desenhada para aprendizagem. Este trabalho tem como objetivo utilizar o \textbf{WSTG} (Web security testing guide) e configurar um ModSecurity reverse proxy como uma \textbf{WAF}. Para esse fim temos uma aplicação cobaia (o \textit{Juicebox}) desenhada para aprendizagem que vamos utilizar num ambiente controlado para aprender como descobrir vulnerabilidades (aplicando o \textbf{WSTG} e recorrendo ao \textbf{OWASP ZAP}) e prevenir antes do serviço estar online (elaborando uma \textbf{WAF}). \section{Architecture Considered for Both Stages} 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, posteriormente, com uma WAF configurada para % mitigar as várias vulnerabilidades que foram encontradas na etapa anterior. % Para simular utilizámos \textit{Virtual Box}, como nos outros projetos, para criar as maquinas virtuais. O cenario que foi criado tem duas máquinas virtuais (servidor e cliente), e ambas as maquinas estão ligadas há mesma rede interna. O servidor vai ser executado numa das maquinas e vai ter o sistema operativo \textit{CentOS 9}, edereço 20.60.0.1, alojar um servidor \textit{Node.js} com o \textit{Juicebox} (a aplicação cobaia) na port 3000 e contém o seviço \textit{Apache} que através do módulo \textit{ModSecurity} funcionará como \textbf{WAF}. O cliente vai ser processado na maquina com o sistema operativo \textit{Kali Linux} e vai ter o edereço 20.60.0.2. Com o ambiente criado foram realizadas duas etapas de testes: \begin{itemize} \item \texttt{Primeira etapa}: Explorar vulnerabilidades na aplicação que existem sem a \textbf{WAF} \item \texttt{Segunda etapa}:Verificar que vulnerabilidades foram mitigadas da primeira etapa com o uso de uma \textbf{WAF} configurada. \end{itemize} Realisticamente estas etapas podiam continuar a repetir-se, até que estivessemos satisfeitos com o resultado, mas para o fim deste projeto estas etapas serão suficientes. \subsection{Network structure} \begin{itemize} \item \textbf{Client (20.60.0.0/24)} Cliente. \item \textbf{Server (10.60.0.0/24)} Apache+ModSecurity e JuiceShop. \end{itemize} \subsection{Servers} \begin{itemize} \item \textbf{10.60.0.1} Servidor CentOS 9 com WAF e aplicação JuiceShop. \end{itemize} \subsection{Services} \begin{center} \begin{tabular}{ll} \toprule Service & Port \\\midrule NodeJS (JuiceShop) & 3000 \\ Apache (WAF) & 80 \\ \bottomrule \end{tabular} \end{center} \section{Web application security testing} \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, investigamos as alertas principais com base no maior nível de risco e grau de confiança reportados pela ferramenta. Para conseguir informação inicial realizamos um \textit{Active Scan} através do \textit{OWASP ZAP}, o policy utilizado para esse scan foi \textit{Default Policy}. Foi obtido vários aletas automáticos devido a esse scan e decidimos investigar as alertas principais com base no nível de risco e grau de confiança reportado pela ferramenta. Adicionalmente, realizámos testes de infraestrutura 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. \includegraphics[width=0.5\textwidth]{email-unique} \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{