background image

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...

background image

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

background image

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

background image

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.