Implementacija slovenske tipkovnice za Teensy

Pred kratkim smo v okviru projekta simulirali različne napade socialnega inženirstva, meddrugim tudi obisk glavnih prostorov podjetja kot IT administrator podjetja. Cilj projekta je bil podtakniti Teensy USB HID napravo v namiznem računalniku na katerem je nameščen Windows 7 ali Windows 8.

Na prvi pogled se je napad zdel sila preprost, toda kmalu smo ugotovili, da temu ni tako. Namestili smo programsko opremo Arduino 1.0.5, ki je zadnja različica, ki podpira Teensyduino; to lahko vidimo, če obiščemo spletno stran http://www.pjrc.com/teensy/td_download.html, kjer je zapisano sledeče: “Teensyduino podpira Arduino 0023 , 1.0.3 , 1.0.4 in 1.0.5”. Po namestitvi smo testirali “Hello World!” program, ki je deloval brez težav. Namestili pa smo tudi Kautilya, ki omogoča avtomatsko generiranje skript, ki jih lahko direktno uporabimo v Teensyduino. S pomočjo Kautilya je olajšano pisanje skript, ki se izvedejo na Teensy napravi, saj jih ni potrebno ročno pisati, ampak skripto dobimo praktično zastonj. V spodnjem izpisu lahko vidimo izpis programa Kautilya, kjer so vidne vse skripte, ki jih lahko direktno uporabimo.

 

888 d8P 888 d8b 888
888 d8P 888 Y8P 888
888 d8P 888 888
888d88K 8888b. 888 888 888888 888 888 888 888 8888b.
8888888b “88b 888 888 888 888 888 888 888 “88b
888 Y88b .d888888 888 888 888 888 888 888 888 .d888888
888 Y88b 888 888 Y88b 888 Y88b. 888 888 Y88b 888 888 888
888 Y88b “Y888888 “Y88888 “Y888 888 888 “Y88888 “Y888888
888
Y8b d88P
Pwnage with Human Interface Devices “Y88P”
Version 0.4.4
|..| Written By: Nikhil “SamratAshok” Mittal |..|
|..| Twitter: @nikhil_mitt |..|
|..| Bugs & Feedback: [email protected] |..|
|..| Code: http://code.google.com/p/kautilya/ |..|
|..| Blog: http://labofapenetrationtester.blogspot.com/ |..|

Kautilya is a toolkit to ease usage of Human Interface Devices in Pen Tests.

Tested on Teensy++ and Teensy 3.0 from pjrc.com.

Choose target OS from the menu below:

1. Payloads for Windows
2. Payloads for Linux
3. Payloads for Mac OS X
0. Exit Kautilya

Kautilya> 1

Choose a payload category from the menu below:
1. Add an admin user
2. Change the default DNS server
3. Edit the hosts file
4. Add a user and Enable RDP
5. Add a user and Enable Telnet
6. Forceful Browsing
7. Download and Execute
8. Sethc and Utilman backdoor
9. Gather Information
10. Hashdump and Exfiltrate
11. Keylog and Exfiltrate
12. Sniffer
13. Wireless Rogue AP
14. Browse and Accept Java Signed Applet
15. Connect to Hotspot and Execute code
16. Code Execution using Powershell
17. Time based payload execution
18. WLAN keys dump
19. Get Target Credentials
20. Code Execution using DNS TXT queries
21. Tracking Target Connectivity
22. Speak on Target
23. HTTP backdoor
24. DNS TXT Backdoor
25. Download and Execute PowerShell Script
26. Remove Update
27. Dump LSA Secrets
 

Takoj smo se odločili za skripto številka 25: “Download and Execute PowerShell Script”, ki z interneta prenese Powershell skripto in jo izvrši. Prav tako pa zna skripto prenesti tudi preko posredovalnega strežnika (“proxy”), ki se v podjetjih pogosto uporablja za dostop do interneta. Po izboru skripte 25 nam bo Kautilya generirala skripto, ki jo lahko direktno skopiramo v Arduino, nakar jo lahko prevedemo in naložimo v Teensy napravo. Vse to deluje brez težav, problem pa nastane, ko Teensy napravo vključimo v Windows sistem, saj naložena skripta ne naredi tistega kar od nje pričakujemo. V našem primeru se je nekaj sicer dogajalo, toda izvajanje skripte je odpiralo raznorazna okna in izpisovalo veliko napak, ki niso imele smisla.

Čez nekaj časa smo ugotovili vzrok težav, kar je bila nastavljena slovenska tipkovnica, toda Teensy uporabljala angleško tipkovnico. Mislili smo, da bomo težavo hitro rešili, toda ugotovili smo, da Teensyduino slovenske tipkovnice sploh ne podpira. Toda, ker smo v Sloveniji ima večina računalnikov nastavljeno privzeto slovensko tipkovnico, kar potrebujemo za uspešen napad na sistem. Na internetu smo iskali rešitev, toda je nismo našli, zaradi česar smo se odločili, da bomo v Teensyduino dodali podporo za slovensko tipkovnico.

Dokumentacija za Teensyduino je zelo slaba, zato smo imeli kar nekaj težav pri iskanju načina za implementacijo. Problem smo rešili s programom Grep, kjer smo v izvorni kodi (bolj specifično v direktoriju hardware/teensy/) iskali določene znakovne nize. S omenjenim načinom smo hitro ugotovili, da moramo podporo za slovensko tipkovnico dodati v datoteko keylayouts.h, ki opredeljuje vse razpoložljive postavitve tipkovnice.

Začeli smo na primeru US postavitve tipkovnice, ki smo jo vzeli za zgled za lažjo implementacijo slovenske postavitve tipkovnice. Najprej smo identificirali vsa imena tipk, ki jih uporablja US tipkovnica in so vidne na spodnji sliki. To je bil ‘težek’ del naloge, kjer smo morali ugotoviti kako se tipke imenujejo.

picture

Ker so znaki pod določenimi tipkami drugačni na slovenski tipkovnici, smo jih morali temu primerno spremeniti. Ker smo vse trdo delo opravili že z identifikacijo imen tipk, smo sedaj dejansko morali le še odčitati kombinacije tipk, ki nam izpišejo ASCII znake od 0x20-0xF7. Za referenco smo celotno predstavitev ASCII znakov za slovensko postavitev tipkovnice predstavili spodaj.

 

#ifdef LAYOUT_SLOVENIAN

#define SHIFT_MASK 0x40
#define ALTGR_MASK 0x0080
#define KEY_NON_US_100 63
#define KEYCODE_TYPE uint8_t
#define ASCII_20 KEY_SPACE // 32
#define ASCII_21 KEY_1 + SHIFT_MASK // 33 !
#define ASCII_22 KEY_2 + SHIFT_MASK // 34 “
#define ASCII_23 KEY_3 + SHIFT_MASK // 35 #
#define ASCII_24 KEY_4 + SHIFT_MASK // 36 $
#define ASCII_25 KEY_5 + SHIFT_MASK // 37 %
#define ASCII_26 KEY_6 + SHIFT_MASK // 38 &
#define ASCII_27 KEY_MINUS // 39 ‘
#define ASCII_28 KEY_8 + SHIFT_MASK // 40 (
#define ASCII_29 KEY_9 + SHIFT_MASK // 41 )
#define ASCII_2A KEY_EQUAL + SHIFT_MASK // 42 *
#define ASCII_2B KEY_EQUAL // 43 +
#define ASCII_2C KEY_COMMA // 44 ,
#define ASCII_2D KEY_SLASH // 45 –
#define ASCII_2E KEY_PERIOD // 46 .
#define ASCII_2F KEY_7 + SHIFT_MASK // 47 /
#define ASCII_30 KEY_0 // 48 0
#define ASCII_31 KEY_1 // 49 1
#define ASCII_32 KEY_2 // 50 2
#define ASCII_33 KEY_3 // 51 3
#define ASCII_34 KEY_4 // 52 4
#define ASCII_35 KEY_5 // 53 5
#define ASCII_36 KEY_6 // 54 6
#define ASCII_37 KEY_7 // 55 7
#define ASCII_38 KEY_8 // 55 8
#define ASCII_39 KEY_9 // 57 9
#define ASCII_3A KEY_PERIOD + SHIFT_MASK // 58 :
#define ASCII_3B KEY_COMMA + SHIFT_MASK // 59 ;
#define ASCII_3C KEY_NON_US_100 // 60 <
#define ASCII_3D KEY_0 + SHIFT_MASK // 61 =
#define ASCII_3E KEY_NON_US_100 + SHIFT_MASK // 62 >
#define ASCII_3F KEY_MINUS + SHIFT_MASK // 63 ?
#define ASCII_40 KEY_V + ALTGR_MASK // 64 @
#define ASCII_41 KEY_A + SHIFT_MASK // 65 A
#define ASCII_42 KEY_B + SHIFT_MASK // 66 B
#define ASCII_43 KEY_C + SHIFT_MASK // 67 C
#define ASCII_44 KEY_D + SHIFT_MASK // 68 D
#define ASCII_45 KEY_E + SHIFT_MASK // 69 E
#define ASCII_46 KEY_F + SHIFT_MASK // 70 F
#define ASCII_47 KEY_G + SHIFT_MASK // 71 G
#define ASCII_48 KEY_H + SHIFT_MASK // 72 H
#define ASCII_49 KEY_I + SHIFT_MASK // 73 I
#define ASCII_4A KEY_J + SHIFT_MASK // 74 J
#define ASCII_4B KEY_K + SHIFT_MASK // 75 K
#define ASCII_4C KEY_L + SHIFT_MASK // 76 L
#define ASCII_4D KEY_M + SHIFT_MASK // 77 M
#define ASCII_4E KEY_N + SHIFT_MASK // 78 N
#define ASCII_4F KEY_O + SHIFT_MASK // 79 O
#define ASCII_50 KEY_P + SHIFT_MASK // 80 P
#define ASCII_51 KEY_Q + SHIFT_MASK // 81 Q
#define ASCII_52 KEY_R + SHIFT_MASK // 82 R
#define ASCII_53 KEY_S + SHIFT_MASK // 83 S
#define ASCII_54 KEY_T + SHIFT_MASK // 84 T
#define ASCII_55 KEY_U + SHIFT_MASK // 85 U
#define ASCII_56 KEY_V + SHIFT_MASK // 86 V
#define ASCII_57 KEY_W + SHIFT_MASK // 87 W
#define ASCII_58 KEY_X + SHIFT_MASK // 88 X
#define ASCII_59 KEY_Z + SHIFT_MASK // 89 Y
#define ASCII_5A KEY_Y + SHIFT_MASK // 90 Z
#define ASCII_5B KEY_F + ALTGR_MASK // 91 [
#define ASCII_5C KEY_Q + ALTGR_MASK // 92
#define ASCII_5D KEY_G + ALTGR_MASK // 93 ]
#define ASCII_5E KEY_3 + ALTGR_MASK // 94 ^
#define ASCII_5F KEY_SLASH + SHIFT_MASK // 95 _
#define ASCII_60 KEY_7 + ALTGR_MASK // 96 `
#define ASCII_61 KEY_A // 97 a
#define ASCII_62 KEY_B // 98 b
#define ASCII_63 KEY_C // 99 c
#define ASCII_64 KEY_D // 100 d
#define ASCII_65 KEY_E // 101 e
#define ASCII_66 KEY_F // 102 f
#define ASCII_67 KEY_G // 103 g
#define ASCII_68 KEY_H // 104 h
#define ASCII_69 KEY_I // 105 i
#define ASCII_6A KEY_J // 106 j
#define ASCII_6B KEY_K // 107 k
#define ASCII_6C KEY_L // 108 l
#define ASCII_6D KEY_M // 109 m
#define ASCII_6E KEY_N // 110 n
#define ASCII_6F KEY_O // 111 o
#define ASCII_70 KEY_P // 112 p
#define ASCII_71 KEY_Q // 113 q
#define ASCII_72 KEY_R // 114 r
#define ASCII_73 KEY_S // 115 s
#define ASCII_74 KEY_T // 116 t
#define ASCII_75 KEY_U // 117 u
#define ASCII_76 KEY_V // 118 v
#define ASCII_77 KEY_W // 119 w
#define ASCII_78 KEY_X // 120 x
#define ASCII_79 KEY_Z // 121 y
#define ASCII_7A KEY_Y // 122 z
#define ASCII_7B KEY_B + ALTGR_MASK // 123 {
#define ASCII_7C KEY_W + ALTGR_MASK // 124 |
#define ASCII_7D KEY_N + ALTGR_MASK // 125 }
#define ASCII_7E KEY_1 + ALTGR_MASK // 126 ~
#define ASCII_7F KEY_BACKSPACE // 127

#endif // LAYOUT_SLOVENIAN

 

Prav tako pa smo morali spremeniti datoteko hardware/teensy/boards.txt, kjer smo dodali vnose za slovensko tipkovnico, ki mora biti dostopna v Tools – Keyboard Layout v Arduino IDE programu. Morali smo dodati naslednje vrstice na ustrezne dele datoteke.

 

teensy3.menu.keys.en-us.build.define1=-DLAYOUT_SLOVENIAN
teensy2.menu.keys.sl-sl.build.define1=-DLAYOUT_SLOVENIAN
teensy1.menu.keys.sl-sl.build.define1=-DLAYOUT_SLOVENIAN
teensypp2.menu.keys.sl-sl.build.define1=-DLAYOUT_SLOVENIAN
teensypp1.menu.keys.sl-sl.build.define1=-DLAYOUT_SLOVENIAN

 

Sedaj, ko smo dodali slovensko postavitev znakov, smo jih morali dodati v Teensyduino. Na internetu smo iskali način za kakršnokoli dokumentacijo o tem, vendar nam ni uspelo najti nič uporabnega. Vseeno pa smo ugotovili, da moramo znotraj hardware/teensy/
cores/teensy3/ direktorija pognati ukaz make, nakar se bo Teensyduino prevedel in v meniju bo dostopna tudi dodana slovenska tipkovnica. Po ponovnem zagonu lahko v menuju Arduino IDE vidimo tudi slovensko tipkovnico.

Za test delovanja slovenske tipkovnice smo izbrali spodnji programček, ki izpiše vse ASCII znake v trenutno aktivni program. Program smo prevedli ter ga namestili na Teensy napravo.

 

 void setup() {

    delay(2000);
    Keyboard.println(“Teensy Slovenian Keyboard Layout Test”);
    delay(100);
    Keyboard.println(“Lowercase: abcdefghijklmnopqrstuvwxyz”);
    delay(100); 
    Keyboard.println(“Uppercase: ABCDEFGHIJKLMNOPQRSTUVWXYZ”);
    delay(100);
    Keyboard.println(“Numbers: 0123456789”);
    delay(100);
    Keyboard.println(“Symbols1: !\”#$%&'()*+,-./”);
    delay(100);
    Keyboard.println(“Symbols2: :;<=>?[\\]^_`{|}~”);
}

void loop() {}

 

Predno smo Teensy vklopili v Windows operacijski sistem, smo zagnali notepad++.exe program, kamor naj bi se izpisali vsi ASCII znaki. Po tem smo Teensy vstavili v USB, kamor so se vsi znaki pravilno izpisali kot vidimo spodaj.

picture3

Po tem lahko na Teensy napravi uporabimo vse ASCII znake, kar nam omogoča izvajanje poljubnih komand na ciljnem računalniku z uporabo Teensy. Dejansko pa nismo implementirali vseh slovenskih znakov kot so č, ž, š, ker jih ne rabimo pri uspešni izvedbi napada na sistem.

Implementacija podpore slovenske tipkovnice je bila potrebna za uspešno izveden projekt.

 

Objavil Dejan Lukan, dne14.10.2013