Chwila z Java Mail, czyli dlaczego maile nie służą do rozmów z bankami
Pewien czas temu natknąłem się na tekst poświęcony sposobom komunikacji klient-bank w mBanku. Autorka słusznie wykazuje, że obsługa w mBanku jest co najmniej upierdliwa, a narzędzie jakim jest korespondencja wewnętrzna nie jest odpowiednio wykorzystane, ale też wysuwa niesłuszną moim zdaniem tezę co do komunikacji za pomocą emaila.
Specjalnie dla niej króciutka prezentacja możliwości manipulowania nagłówkami oraz kilku sztuczek „livehacking” i „socialhacking”. Całość w Javie.
Przygotowania
W pierwszej kolejności instalujemy sobie serwer poczty. Ja wybrałem postfixa.
Listing 1. instalacja Postfixa
$ sudo apt-get install postfix
Czytanie list pakietów... Gotowe
Budowanie drzewa zależności
Odczyt informacji o stanie... Gotowe
Sugerowane pakiety:
procmail postfix-mysql postfix-pgsql postfix-ldap postfix-pcre sasl2-bin resolvconf postfix-cdb
Zostaną zainstalowane następujące NOWE pakiety:
postfix
0 aktualizowanych, 1 nowo instalowanych, 0 usuwanych i 0 nieaktualizowanych.
Konieczne pobranie 1321kB archiwów.
Po tej operacji zostanie dodatkowo użyte 3273kB miejsca na dysku.
Pob: 1 http://pl.archive.ubuntu.com/ubuntu/ lucid/main postfix 2.7.0-1 [1321kB]
Pobrano 1321kB w 1s (901kB/s)
Prekonfiguracja pakietów ...
Zaznaczenie poprzednio niezaznaczonego pakietu postfix.
(Odczytywanie bazy danych ... 347594 plików i katalogów obecnie zainstalowanych.)
Rozpakowanie postfix (z .../postfix_2.7.0-1_i386.deb) ...
Przetwarzanie wyzwalaczy dla ureadahead...
ureadahead will be reprofiled on next reboot
Przetwarzanie wyzwalaczy dla ufw...
Przetwarzanie wyzwalaczy dla man-db...
Konfigurowanie postfix (2.7.0-1) ...
Dodawanie grupy `postfix' (GID 131)...
Gotowe.
Dodawanie użytkownika systemowego `postfix' (UID 126)...
Dodawanie nowego użytkownika `postfix' (UID 126) w grupie `postfix'...
Nie utworzono katalogu domowego `/var/spool/postfix'.
Creating /etc/postfix/dynamicmaps.cf
Adding tcp map entry to /etc/postfix/dynamicmaps.cf
Dodawanie grupy `postdrop' (GID 132)...
Gotowe.
setting myhostname: koziolek-desktop
setting alias maps
setting alias database
mailname is not a fully qualified domain name. Not changing /etc/mailname.
setting destinations: koziolek-desktop, localhost.localdomain, , localhost
setting relayhost:
setting mynetworks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
setting mailbox_size_limit: 0
setting recipient_delimiter: +
setting inet_interfaces: all
/etc/aliases does not exist, creating it.
WARNING: /etc/aliases exists, but does not have a root alias.
Postfix is now set up with a default configuration. If you need to make
changes, edit
/etc/postfix/main.cf (and others) as needed. To view Postfix configuration
values, see postconf(1).
After modifying main.cf, be sure to run '/etc/init.d/postfix reload'.
Running newaliases
* Stopping Postfix Mail Transport Agent postfix [ OK ]
* Starting Postfix Mail Transport Agent postfix [ OK ]
Przetwarzanie wyzwalaczy dla libc-bin...
ldconfig deferred processing now taking place
I tyle. W trakcie instalacji zostaniemy poproszeni o podanie nazwy domeny, ale serwer posłuży nam tylko jako punkt zaczepienia do sieci i domena nie jest istotna.
Następnie tworzymy za pomocą mavena projekt java:
Listing 2. pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelversion>4.0.0</modelversion><groupid>pl.koziolekweb.tutorial</groupid><artifactid>mail-hacking</artifactid><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>mail-hacking</name><url>http://maven.apache.org</url><properties><project.build.sourceencoding>UTF-8</project.build.sourceencoding></properties><build><plugins><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-compiler-plugin</artifactid><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-surefire-plugin</artifactid><version>2.6</version><configuration><suitexmlfiles><suitexmlfile>src/test/resources/testng.xml</suitexmlfile></suitexmlfiles></configuration></plugin><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-eclipse-plugin</artifactid><version>2.8</version><configuration><downloadsources>true</downloadsources><downloadjavadocs>true</downloadjavadocs><workspace>./</workspace></configuration><executions><execution><id>eclipse</id><phase>clean</phase><goals><goal>clean</goal><goal>eclipse</goal></goals></execution></executions></plugin></plugins></build><dependencies><dependency><groupid>org.testng</groupid><artifactid>testng</artifactid><version>LATEST</version><scope>test</scope></dependency><dependency><groupid>org.mockito</groupid><artifactid>mockito-all</artifactid><version>1.8.1</version><scope>test</scope></dependency><dependency><groupid>javax.mail</groupid><artifactid>mail</artifactid><version>1.4</version></dependency></dependencies></project>
jako zależność dodajemy javax.mail i podpinamy do Eclipse.
Programowanie
Teoria
W uproszczeniu każda wiadomość email składa się z nagłówków i treści – ciała. Treść wiadomo zawiera treść. Znacznie interesujące są dla nas nagłówki. Zawierają one informacje kontrolne i sterujące takie jak nadawca, odbiorca, odbiorcy, listy CC i BCC, załączniki, ale też nagłówek Sender, który informuje o tym kto technicznie nadał wiadomość (zawiera informacje o użytkowniku serwera poczty) oraz Reply-To, który wskazuje do kogo będzie wysyłana odpowiedź.
Socialhaking
Kevin Mitnick esencję przedstawionej tu metody zawarł w tytule swojej książki „Sztuka podstępu. Łamałem ludzi, nie hasła”. Cała sztuka opiera się o pewne zachowania użytkownika. W zasadzie o jedno… czy naciskają „odpowiedz” patrzysz do kogo idzie odpowiedź i czy adres email zgadza się z adresem nadawcy? Coś czuję, że od dziś zaczniesz hehehe….
Praktyka
Do „chakierowania” użyję prostego programu napisanego w javie z wykorzystaniem Java Mail API.
Listing 3. Nasze super narzędzie…
package pl.koziolekweb.tutorial;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class App {
public static void main(String[] args) throws AddressException,
MessagingException {
String from = "Jaś Kowalski <jas@kowalski.pl>";
String to = "jełop@mójBank.pl";
String replyTo = "devil@evil.hell";
Properties props = System.getProperties();
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.addHeader("Reply-To", replyTo);
message.addHeader("Content-Type", " text/plain; charset=UTF-8");
message.setSubject("Pytanie");
message.setText("Czy wykonano już przelew?");
Transport.send(message);
}
}
sprawdź samemu zmieniając adres TO na swojego maila.
Co ciekawe wiele klientów email nie sprawdza nagłówków i trzeba samodzielnie sprawdzić czy to gdzie wysyłamy zgodne jest z tym skąd dostajemy…
Schemat ataku
Schemat ataku jest tu bajecznie prosty. Atakujący wysyła maila z „lewymi” nagłówkami w którym pyta o duperelę. Warto by była to rzeczywista duperela np. czy wysłano już zamówioną kartę… Następnie w ramach konwersacji mailowej pytamy się czy osoba z obsługi nie była by tak miła i nie pomogła wykonać jeszcze jedną drobną operację… zmianę adresu korespondencyjnego… prawda, że duperela. Następnie zmuszamy ofiarę do zablokowania karty i zgłoszenia zapotrzebowania na nową… zgadnijcie gdzie trafi karta… Wraz z PINem w osobnym liście…
Oczywiście musimy trafić na bankiera idiotę, ale nie jest to trudne…
Schematy obrony
Podpis cyfrowy
Prosty i stosunkowo tani sposób obrony. Niekwalifikowany podpis można wyrobić sobie samemu. Bankowi przesyłamy klucz publiczny, a wiadomości podpisujemy z wykorzystaniem klucza prywatnego. Podpis kwalifikowany jest droższy, ale ma tą dodatkową zaletę, że można go wykorzystać jeszcze w kilku innych celach oraz, że daje możliwość wysyłania wiadomości z dowolnego komputera wyposażonego w czytnik kart chipowych (w teorii).
Weryfikacja nagłówków
Po stronie banku serwer poczty sprawdza czy nagłówek From i Reply-To są takie same. Metoda dobra o tyle, że klient nie musi nic robić. Wadą jest jej stosunkowo łatwe ominięcie poprzez błędy serwerów pocztowych.
Wewnętrzny system email
Postfix, ale też i inne serwery pozwalają na konfigurację w ten sposób, że cały ruch będzie odbywał się wewnątrz danej instancji serwera. Klient wykorzystuje wtedy specjalne bankowe konto mailowe. Metoda całkiem dobra, ale równie dobrze można wykorzystać jakiś wewnętrzny system wiadomości.