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.