Dwuetapowe uwierzytelnianie, kody SMS i Android

Większość z nas korzysta na co dzień z serwisów wymagających dwuetapowego logowania. Pierwszym etapem jest podanie loginu i hasła. Etapem drugim jest podanie kodu SMS, a następnie, w przypadku poprawnie wpisanego kodu, zalogowanie.

Sama idea jest oczywiście bardzo dobra, chroni to nasze konta przed nieautoryzowanym dostępem. Jedynym minusem tego typu uwierzytelniania jest fakt że wydłuża to znacznie czas logowania lub innych operacji.

O ile hasło jest proste (a nie powinno być), możemy je zapamiętać. Bardziej skomplikowane hasło pomoże nam przechować program KeePass. Za pomocą tego programu można również zautomatyzować proces wprowadzania hasła, dzięki czemu pierwszy etap logowania może przejść błyskawicznie.

Niestety drugi etap wymaga od nas więcej czasu. Gdy przyjdzie SMS, musimy odblokować telefon, wejść w wiadomości, wybrać odebraną wiadomość, zlokalizować kod i następnie poprawnie go przepisać (pomijam widgety, screenlocki itd.). Dodatkowo proces może się wydłużyć w przypadku niepoprawnego wprowadzenia kodu.

I w tym momencie z pomocą nadciąga Android. Dzięki niemu możemy w pełni zautomatyzować proces wpisywania SMSa w przeglądarce.

Proces automatyzacji przebiega następująco:

  • przychodzi do nas kod SMS
  • AndroidNotifier wysyła kod na nasz komputer przez WiFi (UDP)
  • serwer UDP napisany w AutoHothey-u odbiera SMS-a
  • SMS przechodzi przez wyrażenie regularne które wyciąga z niego kod
  • kod zostanie wpisany na stronie wymagającej jego podania

Poniżej przedstawiam sposób w jaki sposób to ogarnąć (oraz małe demo).

Czego będziemy potrzebowali:


1. instalacja i konfiguracja AndroidNotifier-a

Sama instalacja jest prosta, przechodzimy do google store-a i klikamy zainstaluj. Po zainstalowaniu wchodzimy do "Remote Notifier" i zabieramy się za ustawienia.

1

Notification Methods
2

Zaznaczamy IP/Wifi i wchodzimy do IP/Wifi Options
3

Target IP address -> Custom IP or host
Custom Ip address(es) -> nasz lokalny adres IP
Zaznaczamy Auto-enable Wifi
Zaznaczamy send with UDP
4

Notification Service
5

klikamy Start Service
zaznaczamy Start Service at boot
zaznaczamy Show notification icon
2. instalacja i konfiguracja AutoHotkey-a

Instalacja sprowadza się do ściągnięcia aplikacji i poklikania dalej, dalej, dalej, zakończ.

Następnie na pulpicie tworzymy plik server.ahk po czym przechodzimy do jego edycji.

Na początku potrzebny nam będzie serwer, na szczęście nie musimy ponownie wynajdować koła. Z pomocą przychodzi nam forum AutoHotkeya, gdzie ktoś już napisał skrypt pełniący funkcję serwera. Po lekkiej modyfikacji wychodzi nam coś takiego:

Port = 10600 Gui, Add, Edit, w600 r10 vLogEdit ReadOnly, Gui, +Resize Gui, Show,, Tiny UDP OnExit, ExitSub ; ---------------------------------------------------------------- VarSetCapacity(wsaData, 32, 0) DllCall("Ws2_32WSAStartup", "UShort", 0x202, "UInt", &wsaData) recvsock := DllCall("Ws2_32socket", "Int", 2, "Int", 2, "Int", 17) VarSetCapacity(recvaddr, 32, 0) NumPut(2, recvaddr, 0, "Short") NumPut(DllCall("Ws2_32htons", "UShort", Port), recvaddr, 2, "UShort") DllCall("Ws2_32bind", "UInt", recvsock, "UInt", &recvaddr, "Int", 32) DllCall("Ws2_32WSAAsyncSelect", "UInt", recvsock, "UInt", WinExist("A"), "UInt", 0x5555, "Int", 0x1) OnMessage(0x5555, "WinsockMessage") if ( log := DllCall("Ws2_32WSAGetLastError") ) { msgbox WinSock error %log% exitapp } else { log := "Tiny UDP ready -> " a_IPAddress1 ":" Port Guicontrol,, LogEdit, %log% } return ; ---------------------------------------------------------------- WinsockMessage(socket, event) { Critical global log, recvsock VarSetCapacity(recvdata, 256, 0) VarSetCapacity(fromaddr, 32, 0) VarSetCapacity(buff, 64) DllCall("Ws2_32recvfrom", "UInt", recvsock, "Str", recvdata, "UInt", 256, "UInt", 0, "UInt", &fromaddr, "UInt", &buff) FormatTime, TimeString, T12, yyyy-MM-d HH:mm:ss log .= "`n" TimeString " [" log .= NumGet(fromaddr, 4, "UChar") loop 3 log .= "." NumGet(fromaddr, 4+A_Index, "UChar") log .= "] " recvdata Guicontrol,, LogEdit, %log% TakeAction(recvdata) controlsend, edit1, ^{end}, Tiny UDP } ; ---------------------------------------------------------------- GuiClose: ExitSub: NumPut(0xFFFFFFFF, toaddr, 4, "UInt") DllCall("Ws2_32WSACleanup") ExitApp Guisize: GuiControl, Move, LogEdit, % "w" . A_GuiWidth - 20 GuiControl, Move, LogEdit, % "h" . A_GuiHeight - 20 return ; ---------------------------------------------------------------- ; --- ACTIONS ; ---------------------------------------------------------------- TakeAction(msg) { global log MyVar := RegExReplace(msg, "v2/[a-z0-9]+/[a-z0-9]+/", "") StringSplit, El, MyVar, / SplashImage,, x0 y0 b fs12, %El3% Sleep, 5000 SplashImage, Off }

Po zapisaniu i odpaleniu tego skryptu powinno nam się ukazać takie okienko:

Jak widać serwer w tym wypadku nasłuchuje na ip 192.168.1.120 i porcie 10600 (i takie ip i port powinny być wpisane w AndroidNotifier w smartfonie)

Jeśli wszystko do tej pory poszło zgodnie z planem, pasuje sprawdzić czy komunikacja między AndroidNotifier-em a AutoHotkey-em przebiega prawidłowo. Na smartfonie naduszamy przycisk "Send test notification".

W AutoHotkeyu powinno pokazać nam się powiadomienie:

3. konfiguracja AutoHotkey-a cd.

Na tym etapie mamy poprawną komunikację między smartfonem a komputerem. Autohotkey otrzymuje powiadomienia od AndroidNotifiera. Typy otrzymywanych powiadomień można ustawić w opcjach "Events to notify". Nas na chwilę obecną interesują wyłącznie SMSy.

Teraz wystarczy przetworzyć potencjalnego SMSa i wyciągnąć z niego pożądane dane. Edytujemy funkcję TakeAction i dostosowujemy do własnych potrzeb. Poniżej przykładowa funkcja:

TakeAction(msg) { global log MyVar := RegExReplace(msg, "v2/[a-z0-9]+/[a-z0-9]+/", "") StringSplit, El, MyVar, / ;--SMS if(El1 = "SMS"){ if (InStr(El3,"Play")) { clipboard = %El3% NewStr := RegExReplace(El3 , "SMS from PLAY24: Jednorazowe haslo SMS: ", "") log .= "`n" NewStr SEND %NewStr% } } SplashImage,, x0 y0 b fs12, %El3% Sleep, 5000 SplashImage, Off }

W tym wypadku jest to zautomatyzowanie logowania do PLAY24. Poniżej przedstawiam jak to wygląda w praktyce.

Jak widać na powyższym filmiku przepisywanie kodu z telefonu które zazwyczaj zajmuje kilka-kilkanaście sekund sprowadza się do sekundy. Zakładając że chodzi o wysyłanie większej ilości przelewów jest to dosyć pomocne. W górnym lewym rogu ekranu pokazuje się treść SMSa, także w razie gdyby jego zawartość nie zgadzała się z stanem faktycznym, można kliknąć anuluj w określonym serwisie.

4. Podsumowanie

Pokazany powyżej lifehack z pewnością ułatwia proces dwuetapowej autoryzacji, jednak zawsze jest jakieś ALE. Należy się zastanowić czy takie ułatwienie jest bezpieczne. W momencie gdy AndroidNotifier jest włączony, za każdym razem jak przyjdzie jakiś SMS, jest on wysyłany na nasz komputer. Jeśli ktoś planuje atak w naszym kierunku i wie że wykorzystujemy taki system, ponadto zna hasło do naszego konta - załóżmy - bankowego, ułatwienie to może obrócić się przeciw nam. Jednak jest to bardzo ekstremalny przypadek. Dla bezpieczeństwa najlepiej włączać AndroidNotifiera wyłącznie przed zamiarem wykorzystania go. Należy zawsze reagować na sygnał przychodzącego SMSa i sprawdzać jego treść (np. za pośrednictwem AutoHotkeya).