Historie om forskning og udvikling i 3 dele. Del 1 - forskningsdelen.
Der er mange bøger - men endnu mere nytte.
Problemformulering
Under gennemførelsen af pentests og RedTeam kampagner er det ikke altid muligt at benytte klientens standardværktøjer, såsom VPN, RDP, Citrix osv. til at trænge ind i det interne netværk. Nogle steder fungerer den standard VPN med MFA, hvor en hardware-token bruges som den anden faktor, andre steder overvåges den strengt, og vores adgang via VPN bliver straks opdaget, som man siger - med alle de følger, og andre steder er sådanne midler slet ikke tilgængelige.
I sådanne tilfælde må man konstant oprette såkaldte "omvendte tunneler" - forbindelser fra det interne netværk til en ekstern ressource eller en server, som vi kontrollerer. Inden for en sådan tunnel kan vi arbejde med klientens interne ressourcer.
Der findes flere typer sådanne omvendte tunneler. Den mest kendte af dem er selvfølgelig Meterpreter. SSH-tunneler med omvendt port forwarding er også meget populære blandt hackermiljøet. Der er mange midler til at udføre omvendt tunneling, og mange af dem er godt kendte og beskrevet.
Selvfølgelig står udviklerne af beskyttelsesløsninger ikke stille og opdager aktivt sådanne handlinger.
For eksempel bliver MSF-sessioner effektivt opdaget af moderne IPS fra Cisco eller Positive Tech, og omvendte SSH-tunneler kan opfanges af stort set enhver normal firewall.
Derfor, for at forblive uset i en god RedTeam kampagne - er vi nødt til at bygge omvendte tunneler med usædvanlige midler og tilpasse os så tæt som muligt til det reelle driftsmiljø i netværket.
Lad os prøve at finde eller opfinde noget tilsvarende.
Før vi opfinder noget, skal vi forstå, hvilket resultat vi ønsker at opnå, og hvilke funktioner vores udvikling skal udføre. Hvilke krav skal tunnelen opfylde, så vi kan arbejde med maksimal skjulthed?
Det er klart, at kravene kan variere meget fra sag til sag, men baseret på erhvervserfaring kan vi fremhæve de vigtigste:
- arbejd på Windows 7-10, da de fleste virksomhedsnets bruger netop Windows;
- Klienten opretter forbindelse til serveren via SSL for at undgå passiv overvågning med IPS-teknologi;
- Ved opkobling skal klienten støtte adgang gennem en godkendt proxyserver, da mange virksomheder forbinder til internettet gennem en proxy. I virkeligheden behøver klientmaskinen ikke engang at vide dette, og proxyen bruges i transparent tilstand. Men vi skal tage højde for denne funktionalitet;
- Klientdelen skal være enkel og bærbar;
Det er klart, at for at arbejde inden for Kundens netværk kan OpenVPN installeres på klientmaskinen og etablere en fuld tunnel til sin server (heldigvis kan OpenVPN-klienter arbejde gennem proxy). Men for det første er dette ikke altid muligt, da vi måske ikke er lokale administratorer der, og for det andet vil dette lave så meget støj, at en anstændig SIEM eller HIPS straks vil 'reportere' os til de relevante instanser. Ideelt set bør vores klient fungere som en såkaldt inline-kommando, ligesom mange bash-skaller er implementeret, og den skal startes via kommandolinjen, for eksempel når der udføres kommandoer fra et Word-makro. - Vores tunnel skal være multitrådet og understøtte mange forbindelser samtidigt;
- Forbindelsen mellem klient og server skal have en eller anden form for godkendelse, så tunnelen kun oprettes for vores klient, og ikke for alle, der tilgår vores server via den angivne adresse og port. Ideelt set bør en landingsside med katte eller professionel tematik relateret til det oprindelige domæne åbnes for 'eksterne brugere'.
For eksempel, hvis Kunden er en medicinsk organisation, så bør en side med farmaceutiske produkter, Wikipedia med en diagnosebeskrivelse eller Dr. Komarovskys blog åbnes for sikkerhedsadministratoren, der beslutter at kontrollere ressourcen, som klinikens medarbejder har besøgt, osv.
Analyse af eksisterende værktøjer
Før man opfinder sin egen cykel, er det nødvendigt at analysere eksisterende cykler og finde ud af, om vi virkelig har brug for det, og sandsynligvis er vi ikke de eneste, der har tænkt på behovet for en sådan funktionel cykel.
At søge på internettet (vi googler, og det ser ud til at være fint), samt at lede på GitHub efter nøgleordene "reverse socks" har ikke givet mange resultater. Det hele handler primært om at oprette SSH-tunneler med omvendt port forwarding og alt, hvad der hører til. Udover SSH-tunneler kan flere løsninger fremhæves:
En ældre implementering af et omvendt tunnel lavet af drengene fra Kaspersky Lab. Navnet afslører formålet med dette script. Implementeret i Python 2.7, tunnelen kører i cleartext mode (som man nu populært siger — hej til den russiske regering).
Endnu en implementering i Python, også i cleartext, men med flere muligheder. Den er skrevet som et modul og har et API til integration af løsningen i egne projekter.
Det første link er den originale version af revers socks implementeringen i Golang (ikke længere vedligeholdt af udvikleren).
Det andet link er vores tilpasning med ekstra funktioner, også i Golang. I vores version har vi implementeret SSL, arbejde gennem proxy med NTLM-godkendelse, klientgodkendelse, en landing page ved forkert adgangskode (rettere — omdirigering til landing page), multi-threaded mode (det vil sige, at flere personer kan arbejde med tunnelen samtidigt), samt et ping-system til at tjekke, om klienten er aktiv eller ej.
Implementeringen af omvendt socks af vores "kinesiske venner" i Python. Der ligger også en klar binær fil (exe) til de dovne og "udødelige", samlet af kineserne og klar til brug. Her ved kun den kinesiske gud, hvad der ellers kan være i denne binære fil, udover den grundlæggende funktionalitet, så brug det på egen risiko.
Et ret interessant projekt i C++ til implementering af omvendt socks og mere. Udover den omvendte tunnel kan den også lave port forwarding, skabe et kommandoskal osv.
MSF meterpreter
Her er der, som man siger, ikke meget at sige. Alle nogenlunde veluddannede hackere er godt bekendt med denne ting og forstår, hvor nemt den bliver opdaget af sikkerhedsværktøjer.
Alle de ovennævnte værktøjer arbejder efter en lignende teknologi: der køres et forberedte eksekverbart binært modul på maskinen inden for netværket, som opretter forbindelse til en ekstern server. På serveren kører en SOCKS4/5 server, der modtager forbindelser og videresender dem til klienten.
Ulempen ved alle de nævnte værktøjer er, at der skal være installeret Python eller Golang på klientmaskinen (har du nogensinde set Python installeret på f.eks. en virksomheds direktørs eller kontoransats maskine?), eller at vi skal trække en færdiggjort binær fil til denne maskine (faktisk Python og script i én pakke) og køre denne binær fil der. Derudover er det at hente en exe og derefter køre den lige præcis den type signatur for den lokale antivirus eller HIPS.
Generelt står konklusionen klart for os — vi har brug for en løsning i PowerShell. Nu vil vi få tomater kastet på os — fordi PowerShell allerede er alt for slidt, det overvåges, blokeres osv. Faktisk er det ikke overalt. Vi erklærer det ansvarligt. Forresten, der findes mange måder at omgå blokeringer på (her er endnu engang den populære sætning om, at hej til RKN 🙂), fra simpel renaming af powershell.exe -> cmdd.exe og op til powerdll osv.
Lad os begynde at opfinde
Det er tydeligt, at vi først vil kigge på Google og… ikke finde noget som helst om dette emne (hvis nogen har fundet noget — send venligst links i kommentarerne). Der er kun Socks5 på PowerShell, men det er en almindelig "direkte" sock, som har en række ulemper (om dem vil vi tale senere). Man kan selvfølgelig nemt omdanne den til en omvendt, men det vil kun være en enkelt trådede sock, hvilket ikke er helt det, vi har brug for.
Så, vi fandt ikke noget klart, så vi bliver nødt til at opfinde vores egen cykel. Som basis for vores cykel vil vi tage af den omvendte sock på Golang, og klienten til den vil vi implementere i PowerShell.
RSocksTun
Så hvordan fungerer rsockstun?
I bunden af RsocksTun (herefter omtalt som rs) ligger to softwarekomponenter — Yamux og Socks5-serveren. Socks5-serveren er en almindelig lokal socks5, der køres på klienten. Og multiplexeringen af forbindelser til den (kan I huske om trådethed?) sikres med hjælp from yamux (). Denne ordning gør det muligt at starte flere klient-socks5-servere og fordele eksterne forbindelser til dem ved at videresende dem gennem en enkelt TCP-forbindelse (næsten som i meterpreter) fra klienten til serveren, og dermed muliggøre multitrådede operationer, uden hvilke vi simpelthen ikke kan arbejde effektivt i det interne netværk.
Yamux's funktionalitet ligger i, at det introducerer et ekstra netværksniveau af streams, implementeret som en 12-byte header for hver pakke. (Her bruger vi bevidst ordet «stream», ikke «strøm», for ikke at forveksle læseren med programmeringskonceptet ‘thread’ — dette begreb vil også blive brugt i denne artikel). Inde i yamux-headeren er der strømmens nummer, flag til oprettelse/afslutning af stream, antallet af transmitterede bytes, og størrelsen af overførselsvinduet.

Ud over etablering/afslutning af streams implementerer yamux en keepalive-mekanisme, der muliggør overvågning af den etablerede kommunikationskanals funktionalitet. Keepalive-mekanismen konfigureres ved oprettelse af en Yamux-session. Faktisk er der kun to indstillinger: enable/disable og forsendelsesfrekvensen i sekunder. Keepalive-beskeder kan sendes af både yamux-serveren og yamux-klienten. Når en keepalive-besked modtages, skal den fjernede part svare med en besked med nøjagtig den samme identifikator (faktisk et nummer), som den har modtaget. Generelt er keepalive det samme som en ping, blot for yamux.
Detaljeret teknik til multiplexerens funktion: paketyper, flag til etablering og afslutning af forbindelser, samt dataoverførselsmekanismen er beskrevet i til yamux.
Konklusion til første del
Så i den første del af artiklen blev vi introduceret til visse værktøjer til oprettelse af omvendte tunneler, vi så på deres fordele og ulemper, studerede mekanismen bag Yamux-multiplexeren, og beskrev de grundlæggende krav til den nyoprettede powershell-modul. I næste del vil vi arbejde med udviklingen af selve modulet, praktisk talt fra bunden. Fortsættelse følger. Bliv hængende 🙂
Kilde: habr.com
