Nell’articolo precedente abbiamo eseguito le operazioni base per poter costruire un laboratorio ed esercitarci ad eseguire i penetration test. Nei prossimi post andremo a creare i playbook Ansible necessari per creare i singoli nodi del nostro laboratorio. Nel seguito andremo a realizzare la macchina che ci permetterà di sperimentare gli attacchi verso le applicazioni web.
Per tale scopo utilizzeremo Owasp Mutillidae una web application sviluppata da Owasp nella quale vengono riprodotte un numero considerevole di vulnerabilità applicative.
La macchina sulla quale eseguiremo l’installazione è denominata
server1 nello schema di copertina e ha indirizzo IP 192.168.56.103. Per
eseguire il processo di installazione e configurazione partiremo da una vm già
disponibile all’interno del laboratorio e con a bordo il sistema operativo
Xubuntu.
Una volta descritte le operazioni e i file essenziali per poter lanciare il playbook analizzeremo e descriveremo la struttura del playbook
stesso.
Per eseguire tutte le operazioni utilizzeremo l’utente provision creato in precedenza su tutte le macchine. I file necessari per eseguire le istruzioni saranno creati nella cartella /home/provision/mutillidae di cui sotto è possibile vedere il contenuto.
Per gestire i parametri relativi alla configurazione di Ansible esistono diverse modalità e la più utilizzata è sicuramente il file ansible.cfg.
Ansible configuration file
Nel nostro caso il file ansible.cfg conterrà semplicemente la variabile inventory mediante la quale specifichiamo il path dove è localizzato il file di inventory.ini.
inventory = /home/provision/mutillidae/inventory.ini
Ansible Playbook Mutillidae
Di seguito il contenuto del playbook mutillidae.yaml
- hosts: 192.168.56.103 become: yes vars: server_root: /var/www mutillidae_relative_path: /mutillidae mutillidae_path: "{{ server_root }}{{ mutillidae_relative_path }}" add_redirect: yes # Variabili MySQL mysql_username: mutillidae mysql_password: mutillidae mysql_db_name: mutillidae tasks: - name: Installazione prerequisiti apt: name: ['apache2', 'php', 'php-curl', 'php-fpm', 'php-gd', 'php-gettext', 'php-imap', 'php-mbstring', 'php-mysql', 'php-xml', 'libapache2-mod-php', 'mysql-server', 'python-pymysql', 'python3-pymysql', 'python-apt', 'python3-apt', 'unzip'] update_cache: yes - name: Impostazione del file delle credenziali MySQL blockinfile: path: /root/.my.cnf create: yes block: |- [client] user=root password= - name: Creazione del database MySQL mysql_db: login_unix_socket: /var/run/mysqld/mysqld.sock name: "{{ mysql_db_name }}" state: present - name: Creazione utente MySQL mysql_user: login_unix_socket: /var/run/mysqld/mysqld.sock name: "{{ mysql_username }}" password: "{{ mysql_password }}" priv: "{{ mysql_db_name }}.*:ALL" state: present - name: Download ed estrazione Mutillidae da github unarchive: src: https://github.com/webpwnized/mutillidae/archive/master.zip dest: /tmp/ validate_certs: no remote_src: yes - name: Rimozione {{ mutillidae_path } file: path: "{{ mutillidae_path }}" state: absent - name: Spostamento da /tmp/mutillidae-master a {{ mutillidae_path }} command: mv -T /tmp/mutillidae-master {{ mutillidae_path }} - name: Modifica file database-config.inc copy: dest: "{{ mutillidae_path }}/includes/database-config.inc" force: yes content: |- - name: Aggiunta del redirect, se richiesto copy: dest: "{{ server_root }}/index.php" content: |- when: add_redirect is defined and add_redirect == True - name: Cambio permessi directory Mutillidae file: path: "{{ mutillidae_path }}" state: directory owner: www-data group: www-data mode: 0777 recurse: yes - name: Configurazione Apache template: src: mutillidae.conf.j2 dest: /etc/apache2/sites-available/mutillidae.conf - name: Disabilitazione del sito default ed abilitazione del sito Mutillidae command: "{{ item }}" loop: - a2dissite 000-default - a2ensite mutillidae - name: Abilitazione moduli Apache command: a2enmod {{ item }} loop: - rewrite - proxy_fcgi - setenvif - name: Abilitazione del modulo php-fpm shell: a2enconf php$(php --version|head -c7|cut -c5-7)-fpm - name: Riavvio Apache service: name: apache2 state: restarted - name: Setup database uri: url: http://127.0.0.1{{ mutillidae_relative_path }}/set-up-database.php
Hosts: 192.168.56.103
In questo punto dichiariamo su quale delle macchine indicate nel file di inventory dovrà essere lanciato il playbook.
Become: yes
Specifichiamo che i comandi dovranno essere eseguiti usando l’utente root.
Vars
All’interno
dei playbook possiamo dichiarare delle variabili. Nel nostro playbook esse
vengono dichiarate e allo stesso tempo inizializzate all’interno del codice.
Per ottenere maggiore flessibilità potremmo adoperare le variabili di input dei
playbook Ansible mediante i quali si possono ricevere i valori per inizializzare
i valori di: server_root, mutillidae_relative_path, mutillidae_path,
add_redirect.
Dopo aver dichiarato una variabile per utilizzarle è necessario usare la seguente notazione: {{nome variabile}}.
Ansible Module
Nel playbook usiamo diversi moduli.
Apt: modulo per gestire le installazioni dei pacchetti su macchine Linux con distribuzione Ubuntu/Debian o derivate.
Blockinfile: per inserire modificare e rimuovere blocchi di codice all’interno di un file. Mediante il parametro create stiamo indicando che nel caso in cui il file non esiste dovrà essere creato.
Mysql_db: modulo per effettuare connessioni a database mysql remoti ma nel nostro caso è stato adattato per gestire un db locale.
Mysql_user: il modulo permette di gestire (inserire, eliminare) gli utenti associati ad un database.
Unarchive: modulo che permette l’estrazione di un archivio.
File: gestisce file e cartelle e relative proprietà. Ad esempio è possibile creare un file, rimuoverlo, gestire i permessi associati. Nel nostro caso abbiamo usato il parametro state con valore absent per eseguire l’eliminazione di un file.
Command: modulo che permette l’esecuzione di comandi di shell sulla macchina. Esiste una versione adatta a sistemi operativi Windows denominata win_command.
Ansible Template
Un template è un file che al suo interno può contenere delle variabili i cui valori saranno popolati solo quando il playbook viene lanciato. I template sono utili quando è necessario effettuare delle manipolazioni articolate del contenuto di un file (ad esempio file di configurazione). All’interno dei template sono supportate operazioni che permettono una flessibilità di movimento avanzata come la gestione di condizioni mediante if e while, gestire escaping di caratteri, effettuare filtri. Il file relativo al template deve essere presente nella cartella in cui risiede il playbook. Nel nostro caso un template è stato utilizzato per generare il file di configurazione per Apache di Mutillidae.
DocumentRoot {{ server_root | default("/var/www") }}/ {% if server_fqdn is defined %} ServerName {{ server_fqdn }} {% endif %} Options +FollowSymLinks AllowOverride All Require all granted ErrorLog ${APACHE_LOG_DIR}/mutillidae-error.log CustomLog ${APACHE_LOG_DIR}/mutillidae-access.log combined
Lanciare il playbook
Una volta capito come è strutturato il playbook lo possiamo lanciare da linea di comando digitando:
ansible-playbook mutillidae.yaml
Se al termine del playbook non si verificano errori digitando nel browser dalla macchine Ansible 192.168.56.103 vedremo la seguente schermata che attesta la corretta installazione di Mutillidae.
Il vantaggio di usare un playbook Ansible per installare Mutillidae o altri servizi è che in qualsiasi momento, effettuando esclusivamente piccole operazioni preliminari indicate nel post precedente, possiamo ricreare o riconfigurare facilmente un’intera macchina o servizio. L’automation in sostanza ci evita di eseguire operazioni ripetitive e che se effettuate da umani possono dar luogo ad errori.
Conclusioni
Abbiamo creato una macchina bersaglio su cui esercitare le nostre doti di penetration tester. Nel prossimo post vedremo, partendo da una macchina con a bordo Xubuntu, mediante Ansible installeremo una selezione di tool per creare una distribuzione Linux con a bordo gli strumenti necessari per attaccare i bersagli del nostro laboratorio.
Trackback/Pingback