26
HAKIN9
ATAK
5/2010
N
adal jednak jednym z
najpopularniejszych sposobów
wymiany informacji jest SMS (ang.
Short Message Service). Wiąże się to jednak
z poniesieniem pewnych kosztów, głównie u
posiadaczy kart typu prepaid. Dzięki coraz
tańszym połączeniom internetowym możemy
zredukować swoje wydatki prawie do zera.
Małe koszty, duże możliwości
Konkurencja wśród sprzedawców mobilnego
Internetu z roku na rok staje się coraz większa.
Wpływa to pozytywnie na wysokość opłat za
przesyłanie danych. Cennik zmienia się w
szybkim tempie. Operatorzy oferują nam nowe
pakiety, umożliwiające przeglądanie większej
ilości stron za mniejsze pieniądze.
Co nam daje tak tani Internet? Więcej
rozmów na ulubionym komunikatorze, więcej
czasu na wybranym portalu społecznościowym,
więcej przeczytanych wiadomości w serwisie
informacyjnym i w końcu więcej SMS-ów
wysłanych praktycznie bezpłatnie. Policzmy
na przykładzie sieci Heyah, w której za 100 kB
zapłacimy 2 gr (patrz ramka W Sieci), jaki byłby
koszt przesłania takiej ilości danych, jaką posiada
typowy SMS. Jedna wiadomość to domyślnie
160 znaków zakodowanych za pomocą 7 bitów
(b), co daje nam 1120 b. Stawka za 100 kB
(819200 b) wynosi 2 gr. Łatwo możemy policzyć,
że jedna wiadomość wysłana przez Internet
kosztowałaby nas ok. 0,0027 gr. Do tego należy
KONRAD WITASZCZYK
Z ARTYKUŁU
DOWIESZ SIĘ
ile transferu zużywa Twój
telefon przez wysyłanie SMS-
ów,
jak działają systemy autoryzacji,
jak interpretować wyniki
sniffera.
CO POWINIENEŚ
WIEDZIEĆ
powinieneś posiadać
podstawową wiedzę o
programowaniu,
powinieneś wiedzieć, jak są
przesyłane dane protokołem
HTTP.
dodać ewentualny transfer dodatkowych danych
potrzebnych do wysłania wiadomości. Nie są to
jednak duże liczby, więc rezultat i tak robi wrażenie.
Bramki SMS
Istnieje wiele stron internetowych umożliwiających
wysyłanie wiadomości na telefon komórkowy.
Jednak używanie ich bezpośrednio za pomocą
telefonu nie jest dobrym rozwiązaniem z powodu
licznych reklam lub po prostu bogatej oprawy
samej strony. Każdy, kto posiada podstawową
wiedzę o programowaniu może napisać własny
skrypt, który będzie jedynie odbierać dane od
użytkownika i sam przesyłać je na odpowiedni
adres. Uwolni nas to od zbędnych kosztów.
Piszemy własną bramkę
Zajmiemy się teraz pisaniem wcześniej
wspomnianego skryptu. Pozostaniemy nadal
przy przykładzie Heyah, czyli skorzystamy z
bramki udostępnionej dla członków darmowego
Klubu Heyah (patrz ramka W Sieci). Pierwsze,
co musimy zrobić to zastanowić się, co ma
wykonać nasz program, aby wysłać wiadomość.
Na początku musi przejść przez system
autoryzacji. Następnie w celu identyfikacji oraz
podtrzymania sesji, pobierze ciasteczka (ang.
cookies). Ostatnim krokiem jest wysłanie numeru
telefonu i treści wiadomości w odpowiedni
sposób. Teraz należy zdobyć potrzebne
informacje na temat działania wybranego
portalu. W tym celu wykorzystamy dobrze znany
Stopień trudności
Bramki SMS
i darmowe
wiadomości
Internet daje nam wielkie możliwości w zakresie komunikacji.
Dziś prawie każdy może skorzystać z Sieci, posługując się
swoim telefonem komórkowym...
27
HAKIN9
BRAMKI SMS I DARMOWE WIADOMOŚCI
5/2010
sniffer Wireshark (patrz ramka W Sieci).
Załóżmy, że posiadamy konto i jesteśmy
gotowi do zalogowania się. Włączamy
wybrany program do analizy pakietów i
przechodzimy przez cały proces wysyłania
wiadomości. Dobrym wyborem okazał się
portal heyahklub.pl, ponieważ umożliwia
nam ustawienie nadawcy na własny
numer. Dodatkowo sprawdzimy, co trzeba
zrobić, aby ta operacja była możliwa.
Przyjrzyjmy się wynikom pracy sniffera.
Lista interesujących wpisów uzyskana po
skanowaniu została przedstawiona na
Rysunku 1. Pierwszym z nich jest:
POST /sso/authserver/server HTTP/1.1
Host: sso.era.pl
Wraz z nim zostały wysłane następujące
dane:
request=login1&rid=<rid>&sso-server=au
thserver&user=<nazwa_użytkown
ika>&password=<hasło>&x=0&y=0
Widzimy, że poprzez to zapytanie,
zostaliśmy zalogowani. Następnie wykonało
się kilka przekierowań, które ostatecznie
doprowadziły nas do: /hk/portal/
privatePortal.do. Teraz warto zobaczyć, jakie
ciasteczka zostały nam zwrócone:
Cookie:
JSESSIONID=sJ2pLDTNXGZT0T20rv
P7Jrv4Q95Y3NPxWFWJ2BGywmMTJbX0vGhL!-
955922799;
Przyjrzyjmy się fragmentom danych, które
zostały przekazane podczas wysyłania
wiadomości z numerem wirtualnym.
Zapytanie dotyczyło ścieżki: /hk/msg/
user/heyah/sms.do. Jego rezultaty zostały
przedstawione w Listingu 1.
Widać tutaj, że przy budowie bramki
wykorzystano framework Apache Struts
(patrz ramka W Sieci). Wymaga on podania
w celu autoryzacji tokenu przekazanego w
zmiennej
org.apache.struts.taglib.h
tml.TOKEN
.
Analizując dalej pakiety, możemy
zauważyć, że w celu wysłania wiadomości
z naszym prywatnym numerem, należy
wartość
bottom.sender
zmienić z
virtual
na
msisdn
(nazwa pochodzi od
Mobile Subscriber ISDN – numer abonenta
sieci komórkowej).
Zajmiemy się przenoszeniem
zdobytych informacji na kod skryptu.
Przykład podany przeze mnie będzie
napisany w języku Ruby, z wykorzystaniem
biblioteki net/http oraz cgi. Ponieważ
nasz skrypt musi być dostępny poprzez
połączenie z serwerem HTTP, numer
telefonu i treść wiadomości będą wysyłane
metodą
GET
lub
POST
(załóżmy, że nazwę
użytkownika i hasło wpisujemy na stałe do
skryptu):
phone = cgi.params["p"].to_s
text = cgi.params["t"].to_s
Dodatkowo dla bezpieczeństwa
wprowadzimy klucz w celu autoryzacji:
key = cgi.params["k"].to_s
Teraz, aby skrypt został wykonany, trzeba
będzie przejść pod następujący adres (w
przypadku metody
GET
):
http://host/nazwa_skryptu?p=numer_telef
onu&t=treść%20wiadomości&k=ustalony
_klucz
Następny krok to logowanie.
Zauważyliśmy wcześniej, że do jego
wykonania oprócz podania loginu i hasła
należy przekazać
rid
. Łatwo znaleźć tę
wartość analizując formularz logowania
pod ścieżką: /hk/portal/privatePortal.do.
Po otworzeniu tej strony, zostajemy
przekierowani na:
http://sso.era.pl/sso/authserver/
Listing 1.
Dane przekazane na adres http://heyahklub.pl/hk/msg/user/heyah/
sms.do podczas wysyłania wiadomości
--aAbB0R6Tbf
Content-Disposition: form-data; name="tab"
top
--aAbB0R6Tbf
Content-Disposition: form-data; name="send.x"
send
--aAbB0R6Tbf
Content-Disposition: form-data; name="send"
send
--aAbB0R6Tbf
Content-Disposition: form-data; name="top.phoneReceiver"
<numer_telefonu>
--aAbB0R6Tbf
Content-Disposition: form-data; name="top.text"
<tresc_wiadomosci>
--aAbB0R6Tbf
Content-Disposition: form-data; name="org.apache.struts.taglib.html.TOKEN"
0b02d1ba32e4302010cdcf668f5aee5d
--aAbB0R6Tbf
Content-Disposition: form-data; name="bottom.sender"
virtual
Rysunek 1.
Lista wybranych pakietów przechwyconych przez Wireshark
ATAK
28
HAKIN9 5/2010
BRAMKI SMS I DARMOWE WIADOMOŚCI
29
HAKIN9
5/2010
server?request=login1&rid=<rid>&sso-
server=authserver
Okazało się, że nie musimy nawet
przeglądać zawartości tej strony, lecz
jedynie pobrać szukany ciąg znaków z
nowego adresu:
path = "/hk/portal/privatePortal.do"
http = Net::HTTP.new("www.heyahklub.pl
", 80)
resp = http.get(path, nil)
rid = resp.header["location"].scan
(/rid=(.+?)&/)
Teraz możemy przejść do logowania.
Łączymy się z odpowiednim hostem i
wysyłamy dane metodą POST na właściwy
adres:
path = "/sso/authserver/server"
data = "request=login1&rid=#{rid}&sso-
server=authserver&user=#{user}
&password=#{pass}&x=0&y=0"
http = Net::HTTP.new("sso.era.pl", 80)
resp = http.post(path, data)
Zgodnie z wcześniejszymi ustaleniami, w
celu podtrzymania sesji, musimy pobrać
ciasteczka. Najlepiej to zrobić parsując
nagłówki strony, na którą zostaniemy
przekierowani po ostatnim procesie:
data = resp.header["location"].scan(/
login\?(.+?)$/)
url = URI.parse(resp.header["location"])
path = "#{url.path}?#{data}"
http = Net::HTTP.new(url.host,url.port)
resp = http.get(path, nil)
headers = { "Cookie" =>
resp.header["set-cookie"] }
Jesteśmy zalogowani i gotowi do wysłania
wiadomości. Jedyne, czego nam brakuje
to token, którego musimy użyć. W tym celu
otwieramy stronę, na której jest formularz
do wysyłania wiadomości:
path = "/hk/msg/user/heyah/welcome.do"
http = Net::HTTP.new("www.heyahklub.pl
", 80)
resp = http.post(path, nil, headers)
Listing 2.
Skrypt wysyłający SMS za pomocą bramki Heyah używając numeru
prywatnego
#!/usr/local/bin/ruby
require
'net/http'
require ‘cgi’
user
=
"moja_nazwa"
pass
=
"moje_hasło"
phone
=
cgi.params
[
"p"
]
.to_s
text
=
cgi.params
[
"t"
]
.to_s
key
=
cgi.params
[
"k"
]
.to_s
puts cgi.header
if
key
==
"ustalony_klucz"
path
=
"/hk/portal/privatePortal.do"
http
=
Net
::
HTTP.new
(
"www.heyahklub.pl"
,
80
)
resp
=
http.get
(
path
,
nil
)
rid
=
resp.header
[
"location"
]
.scan
(
/rid=(.+?)&/
)
path
=
"/sso/authserver/server"
data
=
"request
=
login
1
&rid
=
#{rid}&sso-server=authserver&user=#{user}&password=#
{pass}&x=0&y=0"
http
=
Net
::
HTTP.new
(
"sso.era.pl"
,
80
)
resp
=
http.post
(
path
,
data
)
data
=
resp.header
[
"location"
]
.scan
(
/
login\?
(
.
+
?
)
$/
)
url
=
URI.parse
(
resp.header
[
"location"
])
path
=
"
#{url.path}?#{data}"
http
=
Net
::
HTTP.new
(
url.host
,
url.port
)
resp
=
http.get
(
path
,
nil
)
headers
=
{
"Cookie"
=>
resp.header
[
"set-cookie"
]
}
path
=
"/hk/msg/user/heyah/welcome.do"
http
=
Net
::
HTTP.new
(
"www.heyahklub.pl"
,
80
)
resp
=
http.post
(
path
,
nil
,
headers
)
token
=
resp.body.gsub
(
"
\n
"
,
""
)
.scan
(
/<
input type
=
"hidden"
name
=
"org
\.
apache
\
.
struts
\.
taglib
\.
html
\.
TOKEN"
value
=
"(.+?)"
\/>/
)
path
=
"/hk/msg/user/heyah/sms.do"
data
=
"tab
=
bottom&smsOptions.x
=
smsOptions&smsOptions
=
smsOptions&org.apache.stru
ts.taglib.html.TOKEN
=
#{token}&bottom.exact=t"
http
=
Net
::
HTTP.new
(
"www.heyahklub.pl"
,
80
)
resp
=
http.post
(
path
,
data
,
headers
)
token
=
resp.body.gsub
(
"
\n
"
,
""
)
.scan
(
/<
input type
=
"hidden"
name
=
"org
\.
apache
\
.
struts
\.
taglib
\.
html
\.
TOKEN"
value
=
"(.+?)"
>/
)
path
=
"/hk/msg/user/heyah/sms.do"
data
=
"send.x
=
send&send
=
send&top.phoneReceiver
=
#{phone}&top.text=#{text}&org.ap
ache.struts.taglib.html.TOKEN=#{token}&bottom.sender=msisdn"
http
=
Net
::
HTTP.new
(
"www.heyahklub.pl"
,
80
)
resp
=
http.post
(
path
,
data
,
headers
)
puts
"OK"
else
puts
"ERROR"
end
Rysunek 2
. Wygląd przykładowego
formularza HTML w przeglądarce Opera
Mobile
ATAK
28
HAKIN9 5/2010
BRAMKI SMS I DARMOWE WIADOMOŚCI
29
HAKIN9
5/2010
W źródle znajdujemy szukaną wartość i
zapisujemy ją poprzez parsowanie tekstu:
token = resp.body.gsub("\n", "")
.scan(/<input type="hidden"
name="org\.apache\.struts\
.taglib\.html\.TOKEN"
value="(.+?)" \/>/)
Ostatecznie możemy przejść do wysłania
wiadomości:
path = "/hk/msg/user/heyah/sms.do"
data = "send.x=send&send=send&top.pho
neReceiver=#{phone}&top.text=
#{text}&org.apache.struts.tag
lib.html.TOKEN=#{token}&botto
m.sender=virtual"
http = Net::HTTP.new("www.heyahklub.pl
", 80)
resp = http.post(path, data, headers)
Jeśli wszystko poszło dobrze, SMS
powinien dotrzeć na wybrany numer.
Teraz zmodyfikujmy nasz skrypt tak,
abyśmy mogli użyć swojego numeru
telefonu. Podczas analizowania pakietów
zauważyliśmy, że wykonano dodatkowe
zapytanie HTTP. W źródle otwartej strony
można znaleźć nowy token. Jednak, aby
tego dokonać, musimy już posiadać
jego starą wartość i wysłać ją na żądany
adres:
path = "/hk/msg/user/heyah/sms.do"
data = "tab=bottom&smsOptions.x=smsOpt
ions&smsOptions=smsOptions&org
.apache.struts.taglib.html.TO
KEN=#{token}&bottom.exact=t"
http = Net::HTTP.new("www.heyahklub.
pl", 80)
resp = http.post(path, data, headers)
W identyczny sposób, jak to zrobiliśmy
ostatnio, pobieramy nowy token:
token = resp.body.gsub("\n", "")
.scan(/<input type="hidden"
name="org\.apache\.struts\
.taglib\.html\.TOKEN"
value="(.+?)">/)
Naszą modyfikację umieszczamy tuż przed
ostatnim zapytaniem. Cały skrypt został
przedstawiony w Listingu 2.
Formularz w telefonie
Naszym głównym celem było
zminimalizowanie kosztów, co wiąże się
z ilością przesyłanych lub pobieranych
danych. Właśnie dlatego warto jako interfejs
dla skryptu utworzyć prosty formularz
HTML, który umieścimy w pamięci naszego
telefonu. Praktycznie każda przeglądarka
internetowa na urządzenia mobilne
pozwala na otwieranie lokalnych plików. Nie
będziemy się zajmować tym, jak zbudować
taką stronę. Listing 3 przedstawia
przykładową stronę, a Rysunek 2 jej wygląd
w przeglądarce Opera Mobile (patrz ramka
W Sieci). Od tej pory możemy używać
naszego skryptu będąc poza domem,
bez dostępu do sieci bezprzewodowych, a
jedynie z zasięgiem telefonii komórkowej.
Podsumowanie
Należy wspomnieć, że Heyah nie daje
możliwości wysyłania nieograniczonej ilości
SMS-ów przez bramkę. Maksymalnie można
uzyskać 200 darmowych wiadomości na
każdy nowy miesiąc. Jednak ilość takich
bramek internetowych jest olbrzymia. Dla
programisty nie jest problemem dopisanie
własnych modułów obsługujących inne
strony. Mając własny skrypt, który potrafi
sam wybrać odpowiednią bramkę, możemy
wysyłać dużo więcej wiadomości. Oprócz
tego w celu ułatwienia sobie wpisywania
adresata, dobrym wyjściem byłoby
utworzenie książki adresowej załączonej we
wcześniej napisanej stronie HTML.
Pokazane tutaj metody są całkowicie
legalne. Przedstawiają jedynie sposób
użytkowania udostępnionych usług.
Napisanie takiego skryptu nie zajmuje wiele
czasu, ani nie jest trudne do wykonania.
Mimo tego można wiele się nauczyć oraz
zdobyć chociażby minimalne korzyści.
Automatyzuje on jedynie czynności, które
moglibyśmy wykonać osobiście za pomocą
przeglądarki. Trzeba jednak pamiętać, że
wykonanie ich poprzez telefon komórkowy
zwiększyłoby ilość pobranych danych, a tym
samym podniosło koszty.
Listing 3.
Przykład formularza do wysyłania wiadomości
<
!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/
TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns=
"http://www.w3.org/1999/xhtml"
xml:lang=
"pl"
lang=
"pl"
>
<
head
>
<
meta http-equiv=
"Content-Type"
content=
"text/html; charset=utf-8"
/
>
<
meta name=
"viewport"
content=
"width=device-width, initial-scale=0.50,
minimum-scale=0.50, maximum-scale=1.1"
>
<
title
>
Bramka SMS - Heyah!
<
/title
>
<
style type=
"text/css"
>
body {
margin: 5;
}
<
/style
>
<
/head
>
<
body
>
<
form name=
"sms"
action=
"http://host/nazwa_skryptu"
method=
"post"
>
<
input name=
"p"
type=
"text"
value=
""
size=
"11"
/
><
br
/
>
<
textarea name=
"t"
rows=
"5"
cols=
"40"
><
/textarea
><
br
/
>
<
input type=
"hidden"
name=
"k"
value=
"ustalony_klucz"
/
>
<
input type=
"submit"
value=
"Send!"
/
>
<
/form
>
<
/body
>
<
/html
>
W Sieci
• http://heyah.pl/mobilny-internet – oferta
mobilnego Internetu w Heyah,
• http://heyahklub.pl/ – Klub Heyah,
bramka SMS,
• http://www.wireshark.org/ – sniffer
Wireshark,
• http://www.opera.com/mobile/
– przeglądarka Opera Mobile,
• http://struts.apache.org/ – framework
Apache Struts.
Konrad Witaszczyk
Autor jest uczniem szkoły średniej. Utrzymuje stałą
współpracę z Uniwersytetem Jagielońskim, pracując
nad aplikacjami sieciowymi Europejskiej Akademii Gier
(http://ega.org.pl/).
Kontakt z autorem: konrad.witaszczyk@ega.org.pl.