Linux下的格式化字符串漏洞利用姿势

简介:

【转】http://www.cnblogs.com/Ox9A82/p/5429099.html


linux最早的漏洞防护机制nx-stack刚刚出现后就有人想出了突破方法。那就是只有栈是不可执行,而除了栈以外的其他地方还是可以执行的,只要把返回地址执行别的地方就可以。

一.格式化字符串漏洞

格式化字符串漏洞在Windows下很难以利用,但是在Linux下的pwn题目中出现的频率是很高的。

 

格式化字符串的“$”操作符,其允许我们从格式化字符串中选取一个作为特定的参数。例如,

1
printf ( "%3$s" , 1,  "b" "c" , 4);


最终会显示结果“c”。这是因为格式化字符串“%3$s”,它告诉计算机“把格式化字符串后面第三个参数告诉我,然后将参数解释为字符串”。所以,我们也可以这样做

1
printf ( "AAAA%3$n" );


printf函数将值“4”(输入的A的数量)写入第三个参数指向的地址。

 

格式化字符串还有%s参数。那么,如果在栈中保存有指向我们感兴趣数据的指针,我们就可以在打印指针的时候使用一个%s来打印别的地方的内容。而且一般的程序都会将用户输入的数据储存在栈上。这就给了我们一个构造指针的机会,再结合格式化字符串漏洞,几乎可以得到所有内存数据

 

%n功能是将%n之前printf已经打印的字符个数赋值给传入的指针。通过%n我们就可以修改内存中的值了。和%sleak内存一样,只要栈中有我们需要修改的内存的地址就可以使用格式化字符串的漏洞修改它。

当然,如果需要修改的数据是相当大的数值时,我们可以使用%02333d这种形式。在打印数值右侧用0补齐不足位数的方式来补齐足。

可以看出,格式化字符串可以修改的内存范围更加广。只要构造出指针,就可以改写内存中的任何数值。和栈溢出的地毯轰炸不同。这种一次只能改写一个dword大小的内存的攻击方式更加精准而致命。

 

由此可见格式化字符串漏洞主要是:

1.泄漏任意地址的值,leak内存(比如leak出libc基地址)

2.写任意地址,可用于修改got表

 

主要实现方式是利用格式化串本身也处于栈中,去用直接参数访问找到这个栈中的格式化串。这个格式化串可以使用一个要写入的内存地址。也就是直接参数访问+%n格式符+长度表示=向任意地址写入值,这个写入是不能一次写入4字节的,所以可以分两次写入2字节和分四次写入1字节。其中hhn是写一个字节,hn是写两个字节。n是写四个字节。

附送栗子一枚:http://www.cnblogs.com/Ox9A82/p/5483916.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
这部分来自icemakr的博客
 
32
 
 
'%{}$x' . format (index)            / /  4 个字节
'%{}$p' . format (index)            / /  同上面
'${}$s' . format (index)
 
'%{}$n' . format (index)            / /  解引用,写入四个字节
'%{}$hn' . format (index)           / /  解引用,写入两个字节
'%{}$hhn' . format (index)          / /  解引用,写入一个字节
'%{}$lln' . format (index)          / /  解引用,写入八个字节
64
 
 
'%{}$x' . format (index, num)       / /  4 个字节
'%{}$lx' . format (index, num)      / /  8 个字节
'%{}$p' . format (index)            / /  8 个字节
'${}$s' . format (index)
 
'%{}$n' . format (index)            / /  解引用,写入四个字节
'%{}$hn' . format (index)           / /  解引用,写入两个字节
'%{}$hhn' . format (index)          / /  解引用,写入一个字节
'%{}$lln' . format (index)          / /  解引用,写入八个字节
% 1 $lx: RSI
% 2 $lx: RDX
% 3 $lx: RCX
% 4 $lx: R8
% 5 $lx: R9
% 6 $lx: 栈上的第一个QWORD

其它

这里记录一些相关的姿势

fmtstr_payload是pwntools提供的函数,用于自动生成格式化字符串。

fmtstr_payload有两个参数
第一个参数是int,用于表示取参数的偏移个数

第二个参数是字典,字典的意义是往key的地址,写入value的值

1
fmtstr_payload( 7 , {printf_got: system_add})

这个函数调用会往printf_got中写入system_add

 

此外调用一次fsb函数并不意味着只能进行一次写操作,实际上可以传递多个写格式串以实现一次调用对多个地址写的操作,注意写入的值是“之前”输入的字符总数。

















本文转自fatshi51CTO博客,原文链接:http://blog.51cto.com/duallay/1909336 ,如需转载请自行联系原作者



相关文章
|
6月前
|
安全 Linux 数据安全/隐私保护
百度搜索:蓝易云【OpenVAS 检查 Linux 服务器漏洞教程!】
通过上述步骤,你可以在Linux服务器上使用OpenVAS进行漏洞检测。请注意,漏洞检测和扫描是一个复杂的过程,需要持续的更新和管理。建议参考OpenVAS的官方文档和用户指南,以了解更多关于配置和使用OpenVAS的详细信息。
104 0
百度搜索:蓝易云【OpenVAS 检查 Linux 服务器漏洞教程!】
|
7月前
|
安全 Ubuntu Linux
Linux Kernel openvswitch模块权限提升漏洞(CVE-2022-2639)
Linux 内核模块Open vSwitch 存在越界写入漏洞,在足够多actions情况下,在为新的flow的新的action拷贝和预留内存时,如果next_offset比MAX_ACTIONS_BUFSIZE大,reserve_sfa_size并不会如期返回 -EMSGSIZE,此时会产生越界写入漏洞。攻击者可以利用该漏洞将普通权限提升至ROOT权限。
69 1
|
7月前
|
安全 Ubuntu Linux
Linux Kernel 权限提升漏洞 (CVE-2023-32233)
Linux Netfilter 是一个在 Linux 内核中的网络数据包处理框架,也称作 iptables,它可以通过各种规则和过滤器,基于数据包的来源、目标地址、协议类型、端口号等信息,控制网络流量和数据包的转发和处理,是 Linux 系统网络安全性和可靠性的重要组成部分
166 1
Linux Kernel 权限提升漏洞 (CVE-2023-32233)
|
7月前
|
安全 Linux
Linux内核OverlayFS子系统权限提升漏洞(CVE-2023-0386)
Linux内核OverlayFS子系统权限提升漏洞,在Linux内核的 OverlayFS子系统中,当用户将一个具有权限的文件从一个nosuid挂载点复制到另一个挂载点时,未经授权的攻击者可以执行setuid文件,导致权限提升。
103 1
|
7月前
|
安全 Ubuntu Linux
CVE-2021-3560 Linux Polkit 权限提升漏洞
Polkit是默认安装在很多Linux发行版上的系统服务,它由systemd使用,因此任何使用systemd的Linux发行版也使用Polkit。
57 2
|
11月前
|
Ubuntu 安全 Linux
CVE-2021-3493 Linux kernel提权漏洞复现
CVE-2021-3493 Linux kernel提权漏洞复现
167 0
|
7月前
|
安全 Ubuntu 网络协议
Linux 本地权限提升漏洞
Linux内核中 net/ipv4/esp4.c 和 net/ipv6/esp6.c中的 IPsec ESP 转换代码中发现堆缓冲区溢出漏洞。该漏洞允许具有正常用户权限的本地攻击者覆盖内核中的堆对象,最终获取root权限。
37 1
|
7月前
|
安全 Linux 数据安全/隐私保护
Linux DirtyPipe 内核提权漏洞 (CVE-2022-0847)
它是自 5.8 以来 Linux 内核中的一个漏洞,它允许覆盖任意只读文件中的数据。这会导致权限提升,因为非特权进程可以将代码注入根进程。
92 1
|
7月前
|
缓存 安全 Linux
Linux内核提权漏洞—CVE-2022-0874
Linux内核提权漏洞—CVE-2022-0874
82 1
|
7月前
|
安全 Ubuntu Linux
Linux Sudo权限提升漏洞(CVE-2023-22809)
Sudo存在权限提升漏洞,攻击者可过特定的payload获取服务器ROOT权限
61 3