TEST ONT
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 } } }