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


	4.0.0

	pl.koziolekweb.tutorial
	mail-hacking
	1.0-SNAPSHOT
	jar

	mail-hacking
	http://maven.apache.org

	
		UTF-8
	
	
		
			
				org.apache.maven.plugins
				maven-compiler-plugin
				
					1.6
					1.6
				
			
			
				org.apache.maven.plugins
				maven-surefire-plugin
				2.6
				
					
						src/test/resources/testng.xml
					
				
			
			
				org.apache.maven.plugins
				maven-eclipse-plugin
				2.8
				
					true
					true
					./
				
				
					
						eclipse
						clean
						
							clean
							eclipse
						
					
				
			
		
	
	
		
			org.testng
			testng
			LATEST
			test
		
		
			org.mockito
			mockito-all
			1.8.1
			test
		
		
			javax.mail
			mail
			1.4
		
	

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.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax