Browse Source

iptables as backup strategy. confirmed working

Fabio Arnold 9 years ago
parent
commit
734f256841

+ 14 - 3
src/de/tudarmstadt/informatik/hostage/commons/HelperUtils.java

@@ -1,5 +1,7 @@
 package de.tudarmstadt.informatik.hostage.commons;
 
+import junit.framework.Assert;
+
 import org.apache.http.HttpVersion;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpPost;
@@ -430,10 +432,19 @@ public final class HelperUtils {
 		return activeNetworkInfo != null && activeNetworkInfo.isConnected();
 	}
 
-    public static boolean redirectPort(int From, int To) throws IOException {
+	/**
+	 * redirects port using iptables
+	 * @param protocol either "udp" or "tcp"
+	 * @param From
+	 * @param To
+	 * @return
+	 * @throws IOException
+	 */
+    public static boolean redirectPort(String protocol, int From, int To) throws IOException {
+		assert protocol.equals("tcp") || protocol.equals("udp");
         boolean success = Device.isRooted();
-        new ProcessBuilder("su","-c","iptables -t nat -A PREROUTING -p udp --dport "+From+" -j REDIRECT --to-ports "+To).start();
-        new ProcessBuilder("su","-c","iptables -t nat -A OUTPUT -p udp --dport "+To+" -j REDIRECT --to-ports "+From).start();
+        new ProcessBuilder("su","-c","iptables -t nat -A PREROUTING -p "+protocol+" --dport "+From+" -j REDIRECT --to-ports "+To).start();
+        new ProcessBuilder("su","-c","iptables -t nat -A OUTPUT -p "+protocol+" --dport "+To+" -j REDIRECT --to-ports "+From).start();
 
         return success;
     }

+ 19 - 10
src/de/tudarmstadt/informatik/hostage/net/MyServerSocketFactory.java

@@ -10,6 +10,7 @@ import java.net.SocketImpl;
 
 import javax.net.ServerSocketFactory;
 
+import de.tudarmstadt.informatik.hostage.commons.HelperUtils;
 import de.tudarmstadt.informatik.hostage.system.Device;
 import de.tudarmstadt.informatik.hostage.system.PrivilegedPort;
 import de.tudarmstadt.informatik.hostage.system.PrivilegedPort.TYPE;
@@ -24,16 +25,24 @@ public class MyServerSocketFactory extends ServerSocketFactory {
 			socket = new ServerSocket();
 			socket.setReuseAddress(true);
 			socket.bind(new InetSocketAddress(port));
-		} else if (Device.isPorthackInstalled()) {
-			FileDescriptor fd = new PrivilegedPort(TYPE.TCP, port).getFD();
-			socket = new ServerSocket();
-			try {
-				SocketImpl impl = getImpl(socket);
-				injectFD(fd, impl);
-				setBound(socket);
-			} catch (NoSuchFieldException e) {
-			} catch (IllegalAccessException e) {
-			} catch (IllegalArgumentException e) {
+		} else if (Device.isRooted()) {
+			if (Device.isPorthackInstalled()) {
+				FileDescriptor fd = new PrivilegedPort(TYPE.TCP, port).getFD();
+				socket = new ServerSocket();
+				try {
+					SocketImpl impl = getImpl(socket);
+					injectFD(fd, impl);
+					setBound(socket);
+				} catch (NoSuchFieldException e) {
+				} catch (IllegalAccessException e) {
+				} catch (IllegalArgumentException e) {
+				}
+			} else { // use ip tables
+				int redirectedPort = port + 1024 + 27113;
+				HelperUtils.redirectPort("tcp", port, redirectedPort);
+				socket = new ServerSocket();
+				socket.setReuseAddress(true);
+				socket.bind(new InetSocketAddress(redirectedPort));
 			}
 		}
 		return socket;

+ 2 - 2
src/de/tudarmstadt/informatik/hostage/protocol/smbutils/NMB.java

@@ -233,8 +233,8 @@ public class NMB extends Thread {
 			nbdsSocket = factory.createDatagramSocket(nbdsPort);
 
             // port forwarding
-            HelperUtils.redirectPort(nbnsOriginPort, nbnsPort);
-            HelperUtils.redirectPort(nbdsOriginPort, nbdsPort);
+            HelperUtils.redirectPort("udp", nbnsOriginPort, nbnsPort);
+            HelperUtils.redirectPort("udp", nbdsOriginPort, nbdsPort);
 
 		} catch (SocketException e) {
 			e.printStackTrace();