Showing posts with label forensic. Show all posts
Showing posts with label forensic. Show all posts

Sunday, April 19, 2015

PNG Uncorrupt(Forensic150)


Kita diberikan sebuah file PNG dengan petunjuk:
We received this PNG file, but we're a bit concerned the transmission may have not quite been perfect.
Dengan menggunakan pngcheck, kita bisa tahu apa salahnya file ini:

yohanes@ubuntu:~$ pngcheck corrupt_735acee15fa4f3be8ecd0c6bcf294fd4.png
corrupt_735acee15fa4f3be8ecd0c6bcf294fd4.png:  CORRUPTED by text conversion
ERROR: corrupt_735acee15fa4f3be8ecd0c6bcf294fd4.png


Header PNG dirancang supaya kita bisa mendeteksi jika ada konversi ASCII ketika mentransfer file. Tapi sayangnya tidak membantu dalam hal recoverynya.


http://www.libpng.org/pub/png/pngintro.html
PNG supports three main types of integrity-checking to help avoid problems with file transfers and the like. The first and simplest is the eight-byte magic signature at the beginning of every PNG image. It will detect the most common type of file corruption: that due to the transfer of a binary file in text (or "ASCII") mode.
PNG's magic signature cleverly includes both a CR/LF pair and a single LF.
Dalam kasus ini ketika kita lihat header PNG-nya, tidak cukup untuk memperbaiki headernya saja, karena di dalam data PNG (yang terkompresi), masih ada byte yang tadinya CRLF (0x0d 0x0a) berubah menjadi LF (0x0a). Masalahnya adalah: tidak semua 0x0a tadinya adalah (0x0d 0x0a). Contohnya seperti ini. Jika data asli adalah:

0x0a 0x01 0x02 0x0d 0x0a 0x02 0x0a

Maka setelah konversi CRLF:

0x0a 0x01 0x02 0x0a 0x02 0x0a

Kita tidak tahu 0x0a mana yang harus dikembalikan menjadi 0x0d 0x0a (bisa jadi ada beberapa 0x0a yang harus dikembalikan menjadi 0x0d 0x0a).

Bagaimana kita bisa mengembalikan byte-byte yang benar? file PNG disusun dalam bentuk chunk, seperti ini:

- Length (4 byte)
- Chunk Type (4 byte)
- Chunk Data (N byte, sesuai dengan length)
- CRC (4 byte, CRC sesuai algoritma di sini)

Data PNG ada dalam chunk IDAT, dalam file soal ada 10 IDAT yang sebagian besar corrupt. Perhatikan bahwa karena konversi CRLF, maka kita tidak bisa memparsing menggunakan LENGTH, karena datanya akan bergeser ketika CRLF berubah menjadi LF.

Kode yang saya pakai untuk menyelesaikan agak berantakan (Karena ini adalah CTF dan ini satu-satunya soal yang sempat saya selesaikan sebelum perjalanan panjang). Saya punya dua kode, pertama dalam python untuk mensplit PNG menjadi chunk IDAT, dan kode dalam C (supaya cepat) untuk memperbaiki CRC-nya.

Kedua kode ini sebenarnya bisa digabung supaya semuanya otomatis. Skrip python juga mengoutputkan HEADER dan FOOTER supaya bisa digabung lagi hasil akhirnya. Kelebihan menggunakan cara terpisah adalah: saya bisa copy chunk-nya ke komputer lain dan menjalankan perbaikan untuk chunk itu saja.


Bagian parsing IDAT dalam python hanya mencari string IDAT dan ditulis ke file:

Di situ saya juga memprint padding, berapa byte yang berubah dari yang seharusnya. Setelah tahu berapa byte yang berubah tiap blok, saya membuat program dalam C untuk memperbaiki chunk IDAT tersebut.

Cara perbaikannya adalah sebagai berikut: kita tahu berapa jumlah 0x0a (misalnya N) di dalam sebuah chunk IDAT (bisa dihitung dengan melihat bytenya), kita tahu berapa 0x0d0x0a yang berubah menjadi 0x0a (dari jumlah padding di skrip python, misalnya K), kita tahu CRC dari tiap blok IDAT.
Kita bisa mencoba-coba memilih kombinasi K dari N. Untuk IDAT tertentu, hanya 1 byte dari sekitar 400 byte yang perlu diubah (bisa dicoba-coba manual kalau rajin), untuk IDAT-4, ada 459 byte 0x0a, dan paddingnya 3, artinya ada lebih dari 16 juta kombinasi, tidak mungkin diperbaiki manual.


Berikut ini source saya untuk memperbaiki IDAT dengan mencoba semua kombinasi dan mengecek crcnya:

Setelah selesai, saya gabungkan lagi HEADER, IDAT, dan FOOTER-nya.
Hasilnya adalah gambar berikut:
result
flag{have_a_wonderful_starcrafts}















Saturday, July 12, 2014

Pwnium CTF2014: For150 Altered Code

Diberikan sebuah source code singkat ini:

 

Kita disuruh mencari kodenya. Di teks di atas tidak terlihat, tapi di source code aslinya terlihat bahwa ada yang indentasinya memakai spasi dan ada yang memakai tab, setelah kita comment baris-baris yang berbeda, hasilnya:

 

Dan ketika dicompile , lalu dijalankan, flag yang kita dapatkan:

D0nT_e4t_Sushi

Saturday, May 10, 2014

ASIS Quals 2014: Forensic 2 (Forensic 300)

Ini soal yang tidak berhasil diselesaikan tepat waktu, jadi kami tidak mendapat poin untuk ini. Karena tidak ada team yang berhasil mendapatkan poin, saya tuliskan informasinya di sini.
Dalam soal forensic ini, diberikan sebuah file Virtual Box Saved State. Volatility tidak mendukung format ini. Tidak ada informasi mengenai format file ini di web, jadi kita perlu membaca source code Virtual Box:
http://www.virtualbox.org/svn/vbox/trunk/src/VBox/VMM/VMMR3/SSM.cpp

Hasilnya adalah program dalam C  yang memakai liblzf:
https://www.dropbox.com/sh/vtsk0ji7pqhje42/AABY57lRqinlwZpo8t9zzGYka

gcc parsvbox.c lzf_d.c
./a.out vbox.img
Saya akan menaruh filenya di github setelah dicleanup (dan jika tidak sibuk, mungkin akan saya sumbangkan kodenya ke volatility).
File-file yang dihasilkan:
vbox.img-8237A.out
vbox.img-acpi.out
vbox.img-ahci.out
vbox.img-apic.out
vbox.img-ConsoleData.out
vbox.img-cpum.out
vbox.img-DisplayData.out
vbox.img-DisplayScreenshot.out
vbox.img-e1000.out
vbox.img-em.out
vbox.img-HGCM.out
vbox.img-HWACCM.out
vbox.img-i8254.out
vbox.img-i8259.out
vbox.img-ichac97.out
vbox.img-ioapic.out
vbox.img-mc146818.out
vbox.img-mm.out
vbox.img-pci.out
vbox.img-pckbd.out
vbox.img-pdm.out
vbox.img-pdmblkcache.out
vbox.img-pgm.out
vbox.img-piix3ide.out
vbox.img-rem.out
vbox.img-selm.out
vbox.img-SSM.out
vbox.img-tm.out
vbox.img-trpm.out
vbox.img-usb-ehci.out
vbox.img-usb-ohci.out
vbox.img-vga.out
vbox.img-vmm.out
vbox.img-VMMDev.out

Saya juga membuat parser screenshot (readss.c) dan mendapatkan gambar ini, tapi ternyata tidak membantu sama sekali.
out
Isi memori utama ada di: vbox.img-pgm.out, melihat isi memori dengan strings, didapatkan:
 
ssh-copy-id 'asis_agent@asis-ctf.ir -p 2014'
ssh-keygen ssh-copy-id 'asis_agent@asis-ctf.ir -p 2014'
ssh-copy-id 'asis_agent@asis-ctf.ir -p 2014'
ssh asis_agent@asis-ctf.ir -p 2014 ls -al 0bin.key

Key yang ditemukan adalah: 2 RSA Key, 1 EC key, 1 DSA key:

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA0fECvoo0bX8mIh8o9G4U56D/hJ0vHTru85Lt3VVPP/bGq3fH
JIpaF3zfcmdxCWJJarTV/CPnPW/7HtgPNypk78JKFXBwmsS0BuI25JD41X1bZQDL
vEi3mT0fcNFPkEDb9+pcS6LOKNXt/6hyvNv7rZF6EodSY4bpFa/IDPQMa9bOW/D0
CwXy8c7j7t4/EdnKg9xsj4eBKqWJZbS3bJZMNuWgZaVLgJNCgcSXlI67K8Y6bjqp
8YuPhqUQKaY/HpPqMtw9OptCjAKV3dbXEfjWWzceUXtdvMPqnAZ8flX95c4Vm6AV
Ai55t04tBolXv3bNQvhGSc5zaOH/RJFBypZaWwIDAQABAoIBAQCJpnZgLAm4CXgd
Q0T9DvhR7vPaJZ1wkuV9esbPKlIt5EXaw0wlHzl20P9I6Z3pwzHT7wGmsnu5gqSq
UouXZgqMUV11tSV/tJ09LjFDp/IfOHQmQ2FR8HPA25yzweli8cPIRzeAuBxoFexY
hj/EqI/Z+9qIL4XLj/dfqsOGCrXiNeNGJKOnLrhVjyDYmGCZ9bvOSZkIQF84lvWy
0rIwch3g46m7LMxuu+iU51SpBlWnwVwUpsGwlHDHRORdQ5HWPXM4z06vjuMCKMlE
p6dMhjF5+906gQzhlcPibb6w8d4u9BAZZl4GrtCg+9ZbXlDqHP+oo8ptG735ulTv
W1UjGTxRAoGBAOvjStt/eQbfJ1+a54eOJ0zEwPz1pXVk9GgxoZpppIIhl8/60H45
f75/g04pwbXxKEpr/SLPUEVyZDgkhkKbPdsUYuIB0rAK+Np28yzqIZmRkIpPD+Co
1G728ShF7EhVqHN4Y5Uebt+zJCLLlg0KT8SDnff0FJJM4cyEACd0GbjNAoGBAOPX
Y0axsGilQ2b4aUmCrrQam7VFTMY9pF3gmw+NZfkzwx3QZN85j/Bu4BWeiwSAaSFE
OOQKixDpSeneQfZUg2lvdYjXHcyJhd5ytziN39op7h9MB+d9UoaqVAhQ3Bnoo/Dp
rsVHLTDOMnTB+Gz2JqFibb7SXvWPJfc8uPfvkn/HAoGAR+VsIIC227BSaOJm5Tsf
oVdq1u7sMl7F26gc8Fp4qK0if2Kb/4z48ZAd7knt382UETLe4ag8eB5Ii5AeV9jH
Pqn1BZu2oq+Fb9jHf44RFaR3YKB+X2Q182hS0oqVXOq2wBMWjxHKi2Yngm942Zql
+2h+Ul/TkU/blqE5Bs1tNZUCgYEAlBqJnQWaP5vV4ZRulGtPdyGov7+JdX/SXXfI
M+bdN42PMs0pFPXM/CSGo2cIxOdX71jyhkHYPij3c/+W7zHmrl3WkBoNc8ydaYk2
UpvevGjvMgbxSGftgj4sG6+8M1dHYi30/qYS2RvgLod8HhAv8k4SOq1zLrpbmogt
UHW5zDcCgYEAwKlyLVAVLPej+JpdEs/N4LmFIBbApV3hMjInWLf+VLHH4yQcM8Wm
Pc1H7+0ZThbZmqPNoHiSfISzgi1XRs1kESYunCVBwuKvZcOvD8M2ZpwDWNXFXS9B
VtFekTFuN32zHzm5wq/mW+Mwk0waK52A5Ec7IMLxcpZDlp+LwpEVP34=
-----END RSA PRIVATE KEY-----

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEArdgOcEXvJAm519M8kl78xeU5ubQl2G39xMXuM8FafA304YVz
B04xDromqH+UOwnjREVBIrOWgozS+ig1IOHWkb5txnSpkG/oWD3HjOQXc5bCSbKg
bSWawE9kqTp0/tiv/oEKviqphCnMl/L2I1CLvAeLIJMaeKUygqhPXCluXfFdbcfc
mbip56WM4AhGzWJfgw+XQHJAJA9PtJ2pyaVqf8x4n2WSaG4Pj5NTXiwwmvaWq3xk
d31P+G1rXwzNKU1kRDKKz4R6tDS34oEIUjYXtCfolRCpNMO20vxWKG64bgVtqcDV
phhk5mUiDh+4O2P5nzLnU0uebHRqSoUWEnaUKwIDAQABAoIBAQCATy5g+Y0G6VLM
lDFpy0f//C79/JPOSWh6+qfUdUqGs3phlbCP3MtilkyAIyHR7XtbYU4xAaH+G1iA
oHqOGYHYMlgtmN+qJp6zum11dMhGXShrYrb7uDye4jpmmSnPCzniu3WlZDGXxY4n
PIElEYcBMgQi99Aa6br9KqLgYAgAtzSHmBKw1CPlmn44vmf6WB+lGGBjPEfVTCnd
I15WmMmzkrkwAarHQr36JN2j2FfWM9WfHaflyP1Ok2tB5zuj+O5AGX9R65tEApvp
8Ts3flO7ZZVcN7XKhxHatvS44XAUVwpDLfmDPqSw8dHM1+gyMVPKg9zOOdsw0Y+v
LZLsyDD5AoGBANc+YZQCzJ4RK4Cuo8dGLTmS8THfiTDjaIytx2o5yzfiwZa2a1ep
HiK3On4+1gDrPvD8btg6dl9kjrh1Pp7SBsXH3OpszaRZcJEGZqL20EsL7qmNxQKQ
Ou5+VDmzAetmfSCyKDLJjxghHiCz0EqYuusHhw98WX4n7BX8DW5sQKwdAoGBAM7C
4r56l7PIo+liJfxIVpy9wCa1Kub9cAbU6YatK/V2fCREmG6OJemiGbdWkYrjTe02
EmVF8K3n6kTdvG7BA/nE8U/GQSt4KpOYVo3Z0KLwObU7CgkPNul2YYt//j4HepcP
W6SAPwQF6TxDuqGndTUJmQ8Ai8t1UccRooc96X7nAoGAffJWjpEEwgkx9145H0WE
+QducsxmLmEisA6PfSzMKKtas6GSNf0TUST96RlDh84fSkurYIL0+OSSToTsW2px
5BEKx3Fa8ywSngmszPa28vLMeBIokVNr6FmrVwfTu7aAyTz2IKGoRWo7gs80tjGg
Th5dfUY554PctRCDm3VkclECgYAjxR+JKJhaKBoDZFGCBdnGICXADJOxhqL865TD
Ee6K9safV6avabQxaTPdvgJL7usqYLJqBuGOlJK4+0uANbBEY8gDrx7TMGTdR/uh
as9ngPva2K3xx0oOtcZGZgxMGusgey21leJRBdzF6km9ccUbOd/a8pM8zb0qHWjq
0NE2fQKBgG+4XabYHqM0DznSHEHjTzrPzhC+Kpo5p02sJeVoVbqxqfNFyg0hAdR1
DcRIB81aewUYGLs6/TEKWETB32C4W0QFVxCGt3SuGnkehuWwczJ33sJwdGYaN/qU
PMPyvWr50EUHJwdFaF3mS7DtK2FSVL42CmilDRuUP3iCC9+NkJEB
-----END RSA PRIVATE KEY-----

-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIC5RULOwvXYfcqZuuOBhI9TBSbRM0SEhwfUPxZsbTBi3oAoGCCqGSM49
AwEHoUQDQgAE9aWSuKzdge7XdJLSc2MzIklGeMJeTXqYhWvbW1kidli2S8g1/OLL
3+yt6YauLlUhqkRztqPNbA1xNKOlhyLX3Q==
-----END EC PRIVATE KEY-----



Semuanya tidak bisa digunakan untuk login ke server asis.

Ditemukan perintah untuk mendownload file secret.zip

wget asis-ctf.ir/56f4846d2dce6afafb35f25970b6f792/secret.zip

Tapi file ini terenkripsi. Saya stuck di sini. Berdasarkan screenshot, saya bertanya ke @factoreal di irc.asis.io, tapi ternyata tidak dijawab oleh factoreal.

Teori saya: seharusnya saya bisa login dengan ssh key yang diberikan, tapi sepertinya server mereka error. Saya terlalu lama berpikir sebelum mengirimkan email ke panitia, jadi waktu saya sudah sangat sedikit. Akhirnya saya mengirimkan email ke panitia dengan key yang saya temukan, saya mendapatkan balasan:

Hello,
great job, what you are looking on the server is this:
wyP733TE6HTlmmsjsTfwCufOanStL44kHvot/iJ7Agg=
but you are one step away from it.
thanks
_factoreal

Sayangnya di langkah ini saya stuck lagi. Setelah selesai event ASISnya dan bertanya ke IRC, ternyata orang lain (atdog) menemukan URL ini: 0bin.asis.io/paste/cXLEG4r+ (entah kenapa, saya melewatkan nURL ini walaupun sudah berkali-kali memfilter kata “asis”). Tanpa key, URL tersebut sia-sia:

asis-paste1

Jika digabung dengan key yang diberikan oleh factoreal, maka didapat teks password:

http://0bin.asis.io/paste/cXLEG4r+#wyP733TE6HTlmmsjsTfwCufOanStL44kHvot/iJ7Agg=

asis-pastebin

Dan setelah kita unzip secret.zip, flagnya adalah:

ASIS_dab27f4eae72aa966887d80aa4cd2f0a

ASIS Quals 2014: Toq toq (Forensic100)

Soal ini sebenarnya sangat mudah: diberikan sebuah file PCAP, carilah port-port untuk melakukan port-knocking agar dapat membuka URL flagnya. Ide mengenai port-knocking didapatkan dari nama challenge (toq toq) dan analisa paket itu sendiri.
 
Setelah mengetahui IP asal dan tujuan yang berhubungan dengan flag, kita bisa memasukkan filter ini di Wireshark:
(ip.dst == 87.107.123.4) or (ip.src == 87.107.123.4)
Filter tersebut akan menghilangkan semua sampah yang ada di file.

forensic-100

Pada file pcap yang sudah kita filter juga akan di temukan 5 buah akses ke web yang menunjukkan informasi terkait flag dengan port yang berbeda-beda

















Seharusnya tantangan ini bisa diselesaikan seperti ini:
Pastikan server hidup:
ping <IP>
Ketok pintunya
knock –v<IP> port1 port2 port3
lynx http://<IP>:target/

Tapi koneksi ke server sering lambat, jadi knocking perlu dilakukan pelan-pelan:
for i in port1 port2 port3; do knock –v $IP $i; sleep 1; done

Bahkan cara ini pun kadang tidak berhasil, jadi perlu dilakukan berkali-kali. Ini harus dilakukan 5 kali (first_part_of_the_flag, second_part_of_the_flag, …, last_part_of_the_flag). Setelah berkali-kali mencoba dan menghubungi panita terkait ketersediaan server maka nantinya akan didapatkan flag dalam 5 part.

Monday, April 14, 2014

PlaidCTF2014 Write Up: rsa(forensic450)

Sebenarnya kami tidak berhasil menyelesaikan challenge RSA ini tepat waktu, jadi kami tidak mendapatkan poin. Tapi karena kami sudah berhasil menyelesaikan challengenya, jadi kami tuliskan pembahasannya.

Inti dari solusinya adalah berdasarkan paper: "Reconstructing RSA Private Keys from Random Key Bits"

http://cseweb.ucsd.edu/~hovav/papers/hs09.html

Ada source code yang bisa didownload di situ, tapi sourcenya perlu dimodifikasi. Berikut ini adalah modifikasi yang saya lakukan:

Program aslinya akan menghasilkan RSA key (atau membaca dari  file), merusak key tersebut, lalu merekonstruksi kembali keynya. Bagian membaca dari file diganti agar membaca bit yang tersedia dan bit yang tidak tersedia dianggap corrupt.

Saya menambahkan opsi -x <corrupted_file>. File input harus diperbaiki dulu supaya nilai modulus benar. Ini bisa didapatkan dari public key:

openssl pkey -pubin -in public.pub -text -noout
Contoh file input berdasarkan soal:

Jalankan program:

./rsa -x corrupted.pem

Hasilnya: solution0.asn

Ubah ke format der:

openssl asn1parse -genconf solution0.asn -out newkey.der

Check bahwa keynya benar, dan tuliskan ke PEM:

openssl rsa -in newkey.der -inform der -text -check > key.pem

Decrypt pesan:

openssl rsautl -decrypt -in encrypted -out plaintext.txt -inkey key.pem

Hasilnya adalah:

crypt0>>>f0rensics3~

Sunday, April 13, 2014

PlaidCTF2014 Write Up: curlcore (Forensic250)

Dalam challenge ini, Kita diberi sebuah file coredump dari curl yang sedang mengakses sebuah situs https, dan sebuah file capture pcap, serta beberapa library pelengkap curl. Tadinya ingin meload file ini di gdb untuk melihat session master key, tapi ternyata meload file ini sulit dilakukan. Setelah mencari-cari di Internet, didapat link ini yang menyatakan bahwa kita bisa langsung mengekstrak dari key dari memori dengan mudah jika kita tahu session idnya:
http://www.cloudshield.com/blog/advanced-malware/how-to-decrypt-openssl-sessions-using-wireshark-and-ssl-session-identifiers/
Jadi solusinya cukup mudah: cari session id menggunakan wireshark di paket handshake, dan didapat:
19ab5edc02f097d5074890e44b483a49b083b043682993f046a55f265f11b5f4
Kemudian kita cari di curlcure nilai hex tersebut, dan kita mundur sedikit untuk mendapatkan master keynya:
191e5042e6b31371aa65258e13b2dc714d984df8d68fad678ff0a2fc49476d65c3a161f718572c3f5db8566a0de89e58
Keduanya kita masukkan ke file sslkey.txt (semuanya satu baris):
RSA Session-ID:19ab5edc02f097d5074890e44b483a49b083b043682993f046a55f265f11b5f4 Master-Key:191e5042e6b31371aa65258e13b2dc714d984df8d68fad678ff0a2fc49476d65c3a161f718572c3f5db8566a0de89e58
Lalu kita pakai file ini di wireshark:
settingssl
Kita sekarang bisa melihat requestnya:
ssl2
Dan jika kita ikuti SSL Streamnya:
ssl
Kita mendapatkan flagnya.

PlaidCTF2014 Write Up: doge_stege (Forensics100)

Ini adalah soal kategori forensik tapi sebenarnya bisa juga kategori steganography.

Berikut adalah deskripsi soalnya:

You were startled to learn the The Plague has been behind many of the most popular internet memes. We believe he hides information in these funny pictures with steganography in order to broadcast his messages through time without detection. Find the hidden message, stop the signal.
Hidden message adalah sebuah gambar berikut.


Kita diminta untuk mencari flag yang tersembunyi dari gambar.

Soal ini sangat mudah diselesaikan dengan stegsolve, dengan beberapa kali klik sudah terlihat pada random color map terlihat teks tersembunyi.



Karena warnanya diacak, kita bisa melakukan beberapa kali klik untuk melihat beberapa variasi warna sampai terlihat teks tersembunyi, pctf{keep_doge_alive_2014} yang menjadi flag.