hacktricks/network-services-pentesting/27017-27018-mongodb.md

285 lines
14 KiB
Markdown
Raw Normal View History

2022-04-28 23:27:22 +00:00
# 27017,27018 - Pentesting MongoDB
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
2023-06-06 18:56:34 +00:00
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
<figure><img src="../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
**HackenProof é o lar de todas as recompensas por bugs de criptografia.**
2022-11-05 09:07:43 +00:00
**Seja recompensado sem atrasos**\
As recompensas do HackenProof são lançadas apenas quando seus clientes depositam o orçamento de recompensa. Você receberá a recompensa após a verificação do bug.
2023-02-27 09:28:45 +00:00
**Adquira experiência em pentesting web3**\
Protocolos de blockchain e contratos inteligentes são a nova Internet! Domine a segurança web3 em seus dias de ascensão.
2023-02-27 09:28:45 +00:00
**Torne-se a lenda do hacker web3**\
Ganhe pontos de reputação com cada bug verificado e conquiste o topo do leaderboard semanal.
2023-02-27 09:28:45 +00:00
[**Cadastre-se no HackenProof**](https://hackenproof.com/register) comece a ganhar com seus hacks!
{% embed url="https://hackenproof.com/register" %}
2022-11-05 09:07:43 +00:00
2023-06-06 18:56:34 +00:00
## Informações Básicas
O MongoDB é um sistema de gerenciamento de banco de dados (DBMS) de código aberto que usa um modelo de banco de dados orientado a documentos que suporta várias formas de dados. (De [aqui](https://searchdatamanagement.techtarget.com/definition/MongoDB))
2023-06-06 18:56:34 +00:00
**Porta padrão:** 27017, 27018
```
PORT STATE SERVICE VERSION
27017/tcp open mongodb MongoDB 2.6.9 2.6.9
```
### Enumeração
#### Manual
A enumeração manual é um processo de coleta de informações sobre um serviço MongoDB. Isso pode ser feito usando comandos e ferramentas específicas para obter detalhes sobre a instância do MongoDB em execução.
#### Verificação de porta
A primeira etapa é verificar se a porta 27017 (padrão do MongoDB) está aberta. Isso pode ser feito usando a ferramenta `nmap` com o seguinte comando:
```
nmap -p 27017 <alvo>
```
Se a porta estiver aberta, isso indica que o serviço MongoDB está em execução.
#### Conexão ao MongoDB
Após verificar a porta, você pode tentar se conectar ao serviço MongoDB usando o cliente `mongo` com o seguinte comando:
```
mongo <alvo>:27017
```
Se a conexão for bem-sucedida, você será apresentado ao prompt do MongoDB, onde poderá executar comandos e consultar o banco de dados.
#### Enumeração de informações
Uma vez conectado ao MongoDB, você pode usar comandos específicos para obter informações sobre o banco de dados e suas coleções. Alguns comandos úteis incluem:
- `show dbs`: lista todos os bancos de dados disponíveis.
- `use <nome_do_banco_de_dados>`: seleciona um banco de dados específico.
- `show collections`: lista todas as coleções no banco de dados selecionado.
- `db.<nome_da_coleção>.find()`: exibe todos os documentos em uma coleção específica.
Esses comandos podem ajudar a identificar informações sensíveis ou vulnerabilidades no banco de dados MongoDB durante a enumeração manual.
```python
from pymongo import MongoClient
client = MongoClient(host, port, username=username, password=password)
client.server_info() #Basic info
#If you have admin access you can obtain more info
admin = client.admin
admin_info = admin.command("serverStatus")
cursor = client.list_databases()
for db in cursor:
print(db)
print(client[db["name"]].list_collection_names())
#If admin access, you could dump the database also
```
2023-06-06 18:56:34 +00:00
**Alguns comandos do MongoDB:**
```bash
# Show databases
show dbs
# Switch to a specific database
use <database_name>
# Show collections in the current database
show collections
# Insert a document into a collection
db.<collection_name>.insertOne({<document>})
# Find documents in a collection
db.<collection_name>.find({<query>})
# Update documents in a collection
db.<collection_name>.updateOne({<query>}, {<update>})
# Delete documents from a collection
db.<collection_name>.deleteOne({<query>})
```
**Observações:**
- Substitua `<database_name>` pelo nome do banco de dados desejado.
- Substitua `<collection_name>` pelo nome da coleção desejada.
- Substitua `<document>` pelo documento que deseja inserir.
- Substitua `<query>` pela consulta que deseja realizar.
- Substitua `<update>` pela atualização que deseja fazer.
```bash
show dbs
use <db>
show collections
db.<collection>.find() #Dump the collection
db.<collection>.count() #Number of records of the collection
db.current.find({"username":"admin"}) #Find in current db the username admin
```
2023-06-06 18:56:34 +00:00
### Automático
O MongoDB é um banco de dados NoSQL popular que utiliza um modelo de armazenamento de documentos. Ele é amplamente utilizado em aplicações web e móveis devido à sua flexibilidade e escalabilidade. No entanto, como qualquer outro serviço de rede, o MongoDB também pode ser alvo de ataques.
Neste capítulo, discutiremos algumas técnicas de pentesting para identificar e explorar vulnerabilidades em instâncias do MongoDB. Vamos nos concentrar nas portas padrão 27017 e 27018, que são comumente usadas para comunicação com o MongoDB.
#### Verificação de porta
Antes de iniciar um teste de penetração em um serviço MongoDB, é importante verificar se as portas 27017 e 27018 estão abertas. Isso pode ser feito usando ferramentas de varredura de portas, como o Nmap.
```bash
nmap -p 27017,27018 <alvo>
```
Se as portas estiverem abertas, isso indica que o serviço MongoDB está em execução e pode ser acessado.
#### Enumeração de bancos de dados
Uma vez que tenhamos acesso ao serviço MongoDB, a próxima etapa é enumerar os bancos de dados disponíveis. Isso pode ser feito usando o comando `show dbs` no shell do MongoDB.
```bash
mongo --host <alvo> --port 27017
> show dbs
```
Isso nos fornecerá uma lista de todos os bancos de dados presentes no servidor.
#### Enumeração de coleções
Após identificar os bancos de dados, podemos prosseguir para a enumeração das coleções dentro de cada banco de dados. Isso pode ser feito usando o comando `show collections` no shell do MongoDB.
```bash
mongo --host <alvo> --port 27017 --authenticationDatabase <banco_de_dados> -u <usuário> -p <senha>
> use <banco_de_dados>
> show collections
```
Isso nos fornecerá uma lista de todas as coleções presentes no banco de dados selecionado.
#### Extração de dados
Uma vez que tenhamos identificado as coleções, podemos extrair dados dessas coleções usando o comando `find` no shell do MongoDB.
```bash
mongo --host <alvo> --port 27017 --authenticationDatabase <banco_de_dados> -u <usuário> -p <senha>
> use <banco_de_dados>
> db.<coleção>.find()
```
Isso nos retornará todos os documentos presentes na coleção selecionada.
#### Injeção de comandos
Além da extração de dados, também podemos explorar a possibilidade de injeção de comandos no MongoDB. Isso pode ser feito usando o operador `$where` no comando `find`.
```bash
mongo --host <alvo> --port 27017 --authenticationDatabase <banco_de_dados> -u <usuário> -p <senha>
> use <banco_de_dados>
> db.<coleção>.find({$where: "<comando>"})
```
Isso nos permitirá executar comandos arbitrários no servidor MongoDB.
#### Ataques de força bruta
Se tivermos credenciais de acesso limitadas, também podemos tentar realizar ataques de força bruta para obter acesso não autorizado ao serviço MongoDB. Isso pode ser feito usando ferramentas como o Hydra.
```bash
hydra -l <usuário> -P <wordlist> <alvo> mongodb
```
Isso tentará várias combinações de nomes de usuário e senhas da lista fornecida para obter acesso ao serviço MongoDB.
#### Conclusão
O MongoDB é um serviço popular que pode ser alvo de ataques se não for configurado corretamente. Neste capítulo, discutimos algumas técnicas de pentesting para identificar e explorar vulnerabilidades em instâncias do MongoDB. É importante lembrar que todas as técnicas discutidas devem ser realizadas apenas em sistemas autorizados e com o devido consentimento.
```bash
nmap -sV --script "mongo* and default" -p 27017 <IP> #By default all the nmap mongo enumerate scripts are used
```
2022-05-01 13:25:53 +00:00
### Shodan
* Todos os mongodb: `"informações do servidor mongodb"`
* Pesquisar por servidores mongodb totalmente abertos: `"informações do servidor mongodb" -"parcialmente habilitado"`
* Apenas habilitar parcialmente a autenticação: `"informações do servidor mongodb" "parcialmente habilitado"`
2022-05-01 13:25:53 +00:00
## Login
2023-06-06 18:56:34 +00:00
Por padrão, o mongo não requer senha.\
**Admin** é um banco de dados comum do mongo.
```bash
mongo <HOST>
mongo <HOST>:<PORT>
mongo <HOST>:<PORT>/<DB>
mongo <database> -u <username> -p '<password>'
```
O script do nmap: _**mongodb-brute**_ irá verificar se são necessárias credenciais.
```bash
nmap -n -sV --script mongodb-brute -p 27017 <ip>
```
2023-06-06 18:56:34 +00:00
### [**Força bruta**](../generic-methodologies-and-resources/brute-force.md#mongo)
Verifique dentro de _/opt/bitnami/mongodb/mongodb.conf_ para saber se são necessárias credenciais:
```bash
grep "noauth.*true" /opt/bitnami/mongodb/mongodb.conf | grep -v "^#" #Not needed
grep "auth.*true" /opt/bitnami/mongodb/mongodb.conf | grep -v "^#\|noauth" #Not needed
```
2023-06-06 18:56:34 +00:00
## Previsão de Mongo Objectid
Os IDs de objeto do Mongo são strings hexadecimais de **12 bytes**:
![](../.gitbook/assets/id-and-objectids-in-mongodb.png)
Por exemplo, aqui está como podemos analisar um ID de objeto real retornado por um aplicativo: 5f2459ac9fa6dc2500314019
2023-06-06 18:56:34 +00:00
1. 5f2459ac: 1596217772 em decimal = Sexta-feira, 31 de julho de 2020 17:49:32
2. 9fa6dc: Identificador da máquina
2023-06-06 18:56:34 +00:00
3. 2500: ID do processo
4. 314019: Um contador incremental
Dos elementos acima, o identificador da máquina permanecerá o mesmo enquanto o banco de dados estiver executando na mesma máquina física/virtual. O ID do processo só mudará se o processo do MongoDB for reiniciado. O timestamp será atualizado a cada segundo. O único desafio em adivinhar os IDs de objeto simplesmente incrementando os valores do contador e do timestamp é o fato de que o Mongo DB gera IDs de objeto e atribui IDs de objeto em nível de sistema.
A ferramenta [https://github.com/andresriancho/mongo-objectid-predict](https://github.com/andresriancho/mongo-objectid-predict), dado um ID de objeto inicial (você pode criar uma conta e obter um ID inicial), retorna cerca de 1000 IDs de objeto prováveis que poderiam ter sido atribuídos aos próximos objetos, então você só precisa forçar a entrada.
2022-05-01 13:25:53 +00:00
## Post
2023-06-06 18:56:34 +00:00
Se você é root, pode **modificar** o arquivo **mongodb.conf** para que não sejam necessárias credenciais (_noauth = true_) e **fazer login sem credenciais**.
2022-04-28 16:01:33 +00:00
<figure><img src="../../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>
**HackenProof é o lar de todas as recompensas por bugs de criptografia.**
2023-03-05 19:54:13 +00:00
**Seja recompensado sem atrasos**\
As recompensas do HackenProof são lançadas apenas quando os clientes depositam o orçamento de recompensa. Você receberá a recompensa após a verificação do bug.
2023-02-27 09:28:45 +00:00
**Adquira experiência em pentesting web3**\
Protocolos de blockchain e contratos inteligentes são a nova Internet! Domine a segurança web3 em seus dias de ascensão.
2023-02-27 09:28:45 +00:00
**Torne-se a lenda do hacker web3**\
Ganhe pontos de reputação com cada bug verificado e conquiste o topo do leaderboard semanal.
2023-02-27 09:28:45 +00:00
[**Cadastre-se no HackenProof**](https://hackenproof.com/register) e comece a ganhar com seus hacks!
{% embed url="https://hackenproof.com/register" %}
2022-11-05 09:07:43 +00:00
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? Ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
2023-06-06 18:56:34 +00:00
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>