TEST ONT

mail@pastecode.io avatar
unknown
java
2 years ago
7.7 kB
4
Indexable
Never

package os;

import app.Main;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;

/**
 * Clase utilizada para todas las operaciones con Linux
 *
 * @author Luis.
 */
public class OSLinux implements OSStructure {

    private String device = "";
    private boolean privileges = false;

    public OSLinux() {
        checkPrivileges();
    }

    /**
     * Método utilizado para obtener el listado de redes disponibles.
     * @return Devuelve un array con todas las redes y sus datos.
     */
    public ArrayList<ArrayList<String>> getSSIDs() {
        Main.startPB("Obteniendo redes disponibles");
        ArrayList<ArrayList<String>> ssids = new ArrayList();
        try {
            if (privileges) {
                getDevice();
                File nets = new File("nets");
                BufferedReader br = new BufferedReader(new FileReader(nets));
                ArrayList<String> ssid = new ArrayList();
                String line, auth = "";
                while ((line = br.readLine()) != null) {
                    line = line.trim();
                    if (line.indexOf("Address")!=-1) {
                        if (ssid.size()>0 && !auth.equals("")) {
                            ssid.add(null); ssid.add(auth);
                            ssids.add(ssid);
                            auth = "";
                        }
                        ssid = new ArrayList();
                        ssid.add(null);
                        String bssid = line.substring(line.length()-17);
                        ssid.add(bssid.toUpperCase());
                        auth = "WEP";
                    }
                    if (line.indexOf("ESSID")!=-1) {
                        StringTokenizer st = new StringTokenizer(line, "\"");
                        st.nextToken();
                        String essid = st.nextToken().trim();
                        if (!essid.equals("\\x00")) ssid.set(0, essid);
                        else ssid.add(0, "(oculta)");
                    }
                    if (line.indexOf("WPA2")!=-1) auth = "WPA2";
                    else if (!auth.equals("WPA2") && line.indexOf("WPA")!=-1) auth = "WPA";
                }
                if (ssid.size()>0 && !auth.equals("")) {
                    ssid.add(null);
                    ssid.add(auth);
                    ssids.add(ssid);
                }
                br.close();
                nets.delete();
            }
        } catch (FileNotFoundException ex) {
            Main.stopPB();
            int type = JOptionPane.ERROR_MESSAGE;
            String msg = "No se pueden encontrar las redes inalambricas disponibles.\n" +
                         "Inicie la aplicación con permisos de administrador.";
            JOptionPane.showMessageDialog(null, msg, "TEST ONT", type);
        } catch (Exception ex) {
            // EXCEPCION
        } finally {
            Main.stopPB();
            return ssids;
        }
    }

    /**
     * Método utilizado para conectarse a una red vulnerable.
     * @param index ID de la red vulnerable (en la tabla y en el array)
     */
    @Override
    public void connect(int index) {
        try {
            if (privileges) {
                Main.startPB("Conectando a " + Main.getSSIDs().get(index).get(0));
                ArrayList<String> ssid = Main.getSSIDs().get(index);
                execute("/etc/init.d/network-manager stop");
                execute("killall wpa_supplicant");
                execute("ifconfig " + device + " down");
                setWPAConf(ssid.get(0), ssid.get(2));
                File wpaConf = new File("wpa.conf");
                execute("wpa_supplicant -B -i" + device + " -c" + wpaConf.getAbsolutePath());
                execute("ifconfig " + device + " up");
                execute("dhclient " + device);
                Main.stopPB();
            } else {
                int type = JOptionPane.ERROR_MESSAGE;
                String msg = "Es necesario que inicie la aplicación con " +
                             "permisos de administrador.";
                JOptionPane.showMessageDialog(null, msg, "TEST ONT", type);
            }
        } catch (Exception ex) {
            // EXCEPCION
        }
    }

    /**
     * Método utilizado para obtener el nombre del dispositivo inalámbrico
     * activo.
     */
    private void getDevice() throws Exception {
        File fileDevices = new File("devices");
        execute("ifconfig -s > " + fileDevices.getAbsolutePath());
        BufferedReader br = new BufferedReader(new FileReader(fileDevices));
        ArrayList<String> devices = new ArrayList();
        // Elimino una linea de basura
        String line = br.readLine();
        while ((line = br.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(line);
            devices.add(st.nextToken());
        }
        br.close();
        fileDevices.delete();
        for (int i=0; i<devices.size(); i++) {
            execute("iwlist " + devices.get(i) + " scan > nets");
            File fileDevice = new File("nets");
            br = new BufferedReader(new FileReader(fileDevice));
            while ((line = br.readLine()) != null) {
                String error = "Interface doesn't support scanning";
                if (line.indexOf(error)!=-1) break;
                else {
                    device = devices.get(i);
                    break;
                }
            }
            br.close();
            if (!device.equals("")) break;
        }
    }

    /**
     * Método utilizado para la creación del fichero de configuracion del
     * wpa_supplicant
     * @param essid Nombre de la red vulnerable
     * @param contrasenna Contraseña de la red
     */
    private void setWPAConf(String essid, String contrasenna) throws Exception {
        File wpaConf = new File("wpa.conf");
        wpaConf.deleteOnExit();
        PrintWriter pw = new PrintWriter(wpaConf);
        pw.println("ctrl_interface=/var/run/wpa_supplicant");
        pw.println("network={");
        pw.println("ssid=\"" + essid + "\"");
        pw.println("key_mgmt=WPA-PSK");
        pw.println("psk=\"" + contrasenna + "\"");
        pw.println("}");
        pw.close();
    }

    /**
     * Método utilizado para la ejecución de comandos del sistema.
     * @param command Comando a ejecutar.
     * @throws Exception Lanza 'IOException' e 'InterruptedException'
     */
    private void execute(String command) throws Exception {
        String[] cmd = {"/bin/sh","-c",command};
        Process shProcess = Runtime.getRuntime().exec(cmd);
        shProcess.waitFor();
    }
    
    /**
     * Método utilizado para comprobar que la aplicación se lanza con privilegios
     * de administrador.
     * Se crea un archivo temporal en la carpeta /root y se comprueba que exista,
     * si no es así es que la aplicación no tiene los permisos necesarios.
     */
    private void checkPrivileges() {
        try {
            execute("touch /root/privileges");
            File privilegesFile = new File("/root/privileges");
            if (!privilegesFile.exists()) {
                int type = JOptionPane.ERROR_MESSAGE;
                String msg = "Es necesario que inicie la aplicación con permisos " +
                             "de administrador.";
                JOptionPane.showMessageDialog(null, msg, "TEST ONT", type);
            } else privileges = true;
            privilegesFile.delete();
        } catch (Exception ex) {
            // EXCEPCION
        }
    }

}