在进行邮件钓鱼的时候,我的客户端经常询问或者想知道用户在钓鱼邮件中点击了什么。有许多方法可以达到这个目的,但是我这里想探讨下我在钓鱼网站中用来跟踪不同用户的点击的办法。
我用之前博文的标题给这篇文章加个序言:我是怎样实施钓鱼的,在那篇文章中我讨论了用我称为sendmail.rb的ruby脚本进行网络钓鱼。这个脚本本身并没什么特别和神奇之处,他只是提供了一种可选的方法在发送钓鱼邮件中用来跟踪不同访问者对钓鱼网站的点击。知道CIO或者其他C-level的钓鱼攻击也是很重要的。
通常来说,如果你用邮件客户端实施钓鱼攻击,例如Thunderbird, Outlook或者其他工具,你所能知道的只是网站的点击量,但是你不能将网站的点击和访问者联系起来或者知道有多少个特定的来访者。你只能得到一些模糊的数量统计结果:我们发送了邮件给50个人,最后得到35个点击量。我很想知道的问题是,在这35次点击中,有多少个是特定的目标访问了网站?或者其实只是两个用户分别点击了15次造成的结果?sendmail.rb可以帮助解决这个问题。
这其中的原理是非常简单的,我们只要在钓鱼链接后面添加邮件地址就行了。添加明文的邮件地址的意图是相当明显的,所以我们在添加之前把邮件地址用base64加密下。
假设你的钓鱼链接地址是这样的:
sendmail脚本会把它修改成这样:
http://example.com/index.php?id=bWNjYW5uLmJyYW5kb25AZ21haWwuY29t
一旦有人点击了加了base64加密的邮件地址的链接,触发的HTTP GET请求会在web服务器的日志中被记录下来。我用apache来演示这个例子,接下来我就演示如何分析用了这种方式请求页面的服务日志。
我写了另一个叫做decode_logs.rb的ruby脚本,用来快速有效的从apache日志中提取有用的信息。举例说明我如何用这个脚本分析这些日志。
最开始在我用sendmail.rb发送电子邮件的时候,我编写原始的html文件来实施我的钓鱼计划。这是非常耗费时间的事情,而且我不是个职业的网页设计师所以我的钓鱼邮件从来没有达到我想要的那种效果。
这里非常感谢我的女同事,她推荐我尝试使用Thunderbird来制作邮件而且这能很简单的另存这个电子邮件信息。邮件默认被保存为EML格式,但是我们需要保存为原始的HTML文件,这样才能够完美的配合sendmain.rb脚本的工作。
让我们看下如何快速的创建一个钓鱼邮件。我打开邮箱的收件箱查看,发现了很多从Linkedin发来的垃圾邮件。创建一个简单的钓鱼邮件就像下面给出的例子一样:
只要我们找到了一个在Thunderbird看起来效果很好的钓鱼邮件,要做的下一步就是把这个邮件内容保存为本地文件,这样一来我们就能把邮件作为HTML文件供脚本使用。保存为本地文件没什么难处:
现在我们已经拿到了所需要内容的HTML格式文本,紧接着就是把邮件地址头添加到信息文本中。通过前面的步骤所得到的HTML文本并不能直接的被SMTP服务器发送。下图的红框部分是我们用sendmail.rb脚本发送邮件所需要额外添加的内容。在红框下面的HTML文本是我们从Thunderbird保存得来的可用内容。
最后我还做了一些修改,先找到包含”To:”的这一行,然后把这一行完全删除了。这样做的目的是把电子邮件的一些信息包括邮件发送方、接收方还有发送日期全部清除掉。
现在我们已经创建了一个钓鱼邮件了,把它发送给出去然后看看效果如何。
OK,看起来效果还不错了。这个邮件看起来很完美,但是我现在要把一些正常的链接替换成我们的钓鱼链接。这样一来当有人点击了我们的邮件,就会被我们引导到事先设下的恶意网站而不是Linkedin。还有个注意点,不一定要发同样的邮件,你可以把邮件头的From字段修改成别的而不是Linkedin。
添加上钓鱼链接是件很容易的事情,用sendmail脚本就能轻松搞定。把保存的文件用文本编辑器打开,把href=linkedin.com 修改成 href=#{url}就行了。在发送邮件的时候sendmail会检索邮件的内容把href=#{url}替换成钓鱼链接。我们同样可以用一些得力的工具像sed这种,让我们的工作更顺利也能达到同样的效果。
所有的困难的部分都已经完成了,现在可以把邮件发出去看谁会点击我们的链接了。希望这篇文章能给你们一些启发,享受钓鱼的乐趣吧。
一些注意事项:
以上内容为译文,小编尝试了国内的163和QQ邮箱,都无法伪造from字段也就是伪造来源发送邮件,因为这些邮箱有检查来源一致性。(91ri.org注:其实用php就能实现伪造,但连我妈都会看邮件头了…)按作者的做法,godaddy是不检查这个的,可以注册godaddy用来发送钓鱼邮件。不过在本地搭建SMTP服务器发送邮件就可以完全无视这个问题了。再就是作者给的sendmail.rb经过测试是有点小问题的,下面附上91ri.org小编修改过的版本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
#!/usr/bin/env ruby
# This script takes a .txt file as an argument. It will iterate through each emailaddress
# in the file and send an email to each target
# Authors: zeknox & R3dy
##########################################################################
require ‘net/smtp’
require ‘base64′
username = ‘greg.olson@issds.com’
password = ‘password’
from = ‘greg.olson@issds.com’
display_from = ‘Greg Olson’
subject = ‘Microsoft Security Update’
date = ‘Thursday, January 18, 2013′
url = ‘www.example.com/index.php?id=’
smtp = ‘secureserver.net’
smtpout = ‘smtpout.secureserver.net’
port = ’3535′
message = []
def sendemail(username, password, from, message, email, port, smtpout, smtp)
# code to send email
begin
Net::SMTP.start(“#{smtpout}”, “#{port}”, “#{smtp}”,“#{username}”, “#{password}”, :plain) do |smtp|
smtp.send_message message, “#{from}”, email.chomp
end
puts “tSent to: #{email}”
rescue => e
puts “tIssues Sending to: #{email}rn#{e.class}rn#{e}”
end
end
unless ARGV.length == 2
puts “./sendmail.rb <email-addys.txt> <email_message.txt>n”
exit!
else
emails = File.open(ARGV[0], ‘r’)
end
count = 1
puts “Sending Emails:”
emails.each_line do |email|
message = []
# base64 encode email address
encode = “#{Base64.encode64(“#{email}”)}”
email_message = File.open(ARGV[1], ‘r’)
email_message.each_line do |line|
if line =~ /#{url}/
message << line.gsub(/#{url}/, “#{url}#{encode.chomp}”)
elsif line =~ /#{to}/
message << line.gsub(/#{to}/, “#{email.chomp}”)
elsif line =~ /#{from}/ and line =~ /#{display_from}/
message << line.gsub(/#{display_from} <#{from}>/, “#{display_from} <#{from}>”)
elsif line =~ /#{display_from}/ and not line =~ /#{from}/
message << line.gsub(/#{display_from}/, “#{display_from}”)
elsif line =~ /#{subject}/
message << line.gsub(/#{subject}/, “#{subject}”)
elsif line =~ /#{date}/
message << line.gsub(/#{date}/, “#{date}”)
else
message << line
end
end
email_message.close
text = message.join
# send emails
sendemail(username, password, from, text, email, port, smtpout, smtp)
end
# close files
emails.close
|
相关文章推荐:《利用iframe URI钓鱼》《点击劫持(ClickJacking)的小科普》
日币奖励:
本文为译文且为原创、首发,作者有自己的实践,根据本站积分规则给予日币奖励共5枚。
AD:本站开放投稿及积分(日币),日币可兑换实物奖励,每月top3可获得礼品一份。
Copyright © hongdaChiaki. All Rights Reserved. 鸿大千秋 版权所有
联系方式:
地址: 深圳市南山区招商街道沿山社区沿山路43号创业壹号大楼A栋107室
邮箱:service@hongdaqianqiu.com
备案号:粤ICP备15078875号