Metasploit psexec resurrect

What a joy !

I just received tonight this nice email from github :

Meatballs1 merged commit 1a3b319 into  from 

My 2 years old pull request to metasploit was just accepted !

Long story short

Annoyed to have to chain msfencode and msfencode and msfencode to bypass anti-virus during penetration testing, we wanted to create some packers that do the job. Better than that, we wanted to integrate it in metasploit to use it with all the framework features and improve our performances :D.

I firstly figured it out that most of AVs detect ‘exe’ loader creation technique (from msfpayload) even if you put a "foobar" payload : echo -n "foobar" | msfencode -t exe -e generic/none => HIGH SCORE on virustotal.

I proposed "exe-only" technique. Shortly, it write the payload at the original entry-point of your exe template and put the section RWX so it reduces the loader signature to one RWX section only.

So next we could focus on the payload encoding.

For information, I scanned every native windows exe and find that ntkrnlpa.exe and ntoskrnl.exe contains RWX section (if AVs shoots files for having RWX sections, it would shoot Windows native exe too).

After some debate this exe-only technique was added to metasploit.

Next part was to use it with the famous psexec module that nobody use anymore because every AVs trigger it.

It’s simply because service executable created by psexec module use subsitution method, replacing "PAYLOAD:" with the payload in a template. Again, AVs trigger template regardless of the payload and to create a working template it was such a pain that we prefered use a "normal" executable and send it using psexec custom_exe feature…

So I wanted to use the previously merged "exe-only" technique to create a register service payload prepended to the user encoded payload.

That’s that stuff that took two years to land in Metasploit, mostly because I’m a noob in ruby and git (booo) and a little bit of scepticism from some metasploit guys.

Anyway, I’m proud it’s finally merged, you could just track it for fun :

07/09/2012 – https://dev.metasploit.com/redmine/issues/7231

14/10/2012 – https://github.com/rapid7/metasploit-framework/pull/903

19/05/2013 – https://github.com/rapid7/metasploit-framework/pull/1850

20/11/2013 – https://github.com/rapid7/metasploit-framework/pull/2657

07/06/2014 – Merged !

I hope you will re-use psexec now and I’m sure it bypass a lot of BIG AV at this moment because their sandbox executes the service PE that actually register itself to the SVC manager and exit. SVC manager then re run the PE beginning at the registered service entry-point.

It was very cool to speak with Metasploit guys and I know I would have to persevere for my next pull request !

Publié dans Metasploit, news, vulnérabilité

Area 41

Après une année d’absence, les Hashdays reviennent avec un nouveau nom, une nouvelle localisation et des nouvelles dates.

La conférence se passait les 2 et 3 juin 2014 au Komplex 457 de Zurich.

Fini le Radisson et les berges du lac des quatre cantons et direction les salles de concert dans le noir.

Les organisateurs proposaient deux tracks en parallèle, un dans la plus grand salle avec caméra, projecteur et canon à fumée et l’autre plus discrète dans un ancien strip club.

Keynote: Halvar Flake

Slide

Halvar Flake nous parle des tests à faire afin d’être sûr que notre ordinateur n’est pas compromis. Il propose divers tests dont la vérification des signatures des binaires dans le userspace, des binaires dans le kernelspace, des éléments du BIOS, des firmwares des différents composants et management engine des cartes mères et la possibilité de vérifier que les CAs sont bien la source des certificats délivrés.

Malheureusement, à l’heure actuelle, il n’est pas possible de valider ces points. Très peu d’exécutables sont signés et même s’ils le sont leurs extensions ne le sont pas forcément. Pour les éléments du BIOS, les firmwares et les management engine, il n’est même pas possible de connaitre les binaires et les signatures.

De plus, même si un élément a été signé, il est difficile d’être sûr que la CA en soit bien la source.

Il termine sa présentation en précisant qu’il reste encore beaucoup de travail pour améliorer la signature des binaires. Les fabricants doivent faire pression pour avoir accès aux contenus des éléments embarqués et il faudrait mettre en place une liste publique des certificats signés par chaque CA afin de garantir que les signatures de proviennent pas d’une version corrompue.

Ange Albertini and Gynvael Coldwind: Schizophrenic Files – A file that thinks it’s many

Slide

Possibilité pour moi de voir cette présentation que j’avais ratée à Insomni’hack 2014 et en plus cette fois, Ange était accompagné de Gynvael.

Première bonne surprise , Gynvael portait son tshirt Insomni’hack :-)

Ce talk parle de la possibilité d’abuser les parser de différents logiciels afin d’obtenir un résultat différent en ouvrant le même fichier.

Les premiers exemples concernent les archives zip  et ce procédé a même été déjà utilisé par Jeff Forristal pour abuser le mécanisme de signature des APK pour android (présentation à Blackhat 2013).

Vient ensuite le tour du format PDF qui en plus d’ouvrir un document différent en fonction du lecteur permet d’obtenir un fichier différent lors de l’impression. Cette partie n’étant même pas un bug mais une fonctionnalité offerte par le format.

Les formats BMP et PNG permettent aussi ce comportement en jouant avec les headers du fichier ou avec les palettes de couleurs utilisées.

Ange a aussi joué avec les PE et s’est même offert le luxe d’avoir des fichiers exécutables compatibles avec toutes les versions de Windows de XP à Windows 8 64 bit.

Chris Nickerson – 50 Shades of RED: Stories from the "Playroom"

Slide (venant de Confidence mais identique)

Place à un grand show à l’américaine rempli de lolcats et de blagues en tout genre!

Malgré une présentation sur le ton du deuxième (voir troisième) degré, Chris a quand même un message à faire passer.

Son constat principal est le rapport entre l’argent dépensé dans la sécurité de l’information et l’argent perdu suite à des attaques. Plus les années avancent et plus le montant des deux augmente.

Il proposes quelques idées pour essayer d’améliorer ce constat sous forme de retour d’expérience et d’exemple de sensibilisation d’utilisateur.

On retiendra surtout son explication du terme APT et la citation de Mike Tyson "everyone has a plan until they get punched in the mouth"

Chris John Riley – REDACTED

Ce talk au nom peu indicateur parlait en fait des attaques faites sur les smartphones android au travers de l’ADB.

Deux attaques ont été présentées.

La première concerne l’application mobile de LastPass. Au travers de l’ADB, il est possible de faire un backup de l’application, d’ouvrir l’archive, de modifier un fichier xml de configuration et de supprimer la demande du code PIN permettant la connexion automatique au coffre-fort. Il suffit ensuite de refaire l’archive et de faire un restore au travers de l’ADB pour accéder aux mots de passe.

Même si l’attaque semble dangereuse, elle ne me semble pas vraiment exploitable compte tenu du nombre de prérequis. (téléphone non chiffré, mode debug USB activé et surtout, la pire configuration de lastpass possible)

La deuxième attaque concerne les containers Good. Un mécanisme de wipe du container rend le brute.force de clé impossible. Grâce à l’ADB, il est possible de faire un backup du container, de tester neuf possibilités de clés ( dix essais étant autorisés avant le wipe) et de restaurer le container pour faire passer le compteur à zéro avant de continuer.

 

En conclusion, très bonne conférence au niveau des Hasdays. et j’attends avec impatience les vidéos des talks que je n’ai pas eu l’occasion de voir.

Publié dans Events

PHDays Finals 2014 Homepage + Breadcrumbs Tasks Writeup

We’re going to look at two of the tasks of the PHDays finals, namely breadcrumbs which we solved and homepage, which unfortunately we were not able to solve during the CTF, though the solution seems to be correct. If you have any additional information on this particular task, I’d love to have your comments : @plopz0r.

Breadcrumbs

This was a forensics task where a full virtual machine was provided to us. We were simply told that the task started with the user "user". So after extracting the VM’s disk, we started by searching in that user’s home directory. Easily enough, we discover a file named simple_bsl.png.

simple_bsl

 

In a comment section of the image, we can find :

Next breadcrumb is located at /usr/share/doc/ranger/
But first find password...

And in this folder, there is a file named "hacking.gpg" which obviously needs a password. The name of the first image points in the direction of information being hidden in the least-significant bit of each pixel (bsl -> lsb). The answer is not quite as straight forward though, as actually only the first 8 out of every 9 bits must be considered to find the password.

The file then decrypts this message:

here is md5 sum of file you need to find: 30055312e086ea49424c759f3deb751a. Password is the name of the folder, where file is located. Let the force be with you, good luck, etc :)

We can easily find this file with the following command:

find . | xargs md5sum | grep 30055312e086ea49424c759f3deb751a

The file is /etc/magic, it is also a GPG encrypted file. We can decrypt it with "etc" as a password. This now reveals:

Now you need to collect parts of the flag that are located in this folder. Valid flag's parts can contain ONLY alphabet symbols, underscore ("_") and exclamation ("!") mark. First part of the flag is "Not_". Good luck!

We quickly see that Not_ is prepended by Key_part: and so we grepped for all "Key_part: " followed by alphabet, underscore and exclamation mark characters. This however reveals way too many results to find the flag immediately… So we tried ordering the parts by file modification date, or line number within the file, but this didn’t really give any results, so we proceeded with a bit of guessing.

The flag starts with "Not_" and there is a key part "_nor_" and another one "tel!". So we decided it was likely that the flag would be of the format "Not_XXXXX_nor_YYYYYtel!"

One other key part is "gre", which can be added before "tel!" to give "gretel!".  Since the name of the task is "breadcrumbs", We guessed the flag was "Not_hansel_nor_gretel!", which was correct!

Homepage

This was a web task and when you connect to the application, there is not much you can do. Essentially, create a user, login with that user, view a blog page in english or russian, and send a message to the admin. The blog page itself talks about XSS, CSRF, Response Splitting and Clickjacking. There is an admin page, but we cannot access the contents.

We first started looking for XSS flaws in the site, but to no avail, everything is correctly encoded. We tried sending messages to the admin and noticed that he would click on links that are sent to him (though this did not seem to work at the start of the CTF), therefore allowing us to do CSRF attacks on the site. How could we exploit this?

We noticed that there is a session fixation flaw in the login mechanism, as the JSESSIONID is not regenerated when a user logs in.And the only remaining action that can be done on the website is to change the language that is set for the blog page. This is done through a parameter named "locale" which then has the server set a cookie for the user:

Set-cookie: locale="XXX"; path=/HomePage/blog/; HttpOnly

Could we maybe directly inject new HTTP headers and set the admin’s JSESSIONID cookie into the response by inserting CR/LF characters? The answer is no… They are converted to "space" characters in the response, so no new lines allowed :(

Pretty much any other characters are allowed though. So we tried to set multiple cookies in a single set-cookie header, but again this failed. However, it turns out that Tomcat will accept "," as a cookie separator when a request is received. So it is actually possible to smuggle several cookies into a single one! Pretty cool! For example, if you decide to set the locale like this:

?locale=en", JSESSIONID=XXXXXXXXXXXXXXXXXXXXXX, toto="

When your browser sends this cookie to the server, it will look like this:

Cookie: locale="en", JSESSIONID=XXXXXXXXXXXXX, toto=""; JSESSIONID=origsessionid

The server will then see three different cookies, and only take the first JSESSIONID which is the one set by us! We’re definitely on the right track.

The only problem is the cookie that we set for the locale is only set for /HomePage/blog/ and none of the other pages of the site. No login, no access to the admin interface, nothing. So even if we can force the admin to use a specific sessionid, it will only be used on a page that doesn’t interest us…

At this point, we’re pretty sure we’re on the right track and that we just have to find a way to set the cookie for the whole domain instead of the blog page. Once that is done, we can get the admin to click our link, set the cookie and just wait for him to login again and we can reuse the sessionid to access the page as an admin (because of the session fixation flaw).

Now this took ages and a little hint from the organisers to actually get it done. We tried adding various cookie parameters such as an additional path, or domain, secure and so on, but apparently the browser will only use the last path that is specified if there are more than one :(

But (and this is where the orgas gave us a little hint) if you add the path parameter multiple times, Chrome will actually ignore the last one and select one of the ones that was specified before hand. Wtf?

I’m not quite sure what the exact number is, but if you set the following locale, you will actually end up with a JSESSIONID that is valid for the whole web site (at least in the latest version of Chrome).

?locale=en", JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXXXXXX, toto="; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/; path=/HomePage/;

This was discovered 10 minutes before the end of the CTF, so I quickly sent the link to an admin with my own JSESSIONID in there and waited for him to click and hope that he then logged in to the site again. Unfortunately nothing happened, I never got the admin privs and couldn’t access the admin page to get the flag. So I’m wondering if I’m still missing something or if the challenge was broken?

Interesting challenge though!

 

 

Publié dans Events

Finales PHDays 2014

S’étant qualifiés en ligne pour les finales, quelques ingénieurs de SCRT se sont rendus à Moscou pour participer avec l’équipe "w3stormz" à la finale du concours de piratage éthique PHDays.

BoOpw2CIcAANsbv

Le format de la finale était de type "Attaque/Défense" avec un certain nombre de tâches annexes qui pouvaient être débloquées une fois que l’équipe avait récupéré suffisamment de points avec l’attaque et/ou la défense. En parallèle, certaines quêtes étaient accessibles pendant un temps limité.

20140521_090820

Au final, ce sont (encore) les Dragon Sector qui l’ont emporté devant les Int3pids et BalalaikaCr3w. Après un bon départ, nous avons fini en 8ème position sur les 10 équipes présentes.

Malgré une belle diversité des tâches présentes (Web, Reverse, Forensics, Network, Ucucuga, Crypto, Pwn), très peu d’entre elles ont été résolues, même par les premières équipes et c’est au final surtout le score de l’attaque/défense qui a départagé les équipes.

Nous nous sommes par contre démarqués lors du concours "2drunk2hack" en plaçant 4 personnes dans le Top 5! Il s’agit d’un concours basé sur la rapidité et le bypass d’un WAF pour obtenir un max de flags en 30 minutes. Les participants ayant été détectés le plus souvent doivent régulièrement boire un shot de Tequila, d’où le nom du concours. Il faut croire qu’on a su rester discret :)

BoP9cCaIIAAhguN

Au final, PHDays est un événement fort intéressant proposant également des conférences et un nombre impressionant de concours annexes. Nous espérons pouvoir nous qualifier de nouveau l’année prochaine.

Publié dans Events

Neo4j – "Enter the GraphDB"

Following interest for NoSQL (see MongoDB exploit :D), this time I wanted to check Neo4j, the famous Graph Database. As you can see on their blog http://blog.neo4j.org/, Neo4j is really active and updates come really often ! The v1 was released in 2010 and v2 in 2013 and I didn’t find any specific paper about security so it may be interesting… Don’t hesitate to correct me if I say something wrong ! Lire la suite

Publié dans Uncategorized

Analyse d’un malware iOS : Unflod.dylib

Suite à la parution de commentaires sur /r/jailbreak concernant un malware ciblant iOS, je me suis dis qu’une analyse serait intéressante vu que cette plateforme est encore peu ciblée par ce type de menaces du à son architecture.

La première étape fut de récupérer des informations sur le binaire, ie. Entitlements et signature du code. Le premier point n’apporte pas grand chose sur le binaire, à part qu’il peut être débuggé et accéder au Keychain.

checksignBien que n’ayant été trouvée que sur des terminaux jailbreakés, cette bibliothèque est signée avec le compte iPhone Developer de Wang Xin. Ce procédé est étrange vu que le jailbreak désactive la validation de code signé sur iOS.

L’EntryPoint de la bibliothèque est assez simple et ne réalise qu’une seule action: remplacer la fonction SSLWrite du système par une fonction implémentée dans la bibliothèque: replace_SSLWrite. Le hooking de la fonction est réalisée à l’aide de la fonction libsubstrate.dylib!MSHookFunction. La bibliothèque MobileSubstrate est utilisée par  beaucoup d’applications provenant d’AppStore tierce afin de réaliser du Swizzling/hooking, il n’est donc pas étonnant de la voir utilisée ici.

call_mshookfunction

La fonctionnalité de la fonction remplaçant SSLWrite est elle aussi très simple: détecter une tentative d’authentification sur les serveurs d’Apple et intercepter les authentifiants de l’utilisateur. Pour ce faire, la chaine /WebObjects/MZFinance.woa/wa/authenticate est recherchée dans les données envoyées via SSL. Cette chaine fait en général partie des URLs pointants sur *.itunes.apple.com.

searching_iTunes_login

Une fois identifiés, les authentifiants sont envoyés à un serveur en écoute sur le port 7878 soit à l’IP 23.88.10.4, soit à l’IP 23.228.204.55.sending_info

Pour le moment, aucune information n’est disponible quant-à la source de l’infection. Il est toutefois intéressant de voir que les terminaux iOS jailbreakés commencent à être la cible de malware grand-public.

Publié dans forensics | Tagué , , , , ,

NeDi Remote Code Execution

During a recent intrusion test, we discovered that NeDi was used in our target infrastructure. Since this application’s source code is freely available on the developer’s website (www.nedi.ch) I thought I’d have a look and see whether it would be possible to take control of a server through it.

It didn’t take too long to discover a call to PHP’s eval function in file inc/graph.php:

function drawFunction($function, $dx = 0.1) {
    $xold = $x = $this->x0;
    eval("\$yold=".$function.";");
    for ($x += $dx; $x <= $this->x1; $x += $dx) {
      eval("\$y = ".$function.";");
      imageLine($this->img, $this->posX0+$xold*$this->scale,
                            $this->posY0-$yold*$this->scale,
                            $this->posX0+$x*$this->scale,
                $this->posY0-$y*$this->scale, $this->grn);
      $xold = $x;
      $yold = $y;
    }
  }

We see that parameter $function is used directly in the eval(). Where does this particular parameter come from? Well drawFunction is called from page OtherPlot.php:

$cmd = isset($_GET['cmd']) ? $_GET['cmd'] : '';
$res = isset($_GET['res']) ? $_GET['res'] : 'vga';
$xf = isset($_GET['xf']) ? $_GET['xf'] : 4;
$yf = isset($_GET['yf']) ? $_GET['yf'] : 4;
$xt = isset($_GET['xt']) ? $_GET['xt'] : 4;
$yt = isset($_GET['yt']) ? $_GET['yt'] : 4;
$f = isset($_GET['function']) ? $_GET['function'] : 'sin(30 * $x) * 1 / cos($x) / $x';
#	$f='tan($x - $x * cos(pi() * $x))';

if ($cmd=="img"){
	include_once ("inc/graph.php");
	$graph = new FunctionGraph($xf,$yf);
	$graph->drawAxes();
	$graph->drawFunction($f, 0.01);
	$graph->writePNG();
	$graph->destroy();
	die;
}

As you can see, the parameter which is sent to the vulnerable function is taken directly from the function GET parameter.

Moreover, this particular piece of code can be called by an unauthenticated user, meaning that it is possible to execute arbitrary code (unless there is some sort of PHP hardening going on) on the web server without needing any credentials.

After discussing the issue with Remo Rickli, who wrote the application, it turns out this is a piece of legacy code which is not used any more and will be removed in future versions. For the time being, the recommendation is to remove the Other-Plot.php and inc/graph.php files from your servers (http://www.nedi.ch/nedi-news/).

Publié dans vulnérabilité