Manage Pentest Projects with Cervantes

Tested on Kali GNU/Linux Rolling 2026.2 (kali-rolling)
Package Docker Engine
Docker Compose plugin
Cervantes (mesq/cervantes:latest)
Lab environment Pentest lab
Privilege sudo or root for Docker; normal user if your account is in the docker group
Scope Clone the official Cervantes Docker stack, retrieve the generated admin password, create clients and projects, add targets, record vulnerability findings, write the executive summary, export reports, back up data, and stop the lab stack. Does not cover custom Cervantes development or enterprise SSO beyond noting LDAP and OpenID Connect settings in appsettings.json.
Related guides Install Kali Linux on Proxmox
Short on time?Beta Get the gist of this 11-minute read in seconds, then ask follow-up questions

Cervantes is an open source platform for pentesters and red teams who want clients, projects, targets, findings, and reports in one place. You still write the technical content yourself, but Cervantes gives you structured fields for severity, categories, evidence, and exportable report templates instead of rebuilding the same Word outline on every engagement.

This guide installs the official Docker stack, walks through a minimal project workflow, and points to the penetration test report guide when you move from tracked findings to client-ready prose.

IMPORTANT
Run Cervantes only for authorized engagements. Store client data on hosts you control, restrict network access to the Cervantes UI, and follow the secure distribution rules from your penetration testing rules of engagement.

What Cervantes is and why use it

Cervantes is a project hub, not a scanner. You bring findings from Nmap, Burp, Metasploit, or manual testing; the platform helps you organize and report them.

Area What you use it for
Clients Legal entities and contacts before you open a project
Projects Engagement metadata: assessment type, dates, status, assigned testers
Targets In-scope hosts, URLs, or assets tied to the project
Vulnerabilities Finding records with risk level, category, evidence, and owner
Documents Store supporting engagement documents
Report templates Reusable layouts for exported pentest reports
Dashboard and calendar Overview of project activity, tasks, vulnerabilities, and scheduled engagement work

For example, you might use Documents for approved scope material or other engagement documentation. The platform gives you the storage area; your team decides what belongs there.

The practical sequence is client → project → targets → vulnerabilities → executive summary → report.

Why use Cervantes for pentest projects?

If you are comparing Cervantes to spreadsheets and Word documents, these are the capabilities that usually justify the switch:

  • Centralizes clients, projects, targets, and vulnerabilities in one workspace
  • Reuses vulnerability and project templates across engagements
  • Supports team and project membership for shared work
  • Generates reports from reusable components and templates
  • Exports reports as HTML or DOCX
  • Includes Jira integration and collaboration features for larger teams

This guide does not compare Cervantes to Dradis, Faraday, or other platforms. The goal is a working Docker install and a realistic project workflow.


Prerequisites

You need Docker Engine and the Docker Compose plugin on the host where Cervantes will run. On Kali, refresh the package index first:

bash
sudo apt update

Install Docker, the Compose plugin, and Git:

bash
sudo apt install -y docker.io docker-compose-plugin git

Enable and start the Docker service:

bash
sudo systemctl enable --now docker

Add your lab user to the docker group if you do not want to prefix every command with sudo:

bash
sudo usermod -aG docker "$USER"

Log out and back in so the group membership applies. Confirm both CLI tools respond:

bash
docker --version
docker compose version

Port 443 on the host must be free. The upstream docker-compose.yml maps container HTTPS to host port 443.


Install Cervantes with Docker Compose

Clone the official repository

Cervantes publishes a maintained Compose stack in the CervantesSec/docker repository. Clone it into a working directory on your lab host:

bash
git clone https://github.com/CervantesSec/docker.git ~/lab/cervantes-docker

Move into the clone so Compose reads the bundled docker-compose.yml:

bash
cd ~/lab/cervantes-docker

Confirm that docker-compose.yml, appsettings.json, and the https/ directory are present. These are the files used by the production Compose configuration.

Start the containers

Pull images and start the database and application containers in detached mode:

bash
docker compose -p cervantes -f docker-compose.yml up -d

up -d returns once containers are created. List their status:

bash
docker compose -p cervantes ps

Sample output:

output
NAME            IMAGE                            STATUS         PORTS
cervantes-app   mesq/cervantes:latest            Up 2 minutes   0.0.0.0:443->8081/tcp
cervantes-db    mesq/cervantes-postgres:latest   Up 2 minutes

You should see cervantes-app running with port 443 published on the host and cervantes-db in the Up state.

Retrieve the generated admin password

The default username is admin@cervantes.local. The password is not a fixed string like Admin123.; Cervantes generates it on first startup.

Read the application container logs and look for the password line Cervantes prints during initialization:

bash
docker logs cervantes-app 2>&1 | grep -i password

Sample output (the password value is unique per install):

output
Default admin user created. Password: <generated-value>

Copy the value from your log output. Yours will differ from any screenshot or older tutorial. Change the password after first login under user settings.

Log in

Open the web UI over HTTPS:

text
https://localhost

Your browser will warn about the self-signed certificate from the bundled cervantes.pfx. Accept the warning for lab use only. In production, terminate TLS with a proper certificate or place Cervantes behind a reverse proxy.

Sign in with admin@cervantes.local and the password from the container logs.

Cervantes login page with email and password fields and a Sign in button

After authentication, the dashboard shows open projects, vulnerability counts, and calendar entries once you add data.

Cervantes dashboard with project summary cards, vulnerability counts, and the calendar widget


Create a client and pentest project

Work in this order so every target and finding links to the correct engagement.

Register the client

Open Clients in the sidebar and create a record for the organization you are testing.

Cervantes Clients list view with client name, contact details, and row action buttons

Include contact name and email if your report template uses them. For lab practice, use a fictional name such as Example Corp.

Create the project

Open Projects and add a new engagement:

Cervantes Projects list showing project name, status, start and end dates, and assessment type

  • Name the project clearly (Example Corp external pentest Q3)
  • Set assessment type (black-box, gray-box, or white-box) to match pre-engagement scoping
  • Set start and target end dates

After creating the project, open Members and add any testers who need access to the project workspace. Users who are not listed there cannot interact with the project.

Project templates save recurring fields when you run similar assessments often.


Add targets to the project

Open the project and go to Targets. Targets represent the in-scope assets you will test and later associate with findings.

You can add targets in three ways:

  • Manually — enter hostnames, IP addresses, or URLs one at a time
  • CSV import — bulk-load a target list when you already have scope in a spreadsheet
  • Nmap XML import — import an Nmap XML scan to populate project targets and discovered services

Imported Nmap XML can also help populate service information associated with targets. After targets exist, link each vulnerability to the relevant target when you record findings. That keeps the exported report aligned with which asset was affected.


Record vulnerability findings

Open Vulnerabilities and add a finding tied to the project and target you just created.

Cervantes Vulnerabilities list with title, project, risk level, category, and owner columns

Information you should capture Notes
Title Short and specific (Unauthenticated SQL injection in portal login)
Project and target The engagement and asset this finding belongs to
Risk / severity Align with your CVSS or client scale
Category OWASP, CWE, or a custom category your firm uses
Description What is wrong and how you confirmed it
Evidence / supporting material Use vulnerability Notes and Attachments for screenshots, command output, request/response evidence, or supporting files
Remediation Fix guidance the client can ticket

Cervantes also supports vulnerability templates so repeated finding types (missing patches, weak TLS, default credentials) start from a consistent baseline. The platform does not replace manual validation: confirm scanner hits before you record them as confirmed vulnerabilities, same as you would in a standalone report.


Write the executive summary and generate a report

Report generation in Cervantes starts inside the project, not only at export time.

  1. Open the project's Executive Summary tab and write or refine the non-technical summary in business language.
  2. Confirm targets and vulnerabilities belong to the project and are associated correctly.
  3. Open Reports, create a report, and choose a Report template. Cervantes ships defaults; you can clone and edit templates under Report Templates to match your firm's branding and section order.

Cervantes Report Templates page listing built-in and custom report layouts

If the Create report action is unavailable, check your role: Cervantes documentation states that report creation and deletion require an Admin or SuperUser account. 4. Download the generated report as HTML or DOCX. 5. Perform final editorial and QC review outside Cervantes as needed.

Exported reports pull structured finding data from the project. You still need to verify CVSS vectors, reproduction steps, and attack narrative wording when findings chain together. Record retest status after the client remediates.

Those writing tasks are covered in how to write a penetration test report. Treat Cervantes output as a draft organized by finding ID, not the final PDF you send without review.


Collaboration and project-management features

Once the core workflow works, these areas support larger teams:

Section Purpose
My Workspaces Projects assigned to the logged-in tester
Calendar Engagement dates and task states with color coding
Users Additional accounts; enable two-factor authentication per user
Organization Company name, logo, and contact details on exports
Application Logs Who changed clients, projects, or findings
Backup Database and attachment exports for restore or migration

Optional integrations such as Jira, email, LDAP, and OpenID Connect can be configured for larger deployments. Leave them disabled in a lab until you understand the base workflow.


Back up Cervantes data

Use Cervantes' Backup feature before rebuilding or removing the stack. Export from the Backup page in the UI so you can restore clients, projects, targets, findings, and attachments on a fresh install.

Cervantes Backup page with options to export and restore database and attachment backups

The upstream Compose file does not persist PostgreSQL data outside the cervantes-db container. Do not treat that container as durable storage. Export a Cervantes backup before you remove or recreate it.


Stop the lab stack

When you finish practicing, stop the containers from the clone directory:

bash
cd ~/lab/cervantes-docker && docker compose -p cervantes down

The upstream Compose file does not persist PostgreSQL data outside the cervantes-db container. Because docker compose down removes that container, export a Cervantes backup before running it if you need to keep engagement data.


Troubleshooting

Symptom Likely cause Fix
bind: address already in use on port 443 Another service uses host 443 Change the host port in docker-compose.yml (for example 8443:8081) and open https://localhost:8443
Browser cannot reach https://localhost Containers not running or firewall blocking Run docker compose -p cervantes ps; confirm cervantes-app is up
Login fails with admin@cervantes.local Wrong or stale password Re-read docker logs cervantes-app; recreate the stack only after backup if you lost the log
Certificate warning will not proceed Expected with bundled self-signed cert Proceed for lab only; use a real certificate in production
permission denied on docker User not in docker group Run with sudo or add the user to docker and re-login
Empty report export No vulnerabilities linked to the project Add findings under Vulnerabilities, confirm target associations, and check the Executive Summary tab
Create report action missing Account role lacks permission Cervantes allows report creation and deletion only for Admin or SuperUser accounts

References


Summary

Cervantes gives you a single workspace for clients, engagements, targets, vulnerability records, and report templates. Install it with the official Docker Compose stack, read the generated admin@cervantes.local password from docker logs cervantes-app, and open https://localhost to reach the UI.

The practical sequence is client, project, targets, findings, executive summary, then report export. Cervantes structures the data; you still own validation, CVSS accuracy, and executive summary wording before anything goes to a client. Export a Cervantes backup before docker compose down, because that command removes the database container and the upstream Compose file does not persist PostgreSQL data outside it. Pair the platform with solid report-writing and signed rules of engagement so tracking and delivery stay aligned with authorized scope.


Frequently Asked Questions

What is Cervantes used for in penetration testing?

Cervantes is an open source platform for managing offensive security projects. It stores clients, engagements, targets, vulnerability entries, evidence, and report templates so a team can track findings and export reports from one workspace instead of scattered spreadsheets and document folders.

What is the default Cervantes admin username?

The first admin account is admin@cervantes.local. The password is generated randomly when the application container starts for the first time. Read it from the cervantes-app container logs before you log in, then change it under user settings.

Does Cervantes replace writing a penetration test report?

No. Cervantes helps you organize findings, severity, and templates, then export a report document. You still need clear reproduction steps, CVSS scoring, and executive summary wording. Use your report methodology alongside the platform output.

Which URL do I use after docker compose up?

The official Docker Compose file publishes HTTPS on host port 443. Open https://localhost in your browser and accept the self-signed certificate warning on first visit. If port 443 is already in use on the host, edit the ports mapping in docker-compose.yml before starting the stack.

How do I back up Cervantes data?

Use the Backup section in the Cervantes web UI to export the database and attachments before you rebuild or remove the stack. The upstream Compose file does not persist PostgreSQL data outside the cervantes-db container. Because docker compose down removes that container, export a Cervantes backup before running it if you need to keep engagement data.

Can I run Cervantes on Kali Linux?

Yes. Install Docker Engine and the Docker Compose plugin on Kali, clone the CervantesSec/docker repository, and start the stack from that directory. This guide uses the same workflow on Kali in a pentest lab or on Kali deployed to Proxmox.

Finished reading?Beta Get the key takeaways in seconds, then ask follow-up questions
Deepak Prasad

R&D Engineer

Founder of GoLinuxCloud with 15+ years of expertise in Linux, Python, Go, Laravel, DevOps, Kubernetes, Git, Shell scripting, OpenShift, AWS, Networking, and Security. With extensive experience, he excels across development, DevOps, networking, and security, delivering robust and efficient solutions for diverse projects.

  • Go (programming language)
  • Python (programming language)
  • DevOps
  • Computer Security
  • Cloud Computing
  • Kubernetes
  • Linux
  • Ansible (software)