Daniel Goldberg 2017-09-25 17:34:19 +03:00
parent 10c9648854
commit 79e6a44008
4 changed files with 28 additions and 19 deletions

View File

@ -1,13 +1,14 @@
import os import os
import sys import sys
from network.range import FixedRange, RelativeRange, ClassCRange import types
from exploit import WmiExploiter, Ms08_067_Exploiter, SmbExploiter, RdpExploiter, SSHExploiter, ShellShockExploiter,\ import uuid
SambaCryExploiter
from network import TcpScanner, PingScanner, SMBFinger, SSHFinger, HTTPFinger, MySQLFinger
from abc import ABCMeta from abc import ABCMeta
from itertools import product from itertools import product
import uuid
import types from exploit import WmiExploiter, Ms08_067_Exploiter, SmbExploiter, RdpExploiter, SSHExploiter, ShellShockExploiter, \
SambaCryExploiter
from network import TcpScanner, PingScanner, SMBFinger, SSHFinger, HTTPFinger, MySQLFinger
from network.range import FixedRange
__author__ = 'itamar' __author__ = 'itamar'
@ -15,6 +16,7 @@ GUID = str(uuid.getnode())
EXTERNAL_CONFIG_FILE = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), 'monkey.bin') EXTERNAL_CONFIG_FILE = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), 'monkey.bin')
def _cast_by_example(value, example): def _cast_by_example(value, example):
""" """
a method that casts a value to the type of the parameter given as example a method that casts a value to the type of the parameter given as example
@ -178,7 +180,7 @@ class Configuration(object):
range_class = FixedRange range_class = FixedRange
range_size = 1 range_size = 1
range_fixed = ['',] range_fixed = ['10.0.1.63', ]
blocked_ips = ['', ] blocked_ips = ['', ]
@ -186,7 +188,7 @@ class Configuration(object):
HTTP_PORTS = [80, 8080, 443, HTTP_PORTS = [80, 8080, 443,
8008, # HTTP alternate 8008, # HTTP alternate
] ]
tcp_target_ports = [22, 2222, 445, 135, 3389] tcp_target_ports = [22, 2222, 445, 135, 3389, 3306, ]
tcp_target_ports.extend(HTTP_PORTS) tcp_target_ports.extend(HTTP_PORTS)
tcp_scan_timeout = 3000 # 3000 Milliseconds tcp_scan_timeout = 3000 # 3000 Milliseconds
tcp_scan_interval = 200 tcp_scan_interval = 200
@ -217,7 +219,7 @@ class Configuration(object):
exploit_password_list = ["Password1!", "1234", "password", "12345678"] exploit_password_list = ["Password1!", "1234", "password", "12345678"]
# smb/wmi exploiter # smb/wmi exploiter
smb_download_timeout = 300 # timeout in seconds smb_download_timeout = 300 # timeout in seconds
smb_service_name = "InfectionMonkey" smb_service_name = "InfectionMonkey"
# Timeout (in seconds) for sambacry's trigger to yield results. # Timeout (in seconds) for sambacry's trigger to yield results.
@ -243,7 +245,6 @@ class Configuration(object):
# Monkey copy filename on share (64 bit) # Monkey copy filename on share (64 bit)
sambacry_monkey_copy_filename_64 = "monkey64_2" sambacry_monkey_copy_filename_64 = "monkey64_2"
# system info collection # system info collection
collect_system_info = True collect_system_info = True
@ -253,4 +254,5 @@ class Configuration(object):
mimikatz_dll_name = "mk.dll" mimikatz_dll_name = "mk.dll"
WormConfiguration = Configuration() WormConfiguration = Configuration()

View File

@ -84,6 +84,7 @@
80, 80,
8080, 8080,
443, 443,
3306,
8008 8008
], ],
"timeout_between_iterations": 10, "timeout_between_iterations": 10,

View File

@ -1,8 +1,9 @@
import socket
import logging import logging
import socket
from model.host import VictimHost
from network import HostFinger from network import HostFinger
from .tools import struct_unpack_tracker, struct_unpack_tracker_string from .tools import struct_unpack_tracker, struct_unpack_tracker_string
from model.host import VictimHost
MYSQL_PORT = 3306 MYSQL_PORT = 3306
SQL_SERVICE = 'mysqld-3306' SQL_SERVICE = 'mysqld-3306'
@ -15,6 +16,9 @@ class MySQLFinger(HostFinger):
Fingerprints mysql databases, only on port 3306 Fingerprints mysql databases, only on port 3306
""" """
SOCKET_TIMEOUT = 0.5
HEADER_SIZE = 4 # in bytes
def __init__(self): def __init__(self):
self._config = __import__('config').WormConfiguration self._config = __import__('config').WormConfiguration
@ -26,15 +30,15 @@ class MySQLFinger(HostFinger):
""" """
assert isinstance(host, VictimHost) assert isinstance(host, VictimHost)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(0.5) s.settimeout(self.SOCKET_TIMEOUT)
try: try:
s.connect((host.ip_addr, MYSQL_PORT)) s.connect((host.ip_addr, MYSQL_PORT))
header = s.recv(4) # max header size? header = s.recv(self.HEADER_SIZE) # max header size?
tmp, curpos = struct_unpack_tracker(header, 0, "I") response, curpos = struct_unpack_tracker(header, 0, "I")
tmp = tmp[0] response = response[0]
response_length = tmp & 0xff response_length = response & 0xff # first byte is significant
data = s.recv(response_length) data = s.recv(response_length)
# now we can start parsing # now we can start parsing
protocol, curpos = struct_unpack_tracker(data, 0, "B") protocol, curpos = struct_unpack_tracker(data, 0, "B")
@ -47,6 +51,7 @@ class MySQLFinger(HostFinger):
version, curpos = struct_unpack_tracker_string(data, curpos) # special coded to solve string parsing version, curpos = struct_unpack_tracker_string(data, curpos) # special coded to solve string parsing
version = version[0] version = version[0]
host.services[SQL_SERVICE] = {}
host.services[SQL_SERVICE]['version'] = version host.services[SQL_SERVICE]['version'] = version
version = version.split('-')[0].split('.') version = version.split('-')[0].split('.')
host.services[SQL_SERVICE]['major_version'] = version[0] host.services[SQL_SERVICE]['major_version'] = version[0]
@ -54,6 +59,8 @@ class MySQLFinger(HostFinger):
host.services[SQL_SERVICE]['build_version'] = version[2] host.services[SQL_SERVICE]['build_version'] = version[2]
thread_id, curpos = struct_unpack_tracker(data, curpos, "<I") # ignore thread id thread_id, curpos = struct_unpack_tracker(data, curpos, "<I") # ignore thread id
# protocol parsing taken from
# https://nmap.org/nsedoc/scripts/mysql-info.html
if protocol == 10: if protocol == 10:
# new protocol # new protocol
self._parse_protocol_10(curpos, data, host) self._parse_protocol_10(curpos, data, host)

View File

@ -32,8 +32,7 @@ def struct_unpack_tracker_string(data, index):
""" """
ascii_len = data[index:].find('\0') ascii_len = data[index:].find('\0')
fmt = "%ds" % ascii_len fmt = "%ds" % ascii_len
unpacked = struct.unpack_from(fmt, data, index) return struct_unpack_tracker(data,index,fmt)
return unpacked, struct.calcsize(fmt)
def check_port_tcp(ip, port, timeout=DEFAULT_TIMEOUT, get_banner=False): def check_port_tcp(ip, port, timeout=DEFAULT_TIMEOUT, get_banner=False):