mirror of
https://github.com/NetSPI/PowerHuntShares.git
synced 2025-05-05 03:38:42 +02:00
Update PowerHuntShares.psm1
Added graph filters.
This commit is contained in:
parent
349ba8c50f
commit
40883b42bc
@ -4,7 +4,7 @@
|
|||||||
#--------------------------------------
|
#--------------------------------------
|
||||||
# Author: Scott Sutherland, 2024 NetSPI
|
# Author: Scott Sutherland, 2024 NetSPI
|
||||||
# License: 3-clause BSD
|
# License: 3-clause BSD
|
||||||
# Version: v1.123
|
# Version: v1.124
|
||||||
# References: This script includes custom code and code taken and modified from the open source projects PowerView, Invoke-Ping, and Invoke-Parrell.
|
# References: This script includes custom code and code taken and modified from the open source projects PowerView, Invoke-Ping, and Invoke-Parrell.
|
||||||
function Invoke-HuntSMBShares
|
function Invoke-HuntSMBShares
|
||||||
{
|
{
|
||||||
@ -6907,22 +6907,60 @@ Folder groups are SMB shares that contain the exact same file listing. Each fold
|
|||||||
|
|
||||||
<!-- Tab 1 Content (Toolbar Content) -->
|
<!-- Tab 1 Content (Toolbar Content) -->
|
||||||
<div id="tab1Content" class="tab-content">
|
<div id="tab1Content" class="tab-content">
|
||||||
|
|
||||||
|
<div style="color: #07142A; font-size: 12px; font-weight: bold; margin-bottom: 5px;">Seach Nodes</div>
|
||||||
<input type="text" id="search-input" placeholder="Search nodes..." class="modern-input" style="width: 180px;">
|
<input type="text" id="search-input" placeholder="Search nodes..." class="modern-input" style="width: 180px;">
|
||||||
<input type="text" id="src-node" placeholder="src-node..." class="modern-input" style="width: 180px;">
|
<input type="range" min="0" max="5" value="0" class="modern-slider" id="mySlider" style="width:160px; margin-top: 12px;"> <span id="sliderValue">0</span>
|
||||||
<input type="text" id="dst-node" placeholder="dst-node..." class="modern-input" style="width: 180px;">
|
|
||||||
<button id="find-path" class="modern-button" style="width: 176px;">Find Path</button>
|
<div style="border-bottom: none; height: 5px; width: 100%; margin-bottom: 4px;"></div>
|
||||||
<div style="border-bottom: .5px solid #e3e4e6; height: 5px; width: 100%; margin-bottom: 5px;"></div>
|
|
||||||
<div id="buttonsleft" style="margin-left:2">
|
<div style="color: #07142A; font-size: 12px; font-weight: bold; margin-bottom: 5px;">Find Paths</div>
|
||||||
<button id="save-button" class="modern-button" style="width: 170px;" style="font-size: 11px;">Save as Image</button><br>
|
<input type="text" id="src-node" placeholder="source node..." class="modern-input" style="width: 180px;">
|
||||||
|
<input type="text" id="dst-node" placeholder="target node..." class="modern-input" style="width: 180px;">
|
||||||
|
<button id="find-path" class="modern-button" style="width: 176px;margin-top: 8px;">Find Path</button>
|
||||||
|
|
||||||
|
<div style="border-bottom: .5px solid #e3e4e6; height: 5px; width: 100%; margin-bottom: 4px;"></div>
|
||||||
|
|
||||||
|
<div id="buttonsleft" style="">
|
||||||
|
<button id="save-button" class="modern-button" style="width: 176px;" style="font-size: 11px;">Save as Image</button><br>
|
||||||
</div>
|
</div>
|
||||||
<div style="border-bottom: .5px solid #e3e4e6; height: 5px; width: 100%; margin-bottom: 10px;"></div>
|
|
||||||
<div style="margin-bottom: 0px;margin-top: 15px;">Blast Radius</div>
|
|
||||||
<input type="range" min="0" max="5" value="0" class="modern-slider" id="mySlider" style="width:160px;"> <span id="sliderValue">0</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tab 2 Content (Hello) -->
|
<!-- Tab 2 Content -->
|
||||||
<div id="tab2Content" class="tab-content" style="display: none;">
|
<div id="tab2Content" class="tab-content" style="display: none;">
|
||||||
<p>Filters coming soon.</p>
|
<div style="color: #07142A; font-size: 12px; font-weight: bold; margin-bottom: 10px;">Node Types</div>
|
||||||
|
<div style="color: #07142A; font-size: 10px; display: flex; flex-wrap: wrap; background-color: #e6e6e6; border-radius: 4px; margin-bottom: 10px;">
|
||||||
|
<div style="flex: 1 0 50%;">
|
||||||
|
<label><input type="checkbox" id="FilterNodeIdentity" checked style="transform: scale(0.8);margin-left: 8px;">Identity</label>
|
||||||
|
</div>
|
||||||
|
<div style="flex: 1 0 50%;">
|
||||||
|
<label><input type="checkbox" id="FilterNodeComputer" checked style="transform: scale(0.8);margin-left: 8px;">Computer</label>
|
||||||
|
</div>
|
||||||
|
<div style="flex: 1 0 50%;">
|
||||||
|
<label><input type="checkbox" id="FilterNodeShareName" checked style="transform: scale(0.8);margin-left: 8px;">Share Name</label>
|
||||||
|
</div>
|
||||||
|
<div style="flex: 1 0 50%;">
|
||||||
|
<label><input type="checkbox" id="FilterNodeSharePath" checked style="transform: scale(0.8);margin-left: 8px;">Share Path</label>
|
||||||
|
</div>
|
||||||
|
<div style="flex: 1 0 50%;">
|
||||||
|
<label><input type="checkbox" id="FilterNodeFolderGroup" checked style="transform: scale(0.8); margin-left: 8px;">Folder Group</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="color: #07142A; font-size: 12px; font-weight: bold; margin-bottom: 10px;">Edge Types</div>
|
||||||
|
<div style="color: #07142A; font-size: 10px; display: flex; flex-wrap: wrap; background-color: #e6e6e6; border-radius: 4px;">
|
||||||
|
<div style="flex: 1 0 50%;">
|
||||||
|
<label><input type="checkbox" id="FilterEdgeOwner" checked style="transform: scale(0.8); margin-left: 8px;">owner_of</label>
|
||||||
|
</div>
|
||||||
|
<div style="flex: 1 0 50%;">
|
||||||
|
<label><input type="checkbox" id="FilterEdgePriv" checked style="transform: scale(0.8); margin-left: 8px;">has_privilege_on</label>
|
||||||
|
</div>
|
||||||
|
<div style="flex: 1 0 50%;">
|
||||||
|
<label><input type="checkbox" id="FilterEdgeHosted" checked style="transform: scale(0.8); margin-left: 8px;">hosted_on</label>
|
||||||
|
</div>
|
||||||
|
<div style="flex: 1 0 50%;">
|
||||||
|
<label><input type="checkbox" id="FilterEdgeChild" checked style="transform: scale(0.8); margin-left: 8px;">child_of</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tab 3 Content (Hello) -->
|
<!-- Tab 3 Content (Hello) -->
|
||||||
@ -6952,14 +6990,15 @@ Folder groups are SMB shares that contain the exact same file listing. Each fold
|
|||||||
<option value="taxi">Taxi</option>
|
<option value="taxi">Taxi</option>
|
||||||
<option value="straight-triangle">Straight-Triangle</option>
|
<option value="straight-triangle">Straight-Triangle</option>
|
||||||
</select>
|
</select>
|
||||||
<label><input type="checkbox" id="toggle-edge-labels" checked> Show Edge Labels</label>
|
<div style="color: #07142A; margin-top: 8px; margin-bottom: 6px;font-size: 10px; display: flex; flex-wrap: wrap; background-color: #e6e6e6; border-radius: 4px;">
|
||||||
<label><input type="checkbox" id="toggle-node-labels" checked> Show Node Labels</label>
|
<label><input type="checkbox" id="toggle-edge-labels" checked style="transform: scale(0.8); margin-left: 8px;"> Show Edge Labels</label>
|
||||||
<label><input type="checkbox" id="toggle-visibility"> Hide Unselected</label>
|
<label><input type="checkbox" id="toggle-node-labels" checked style="transform: scale(0.8); margin-left: 8px;"> Show Node Labels</label>
|
||||||
<div style="border-bottom: .5px solid #e3e4e6; height: 5px; width: 100%; margin-bottom: 5px;"></div>
|
<label><input type="checkbox" id="toggle-visibility" style="transform: scale(0.8); margin-left: 8px;"> Hide Unselected</label>
|
||||||
<div id="buttonsleft" style="margin-left:2">
|
</div>
|
||||||
<button id="clear-selection" class="modern-button" onclick="ResetGraph();" style="font-size: 11px"> Reset </button>
|
<div id="buttonsleft">
|
||||||
|
<button id="clear-selection" class="modern-button" onclick="ResetGraph();" style="font-size: 12px"> Reset </button>
|
||||||
<button id="removeFadedClassButton" class="modern-button" style="font-size: 11px"> Show All </button><br>
|
<button id="removeFadedClassButton" class="modern-button" style="font-size: 11px"> Show All </button><br>
|
||||||
<button id="zoom-in" class="modern-button" style="font-size: 11px"> Zoom In </button>
|
<button id="zoom-in" class="modern-button" style="font-size: 12px"> Zoom In </button>
|
||||||
<button id="zoom-out" class="modern-button" style="font-size: 11px">Zoom Out </button>
|
<button id="zoom-out" class="modern-button" style="font-size: 11px">Zoom Out </button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -7654,6 +7693,17 @@ Folder groups are SMB shares that contain the exact same file listing. Each fold
|
|||||||
|
|
||||||
// Set Selected to ""
|
// Set Selected to ""
|
||||||
document.getElementById('selected-node').innerHTML = 'None';
|
document.getElementById('selected-node').innerHTML = 'None';
|
||||||
|
|
||||||
|
// Reset all filters
|
||||||
|
document.getElementById('FilterNodeIdentity').checked = true; // Set the checkbox to checked
|
||||||
|
document.getElementById('FilterNodeComputer').checked = true; // Set the checkbox to checked
|
||||||
|
document.getElementById('FilterNodeShareName').checked = true; // Set the checkbox to checked
|
||||||
|
document.getElementById('FilterNodeSharePath').checked = true; // Set the checkbox to checked
|
||||||
|
document.getElementById('FilterNodeFolderGroup').checked = true; // Set the checkbox to checked
|
||||||
|
document.getElementById('FilterEdgeOwner').checked = true; // Set the checkbox to checked
|
||||||
|
document.getElementById('FilterEdgePriv').checked = true; // Set the checkbox to checked
|
||||||
|
document.getElementById('FilterEdgeHosted').checked = true; // Set the checkbox to checked
|
||||||
|
document.getElementById('FilterEdgeChild').checked = true; // Set the checkbox to checked
|
||||||
}
|
}
|
||||||
|
|
||||||
// #################################
|
// #################################
|
||||||
@ -8301,7 +8351,9 @@ Folder groups are SMB shares that contain the exact same file listing. Each fold
|
|||||||
function updateLabelsVisibility() {
|
function updateLabelsVisibility() {
|
||||||
var showEdgeLabels = document.getElementById('toggle-edge-labels').checked;
|
var showEdgeLabels = document.getElementById('toggle-edge-labels').checked;
|
||||||
var showNodeLabels = document.getElementById('toggle-node-labels').checked;
|
var showNodeLabels = document.getElementById('toggle-node-labels').checked;
|
||||||
|
var showHideUnselected = document.getElementById('toggle-visibility').checked;
|
||||||
|
|
||||||
|
// Apply faded and invisible class styles
|
||||||
cy.edges().forEach(function (edge) {
|
cy.edges().forEach(function (edge) {
|
||||||
if (edge.hasClass('faded') || edge.hasClass('invisible')) {
|
if (edge.hasClass('faded') || edge.hasClass('invisible')) {
|
||||||
edge.style('text-opacity', 0); // Hide label if faded or invisible
|
edge.style('text-opacity', 0); // Hide label if faded or invisible
|
||||||
@ -8317,8 +8369,46 @@ Folder groups are SMB shares that contain the exact same file listing. Each fold
|
|||||||
node.style('text-opacity', showNodeLabels ? 1 : 0); // Show or hide based on the checkbox
|
node.style('text-opacity', showNodeLabels ? 1 : 0); // Show or hide based on the checkbox
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
|
// Get filter settings
|
||||||
|
var FilterNodeIdentity = document.getElementById('FilterNodeIdentity').checked;
|
||||||
|
var FilterNodeComputer = document.getElementById('FilterNodeComputer').checked;
|
||||||
|
var FilterNodeShareName = document.getElementById('FilterNodeShareName').checked;
|
||||||
|
var FilterNodeSharePath = document.getElementById('FilterNodeSharePath').checked;
|
||||||
|
var FilterNodeFolderGroup = document.getElementById('FilterNodeFolderGroup').checked;
|
||||||
|
var FilterEdgeOwner = document.getElementById('FilterEdgeOwner').checked;
|
||||||
|
var FilterEdgePriv = document.getElementById('FilterEdgePriv').checked;
|
||||||
|
var FilterEdgeHosted = document.getElementById('FilterEdgeHosted').checked;
|
||||||
|
var FilterEdgeChild = document.getElementById('FilterEdgeChild').checked;
|
||||||
|
|
||||||
|
// Define array of filter variables with corresponding element IDs and their types
|
||||||
|
var filters = [
|
||||||
|
{ id: 'FilterNodeIdentity', type: 'user' },
|
||||||
|
{ id: 'FilterNodeIdentity', type: 'owner' },
|
||||||
|
{ id: 'FilterNodeComputer', type: 'computer' },
|
||||||
|
{ id: 'FilterNodeShareName', type: 'sharename' },
|
||||||
|
{ id: 'FilterNodeSharePath', type: 'sharepath' },
|
||||||
|
{ id: 'FilterNodeFolderGroup', type: 'Folder Group' },
|
||||||
|
{ id: 'FilterEdgeOwner', type: 'owner_of' },
|
||||||
|
{ id: 'FilterEdgePriv', type: 'has_privilege_on' },
|
||||||
|
{ id: 'FilterEdgeHosted', type: 'hosted_on' },
|
||||||
|
{ id: 'FilterEdgeChild', type: 'child_of' }
|
||||||
|
];
|
||||||
|
|
||||||
|
// Iterate through each filter
|
||||||
|
filters.forEach(function(filter) {
|
||||||
|
|
||||||
|
// Get the checkbox element and check if it's unchecked
|
||||||
|
var isChecked = document.getElementById(filter.id).checked;
|
||||||
|
if (!isChecked) {
|
||||||
|
|
||||||
|
// Add invisible class to nodes or edges based on filter type
|
||||||
|
cy.elements("[type = '" + filter.type + "']").addClass('invisible')
|
||||||
|
.connectedEdges().addClass('invisible');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Toggle faded visibility
|
// Toggle faded visibility
|
||||||
document.getElementById('toggle-visibility').addEventListener('change', function () {
|
document.getElementById('toggle-visibility').addEventListener('change', function () {
|
||||||
@ -8531,7 +8621,6 @@ Folder groups are SMB shares that contain the exact same file listing. Each fold
|
|||||||
selectedEdges.removeClass('faded');
|
selectedEdges.removeClass('faded');
|
||||||
});
|
});
|
||||||
|
|
||||||
// Event listener for the "Center" option from the nodemenu
|
|
||||||
// Event listener for the "Center" option from the nodemenu
|
// Event listener for the "Center" option from the nodemenu
|
||||||
document.querySelector('#nodemenu a:nth-child(2)').addEventListener('click', function () {
|
document.querySelector('#nodemenu a:nth-child(2)').addEventListener('click', function () {
|
||||||
// Determine the centroid node
|
// Determine the centroid node
|
||||||
@ -8646,9 +8735,136 @@ document.querySelector('#nodemenu a:nth-child(2)').addEventListener('click', fun
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------
|
||||||
|
// Filter Option Listeners
|
||||||
|
// ----------------------------
|
||||||
|
|
||||||
|
// Function to update nodes and edges based on applied filter
|
||||||
|
function applyNodeFilter(filterElementName, type) {
|
||||||
|
|
||||||
|
// Get visibility settings
|
||||||
|
var showEdgeLabels = document.getElementById('toggle-edge-labels').checked;
|
||||||
|
var showNodeLabels = document.getElementById('toggle-node-labels').checked;
|
||||||
|
var showHideUnselected = document.getElementById('toggle-visibility').checked;
|
||||||
|
|
||||||
|
// Get the checkbox element and check if it's unchecked
|
||||||
|
var isChecked = document.getElementById(filterElementName).checked;
|
||||||
|
|
||||||
|
if (isChecked) {
|
||||||
|
|
||||||
|
// Remove hide unselected class or faded as needed
|
||||||
|
if(!showHideUnselected){
|
||||||
|
cy.nodes("[type = '" + type + "']").removeClass('invisible')
|
||||||
|
.connectedEdges().removeClass('invisible');
|
||||||
|
}else{
|
||||||
|
cy.nodes("[type = '" + type + "']").removeClass('faded')
|
||||||
|
.connectedEdges().removeClass('faded');
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Add hide unselected class or faded as needed
|
||||||
|
cy.nodes("[type = '" + type + "']").addClass('invisible')
|
||||||
|
.connectedEdges().addClass('invisible'); // Also add classes to connected edges
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update counts
|
||||||
|
updateCounts();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to update edges and connected nodes based on applied filter
|
||||||
|
function applyEdgeFilter(filterElementName, type) {
|
||||||
|
|
||||||
|
// Get visibility settings
|
||||||
|
var showEdgeLabels = document.getElementById('toggle-edge-labels').checked;
|
||||||
|
var showNodeLabels = document.getElementById('toggle-node-labels').checked;
|
||||||
|
var showHideUnselected = document.getElementById('toggle-visibility').checked;
|
||||||
|
|
||||||
|
// Get the checkbox element and check if it's unchecked
|
||||||
|
var isChecked = document.getElementById(filterElementName).checked;
|
||||||
|
|
||||||
|
if (isChecked) {
|
||||||
|
// Remove hide unselected class or faded as needed
|
||||||
|
if(!showHideUnselected){
|
||||||
|
cy.edges("[label = '" + type + "']").removeClass('invisible')
|
||||||
|
} else {
|
||||||
|
cy.edges("[label = '" + type + "']").removeClass('faded')
|
||||||
|
.connectedNodes().removeClass('faded');
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
cy.edges("[label = '" + type + "']").addClass('invisible');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update counts
|
||||||
|
updateCounts();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Computer Filter Listener
|
||||||
|
document.getElementById('FilterNodeComputer').addEventListener('change', function () {
|
||||||
|
|
||||||
|
// Apply the filter
|
||||||
|
applyNodeFilter('FilterNodeComputer', 'computer');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Identity Filter Listener
|
||||||
|
document.getElementById('FilterNodeIdentity').addEventListener('change', function () {
|
||||||
|
|
||||||
|
// Apply the filter
|
||||||
|
applyNodeFilter('FilterNodeIdentity', 'user');
|
||||||
|
applyNodeFilter('FilterNodeIdentity', 'owner');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Share Name Filter Listener
|
||||||
|
document.getElementById('FilterNodeShareName').addEventListener('change', function () {
|
||||||
|
|
||||||
|
// Apply the filter
|
||||||
|
applyNodeFilter('FilterNodeShareName', 'sharename');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Share Path Filter Listener
|
||||||
|
document.getElementById('FilterNodeSharePath').addEventListener('change', function () {
|
||||||
|
|
||||||
|
// Apply the filter
|
||||||
|
applyNodeFilter('FilterNodeSharePath', 'sharepath');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Folder Group Filter Listener
|
||||||
|
document.getElementById('FilterNodeFolderGroup').addEventListener('change', function () {
|
||||||
|
|
||||||
|
// Apply the filter
|
||||||
|
applyNodeFilter('FilterNodeFolderGroup', 'Folder Group');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Owner Edge Filter Listener
|
||||||
|
document.getElementById('FilterEdgeOwner').addEventListener('change', function () {
|
||||||
|
|
||||||
|
// Apply the filter
|
||||||
|
applyEdgeFilter('FilterEdgeOwner', 'owner_of');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Has_privilege_on Filter Listener
|
||||||
|
document.getElementById('FilterEdgePriv').addEventListener('change', function () {
|
||||||
|
|
||||||
|
// Apply the filter
|
||||||
|
applyEdgeFilter('FilterEdgePriv', 'has_privilege_on');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Hosted_on Edge Filter Listener
|
||||||
|
document.getElementById('FilterEdgeHosted').addEventListener('change', function () {
|
||||||
|
|
||||||
|
// Apply the filter
|
||||||
|
applyEdgeFilter('FilterEdgeHosted', 'hosted_on');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Child_of Edge Filter Listener
|
||||||
|
document.getElementById('FilterEdgeChild').addEventListener('change', function () {
|
||||||
|
|
||||||
|
// Apply the filter
|
||||||
|
applyEdgeFilter('FilterEdgeChild', 'child_of');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Filter Option Listeners - END
|
||||||
|
|
||||||
|
|
||||||
// Set curve style
|
// Set curve style
|
||||||
|
Loading…
x
Reference in New Issue
Block a user