Giter VIP home page Giter VIP logo

echosounder's People

Contributors

1ntegrxl avatar alexcombessie avatar alixcheval avatar cjimti avatar crystalrays avatar danielmiessler avatar darcosion avatar derekcollison avatar dominikangerer avatar dominikh avatar egoist avatar foxboron avatar jerryuhoo avatar jhodges10 avatar patrickbaus avatar routeur avatar rubenkelevra avatar sindresorhus avatar wrk226 avatar zzxiang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

sc979

echosounder's Issues

titre "echosounder" stylisé

Actuellement le titre placé dans le <header> est dans une police normale avec quasiment aucun style. J'ai légèrement modifié la forme du titre pour qu'il colle au reste, mais placer des styles appropriés serait intéressant.

Implémentation d'une fonctionnalité de resolve LLMNR

Implémenter une technique de resolve autour de LLMNR pour les machines Windows. Cette technique va permettre notamment de récupérer un hostname. Il est aussi possible de récupérer d'autres informations (à voir). Si vous avez d'autres idées mettez les ici.

Mise en place d'un set d'icone menu

Actuellement, les menu sont actionnables depuis des petits carrés à droite & gauche.

Je propose d'ajouter dans ces carrés des images SVG ou PNG disposant de petites icônes qui indiquerais le type de chaque menu proposé (réseau, machine, autre, visu machine, visu service, visu autre).

Implémenter la fonctionnalité de scan traceroute pour la découverte de réseau multiples

Cette issue devrait (de bon alloi) être résolue après #43
Actuellement, on scan uniquement le réseau local sur lequel on se situe.

Or on pourrais récupérer la liste des réseaux locaux pour avoir plus de visibilité. De plus du fuzzing d'IP local en traceroute permettrait la découverte de réseaux locaux cachés (dont les routes ne sont pas transmises par les routeurs locaux).

Voici une liste d'élément à implémenter :

  • fonction de traceroute classique scapy (https://scapy.readthedocs.io/en/latest/usage.html#tcp-traceroute)
  • Route API retournant pour une cible son traceroute pour une IP
  • Route API retournant pour une cible son traceroute pour un CIDR
  • Implémentation front du bouton de scan traceroute pour un CIDR
  • Implémentation front du bouton de scan traceroute pour une IP
  • Affichage/rendu graph pour les résultats de scan traceroute

Visualisation basique d'information lié à un noeud

Actuellement, les noeuds mettent dans un attribut "data" les informations qui lui sont associés.

Cet attribut pourrait être employé pour permettre un affichage détaillé aux utilisateur des informations associés à un noeud dans un panel spécifique (à droite ? ).

Une implémentation naïve de la fonctionnalité va être réalisé afin de s'approprier cette fonctionnalité et couvrir ses cas d'usages.

Ajouter un resetCSS

Actuellement, il n'y a pas de reset CSS, on peut donc avoir potentiellement des colisions en fonction de l'approche d'affichage de chaque navigateur.

Je propose d'ajouter un fichier de reset CSS au lancement afin d'avoir un modèle de construction unifié.

Implémentation de "scan" DHCP

Implémenter fonctionnalité de scan DHCP. Permet notamment d'extraire les champs :

  • Type d'OS.
  • Vendor ID.

Il serait intéressant de regarder ce qu'on pourrait faire avec ce genre d'information (Vendor ID) et quelles sont les types d'attaques possibles si un attaquant dispose de cette information.

Appel continu de la découverte réseau

Actuellement le front appelle la découverte réseau continuellement, ce qui était considéré comme une fonctionnalité (affichage temps réel), mais que je considère comme un bug.

Il faut donc remplacer la découverte réseau automatique par une interface de découverte.

Ajout d'un /health

Actuellement, l'API ne dispose pas de fonctionnalités permettant d'assurer un debug propre, il serait intéressant de rajouter une route indiquant au front l'état du backend sous la forme GET /health. Et coté front, une fonction qui à l'ouverture de la page, en vérifie l'état et donne à l'utilisation l'information sur le sujet.

Voici une suite de fonctionnalité décrite formellement :

  • fonction de vérification des dépendances python & shell (nmap)
  • route API flask /health
  • fonction d'appel de /health coté front
  • appel de la fonction et affichage d'un toast à l'utilisateur
  • ajout de bouton dans le 3ème menu du panel de droite pour requêter l'API

Intégration de découverte de service dans l'interface

Une fois l'issue #5 réalisé, ajouter dans l'interface la possibilité pour une IP ou pour un bulk d'IP de faire la découverte de leurs services pour aller plus loin dans l'analyse.

Dans l'idée, un nmap agressif spécifique à chaque machine pourrais être lancé lorsque demandé.

widget & composant de notification d'actions backend

Un widget indiquant via de petites notification en bas de page les effets donné au backend serait utilise pour que l'utilisateur puisse avoir connaissance de problèmes ou des effets de ce sur quoi il clic.

Gestion du placement de machine sur graph en fonction des données liés

Actuellement, un soucis réside quand à la façon dont on effectue les affichages :

Il n'existe que deux méthodes de scan et si l'une renvoie un certain nombre de donnée sur une machine, l'autre n'actualise pas lesdites données.

De la même façon, si pour une même adresse mac, deux IP sont renvoyés, alors deux machines s'afficheront dans le réseau.

Il faut donc trouver une solution à la problématique de l'affichage cohérent.

Une façon de faire serait de décorréler les "noeuds" de la notion d'IP ou d'adresse MAC. Cela en plaçant une fonction intermédiaire qui s'occuperait de construire des noeuds en fonction d'un ensemble d'information (IP, MAC, méta données) lié à la topologie du réseau.

Une autre façon serait de travailler dans une fonction intermédiaire la notion de couple IP-MAC pour trouver un moyen de lier les IP ayant la même mac dans une notion de réseau rapproché.

Graphe, englobage des subnet

Actuellement, un subnet qui peut potentiellement englober un autre (un /20 englobant un /24) ne l'englobe pas. Une fonctionnalité de reconstruction du réseau avec l'assemblage des subnet serait intéressante.

Travaux visuels sur la logique de quadrillage

Actuellement, le quadrillage est fixé, chaque carré fait 62 pixels de taille.

Cela génère un défaut bête : les écrans et les pages proposés ne sont pas en nombre de pixel des multiples de 62 pixels.

Si l'on souhaite avoir des boites de travaille de tailles multiples à 62 pixels, nous allons avoir des soucis comme cela :
soucis

Il y aurait plusieurs solutions à cela :

  • Trouver un multiple cohérent pour l'ensemble des tailles d'écran possibles
  • utiliser des propriétés CSS pour régler automatiquement la taille de pixels des blocs en multiples de taille d'écran
  • autres solutions ?

A priori, l'idée intéressante serait de prendre une taille d'écran X * Y et de dire qu'on divise cette taille par le nombre de blocs que l'on souhaite (64 par exemple ?), ce qui donnerait (X * Y) / 64 = nb de pixels d'un bloc ?

Donc en utilisant des propriétés CSS comme :

--nb_bloc : 64;
--size_bloc : calc(calc(100vh * 100vw) / 64);

Pour définir des variables que l'on pourrais utiliser, cela me semblerais possible ?

Implémenter la découverte via SMB

Cette phase consiste en l'implémentation des fonctions permettant d'extraire des informations intéressantes via SMB. Les informations qu'on peut retirer sont :

  • Domain.
  • Forest.
  • Hostname.
  • Les shares disponibles.
  • Le type d'OS.

Ajout d'options de scan en fonction de la range de port

Actuellement, depuis la résolution de l'issue #5 on scan une machine sur ses ports 0-400 uniquement. Proposer à l'utilisateur des variations pour les scans de port comme nmap le propose serait bien plus intéressant. Les widgets du second menu devront être retravaillés en conséquence.

Interface de découverte réseau

Actuellement, le programme s'ouvre et affiche le réseau ciblé.

L'objectif va être de construire un panel d'interface avec un ensemble de fonctionnalité de découverte réseau.

Pour cela, il est nécessaire de :

  • Créer un panel au niveau design qui s'ouvre et se referme #15
  • Ajouter des widgets visuels de formulaire de scan
  • ajouter une animation de requête & une animation de retour de requête (éventuellement une animation de chargement de requête) #20
  • Implémenter les appels backend nécessaires (pour le moment seulement deux routes, le scan arp et le fast scan)

option de suppression de noeud dans le graphe

Quand un nœud est inutile, il serait de bon aloi de le supprimer, cette fonctionnalité pourrait être rajouté dans le menu "Manipulations du graph" et proposer une vue avec le titre du nœud ainsi que son logo afin d'être certain de ce que l'on supprime.

Remplacement de la lib de graph proposé par une plus adapté au modèle

Je suis globalement instatisfait de visjs qui a été choisi en premier pour des raisons d'accessibilité du code visjs comparé à d'autres lib.

Si on regarde de près les exemples de visjs : https://visjs.github.io/vis-network/examples/
On constate que l'attention est portée sur la capacité à faire des représentations techniques intéressantes à moindre coup basés sur un JSON varié en terme de structure de donnée.

D'autres approches comme celles de la lib cytoscape me semble plus intéressantes (construction non agnostique JSON avec intégration de propriétés plus variés dans le fonctionnement interne des nodes/edges).

Une tentative d'implémentation va être effectué pour voir si le fonctionnement de cytoscape serait plus adapté.

identification de machine unique via nmap

Actuellement, dans le code il y a cette fonctionnalité qui n'est pas exploité :

Echosounder/echosounder.py

Lines 152 to 160 in 12fada4

def creation_data_nmap(ip_address) -> dict:
machine_specs: tuple = out_in_json(ip_address)
return {
"IP": ip_address,
"nom": machine_specs[0],
"vendeur": machine_specs[1],
"osfamily": machine_specs[2],
"accuracy": machine_specs[3],
}

Elle sert à déterminer quel est le niveau de "confiance" d'un scan identifiant le type de device que l'on a en face.

Cette issue vise à implémenter sa route API ainsi que son implémentation vis a vis du front.

police de caractères spécifiques

Cette issue vise à trouver les polices de caractères sympa pour l'affichage des éléments visuels.

Actuellement, des recherches ont été faites pour retrouver une police similaire à celle de Arkham Night, sans succès, voir #3 (comment).

La question des différentes couleurs de text se pose aussi par ailleurs.

Implémentation de découverte via NTP

Le but est de récupérer des informations concernant :

  • 600 anciens clients.
  • peer NTP, synchro IP.
  • IP clients.

Cette découverte me parait un peu flou, je sais pas comment elle peut être exploité et utilisé. Si quelqu'un a des ressources sur le sujet ou des idées.

Spécifier l'IP + CIDR dans l'interface front avant scan

Actuellement, l'IP + CIDR 192.168.0.0/24 est spécifié en dur. C'est une erreur car un réseau local peut prendre une forme très diverse suivant la gateway et le DHCP qui nous donne les indications ainsi que les routes qui sont donnés sur la machine.

Il faut donc spécifier ces éléments là depuis l'interface web pour s'éviter un maximum de problèmes.

Dépassement de taille de fenêtre par menu de gauche

Actuellement, le menu de gauche quand il contient trop d'informations, dépasse la taille de l'écran et crée un effet de scrolling malvenu.

scroll
On voit bien la barre de scroll tout à droite qui casse tout le styling effectué sur la page et induit un resizing du viewport de la fenêtre entière.

idéalement, une barre de scrolling présent dans le menu de gauche serait plus approprié car il permettrait de ne pas avoir de risque de scroll sur l'écran entier.

L'HTML sur lequel travailler se situe ici :

<div class="d-flex flex-wrap echo_menu_right echo_node_data ng-hide" ng-show="showMenu1">
<div class="container echo_menu_title">Visualisation données de machines</div>
<pre>{{"{{nodedata | json}}"}}</pre>
</div>

La classe la plus proche de notre problématique est la classe echo_menu_right en CSS, néanmoins, une nouvelle classe pour gérer les overflow serait peut-être approprié car elle serait généralisable à l'ensemble des menu.

Refactoring des aspect visuels de graphs

Actuellement, le graph se présente sous la forme d'un ensemble de "bulles" de taille différentes.

C'est assez moche en plus de ne pas faciliter le travail de placement de graph, je propose une refonte complète de cet aspect là.

Fonction d'actualisation du layout

Actuellement, le layout est actualisé lorsque l'on génère un scan général, un bouton permettant d'actualiser le placement layout serait intéressant.

Intégration des services dans la vue front graphe

Actuellement, les services liés à une IP sont représentés sous la forme de donnée dans sa variable data. Depuis la résolution de l'issue #5

Nous avons pour objectif de les mettre dans des nœuds liés à l'IP afin de les associer visuellement.

Ajout de titre à chaque menu

Actuellement, l'utilisateur doit deviner ce que fait chaque menu en cliquant dessus. Un nommage par titre visuel pour chaque menu résoudrais une partie des problèmes que cela engendre.

Refacto du code JSON de scan de service

Le code JSON de scan de service est imbriqué dans du protocol -> port -> data

refaire cela en simple liste contenant le protocol et le port serait beaucoup plus propre pour le front.

Mise en place d'un set d'icone de node

Actuellement, une machine a un nœud octogonal avec un fond vert et c'est tout.

Pour différencier les machines, il serait intéressant de mettre en background-image des SVG ou des PNG associé pour chacun à des types de machine génériques, comme "poste utilisateur", "server", "router", "mobile device", etc...

Cette partie de la documentation cytoscape est à prendre en considération obligatoirement btw : https://js.cytoscape.org/#style/background-image

Implémentation de découverte via SSH

Cette phase permet d'implémenter les fonctions nécessaires à l'extraction d'informations via le protocole SSH. Il est possible d'utiliser HASSH pour obtenir des informations telles que :

  • OS.
  • Server type/version.

En utilisant le fingerprint ssh.

Remplacement du code VanillaJS pur par du code AngularJS

Actuellement, toute la partie JS a été développé from scratch en visjs sans faire appel à du code AngularJS pour profiter des fonctionnements des directives, components & constructeurs AngularJS.

Je propose de faire une refactoring afin de faciliter les échanges "front-back-end" ainsi que les échanges entre les différents composants de la page au niveau javascript.

Bug énumération de service, fonction python nmap crash en cas de cible down

Actuellement, il manque un try catch dans le cas où une machine scanné ne répond pas.

Cette ligne crash :

all_protocols_found: List[str] = nm[ip_list[i]].all_protocols()

En raison de l'absence de l'IP dans nm puisqu'elle n'a pas pu être scanné.
Cela peut être identifié via le retour de commande nmap :

{
    "nmap": {
        "command_line": "nmap -oX - -p 0-400 -sV 192.168.1.9",
        "scaninfo": {
            "tcp": {
                "method": "syn",
                "services": "0-400"
            }
        },
        "scanstats": {
            "timestr": "Sun Mar 13 18:09:42 2022",
            "elapsed": "0.67",
            "uphosts": "0",
            "downhosts": "1",
            "totalhosts": "1"
        }
    },
    "scan": {}
}

Néanmoins, le downhosts n'aidera pas dans un cas de scan multiples...

Design & couleur

edit : liste des images d'exemple pour se simplifier la vie :


export/import JSON de graph

Dans la mesure où le graph propose un dataset JSON, il serait intéressant de pouvoir le charger/décharger pour en conserver la donnée à la volée.

Multiples nodes pour une IP unique

Le bug est le suivant :
bug

Comme dans le code, l'unicité d'un noeud est déterminé de cette façon:

id : ('link ' + $scope.nodes[0].data.id + " " + nodeI.data.id + " "),

Un scan qui détermine de façon différente le type de machine occasionne la création d'un noeud supplémentaire, ce qui est un soucis.

Il faut donc revoir deux choses pour régler ce bug :

  • La façon dont on souhaite assurer l'unicité (une façon propre serait de l'assurer via juste l'IP)
  • La façon dont on souhaite afficher des données cohérentes (comment décider entre une identification d'OS et une autre ?)/

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.