Pivotr - A remote command execution framework
The aim of pivotr initially is to simplify the task of maintaining ssh connections throughout a network environment. These connections, which we refer to as 'nodes', are stored in an encrypted file as a list of objects. Each object currently only contains very basic data regarding each node, including a basic node ID (and consequently, the id of the node in the list), the node's IP address, and the option to append a username and password to the node if SSH credentials are known.
Stage 1 - Nodes:
- Implement basic node manipulation, including the ability to add, delete, modify, view nodes
- Implement basic node data persistance (in this case, pickling)
- Successfully send single SSH commands or make SSH connections to nodes with credentials
- Implement pivot functionality to where connections that require jumps between nodes are seamless
- Encrypt all stored data given the need for stored credentials to nodes
- Add 'mapping' functionality to display a basic map of connected nodes via CLI (aesthetically differentiates between nodes with credentials and nodes without)
- Add uploading/downloading to/from nodes via SCP
- Implement a 'snapshot' feature to allow us to save encrypted node data to be utilized later if necessary
- Introduce ping-sweep feature that scans for hosts on a node's subnet and adds all new discoveries as nodes without credentials
- Work on input validation and clean up code
Stage 2 - Agents:
- Implement a master server process to listen for incoming 'reverse' connections
- Add to node object variables in order to account for much larger data sets provided by agents (see next bullet point)
- Design 'agent' executables that, when run, connect back to our pivotr server. These agents will be the hallmark of any non-ssh functionality and will include features such as:
- The ability to harvest data from their respective hosts and transmit the data back to our pivotr server for safekeeping
- Remain persistent and callback to the pivotr server after a connection is lost
- Utilize IDS/IPS avoidance and obfuscation to maintain persistence
- Transmit data via encrypted channels
- Cross-platform, non-OS-specific implementation
- Integration into current node object schema and mapping functionality
Stage 3 - Profit
(back to top)
Setup
Pivotr has recently been ported to PyPI as a pipx download. Downloading pipx
:
sudo apt update
sudo apt install pipx
sudo dnf install pipx
sudo pacman -Sy python-pipx
brew install pipx
Download pivotr
via pipx
(which both isolates our python environment and also adds a symlink to our executable in the user's path):
pipx ensurepath
pipx install pivotr
(back to top)
Pivotr basics
Help:n
pivotr -h
Show map of all nodes we currently know about (hard lines are credentialed hosts, dotted lines have no credentials):
pivotr -m
โญโโโโโโโโโโโโโโโโโโฎ
โn0 - pivotr โ
โ 192.168.1.150 โ
โฐโโโโโโโโโโโโฌโโโโโโฏ
โ โญ โ โ โ โ โ โ โ โ โฎ
โโโโคn1 โ
โ โ 192.168.1.1 โ
โ โฐ โ โ โ โ โ โ โ โ โฏ
โ โญ โ โ โ โ โ โ โ โ โฎ
โโโโคn2 โ
โ โ 192.168.1.59 โ
โ โฐ โ โ โ โ โ โ โ โ โฏ
โ โญโโโโโโโโโโโโโโโโโโฎ
โโโโคn3 โ
โ โ 192.168.1.170 โ
โ โฐโโโโโโโโโโฌโโโโโโโโฏ
โ โ โญ โ โ โ โ โ โ โ โ โฎ
โ โโโโคn4 โ
โ โ โ 10.0.2.3 โ
โ โ โฐ โ โ โ โ โ โ โ โ โฏ
โ โ โญโโโโโโโโโโโโโโโโโโฎ
โ โโโโคn5 โ
โ โ โ 10.0.2.1 โ
โ โ โฐโโโโโโโโโโฌโโโโโโโโฏ
โ โ โ โญโโโโโโโโโโโโโโโโโโฎ
โ โ โฐโโโคn10 โ
โ โ โ 172.6.12.15 โ
โ โ โฐโโโโโโโโโโโโโโโโโโฏ
โ โ โญ โ โ โ โ โ โ โ โ โฎ
โ โโโโคn6 โ
โ โ โ 10.0.2.4 โ
โ โ โฐ โ โ โ โ โ โ โ โ โฏ
โ โ โญ โ โ โ โ โ โ โ โ โฎ
โ โโโโคn7 โ
โ โ โ 10.0.2.2 โ
โ โ โฐ โ โ โ โ โ โ โ โ โฏ
โ โ โญโโโโโโโโโโโโโโโโโโฎ
โ โฐโโโคn8 โ
โ โ 10.0.2.5 โ
โ โฐโโโโโโโโโโโโโโโโโโฏ
โ โญ โ โ โ โ โ โ โ โ โฎ
โฐโโโคn9 โ
โ 1.2.3.4 โ
โฐ โ โ โ โ โ โ โ โ โฏ
Since our host is node 0 (n0) by default, run a ping sweep from n0 to map our subnet (check to see if ping sweep was successfully by running pivotr -m
afterward):
pivotr -n0 -S
Add known SSH credentials to node 10:
pivotr -n10 -e
Current node values:
1) IP addr: 172.6.12.15
2) UN: jsmith
3) PW:
4) Exit:
Select property to edit: 3
New password: ************
Node 10 successfully modified.
Send command uname -a
to node 10 via SSH:
pivotr -n10 -c "uname -a"
Make SSH connection to node 10:
pivotr -n10 -i
jsmith@172.6.12.15$
Save our current node data set for later use in ./snapshots directory:
pivotr -s
Use a data set from ./snapshots (which replaces current data set at /tmp/nodes.data):
./pivotr -f ./snapshots/2024-01-15_114534-nodes.data
(back to top)
Contact
Maturon Miner - maturon@gmail.com
(back to top)