Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

# SECUREAUTH LABS. Copyright 2018 SecureAuth Corporation. All rights reserved. 

# 

# This software is provided under under a slightly modified version 

# of the Apache Software License. See the accompanying LICENSE file 

# for more information. 

# 

# A Socks Proxy for the IMAPS Protocol 

# 

# Author: 

# Dirk-jan Mollema (@_dirkjan) / Fox-IT (https://www.fox-it.com) 

# 

# Description: 

# A simple SOCKS server that proxies a connection to relayed IMAPS connections 

# 

# ToDo: 

# 

from impacket import LOG 

from impacket.examples.ntlmrelayx.servers.socksplugins.imap import IMAPSocksRelay 

from impacket.examples.ntlmrelayx.utils.ssl import SSLServerMixin 

from OpenSSL import SSL 

 

# Besides using this base class you need to define one global variable when 

# writing a plugin: 

PLUGIN_CLASS = "IMAPSSocksRelay" 

EOL = '\r\n' 

 

class IMAPSSocksRelay(SSLServerMixin, IMAPSocksRelay): 

PLUGIN_NAME = 'IMAPS Socks Plugin' 

PLUGIN_SCHEME = 'IMAPS' 

 

def __init__(self, targetHost, targetPort, socksSocket, activeRelays): 

IMAPSocksRelay.__init__(self, targetHost, targetPort, socksSocket, activeRelays) 

 

@staticmethod 

def getProtocolPort(): 

return 993 

 

def skipAuthentication(self): 

LOG.debug('Wrapping IMAP client connection in TLS/SSL') 

self.wrapClientConnection() 

try: 

if not IMAPSocksRelay.skipAuthentication(self): 

# Shut down TLS connection 

self.socksSocket.shutdown() 

return False 

except Exception as e: 

LOG.debug('IMAPS: %s' % str(e)) 

return False 

# Change our outgoing socket to the SSL object of IMAP4_SSL 

self.relaySocket = self.session.sslobj 

return True 

 

def tunnelConnection(self): 

keyword = '' 

tag = '' 

while True: 

try: 

data = self.socksSocket.recv(self.packetSize) 

except SSL.ZeroReturnError: 

# The SSL connection was closed, return 

break 

# Set the new keyword, unless it is false, then break out of the function 

result = self.processTunnelData(keyword, tag, data) 

if result is False: 

break 

# If its not false, it's a tuple with the keyword and tag 

keyword, tag = result 

 

if tag != '': 

# Store the tag in the session so we can continue 

tag = int(tag) 

if self.idleState is True: 

self.relaySocket.sendall('DONE%s' % EOL) 

self.relaySocketFile.readline() 

 

if self.shouldClose: 

tag += 1 

self.relaySocket.sendall('%s CLOSE%s' % (tag, EOL)) 

self.relaySocketFile.readline() 

 

self.session.tagnum = tag + 1