mirror of https://github.com/gophish/gophish
Added device details to clicked link and submitted data events. Fixes #1009
parent
b2bd879318
commit
f09b448ec1
|
@ -23,7 +23,6 @@ gulp.task('vendorjs', function () {
|
||||||
vendor_directory + 'jquery.js',
|
vendor_directory + 'jquery.js',
|
||||||
vendor_directory + 'bootstrap.min.js',
|
vendor_directory + 'bootstrap.min.js',
|
||||||
vendor_directory + 'moment.min.js',
|
vendor_directory + 'moment.min.js',
|
||||||
vendor_directory + 'chartist.min.js',
|
|
||||||
vendor_directory + 'papaparse.min.js',
|
vendor_directory + 'papaparse.min.js',
|
||||||
vendor_directory + 'd3.min.js',
|
vendor_directory + 'd3.min.js',
|
||||||
vendor_directory + 'topojson.min.js',
|
vendor_directory + 'topojson.min.js',
|
||||||
|
@ -38,7 +37,8 @@ gulp.task('vendorjs', function () {
|
||||||
vendor_directory + 'bootstrap-datetime.js',
|
vendor_directory + 'bootstrap-datetime.js',
|
||||||
vendor_directory + 'select2.min.js',
|
vendor_directory + 'select2.min.js',
|
||||||
vendor_directory + 'core.min.js',
|
vendor_directory + 'core.min.js',
|
||||||
vendor_directory + 'highcharts.js'
|
vendor_directory + 'highcharts.js',
|
||||||
|
vendor_directory + 'ua-parser.min.js'
|
||||||
])
|
])
|
||||||
.pipe(concat('vendor.js'))
|
.pipe(concat('vendor.js'))
|
||||||
.pipe(rename({
|
.pipe(rename({
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -578,6 +578,39 @@ td.details-control {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.timeline-device-details {
|
||||||
|
font-size: .8em;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-device-os>span.fa-stack {
|
||||||
|
font-size: .8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-device-browser>span.fa-stack {
|
||||||
|
font-size: .8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline-device-browser>span.fa-stack>i.fa-stack-1x {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
i.fa-vendor-icon {
|
||||||
|
font-size: .6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
i.fa-tablet+i.fa-vendor-icon {
|
||||||
|
top: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
i.fa-tablet+i.fa-vendor-icon {
|
||||||
|
top: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
i.fa-laptop+i.fa-vendor-icon {
|
||||||
|
top: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
.tooltip-inner {
|
.tooltip-inner {
|
||||||
width: 300px !important;
|
width: 300px !important;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -283,6 +283,79 @@ function replay(event_idx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an HTML string that displays the OS and browser that clicked the link
|
||||||
|
* or submitted credentials.
|
||||||
|
*
|
||||||
|
* @param {object} event_details - The "details" parameter for a campaign
|
||||||
|
* timeline event
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
var renderDevice = function (event_details) {
|
||||||
|
var ua = UAParser(details.browser['user-agent'])
|
||||||
|
var detailsString = '<div class="timeline-device-details">'
|
||||||
|
|
||||||
|
var deviceIcon = 'laptop'
|
||||||
|
if (ua.device.type) {
|
||||||
|
if (ua.device.type == 'tablet' || ua.device.type == 'mobile') {
|
||||||
|
deviceIcon = ua.device.type
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var deviceVendor = ''
|
||||||
|
if (ua.device.vendor) {
|
||||||
|
deviceVendor = ua.device.vendor.toLowerCase()
|
||||||
|
if (deviceVendor == 'microsoft') deviceVendor = 'windows'
|
||||||
|
}
|
||||||
|
|
||||||
|
var deviceName = 'Unknown'
|
||||||
|
if (ua.os.name) {
|
||||||
|
deviceName = ua.os.name
|
||||||
|
if (deviceName == "Mac OS") {
|
||||||
|
deviceVendor = 'apple'
|
||||||
|
} else if (deviceName == "Windows") {
|
||||||
|
deviceVendor = 'windows'
|
||||||
|
}
|
||||||
|
if (ua.device.vendor && ua.device.model) {
|
||||||
|
deviceName = ua.device.vendor + ' ' + ua.device.model
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ua.os.version) {
|
||||||
|
deviceName = deviceName + ' (OS Version: ' + ua.os.version + ')'
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceString = '<div class="timeline-device-os"><span class="fa fa-stack">' +
|
||||||
|
'<i class="fa fa-' + escapeHtml(deviceIcon) + ' fa-stack-2x"></i>' +
|
||||||
|
'<i class="fa fa-vendor-icon fa-' + escapeHtml(deviceVendor) + ' fa-stack-1x"></i>' +
|
||||||
|
'</span> ' + escapeHtml(deviceName) + '</div>'
|
||||||
|
|
||||||
|
detailsString += deviceString
|
||||||
|
|
||||||
|
var deviceBrowser = 'Unknown'
|
||||||
|
var browserIcon = 'info-circle'
|
||||||
|
var browserVersion = ''
|
||||||
|
|
||||||
|
if (ua.browser && ua.browser.name) {
|
||||||
|
deviceBrowser = ua.browser.name
|
||||||
|
// Handle the "mobile safari" case
|
||||||
|
deviceBrowser = deviceBrowser.replace('Mobile ', '')
|
||||||
|
if (deviceBrowser) {
|
||||||
|
browserIcon = deviceBrowser.toLowerCase()
|
||||||
|
if (browserIcon == 'ie') browserIcon = 'internet-explorer'
|
||||||
|
}
|
||||||
|
browserVersion = '(Version: ' + ua.browser.version + ')'
|
||||||
|
}
|
||||||
|
|
||||||
|
var browserString = '<div class="timeline-device-browser"><span class="fa fa-stack">' +
|
||||||
|
'<i class="fa fa-' + escapeHtml(browserIcon) + ' fa-stack-1x"></i></span> ' +
|
||||||
|
deviceBrowser + ' ' + browserVersion + '</div>'
|
||||||
|
|
||||||
|
detailsString += browserString
|
||||||
|
detailsString += '</div>'
|
||||||
|
return detailsString
|
||||||
|
}
|
||||||
|
|
||||||
function renderTimeline(data) {
|
function renderTimeline(data) {
|
||||||
record = {
|
record = {
|
||||||
"first_name": data[2],
|
"first_name": data[2],
|
||||||
|
@ -308,12 +381,18 @@ function renderTimeline(data) {
|
||||||
' <div class="timeline-message">' + escapeHtml(event.message) +
|
' <div class="timeline-message">' + escapeHtml(event.message) +
|
||||||
' <span class="timeline-date">' + moment.utc(event.time).local().format('MMMM Do YYYY h:mm:ss a') + '</span>'
|
' <span class="timeline-date">' + moment.utc(event.time).local().format('MMMM Do YYYY h:mm:ss a') + '</span>'
|
||||||
if (event.details) {
|
if (event.details) {
|
||||||
|
details = JSON.parse(event.details)
|
||||||
|
if (event.message == "Clicked Link" || event.message == "Submitted Data") {
|
||||||
|
deviceView = renderDevice(details)
|
||||||
|
if (deviceView) {
|
||||||
|
results += deviceView
|
||||||
|
}
|
||||||
|
}
|
||||||
if (event.message == "Submitted Data") {
|
if (event.message == "Submitted Data") {
|
||||||
results += '<div class="timeline-replay-button"><button onclick="replay(' + i + ')" class="btn btn-success">'
|
results += '<div class="timeline-replay-button"><button onclick="replay(' + i + ')" class="btn btn-success">'
|
||||||
results += '<i class="fa fa-refresh"></i> Replay Credentials</button></div>'
|
results += '<i class="fa fa-refresh"></i> Replay Credentials</button></div>'
|
||||||
results += '<div class="timeline-event-details"><i class="fa fa-caret-right"></i> View Details</div>'
|
results += '<div class="timeline-event-details"><i class="fa fa-caret-right"></i> View Details</div>'
|
||||||
}
|
}
|
||||||
details = JSON.parse(event.details)
|
|
||||||
if (details.payload) {
|
if (details.payload) {
|
||||||
results += '<div class="timeline-event-results">'
|
results += '<div class="timeline-event-results">'
|
||||||
results += ' <table class="table table-condensed table-bordered table-striped">'
|
results += ' <table class="table table-condensed table-bordered table-striped">'
|
||||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue