PENETRATION TESTING SERVICES

We test every layer an attacker can reach.

Web, API, cloud, network, mobile and your people. Pick where an attacker would start. We test it by hand, end to end, then hand you a report you can act on.

Tested toOWASP · NIST SP 800-115 · MITRE ATT&CK · CIS · OWASP MASVS

WHAT WE TEST

Six types of penetration testing. One standard.

Every test is manual, run by a senior tester, and mapped to a recognised framework. On each card is a real flaw we typically find on that surface.

Not sure where to start?Enter your domain and see what an attacker already knows. Free, instant, and it names the layer to test first.Run the free check

EVERY ENGAGEMENT

Whatever the layer, the same standard.

The service changes with your stack. How we work never does.

  1. Manual-first testing

    Humans find the logic flaws and chained exploits scanners miss.

  2. Only senior testers

    Every engagement is run by certified offensive-security pros. No juniors.

  3. Fix-focused reporting

    Reproduction steps, CVSS and a concrete fix for every finding.

  4. Free retest included

    We re-test every fix at no extra cost, so closure is proven.

This is the floor, not the ceiling. See how we work

PROOF OF WORK

Real findings, not scanner noise.

Five findings from real engagements, verified by hand and scored. Open any one for the full technical write-up, exactly as it reads in your penetration test report.

findings · sample excerpt2 critical2 high1 medium
criticalIDOR → account takeoverWeb ApplicationCVSS 9.6
Classification
CWE-639 · OWASP A01:2021
CVSS v3.1 vector
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N
Surface
Web Application
How we found it

Account records were addressed by a sequential integer. Using a low-privilege test account we incremented the identifier and the API returned another customer's record, then accepted a write to it. Ownership was never checked server side.

Evidence
GET  /api/v2/accounts/1337   200   (our account)GET  /api/v2/accounts/1338   200   (another tenant)PATCH /api/v2/accounts/1338  204   {"email":"attacker@…"}# no ownership check on the object identifier
Business impact

Any authenticated user could read and modify every other customer account, including changing the email on file and taking the account over outright.

Remediation

Enforce object-level authorization on every request: confirm the authenticated subject owns the object before returning or mutating it. Use non-sequential identifiers as defence in depth, and add an authorization test per endpoint to CI.

criticalOver-privileged role → account compromiseCloudCVSS 9.0
Classification
CWE-269 · CIS AWS 1.16
CVSS v3.1 vector
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Surface
Cloud
How we found it

A CI build role carried iam:PassRole alongside lambda:* on a wildcard resource. We passed a higher-privileged role into a function we created, invoked it, and inherited administrative permissions.

Evidence
$ aws iam get-role-policy --role-name ci-build"Action": ["iam:PassRole","lambda:*"], "Resource": "*"$ aws sts get-caller-identity → assumed-role/admin# escalation chain confirmed, no alert raised
Business impact

One leaked CI credential was enough to reach administrative control of the entire account and every workload running in it.

Remediation

Scope PassRole to explicit role ARNs, drop wildcard actions, and attach a permissions boundary so build identities can never grant themselves more than they already hold. Alert on sts:AssumeRole into privileged roles.

highBOLA → cross-tenant data accessAPICVSS 7.7
Classification
CWE-639 · OWASP API1:2023
CVSS v3.1 vector
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Surface
API
How we found it

The tenant identifier was read from the request body instead of the verified session token. Swapping it returned records belonging to unrelated organisations.

Evidence
POST /graphql  { invoices(tenantId:"acme"){ total } }200 OK   412 invoices returnedtenantId -> "northwind"   200 OK   1,208 invoices# tenant scope trusted from client input
Business impact

Any customer could enumerate other organisations' invoices and financial totals, a direct multi-tenant data breach.

Remediation

Derive tenant scope from the verified session token only, never from client-supplied input. Add cross-tenant authorization tests to the CI suite so a regression fails the build.

highSMB relay → lateral movementNetworkCVSS 8.1
Classification
CWE-294 · ATT&CK T1557.001
CVSS v3.1 vector
AV:A/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
Surface
Network
How we found it

LLMNR and NBT-NS were enabled and SMB signing was not enforced. We poisoned name resolution, captured machine authentication, and relayed it to a host where the account held local administrator rights.

Evidence
$ responder -I eth0 -wrf[SMB] NTLMv2 captured: SVC_BACKUP$ ntlmrelayx → SMB session on FS02 (admin)# no password was ever cracked
Business impact

A single unprivileged foothold on the user VLAN reached file-server administrator rights without cracking one password.

Remediation

Disable LLMNR and NBT-NS, enforce SMB signing across the estate, and segment user VLANs from server networks. Where legacy hosts block signing, isolate them behind an explicit allow-list.

mediumSecrets in local storageMobile AppCVSS 5.5
Classification
CWE-312 · MASVS-STORAGE-1
CVSS v3.1 vector
AV:P/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
Surface
Mobile App
How we found it

On a rooted device we pulled the application sandbox. A third-party API key and a long-lived refresh token were sitting in cleartext preferences with no platform protection.

Evidence
$ adb shell run-as com.example.app cat shared_prefs/auth.xml<string name="api_key">sk_live_…</string><string name="refresh_token">eyJhbGciOi…</string># no Keystore usage anywhere in the build
Business impact

Brief physical access, or malware on a rooted device, was enough to lift a long-lived session token and a billable third-party key.

Remediation

Store secrets in the iOS Keychain or Android Keystore, shorten refresh-token lifetime with rotation, and proxy third-party calls through your backend so the key never ships inside the client at all.

READY WHEN YOU ARE

Still not sure? That's what the call is for.

Tell us your stack. In 30 minutes a senior tester will tell you what to test first, and what you can safely leave for later.