Skip to main content

Principal Mapper

Principal Mapper (PMapper) is a script and library for identifying risks in the configuration of AWS Identity and Access Management (IAM) for an AWS account or an AWS organization. It models the different IAM Users and Roles in an account as a directed graph, which enables checks for privilege escalation and for alternate paths an attacker could take to gain access to a resource or action in AWS.

PMapper includes a querying mechanism that uses a local simulation of AWS's authorization behavior. When running a query to determine if a principal has access to a certain action/resource, PMapper also checks if the user or role could access other users or roles that have access to that action/resource. This catches scenarios such as when a user doesn't have permission to read an S3 object, but could launch an EC2 instance that can read the S3 object.

Additional information can be found in the project wiki.

Installation

Requirements

Principal Mapper is built using the botocore library and Python 3.5+. Principal Mapper also requires pydot (available on pip), and graphviz (available on Windows, macOS, and Linux from https://graphviz.org/ ).

Installation from Pip

pip install principalmapper

Installation From Source Code

Clone the repository:

git clone git@github.com:nccgroup/PMapper.git

Then install with Pip:

cd PMapper
pip install .

Using Docker

(After cloning from source)

cd PMapper
docker build -t $TAG .
docker run -it $TAG

You can use -e|--env or --env-file to pass the AWS_* environment variables for credentials when calling docker run ..., or use -v to mount your ~/.aws/ directory and use the AWS_CONFIG_FILE and AWS_SHARED_CREDENTIALS_FILE environment variables. The current Dockerfile should put you into a shell with pmapper -h ready to go as well as graphviz already installed.

Usage

See the Getting Started Page in the wiki for more information on how to use PMapper via command-line. There are also pages with full details on all command-line functions and the library code.

Here's a quick example:

# Create a graph for the account, accessed through AWS CLI profile "skywalker"
pmapper --profile skywalker graph create
# [... graph-creation output goes here ...]

# Run a query to see who can make IAM Users
$ pmapper --profile skywalker query 'who can do iam:CreateUser'
# [... query output goes here ...]

# Run a query to see who can launch a big expensive EC2 instance, aside from "admin" users
$ pmapper --account 000000000000 argquery -s --action 'ec2:RunInstances' --condition 'ec2:InstanceType=c6gd.16xlarge'
# [... query output goes here ...]

# Run the privilege escalation preset query, skip reporting current "admin" users
$ pmapper --account 000000000000 query -s 'preset privesc *'
# [... privesc report goes here ...]

# Create an SVG representation of the admins/privescs/inter-principal access
$ pmapper --account 000000000000 visualize --filetype svg
# [... information output goes here, file created ...]

Note the use of --profile, which should behave the same as the AWS CLI. Also, later calls with query/argquery/visualize use an --account arg which just shortcuts around checking which account to work with (otherwise PMapper makes an API call to determine that).

Here's an example of the visualization:

And again when using --only-privesc:

Contributions

100% welcome and appreciated. Please coordinate through issues before starting and target pull-requests at the current development branch (typically of the form vX.Y.Z-dev).

License

Copyright (c) NCC Group and Erik Steringer 2019. This file is part of Principal Mapper.

  Principal Mapper is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  Principal Mapper is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU Affero General Public License for more details.

  You should have received a copy of the GNU Affero General Public License
  along with Principal Mapper.  If not, see <https://www.gnu.org/licenses/>.

Metadata

Release files for principalmapper-0ca 1.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for principalmapper-0ca 1.1.5
File Size Uploaded Provenance Actions
principalmapper_0ca-1.1.5.tar.gz 412.1 kB Without provenance Details for principalmapper_0ca-1.1.5.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for principalmapper-0ca 1.1.5
File Interpreter ABI Platform Actions
principalmapper_0ca-1.1.5-py3-none-any.whl Python 3 none any Details for principalmapper_0ca-1.1.5-py3-none-any.whl

Total release size: 557.7 kB

Release files / principalmapper_0ca-1.1.5.tar.gz

Download URL principalmapper_0ca-1.1.5.tar.gz
Size 412.1 kB
Tags Source
SHA-256 checksum
How to use checksums
578b463ee4b9ee99be189013a53768e17d5f8aa106a760af1eeb6fb10b4d1883
BLAKE2b-256 checksum
How to use checksums
4678773da68e634b1b4d44d529590ccd0f0466e1ec979ec199d9b929b4046836
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.0 CPython/3.8.16

Release files / principalmapper_0ca-1.1.5-py3-none-any.whl

Download URL principalmapper_0ca-1.1.5-py3-none-any.whl
Size 145.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
066e25b609e5122388eb215ca303f3c70abae10f0ec48bd222617c304199f7c6
BLAKE2b-256 checksum
How to use checksums
288427539979acaa9c90c1e5ac063139d6f0a2f17f4476bfe221599309e6a2fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.0 CPython/3.8.16

Security for principalmapper-0ca 1.1.5

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.1.5 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page