Gérer Metasploit et Armitage avec SaltStack

Qu’est-ce que SaltStack et Metasploit ?

SaltStack

Pour ceux qui ne savent pas encore ce qu’est SaltStack, je les invite à voir mon article pour découvrir SaltStack.

Metasploit

Metasploit est un framework destiné à la sécurité informatique. Il est écrit en Ruby est permet l’exécution de tâches relatives à la sécurité. On peut notamment effectuer des tests de pénétration ou des scans de vulnérabilités.

Armitage

Armitage est un outil de management d’attaque pour Metasploit. Il permet d’avoir une interface graphique pour travailler avec Metasploit.

On commence

Cet exemple de formule SaltStack ne respecte pas entièrement les recommandations SaltStack car je l’avais fait spécifiquement pour mon usage personnel et pour m’entraîner. Donc n’hésitez pas à modifier toute partie non conventionnelle et éventuellement à m’en notifier. Je me ferais un plaisir de puller pour faire évoluer la formule.

Structure fichiers/dossiers

Pour ma formule j’ai utilisé une structure similaire à toutes mes formules personnelles de states SaltStack:

  • le dossier de la states
  • un dossier files
  • un fichier init.sls
  • un fichier README.md
  • un fichier pour gérer mon service/application

Exemple:

/srv/saltstack/states/metasploit/
    - files/
        - database.tpl # Fichier de configuration de la base de données
    - README.md
    - armitage.sls # Fichier pour gérer Armitage
    - init.sls
    - metasploit.sls
    - postgresql.sls

Création de la state pour Metasploit

msf_user:
    user:
        - name: krustyhack
        - present

https://github.com/rapid7/metasploit-framework.git:
    git.latest:
        - rev: master
        - target: /home/krustyhack/metasploit-framework

cd /home/krustyhack/metasploit-framework && bundle install:
    cmd.run
cd /home/krustyhack/metasploit-framework/ && for MSF in $(ls msf*); do rm /usr/local/bin/$MSF && ln -s /home/krustyhack/metasploit-framework/$MSF /usr/local/bin/$MSF;done:
    cmd.run

/home/krustyhack/metasploit-framework/database.yml:
    file.managed:
        - user: krustyhack
        - group: krustyhack
        - mode: 644
        - makedirs: True
        - source: salt://metasploit/files/database.tpl
        - template: jinja
/etc/profile:
    file.append:
        - text: export MSF_DATABASE_CONFIG=/home/krustyhack/metasploit-framework/database.yml

Donc là rien de bien compliqué, je demande à SaltStack de:

  • gérer un utilisateur nommé krustyhack
  • récupérer la dernière version de Metasploit via le git officiel et de le cloner dans un chemin précis
  • effectuer un bundle install dans le dossier de Metasploit
  • créer les liens symboliques pour les exécutables de Metasploit afin d’y accéder partout sur la machine
  • gérer le fichier de configuration de la base de données selon le template files/database.tpl

Comme vous voyez, la state est simple. Passons maintenant à la gestion d’Armitage.

Création de la state pour Armitage

Alors je précise que cette state est inutile si vous installez Metasploit sur un serveur sans display. Car Armitage affiche une interface GUI. Si vous n’utilisez pas cette state, il suffit d’enlever le include dans le fichier init.sls ou encore mieux, ce que je n’ai pas fait, de gérer le cas avec SaltStack… Genre si ma cible n’a pas de display je n’exécute pas la state d’Armitage. 🙂

armitage_archive:
    archive.extracted:
      - name: /home/krustyhack/
      - source: http://www.fastandeasyhacking.com/download/armitage141120.tgz
      - source_hash: md5=a26827cad18767b011031bc52a247ce5
      - archive_format: tar
      - tar_options: v
      - if_missing: /home/krustyhack/armitage/

/home/krustyhack/armitage/armitage:
    file.symlink:
      - target: /usr/local/bin/armitage
/home/krustyhack/armitage/teamserver:
    file.symlink:
      - target: /usr/local/bin/teamserver

echo java -jar /home/krustyhack/armitage/armitage.jar \$\* > /home/krustyhack/armitage/armitage:
    cmd.run
perl -pi -e 's/armitage.jar/\/home\/krustyhack\/armitage\/armitage.jar/g' /home/krustyhack/armitage/teamserver:
    cmd.run

Encore une fois, rien de compliqué ! Ici SaltStack doit:

  • récupérer l’archive d’Armitage et la décompresser à un endroit précis, mais seulement si le dossier armitage n’existe pas encore (pour éviter d’écraser une précédente installation
  • créer deux liens symboliques pour lex exécutables d’Armitage
  • écrire la commande java -jar dans un fichier
  • remplacer toutes les occurrences de armitage.jar par le chemin absolu vers /mon/dossier/armitage/armitage.jar dans le fichier pour le teamserver

Attention à l’étape de récupération de l’archive ! Il est impératif de spécifier un source_hash pour des questions de sécurité évidentes. 🙂

Création de la state pour Postgresql

Il faut maintenant gérer l’installation de Postgresql pour que Metasploit puisse travailler correctement.

postgres_user:
    postgres_user:
        - name: msf
        - user: postgres
        - password: msf
        - present
postgres_database:
    postgres_database:
        - name: msf
        - user: postgres
        - owner: msf
        - present

Bon là, c’est tout con. Je :

  • créer un utilisateur postgres nommé msf avec comme mot de passe msf avec l’utilisateur système postgres
  • créer une base de données nommée msf assignée à l’utilisateur msf avec l’utilisateur système postgres

C’est bien beau tout ça mais ou est géré l’installation de Postgresql ? Très bonne question ! En fait je l’ai mise dans le fichier init.sls que l’on va voir de suite !

Création de la state d’initialisation

{% for package in ["build-essential", "libreadline-dev", "libssl-dev", "libpq5", "libpq-dev", "libreadline5", "libsqlite3-dev", "libpcap-dev", "openjdk-7-jre", "subversion", "git-core", "autoconf", "postgresql", "pgadmin3", "curl", "zlib1g-dev", "libxml2-dev", "libxslt1-dev", "vncviewer", "libyaml-dev", "ruby1.9.3", "ruby-dev", "bundler", "nmap"] %}
{{ package }}:
    pkg:
        - installed
{% endfor %}
{% for gem_package in ["wirble", "sqlite3", "bundler"] %}
gem_{{ gem_package }}:
    gem:
        - name: {{ gem_package }}
        - installed
{% endfor %}
include:
    - .postgresql
    - .metasploit
    - .armitage

Donc ici je demande à SaltStack de:

  • installer les paquets nécessaires
  • installer les paquets gems nécessaires
  • inclure mes 3 states spécifiques

Cool mais pourquoi ne pas avoir mis les dépendances à installer dans chaque state respective ?
Et bien j’ai toujours fait comme ça. Mon init.sls est la pour instancier et préparer l’environnement d’exécution de mes autres states. En clair, j’y gère toutes mes dépendances système, mes paquets, etc… puis j’inclus (ou pas) mes states spécifiques. Je ne sais pas si c’est correct de faire comme ça mais j’y suis habitué. 🙂

Formule prête

Notre formule est prête à être lancée. On balance donc la sauce sur un de nos minions:

╭─root@krustyhack ~ 
╰─➤ salt "monminion" state.sls metasploit

Et hop, si tout est correct la magie a opéré et on a un Metasploit prêt à l’emploi:

╭─root@krustyhack ~ 
╰─➤ msfconsole 
[*] Starting the Metasploit Framework console...|
Call trans opt: received. 2-19-98 13:24:18 REC:Loc

     Trace program: running

           wake up, Neo...
        the matrix has you
      follow the white rabbit.

          knock, knock, Neo.

                        (`.         ,-,
                        ` `.    ,;' /
                         `.  ,'/ .'
                          `. X /.'
                .-;--''--.._` ` (
              .'            /   `
             ,           ` '   Q '
             ,         ,   `._    \
          ,.|         '     `-.;_'
          :  . `  ;    `  ` --,.._;
           ' `    ,   )   .'
              `._ ,  '   /_
                 ; ,''-,;' ``-
                  ``-..__``--`

                             http://metasploit.pro


       =[ metasploit v4.11.0-dev [core:4.11.0.pre.dev api:1.0.0]]
+ -- --=[ 1387 exploits - 781 auxiliary - 223 post        ]
+ -- --=[ 356 payloads - 37 encoders - 8 nops             ]
+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]

msf > db_status 
[*] postgresql connected to msf
msf > search wordpress

Matching Modules
================

   Name                                                      Disclosure Date  Rank       Description
   ----                                                      ---------------  ----       -----------
   auxiliary/admin/http/wp_custom_contact_forms              2014-08-07       normal     WordPress custom-contact-forms Plugin SQL Upload
   auxiliary/dos/http/wordpress_xmlrpc_dos                   2014-08-06       normal     WordPress XMLRPC DoS
   auxiliary/gather/wp_w3_total_cache_hash_extract                            normal     W3-Total-Cache WordPress-plugin 0.9.2.4 (or before) Username and Hash Extract
   auxiliary/scanner/http/wordpress_login_enum                                normal     WordPress Brute Force and User Enumeration Utility
   auxiliary/scanner/http/wordpress_pingback_access                           normal     WordPress Pingback Locator
   auxiliary/scanner/http/wordpress_scanner                                   normal     WordPress Scanner
   auxiliary/scanner/http/wordpress_xmlrpc_login                              normal     WordPress XML-RPC Username/Password Login Scanner
   auxiliary/scanner/kademlia/server_info                                     normal     Gather Kademlia Server Information
   auxiliary/scanner/ssh/detect_kippo                                         normal     Kippo SSH Honeypot Detector
   exploit/unix/webapp/joomla_akeeba_unserialize             2014-09-29       excellent  Joomla Akeeba Kickstart Unserialize Remote Code Execution
   exploit/unix/webapp/php_wordpress_foxypress               2012-06-05       excellent  WordPress Plugin Foxypress uploadify.php Arbitrary Code Execution
   exploit/unix/webapp/php_wordpress_infusionsoft            2014-09-25       excellent  WordPress InfusionSoft Upload Vulnerability
   exploit/unix/webapp/php_wordpress_lastpost                2005-08-09       excellent  WordPress cache_lastpostdate Arbitrary Code Execution
   exploit/unix/webapp/php_wordpress_optimizepress           2013-11-29       normal     WordPress OptimizePress Theme File Upload Vulnerability
   exploit/unix/webapp/php_wordpress_total_cache             2013-04-17       excellent  WordPress W3 Total Cache PHP Code Execution
   exploit/unix/webapp/php_xmlrpc_eval                       2005-06-29       excellent  PHP XML-RPC Arbitrary Code Execution
   exploit/unix/webapp/wp_advanced_custom_fields_exec        2012-11-14       excellent  WordPress Plugin Advanced Custom Fields Remote File Inclusion
   exploit/unix/webapp/wp_asset_manager_upload_exec          2012-05-26       excellent  WordPress Asset-Manager PHP File Upload Vulnerability
   exploit/unix/webapp/wp_downloadmanager_upload             2014-12-03       excellent  WordPress Download Manager (download-manager) Unauthenticated File Upload
   exploit/unix/webapp/wp_google_document_embedder_exec      2013-01-03       normal     WordPress Plugin Google Document Embedder Arbitrary File Disclosure
   exploit/unix/webapp/wp_property_upload_exec               2012-03-26       excellent  WordPress WP-Property PHP File Upload Vulnerability
   exploit/unix/webapp/wp_symposium_shell_upload             2014-12-11       excellent  WordPress WP Symposium 14.11 Shell Upload
   exploit/unix/webapp/wp_wptouch_file_upload                2014-07-14       excellent  WordPress WPTouch Authenticated File Upload
   exploit/unix/webapp/wp_wysija_newsletters_upload          2014-07-01       excellent  WordPress MailPoet Newsletters (wysija-newsletters) Unauthenticated File Upload
   exploit/windows/browser/adobe_flashplayer_newfunction     2010-06-04       normal     Adobe Flash Player "newfunction" Invalid Pointer Use
   exploit/windows/fileformat/adobe_flashplayer_button       2010-10-28       normal     Adobe Flash Player "Button" Remote Code Execution
   exploit/windows/fileformat/adobe_flashplayer_newfunction  2010-06-04       normal     Adobe Flash Player "newfunction" Invalid Pointer Use
   exploit/windows/fileformat/ms12_005                       2012-01-10       excellent  MS12-005 Microsoft Office ClickOnce Unsafe Object Package Handling Vulnerability
   exploit/windows/fileformat/winrar_name_spoofing           2009-09-28       excellent  WinRAR Filename Spoofing
   exploit/windows/ftp/easyftp_cwd_fixret                    2010-02-16       great      EasyFTP Server CWD Command Stack Buffer Overflow
   exploit/windows/http/sws_connection_bof                   2012-07-20       normal     Simple Web Server Connection Header Buffer Overflow
   post/windows/gather/credentials/razer_synapse                              normal     Windows Gather Razer Synapse Password Extraction


msf >

Leave a comment: