
Plataforma de investigación OSINT basada en grafos con análisis de línea de tiempo, gestión de entidades y transformaciones impulsadas por IA para descubrir conexiones ocultas entre correos electrónicos, nombres de usuario, imágenes y ubicaciones.

PANO es una potente plataforma de investigación OSINT que combina visualización de grafos, análisis de líneas de tiempo y herramientas impulsadas por IA para ayudarte a descubrir conexiones y patrones ocultos en tus datos.
Inicio Rápido • Características • Documentación • Contribuciones
https://github.com/user-attachments/assets/6b95e97a-ffdd-4056-b12b-f268d8e5d565
https://github.com/user-attachments/assets/af0c0f65-7b79-417c-a678-a789d42a6003
https://github.com/user-attachments/assets/568b4c28-be78-4559-a607-899fca2f9613
https://github.com/user-attachments/assets/6aa191eb-09de-41d5-b96f-4a2e32d6a0c2
https://github.com/user-attachments/assets/96377b80-e137-4eb4-9387-a0db4e49c2c1
https://github.com/user-attachments/assets/4228bda0-6c13-4ea9-bc07-d87abe367e10
Clona el repositorio:
git clone https://github.com/ALW1EZ/PANO.git
cd PANO
Ejecuta la aplicación:
./start_pano.shstart_pano.batEl script de inicio hará automáticamente:
Para usar la transformación de Búsqueda de Correo Electrónico, necesitas iniciar sesión con GHunt primero. Después de iniciar PANO mediante los scripts de inicio;
source venv/bin/activatecall venv\Scripts\activateVisualización de Grafos Interactiva
Análisis de Línea de Tiempo
Integración de Mapas
Análisis de Correo Electrónico
Análisis de Nombres de Usuario
Análisis de Imágenes
Las entidades son los componentes fundamentales de PANO. Representan piezas distintas de información que pueden ser conectadas y analizadas:
Tipos Incorporados
Sistema de Propiedades
Las transformaciones son operaciones automatizadas que procesan entidades para descubrir nueva información y relaciones:
Tipos de Operación
Características
Los ayudantes son herramientas especializadas con interfaces de usuario dedicadas para tareas de investigación específicas:
Ayudantes Disponibles
Características de los Ayudantes
¡Aceptamos contribuciones! Para contribuir a PANO:
Nota: Usamos una única rama
mainpara el desarrollo. Todos los pull requests deben hacerse directamente amain.
Las entidades son las estructuras de datos centrales en PANO. Cada entidad representa una pieza de información con propiedades y comportamientos específicos. Para crear una entidad personalizada:
entities (por ejemplo, entities/phone_number.py)from dataclasses import dataclass
from typing import ClassVar, Dict, Any
from .base import Entity
@dataclass
class PhoneNumber(Entity):
name: ClassVar[str] = "Phone Number"
description: ClassVar[str] = "A phone number entity with country code and validation"
def init_properties(self):
"""Initialize phone number properties"""
self.setup_properties({
"number": str,
"country_code": str,
"carrier": str,
"type": str, # mobile, landline, etc.
"verified": bool
})
def update_label(self):
"""Update the display label"""
self.label = self.format_label(["country_code", "number"])
Este proyecto está licenciado bajo la Licencia Creative Commons Atribución-NoComercial (CC BY-NC).
Eres libre de:
Bajo los siguientes términos:
Un agradecimiento especial a todos los autores de bibliotecas y colaboradores que hicieron posible este proyecto.
Creado por ALW1EZ con IA ❤️
Las transformaciones son operaciones que procesan entidades y generan nuevos conocimientos o relaciones. Para crear una transformación personalizada:
transforms (por ejemplo, transforms/phone_lookup.py)from dataclasses import dataclass
from typing import ClassVar, List
from .base import Transform
from entities.base import Entity
from entities.phone_number import PhoneNumber
from entities.location import Location
from ui.managers.status_manager import StatusManager
@dataclass
class PhoneLookup(Transform):
name: ClassVar[str] = "Phone Number Lookup"
description: ClassVar[str] = "Lookup phone number details and location"
input_types: ClassVar[List[str]] = ["PhoneNumber"]
output_types: ClassVar[List[str]] = ["Location"]
async def run(self, entity: PhoneNumber, graph) -> List[Entity]:
if not isinstance(entity, PhoneNumber):
return []
status = StatusManager.get()
operation_id = status.start_loading("Phone Lookup")
try:
# Your phone number lookup logic here
# Example: query an API for phone number details
location = Location(properties={
"country": "Example Country",
"region": "Example Region",
"carrier": "Example Carrier",
"source": "PhoneLookup transform"
})
return [location]
except Exception as e:
status.set_text(f"Error during phone lookup: {str(e)}")
return []
finally:
status.stop_loading(operation_id)
Los ayudantes son herramientas especializadas que proporcionan capacidades de investigación adicionales a través de una interfaz de usuario dedicada. Para crear un ayudante personalizado:
helpers (por ejemplo, helpers/data_analyzer.py)from PySide6.QtWidgets import (
QWidget, QVBoxLayout, QHBoxLayout, QPushButton,
QTextEdit, QLabel, QComboBox
)
from .base import BaseHelper
from qasync import asyncSlot
class DummyHelper(BaseHelper):
"""A dummy helper for testing"""
name = "Dummy Helper"
description = "A dummy helper for testing"
def setup_ui(self):
"""Initialize the helper's user interface"""
# Create input text area
self.input_label = QLabel("Input:")
self.input_text = QTextEdit()
self.input_text.setPlaceholderText("Enter text to process...")
self.input_text.setMinimumHeight(100)
# Create operation selector
operation_layout = QHBoxLayout()
self.operation_label = QLabel("Operation:")
self.operation_combo = QComboBox()
self.operation_combo.addItems(["Uppercase", "Lowercase", "Title Case"])
operation_layout.addWidget(self.operation_label)
operation_layout.addWidget(self.operation_combo)
# Create process button
self.process_btn = QPushButton("Process")
self.process_btn.clicked.connect(self.process_text)
# Create output text area
self.output_label = QLabel("Output:")
self.output_text = QTextEdit()
self.output_text.setReadOnly(True)
self.output_text.setMinimumHeight(100)
# Add widgets to main layout
self.main_layout.addWidget(self.input_label)
self.main_layout.addWidget(self.input_text)
self.main_layout.addLayout(operation_layout)
self.main_layout.addWidget(self.process_btn)
self.main_layout.addWidget(self.output_label)
self.main_layout.addWidget(self.output_text)
# Set dialog size
self.resize(400, 500)
@asyncSlot()
async def process_text(self):
"""Process the input text based on selected operation"""
text = self.input_text.toPlainText()
operation = self.operation_combo.currentText()
if operation == "Uppercase":
result = text.upper()
elif operation == "Lowercase":
result = text.lower()
else: # Title Case
result = text.title()
self.output_text.setPlainText(result)