├── .gitignore ├── README.md ├── basic_injection_COMPLETE ├── README.md └── script.py ├── basic_rot_13_COMPLETE ├── README.md └── script.sh ├── binwalk_COMPLETE └── README.md ├── c_e_er_COMPLETE ├── README.md └── script.sh ├── charater_encoding_COMPLETE ├── README.md └── script.py ├── chop_the_tree_COMPLETE ├── README.md └── script.sh ├── crack_me_COMPLETE ├── README.md └── script.sh ├── cryptaz_COMPLETE ├── README.md └── script.sh ├── dont_bump_your_header_COMPLETE ├── README.md └── script.py ├── double_encryption_COMPLETE ├── README.md └── script.py ├── esrom_leumas_COMPLETE ├── README.md └── script.py ├── exhpltoimtilng_COMPLETE ├── README.md ├── quest.html └── script.sh ├── exif_COMPLETE ├── README.md └── script.sh ├── forensic_101_COMPLETE ├── README.md └── pic.jpg ├── git_is_good_COMPLETE └── README.md ├── hat_on_my_head_COMPLETE ├── README.md └── script.sh ├── i_heard_ROT13_COMPLETE ├── README.md └── script.sh ├── makefile ├── md5_COMPLETE └── README.md ├── milk_best_friend_COMPLETE ├── README.md ├── oreo.jpg └── script.sh ├── name_COMPLETE ├── README.md ├── script.py └── script.sh ├── photo_analysis_COMPLETE ├── README.md └── script.sh ├── post_practice_COMPLETE ├── README.md ├── script.py └── script.sh ├── privacy_matters_COMPLETE ├── README.md └── script.py ├── pumpkin_carving_COMPLETE ├── README.md └── script.sh ├── qr_code_COMPLETE ├── README.md ├── hasil_scan.txt ├── qrcode.39907201.png └── script.sh ├── qr_code_v2_COMPLETE ├── README.md ├── hasil_scan └── qr_code.jpg ├── reversal_of_fortune_COMPLETE ├── README.md └── script.py ├── reverse_polarity_COMPLETE ├── README.md └── script.py ├── simple_image_COMPLETE ├── README.md └── filtered.bmp ├── so_many_64_COMPLETE ├── README.md ├── flag.txt ├── script.py └── script.sh ├── solve_this_111_COMPLETE ├── README.md └── script.py ├── taking_ls_COMPLETE └── README.md ├── up_for_a_little_challenge_COMPLETE ├── Begin Hack.jpg └── README.md ├── whats_your_fav_num_alpha_COMPLETE ├── README.md └── script.py └── where_can_my_robot_go_COMPLETE ├── README.md └── script.sh /.gitignore: -------------------------------------------------------------------------------- 1 | # ignore pure files and flags 2 | # cz it's explained in each README.md 3 | flag* 4 | quest* 5 | Flag* 6 | 7 | # files 8 | *.zip 9 | *.jpeg 10 | *.png 11 | *.gif 12 | 13 | # executable 14 | *.exe 15 | 16 | # outputs after extracting 17 | */output/* 18 | */__MACOSX/* 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CTF Learn Writeup 2 | > Made by Computer Engineering Research Club 3 | > Diponegoro University 4 | > Semarang, Indonesia 5 | 6 | --- 7 | 8 | ### Dibuat untuk tujuan pembelajaran dan clue. 9 | > Usahakan untuk mengerjakan sebisanya sebelum melihat writeup. 10 | 11 | --- 12 | 13 | ## Tools Key 14 | * Web Exploitation 15 | * **cURL** 16 | * Python `requests` library 17 | * SQL Injection 18 | * bruteforce 19 | * Forensic 20 | * `file` 21 | * `strings` 22 | * `exiftool` 23 | * `binwalk` 24 | * `foremost` 25 | * Cryptography 26 | * **Bash scripting** 27 | * **Base64** 28 | * ROT13 29 | * Caesar Cipher 30 | * Python Programing Basic 31 | * Hex to decimal, decimal to char, char to decimal, binary to decimal 32 | * Array and/or lists 33 | * Loop 34 | * Miscellaneous 35 | * **Imagination** 36 | * Programming 37 | * Python Programming 38 | * Loop 39 | * If-else 40 | -------------------------------------------------------------------------------- /basic_injection_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Basic Injection 2 | **Category:** web 3 | 4 | See if you can leak the whole database. [https://web.ctflearn.com/web4/](https://web.ctflearn.com/web4/) 5 | 6 | ## Write-up 7 | Web dengan input seperti ini dapat diselesaikan dengan SQL Injection dasar. 8 | Kebanyakan challenge CTF kategori web dibuat dengan bahasa pemrograman PHP. Input dari form bisa diasumsikan dengan berbagai macam bentuk 9 | 10 | ```php 11 | $input = "SELECT * FROM user WHERE name = '". $_POST['input'] ."'"; 12 | ``` 13 | atau 14 | ```php 15 | $input = 'SELECT * FROM user WHERE name = "'. $_POST['input'] .'"'; 16 | ``` 17 | 18 | Perhatikan bahwa input dari user (`$_POST['input']) tidak dilakukan filtering maupun validasi. Dalam kasus seperti ini form sangat mudah untuk di-inject menggunakan syntax SQL biasa. 19 | 20 | Kita coba inject input dengan syntax berikut 21 | ``` 22 | ' OR '1' = '1 23 | 24 | // atau 25 | 26 | " OR "1" = "1 27 | ``` 28 | Saya sertakan 2 contoh karena terkadang program bisa menggunakan bentuk yang pertama maupun kedua. 29 | Dengan kode injection diatas akan membuat variabel `$input` menjadi: 30 | ``` 31 | $input = "SELECT * FROM user WHERE name = '' OR '1' = '1'; 32 | ``` 33 | 34 | Kode diatas akan dieksekusi di DBMS (_Database Management System_) dan akan selalu menghasilkan nilai TRUE, yang artinya semua record/data yang ada di dalam tabel user akan ditampilkan. 35 | 36 | Setelah disubmit, halaman web akan menampilkan semua data yang ada di dalam table `user`. Data dengan Name fl4g__giv3r memiliki flag yang kita cari. 37 | 38 | Flag : `th4t_is_why_you_n33d_to_sanitiz3_inputs` 39 | -------------------------------------------------------------------------------- /basic_injection_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | import requests 3 | 4 | r = requests.post('https://web.ctflearn.com/web4/', data={"submit":"Submit", "input":"' or '1' = '1"}) 5 | 6 | flag = r.text.split("fl4g__giv3r")[1] 7 | flag = flag.split("
")[1] 8 | print(flag) 9 | -------------------------------------------------------------------------------- /basic_rot_13_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Basic ROT 13 2 | **Category:** cryptography 3 | > Possibly the easiest ever. plore{TrgFuvsgl13} 4 | --- 5 | 6 | Untuk menyelesaikan challenge ini kita perlu apa itu enkripsi ROT 13. Kalian bisa [baca disini](http://datagenetics.com/blog/july42015/index.html). 7 | 8 | Kita akan gunakan command `tr` untuk mentranslasikan setiap huruf sebanyak 13 kali. 9 | ```bash 10 | echo plore{TrgFuvsgl13} | tr 'A-Za-z' 'N-ZA-Mn-za-m' 11 | ``` 12 | ``` 13 | A-Za-z akan menjadi ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 14 | N-ZA-Mn-za-m akan menjadi NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm 15 | ``` 16 | 17 | ![ROT 13](http://datagenetics.com/blog/july42015/big.png "sumber: datagenetics.com") 18 | 19 | Setelah perintah diatas dieksekusi maka kita akan mendapatkan flag yang diinginkan. 20 | 21 | flag : `cyber{GetShifty13}` -------------------------------------------------------------------------------- /basic_rot_13_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cat quest | tr 'A-Za-z' 'N-ZA-Mn-za-m' 4 | -------------------------------------------------------------------------------- /binwalk_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Binwalk 2 | **Category:** forensic 3 | ``` 4 | https://mega.nz/#!4UEnAZKT!-deNdQJxsQS8bTSMxeUOtpEclCI-zpK7tbJiKV0tXYY 5 | ``` 6 | --- 7 | 8 | Pada challenge Binwalk ini kita tidak diberikan clue sama sekali, melainkan hanya judul dan alamat file untuk didownload 9 | 10 | Kita buka file gambar yang baru saja didownload 11 | ``` 12 | eog PurpleThing.jpeg 13 | ``` 14 | 15 | Ketika membuka file, kita mendapatkan error. Hal ini terjadi kemungkinan karena gambar sudah disisipi file yang lain (atau:_Steganografi_). 16 | 17 | Kita akan lihat string yang ada di dalam file ini dan jenisnya. 18 | ``` 19 | strings PurpleThing.jpeg 20 | file PurpleThing.jpeg 21 | ``` 22 | 23 | Perintah `strings` tidak menghasilkan data yang kita inginkan. 24 | 25 | Dengan perintah `file` kita tahu bahwa sebenarnya file `PurpleThing.jpeg` bukanlah jenis file **JPEG** melainkan file **PNG**. Maka kita ubah ekstensinya menjadi `.png`. 26 | ``` 27 | mv PurpleThing.jpeg PurpleThing.png 28 | ``` 29 | 30 | setelah itu kita cek apakah file `PurpleThing.png` _corrupt_ atau tidak dengan menggunakan perinah `pngcheck`. Jika belum menginstall maka bisa gunakan perintah `sudo apt-get install pngcheck`. 31 | ``` 32 | pngcheck PurpleThing.png 33 | ``` 34 | 35 | Setelah dieksekusi ternyata file `PurpleThing.png` corrupt 36 | ``` 37 | PurpleThing.png additional data after IEND chunk 38 | ERROR: PurpleThing.png 39 | ``` 40 | 41 | Untuk melakukan _recovering_ kita gunakan perintah `foremost`. Jika belum menginstall bisa gunakan perintah `sudo apt-get install foremost`. 42 | ``` 43 | foremost PurpleThing.png -v 44 | ``` 45 | * `-v`: menampilkan urutan eksekusi, sehingga kita bisa lihat berapa file yang di-recover (_verbose_) 46 | 47 | ``` 48 | ... 49 | File: PurpleThing.png 50 | Start: Sat Jan 34 22:31:28 2500 51 | Length: 160 KB (164802 bytes) 52 | 53 | Num Name (bs=512) Size File Offset Comment 54 | 55 | 0: 00000000.png 149 KB 0 (780 x 720) 56 | 1: 00000299.png 11 KB 153493 (802 x 118) 57 | *| 58 | ... 59 | ``` 60 | 61 | Setelah _recovering_ terdapat 1 folder `output` dan 2 file baru, satu file PurpleThing asli, dan satunya lagi adalah file gambar dengan format `.png` yang tersisip di dalam gambar `PurpleThing.png`. 62 | * `00000000.png` merupakan file asli 63 | * `00000299.png` merupakan file yang tersisip 64 | 65 | ``` 66 | cd output/png 67 | eog 00000299.png 68 | ``` 69 | flag : `ABCTF{B1nw4lk_is_us3ful}` -------------------------------------------------------------------------------- /c_e_er_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # C_e_er 2 | **Category:** cryptography 3 | > I got a message from a Roman General who liked the number 13 and he liked keys. 4 | > This is the message: 5 | > xwfsutyfxwsubvrohirbjvehojbrveoljrbvjrbivlojrbevhipojrbviuobvurosibjvrhsuoibjrvshiouljrbhsioujrbsiluorjsbihjrlosynt{PnrfneVfAbgFrpher}jbr;hsucjrvhucjrvhujrbvsiljrvbhujvbfqywyfxwiusc2vheucrhsucjvrhucjrvhtsbjrvltjrbevltjrheltjrheltjrbhltbjhrletsbhjrletjhrlestjrvhstrjvehsltjrehvljtvhltvhjlt 6 | --- 7 | 8 | Pada challenge ini kita diminta untuk mendekripsi pesan yang disediakan dan menemukan flag-nya. 9 | 10 | Ada beberapa clue untuk menyelesaikan challenge ini, yaitu: 11 | * Dari judul "C_e_er" 12 | * Kata "Roman" 13 | * Kata "who liked the number 13" 14 | 15 | Dari sini kita dapat simpulkan bahwa algoritma yang dipakai untuk mengenkripsi pesan ini adalah Caesar dengan rotasi sebanyak 13 kali. Jika belum paham apa itu **Caesar** dan **ROT 13** silahkan [baca disini](http://datagenetics.com/blog/july42015/index.html). 16 | 17 | Simpan pesan rahasia kedalam file bernama `quest.txt` agar kita bisa dengan mudah untuk memprosesnya. 18 | 19 | ```bash 20 | echo xwfsutyfxwsubvrohirbjvehojbrveoljrbvjrbivlojrbevhipojrbviuobvurosibjvrhsuoibjrvshiouljrbhsioujrbsiluorjsbihjrlosynt{PnrfneVfAbgFrpher}jbr;hsucjrvhucjrvhujrbvsiljrvbhujvbfqywyfxwiusc2vheucrhsucjvrhucjrvhtsbjrvltjrbevltjrheltjrheltjrbhltbjhrletsbhjrletjhrlestjrvhstrjvehsltjrehvljtvhltvhjlt > quest.txt 21 | ``` 22 | 23 | Selanjutnya mari kita dekripsi pesan tersebut dengan perintah `tr` untuk mentranslasikan setiap huruf. 24 | ```bash 25 | cat quest.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m' 26 | ``` 27 | 28 | > Jika belum paham dengan _command_ diatas maka silahkan lihat writeup challenge [Basic ROT 13](https://github.com/cerc-undip/CTF-Learn-Writeup/tree/update/basic_rot_13_COMPLETE). 29 | 30 | Setelah dieksekusi maka kita akan melihat kumpulan kata acak tanpa spasi. Namun di bagian tengah terdapat flag yang kita cari. 31 | 32 | flag : `flag{CaesarIsNotSecure}` -------------------------------------------------------------------------------- /c_e_er_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cat quest.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m' 4 | -------------------------------------------------------------------------------- /charater_encoding_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Character Encoding 2 | **Categori:** cryptography 3 | > In the computing industry, standards are established to facilitate information interchanges among American coders. Unfortunately, I've made communication a little bit more difficult. Can you figure this one out? 41 42 43 54 46 7B 34 35 43 31 31 5F 31 35 5F 55 35 33 46 55 4C 7D 4 | --- 5 | 6 | Pada challenge ini kita diminta untuk men-_decode_ karakter yang tertera. Namun sebelum bisa men-_decode_ kita perlu tahu teknik _decoding_ apa yang dipakai di dalam soal. 7 | 8 | Kita melihat susunan karakter `41 42 43 54 46 7B ...` dimana hanya terdapat angka dan huruf yang terdiri dari A sampai F saja. Ini merupakan encoding karakter **ASCII**. Untuk menyelesaikannya kita gunakan bahasa pemrograman Python. 9 | 10 | ``` 11 | touch script.py 12 | chmod +x script.py 13 | ``` 14 | 15 | Buka file `script.py` menggunakan text editor. 16 | 17 | ``` 18 | #!/usr/bin/python3 19 | 20 | soal = "41 42 43 54 46 7B 34 35 43 31 31 5F 31 35 5F 55 35 33 46 55 4C 7D" 21 | soal = soal.split(" ") 22 | hasil = "" 23 | 24 | for i in soal: 25 | temp = int(i, 16) 26 | hasil += chr(temp) 27 | 28 | print(hasil) 29 | ``` 30 | 31 | * `soal = soal.split(" ")`: memasukkan setiap karakter yang dipisahkan dengan spasi kedalam variabel soal. Tipe data soal sekarang adalah _list_ (_array_ dalam bahasa pemrograman lain) 32 | * `for i in soal:`: akan mengakses setiap nilai di variabel soal dan memasukkannya kedalam variabel `i` 33 | * `int(i, 16)`: konversi dari _hex_ ke _integer_ 34 | * `chr(temp)`: konversi dari _integer_ ke _character_ 35 | 36 | Setelah program dijalankan. Gotcha! kita dapat flag-nya. 37 | 38 | flag : `ABCTF{45C11_15_U53FUL}` -------------------------------------------------------------------------------- /charater_encoding_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | soal = "41 42 43 54 46 7B 34 35 43 31 31 5F 31 35 5F 55 35 33 46 55 4C 7D" 4 | soal = soal.split(" ") 5 | hasil = "" 6 | 7 | for i in soal: 8 | temp = int(i, 16) 9 | hasil += chr(temp) 10 | 11 | print(hasil) 12 | -------------------------------------------------------------------------------- /chop_the_tree_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Chop the Three 2 | **Category:** cryptography 3 | > i'm a lumberjack. i just need to swing my axe to make the three fall. can you do it too? 4 | > d2FvLCBhbG1vc3QgdGhlcmUNClpHOXVKM1FnZDI5eWNua3NJSE52YjI0TkNscHRlR2hhTTNSd1pFWTVjR014T1hwaU1UbHNXVmhPTldaUlBUMD0= 5 | --- 6 | 7 | Pada challenge ini kita diminta untuk melakukan decoding terhadap pesan dalam bentuk Base64. Bentuk Base64 dapat dengan mudah dikenali dengan tanda "sama dengan" (`=`) di akhir. ([Baca disini](https://en.wikipedia.org/wiki/Base64)) 8 | 9 | Langsung saja kita _decode_ pesan tersebut menggunakan bash. 10 | ```bash 11 | echo d2FvLCBhbG1vc3QgdGhlcmUNClpHOXVKM1FnZDI5eWNua3NJSE52YjI0TkNscHRlR2hhTTNSd1pFWTVjR014T1hwaU1UbHNXVmhPTldaUlBUMD0= | base64 -d 12 | ``` 13 | 14 | > wao, almost there 15 | > ZG9uJ3Qgd29ycnksIHNvb24NClpteGhaM3RwZEY5cGMxOXpiMTlsWVhONWZRPT0= 16 | 17 | Setelah di-_decode_ ternyata pesan ini masih memiliki pesan dalam bentuk Base64 dan terdapat pesan lain sebelumnya. 18 | 19 | Dari kata "Three" di judul kita bisa mengetahui bahwa kemungkinan pesan rahasia ini di-_encode_ sebanyak 3 kali. Jadi, kita tidak perlu membuat script panjang seperti pada challenge [So many 64s](https://github.com/cerc-undip/CTF-Learn-Writeup/tree/master/so_many_64_COMPLETE). 20 | 21 | Paste hasil _decoding_ sebelumnya dan _decode_ lagi sampai flag-nya ketemu. 22 | ```bash 23 | echo ZG9uJ3Qgd29ycnksIHNvb24NClpteGhaM3RwZEY5cGMxOXpiMTlsWVhONWZRPT0= | base64 -d 24 | echo ZmxhZ3tpdF9pc19zb19lYXN5fQ== | base64 -d 25 | ``` 26 | 27 | Setelah dilakukan _decoding_ sebanyak 3 kali maka kita dapatkan flag yang kita cari. Yoyoy. 28 | 29 | flag : `flag{it_is_so_easy}` -------------------------------------------------------------------------------- /chop_the_tree_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | soal="d2FvLCBhbG1vc3QgdGhlcmUNClpHOXVKM1FnZDI5eWNua3NJSE52YjI0TkNscHRlR2hhTTNSd1pFWTVjR014T1hwaU1UbHNXVmhPTldaUlBUMD0=" 4 | 5 | echo $soal | base64 -d | grep = | base64 -d | grep = | base64 -d 6 | -------------------------------------------------------------------------------- /crack_me_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Crack Me 2 | **Category:** binary exploitation 3 | > I forgot the secret code to my program can you help me find it? 4 | > https://mega.nz/#!x2xwQS7S!-Id_VR5BDMQv3MEVo89zxA51LWlkQQHy8r7WBBN45CI 5 | --- 6 | 7 | Challenge kali ini berkategori **Binary Exploitation** yang artinya kita perlu melakukan teknik _reverse engineering_ terhadap program agar kita mendapatkan informasi yang kita inginkan. ([Baca disini](https://en.wikipedia.org/wiki/Reverse_engineering)) 8 | 9 | Namun dalam menyelesaikan challenge **Crack Me** kita tidak perlu melakukan **reverse engineering** terhadap program melainkan kita bisa menyelesaikannya seperti pada challenge berkategori **Forensic**. 10 | 11 | Download file dan lihat jenis file-nya 12 | ```bash 13 | $ file crackme.exe 14 | crackme.exe: PE32 executable (console) Intel 80386, for MS Windows 15 | ``` 16 | 17 | Dari sini kita tahu bahwa format file ini adalah **PE32** yang bisa dijalankan melalui sistem console Windows. Tentu kita tidak perlu menjalankannya melalui OS Windows. Mari kita lihat informasi string yang ada di dalamnya. 18 | ```bash 19 | strings crackme.exe | more 20 | ``` 21 | 22 | Ketika kita _scroll_ informasi string kita dapat melihat beberapa kalimat yang akan ditampilkan oleh program ketika dijalankan. Namun ada sebuah string berawalan `flag` yang dimana itu adalah flag yang kita cari. 23 | 24 | flag : `flag{h4ck3rm3n_4ss3mbl3}` -------------------------------------------------------------------------------- /crack_me_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | strings crackme.exe | grep -i flag{ 4 | -------------------------------------------------------------------------------- /cryptaz_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Crack Me 2 | **Category:** cryptography 3 | > If A=Z, B=Y..., then what is: 4 | > XGU{Rmhvxfiv=Vzhb} 5 | --- 6 | 7 | Challenge Cryptaz ini sudah memberikan algoritma yang dipakai untuk merahasiakan pesannya. Jika kita lihat lagi bahwa algoritma yang dipakai ini adalah algoritma yang pernah dipakai pada saat kita mengikuti Pramuka, yaitu sandi A-Z. Keren kan? Wkwkwk 8 | 9 | ![Sandi A-Z](https://aboutpramuka.files.wordpress.com/2015/12/sandi-abjad-az.jpg "sumber: aboutpramuka.wordpress.com") 10 | 11 | Untuk menyelesaikan challenge ini kita cukup mentranslasikannya saja dengan perintah `tr`. Jika ingin lebih paham bisa baca manualnya `man tr`. 12 | ```bash 13 | echo XGU{Rmhvxfiv=Vzhb} | tr 'A-Za-z' 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba' 14 | ``` 15 | * Penulisan huruf dari A sampai dengan Z dan a sampai dengan z bisa ditulis dengan `A-Za-z`. 16 | * Namun untuk sebaliknya tidak bisa dilakukan, maka ditulis secara manual. 17 | 18 | flag : `CTF{Insecure=Easy}` -------------------------------------------------------------------------------- /cryptaz_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo XGU{Rmhvxfiv=Vzhb} | tr 'A-Za-z' 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba' 4 | -------------------------------------------------------------------------------- /dont_bump_your_header_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Don't Bump Your Head(er) 2 | **Category:** web 3 | ``` 4 | Try to bypass my security measure on this site! https://ctflearn.com/header.php 5 | ``` 6 | --- 7 | 8 | Untuk menyelesaikan challenge ini kita akan menggunakan bahasa pemrograman Python (_versi 3.x). Jika belum menginstal bisa gunakan perintah `sudo apt-get install python3`. 9 | 10 | Challenge ini juga bisa diselesaikan dengan menginstall _Chrome Extension_ bernama **Modify Headers** 11 | 12 | Kita akan menuliskan script yang akan dijalankan oleh terminal. Buat file bernama `script.py` dan ubah aksesnya menjadi _executable file_. 13 | ``` 14 | touch script.py 15 | chmod +x script.py 16 | ``` 17 | 18 | Kemudian kita tulis program menggunakan _text editor_. (Bisa menggunakan **gedit**, **sublime**, **atom**, **vim**, **vi**, dsb) 19 | ``` 20 | #!/usr/bin/python3 21 | import requests 22 | re = requests.get('https://ctflearn.com/header.php') 23 | print(re.text) 24 | 25 | ``` 26 | 27 | * `#!/usr/bin/python3`: terminal akan menjalankan program dengan python3. [Baca disini](https://stackoverflow.com/questions/7670303/purpose-of-usr-bin-python3). 28 | * `import requests`: library untuk melakukan _HTTP Request_. 29 | * `re = requests.get('https://ctflearn.com/header.php')`: melakukan request ke url dengan method HTTP GET. 30 | * `print(re.text)`: menampilkan _response_ dari request yang telah dikirim 31 | 32 | > Library requests sangat berguna untuk menyelesaikan setiap challenge dengan kategori **web** 33 | 34 | Simpan dan eksekusi file tersebut dengan perintah `./script.py`. 35 | 36 | Saat dieksekusi, response yang akan diterima adalah bahwa request yang dikirimkan ditolak karena `user agent is not correct`. 37 | 38 | Setelah itu terdapat string/kata yang kemungkinan besar bisa kita gunakan untuk inject header selanjutnya. 39 | 40 | ``` 41 | Sorry, it seems as if your user agent is not correct, in order to access this website. The one you supplied is: python-requests/2.9.1 42 | 43 | ``` 44 | Masalah disini dapat kita selesaikan dengan mengirimkan _custom header_ yang kita inginkan, yaitu dengan mengganti header `User-Agent` dengan `Sup3rS3cr3tAg3nt`. [Pelajari tentang Header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) 45 | 46 | ``` 47 | #!/usr/bin/python3 48 | import requests 49 | re = requests.get('https://ctflearn.com/header.php', headers={'user-agent': 'Sup3rS3cr3tAg3nt'}) 50 | print(re.text) 51 | ``` 52 | Ketika dieksekusi muncul pemberitahuan baru yang menyertakan link `awesomesauce.com`. 53 | 54 | Solusi di langkah ini bukanlah mengunjungi website tersebut melainkan kita mengirimkan _custom header_ tambahan lagi yang bernama [Referer](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer) 55 | 56 | ``` 57 | #!/usr/bin/python3 58 | import requests 59 | re = requests.get('https://ctflearn.com/header.php', headers={'user-agent': 'Sup3rS3cr3tAg3nt', 'referer': 'awesomesauce.com'}) 60 | print(re.text) 61 | ``` 62 | 63 | Gotcha!! Kita dapat flagnya! 64 | 65 | flag : `flag{did_this_m3ss_with_y0ur_h34d}` -------------------------------------------------------------------------------- /dont_bump_your_header_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | import requests 3 | 4 | r = requests.get('https://ctflearn.com/header.php', headers={'user-agent': 'Sup3rS3cr3tAg3nt', 'referer': 'awesomesauce.com'}) 5 | print(r.text) 6 | -------------------------------------------------------------------------------- /double_encryption_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Double Encryption 2 | **Category:** cryptography 3 | > 0101101001101101011110000110100001011010001100110111010000110101011000100011001101010101011011100110001101101101010101010110011101011001010100110100001001101010011000100011001000111001011100110100100101000111010100100011000101011010010001110101011000111001 4 | 5 | > Good Luck 6 | --- 7 | 8 | Untuk menyelesaikan ini kita perlu mengubah bentuk biner tersebut menjadi karakter/teks. Kita bisa akan selesaikan challenge ini menggunakan bahasa pemrograman Python, atau jika ingin cepat bisa gunakan [Binary to Text online](https://www.rapidtables.com/convert/number/binary-to-ascii.html). 9 | 10 | Oke, kita buat file `script.py` dan ubah menjadi _executable_, kemudian buka filenya. 11 | ```bash 12 | touch script.py 13 | chmod +x script.py 14 | ``` 15 | 16 | Untuk pertama kita membuat 2 variabel: `soal` untuk menyimpan pesan biner dan `hasil_temp` untuk menyimpan setiap 8 bit pesan kedalam list/array. 17 | 18 | ```python 19 | #!/usr/bin/python3 20 | soal = "0101101001101101011110000110100001011010001100110111010000110101011000100011001101010101011011100110001101101101010101010110011101011001010100110100001001101010011000100011001000111001011100110100100101000111010100100011000101011010010001110101011000111001" 21 | hasil_temp = [] 22 | 23 | for i in range(len(soal) // 8): 24 | hasil_temp.append(soal[:8]) 25 | soal = soal[8:] 26 | 27 | print(hasil) 28 | ``` 29 | 30 | Selanjutnya kita ubah tiap 8 bit tersebut menjadi karakter ASCII. 31 | 32 | | Dari | Menjadi | Perintah | 33 | |---|---|---| 34 | | biner | desimal | int(var_biner, 2) | 35 | | desimal| ASCII | chr(var_desimal) | 36 | 37 | 38 | ```python 39 | #!/usr/bin/python3 40 | soal = "0101101001101101011110000110100001011010001100110111010000110101011000100011001101010101011011100110001101101101010101010110011101011001010100110100001001101010011000100011001000111001011100110100100101000111010100100011000101011010010001110101011000111001" 41 | hasil_temp = [] 42 | 43 | for i in range(len(soal) // 8): 44 | hasil_temp.append(soal[:8]) 45 | soal = soal[8:] 46 | 47 | hasil = "" 48 | 49 | for j in range(len(hasil_temp)): 50 | temp = chr(int(hasil_temp[j], 2)) 51 | hasil += temp 52 | 53 | print(hasil) 54 | ``` 55 | 56 | Setelah dijalankan, ternyata pesan biner ini menghasilkan pesan lain dalam bentuk Base64. Selanjutnya kita akan _decode_ pesan ini menggunakan library python `base64`. Jika belum terinstal bisa gunakan `sudo pip install base64` atau `sudo pip3 install base64`. 57 | 58 | ```python 59 | #!/usr/bin/python3 60 | import base64 61 | 62 | soal = "0101101001101101011110000110100001011010001100110111010000110101011000100011001101010101011011100110001101101101010101010110011101011001010100110100001001101010011000100011001000111001011100110100100101000111010100100011000101011010010001110101011000111001" 63 | 64 | hasil_temp = [] 65 | 66 | for i in range(len(soal) // 8): 67 | hasil_temp.append(soal[:8]) 68 | soal = soal[8:] 69 | 70 | hasil = "" 71 | 72 | for j in range(len(hasil_temp)): 73 | temp = chr(int(hasil_temp[j], 2)) 74 | hasil += temp 75 | 76 | hasilAkhir = base64.b64decode(hasil).decode('utf-8') 77 | print(hasilAkhir) 78 | ``` 79 | 80 | Terakhir, jalankan program tersebut `./script.py` dan kita akan mendapatkan flag yang kita inginkan. 81 | 82 | flag : `flag{you're a cool dude}` -------------------------------------------------------------------------------- /double_encryption_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | import base64 3 | 4 | soal = "0101101001101101011110000110100001011010001100110111010000110101011000100011001101010101011011100110001101101101010101010110011101011001010100110100001001101010011000100011001000111001011100110100100101000111010100100011000101011010010001110101011000111001" 5 | 6 | hasil_temp = [] 7 | 8 | for i in range(len(soal) // 8): 9 | hasil_temp.append(soal[:8]) 10 | soal = soal[8:] 11 | 12 | hasil = "" 13 | 14 | for j in range(len(hasil_temp)): 15 | temp = chr(int(hasil_temp[j], 2)) 16 | hasil += temp 17 | 18 | hasilAkhir = base64.b64decode(hasil).decode('utf-8') 19 | print(hasilAkhir) 20 | -------------------------------------------------------------------------------- /esrom_leumas_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Esrom Leumas 2 | **Category:** cryptography 3 | > I got a message from Esrom Leumas: 4 | > ..-. .-.. .- --. ... .- -- ..- . .-.. -- --- .-. ... . .. ... -.-. --- --- .-.. -... -.-- - .... . .-- .- -.-- .. .-.. .. -.- . -.-. .... . . ... . 5 | > The flag has format: flag{FourWordsInCamelCase} 6 | --- 7 | 8 | Kata kunci untuk menyelesaikan challenge ini adalah pada judulnya "Esrom Leumas". Jika dibalik, kata ini berarti "Samuel Morse". Oke, kita kembali lagi ke masa Pramuka untuk menyelesaikan challenge ini. 9 | 10 | Kita bisa gunakan bahasa pemrograman Python atau jika ingin cepat bisa gunakan [Morse Code Translator Online](https://morsecode.scphillips.com/translator.html?utm_source=hootsuite). 11 | 12 | Mari kita buat file `script.py` dan ubah menjadi _executable_, kemudian buka file tersebut. 13 | ```bash 14 | touch script.py 15 | chmod +x script.py 16 | ``` 17 | 18 | ```python 19 | #!/usr/bin/python3 20 | soal = "..-. .-.. .- --. ... .- -- ..- . .-.. -- --- .-. ... . .. ... -.-. --- --- .-.. -... -.-- - .... . .-- .- -.-- .. .-.. .. -.- . -.-. .... . . ... ." 21 | 22 | hasil = soal.split(" ") 23 | print(hasil) 24 | ``` 25 | 26 | Dengan program diatas, kita masukkan tiap kode yang dipisahkan dengan spasi kedalam variabel `hasil`. 27 | 28 | Pasangan antara kode morse dengan huruf kita gunakan tipe data `dictionary` dari Python. 29 | ```python 30 | #!/usr/bin/python3 31 | soal = "..-. .-.. .- --. ... .- -- ..- . .-.. -- --- .-. ... . .. ... -.-. --- --- .-.. -... -.-- - .... . .-- .- -.-- .. .-.. .. -.- . -.-. .... . . ... ." 32 | 33 | sandi = { 34 | ".-": "A", 35 | "-...": "B", 36 | "-.-.": "C", 37 | "-..": "D", 38 | ".": "E", 39 | "..-.": "F", 40 | "--.": "G", 41 | "....": "H", 42 | "..": "I", 43 | ".---": "J", 44 | "-.-": "K", 45 | ".-..": "L", 46 | "--": "M", 47 | "-.": "N", 48 | "---": "O", 49 | ".--.": "P", 50 | "--.-": "Q", 51 | ".-.": "R", 52 | "...": "S", 53 | "-": "T", 54 | "..-": "U", 55 | "...-": "V", 56 | ".--": "W", 57 | "-..-": "X", 58 | "-.--": "Y", 59 | "--..": "Z" 60 | } 61 | 62 | hasil = soal.split(" ") 63 | 64 | decoded = [] 65 | for j in range(len(hasil)): 66 | decoded.append(sandi[hasil[j]]) 67 | 68 | print("".join(decode)) 69 | ``` 70 | 71 | Program diatas akan otomatis mengakses setiap kode di variabel `hasil` dan mencocokkan dengan _dictionary_ di variabel `sandi`. Hasil dari pencocokkan tersebut dimasukkan kedalam list/array decoded. Terakhir kita tampilkan hasil penggabungan kata di dalam variabel `decoded`. 72 | 73 | Kalian bisa kontribusi perbaiki kode **Morse Decoder** diatas di [repository ini](https://github.com/fannyhasbi/morse-decoder). 74 | 75 | Perhatikan bahwa format flag-nya adalah **flag{FourWordsInCamelCase}**. 76 | 77 | flag : `flag{SamuelMorseIsCool}` 78 | -------------------------------------------------------------------------------- /esrom_leumas_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | soal = input("Enter the morse to decode: ") 4 | 5 | sandi = { 6 | ".-": "A", 7 | "-...": "B", 8 | "-.-.": "C", 9 | "-..": "D", 10 | ".": "E", 11 | "..-.": "F", 12 | "--.": "G", 13 | "....": "H", 14 | "..": "I", 15 | ".---": "J", 16 | "-.-": "K", 17 | ".-..": "L", 18 | "--": "M", 19 | "-.": "N", 20 | "---": "O", 21 | ".--.": "P", 22 | "--.-": "Q", 23 | ".-.": "R", 24 | "...": "S", 25 | "-": "T", 26 | "..-": "U", 27 | "...-": "V", 28 | ".--": "W", 29 | "-..-": "X", 30 | "-.--": "Y", 31 | "--..": "Z" 32 | } 33 | 34 | hasil = soal.split(" ") 35 | 36 | decoded = [] 37 | for j in range(len(hasil)): 38 | decoded.append(sandi[hasil[j]]) 39 | 40 | print("".join(decoded)) 41 | -------------------------------------------------------------------------------- /exhpltoimtilng_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # exHplToiMtiLng 2 | **Category:** miscellaneous 3 | > What is li123456789fe? 4 | > 5 | > Ignore that nonsense ^ 6 | > 7 | > https://mega.nz/#!9ZsDFbYL!y8agy4iFlDq-MX5CCDf5fuUcwyFUOSy3A3aSLFzqXnk 8 | --- 9 | 10 | Oke, no intro langsung saja download file-nya dan coba buka file tersebut. 11 | ```bash 12 | eog 1234568-doesn\'t-that-bother-you.jpg 13 | ``` 14 | 15 | Saat membuka gambar kita akan mendapatkan error. Kemungkinan jenis file ini berbeda dari yang terlihat atau bahkan telah dilakukan teknik _steganografi_. 16 | 17 | Saat kita melihat jenis file tersebut dengan perintah `file` kita tahu bahwa itu bukanlah file gambar, melainkan adalah dokumen HTML. 18 | 19 | Selanjutnya kita ubah file tersebut menjadi `quest.html`. 20 | ``` 21 | $ file 1234568-doesn\'t-that-bother-you.jpg 22 | 1234568-doesn't-that-bother-you.jpg: HTML document, UTF-8 Unicode text, with very long lines 23 | $ mv 1234568-doesn't-that-bother-you.jpg quest.html 24 | ``` 25 | 26 | Buka `quest.html` dengan text editor. Perhatikan disana ada flag yang kita cari. Bisa dicari dengan Ctrl+F atau jika menggunakan terminal gunakan perintah: 27 | ```bash 28 | cat quest.html | grep -i ctf{ 29 | ``` 30 | 31 | flag : `CTF{HTML=fun}` -------------------------------------------------------------------------------- /exhpltoimtilng_COMPLETE/quest.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | EASTER EGGS BABY!!! 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 20 | 41 | 42 | 43 | 44 | 79 | 80 |
81 |
82 | 85 |
86 |
87 |
88 |
89 |
90 |

The answer is CTF{HTML=fun}You're Welcome. -skywalkrs

91 |
..,..
92 |
93 |

Thanks for playing!

94 |
95 |
96 |
97 | Solve now 98 |
99 |
100 |
101 |
102 |
103 |
104 |

Jumperthekidofarcrania

105 |
Binary Exploitation
106 |
107 |

Hey, I have this simple assembly code: http://bit.ly/2x30WvB. I need YOUR help. On a particular instruction (address 0x80484e2) I want to know where the call instruction is jumping to (i.e. the address that we are jumping to) (If the user inputs in 'jump'). Specify your answer as a hex number prefixed with '0x', with no leading zeros. Ex. 0x1234. Good luck!

108 |
109 |
110 |
111 | Solve now 112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |

Posts from us

125 |
126 |
127 |

Posts from others

128 | Add a post 129 |
130 |
131 |
132 |
133 |
134 |
135 |

Hey everyone! Some may have noticed that the quality of some of the problems has fallen a bit. Comment below on how you think we should deal with this problem. Rating system, moderator review, or any other ideas you have! Happy Hacking!

136 |
137 |
138 |

intelagent1 day ago 139 |  1 Comments

140 |
141 |
142 |
143 |
144 |

5000th user! Thanks everyone for sharing the site and using it. Greatly appreciated!

145 |
146 |
147 |

intelagent1 month ago 148 |  4 Comments

149 |
150 |
151 |
152 |
153 |

Hey everyone, I hope you are enjoying the platform. I just merged all the pull requests on github. If there any more bugs, feel free to make a pull request or comment the bug!

154 |
155 |
156 |

intelagent2 months ago 157 |  0 Comments

158 |
159 |
160 |
161 |
162 |
163 |
164 |

Hey! Just for fun... I decided to count the number of problems each user created. (They are ordered solely by total number of problems created, nothing else) https://pastebin.com/7Vqyc7VG

165 |
166 |
167 |

thekidofarcrania3 days ago 168 |  1 Comments

169 |
170 |
171 |
172 |
173 |

I want to learn how to solve ctf problems? I don't know which topics should i master or know about?

174 |
175 |
176 |

OmarKimo6 days ago 177 |  2 Comments

178 |
179 |
180 |
181 |
182 |

Hey guys! You should consider making a slack channel maybe or another platform (if you don't have one already) where all the users can communicate :) Could be great, I will join for sure!

183 |
184 |
185 |

bakkka2 months ago 186 |  6 Comments

187 |
188 |
189 |
190 |
191 |
192 |
193 | Older posts 194 |
195 |
196 | Older posts 197 |
198 |
199 |
200 | 201 |
202 | 210 |
211 |
212 |

213 |

214 |

215 |

216 |
217 | 218 |
219 | 220 | -------------------------------------------------------------------------------- /exhpltoimtilng_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cat quest.html | grep -i ctf{ 4 | -------------------------------------------------------------------------------- /exif_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Exif 2 | **Category:** forensic 3 | > If only the password were in the image? 4 | > https://mega.nz/#!QDZGiLSZ!fkkhBJuBBtBKGsLTDiF2NuLihP2WRd97Iynd3PhWqRw 5 | > 6 | > You could really "own" it with exif 7 | --- 8 | 9 | Pada challenge ini kita diminta untuk mencari flag dari gambar yang disediakan. Di judul juga sudah diberikan clue untuk menggunakan Exif (Exchangeable Image File). ([Baca disini](https://en.wikipedia.org/wiki/Exif)). 10 | 11 | > Exif cukup sering digunakan untuk mencari informasi di dalam file gambar 12 | 13 | Oke, kita akan melihat informasi EXIF ini di terminal dengan perintah `exiftool`. Jika belum menginstal silahkan gunakan `sudo apt-get install exiftool`. 14 | ```bash 15 | exiftool Computer-Password-Security-Hacker\ -\ Copy.jpg | more 16 | ``` 17 | 18 | Dengan perintah diatas kita dapat mengetahui semua informasi EXIF yang ada di dalam gambar ini. Pada baris `Owner Name` terdapat flag yang kita cari. 19 | 20 | flag : `flag{3l1t3_3x1f_4uth0r1ty_dud3br0}` -------------------------------------------------------------------------------- /exif_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | exiftool quest.jpg | grep flag{ 4 | -------------------------------------------------------------------------------- /forensic_101_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Forensic 101 2 | **Category:** forensic 3 | 4 | Untuk menyelesaikan challenge bertipe **forensic** awali dengan cek tipe file dan strings, karena dari sini bisa saja terdapat informasi yang dapat digunakan untuk menemukan clue selanjutnya. 5 | 6 | Cek file menggunakan terminal 7 | ``` 8 | file pic.jpg 9 | ``` 10 | 11 | Dari perintah diatas ternyata file tersebut merupakan file berjenis `JPEG Image`. Dalam kasus lain gambar bisa berjenis `ZIP`, `TAR.GZ`, `RAR`, maupun yang lain 12 | ``` 13 | pic.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 236x218, frames 3 14 | ``` 15 | 16 | Jika file dibuka tidak akan didapat informasi yang penting. Hanya terdapat gambar minion dan tulisan yang tidak berkaitan dengan challenge 17 | ``` 18 | eog pic.jpg 19 | ``` 20 | ![](./pic.jpg) 21 | 22 | > Hal terpenting ketika menyelesaikan challenge bertipe `forensic` 23 | > dengan mengecek kata-kata yang ada di dalam file tersebut 24 | 25 | ``` 26 | strings pic.jpg 27 | ``` 28 | Dari perintah diatas kita dapatkan kata-kata yang acak. Namun pada bagian terakhir ada string yang dapat dibaca, dan itu merupakan flag-nya. 29 | ``` 30 | ... 31 | X`( 32 | 8kF= 33 | ~9%]Tn 34 | flag{wow!_data_is_cool} 35 | $lqU 36 | AG{u 37 | Xm*CnC 38 | @'hnQ 39 | ax+p 40 | bdQG 41 | D_ O 42 | ``` 43 | 44 | flag `flag{wow!_data_is_cool}` -------------------------------------------------------------------------------- /forensic_101_COMPLETE/pic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cerc-undip/CTF-Learn-Writeup/137b6bcd6fcdaf1bf4771575cb52b76ea91a19f9/forensic_101_COMPLETE/pic.jpg -------------------------------------------------------------------------------- /git_is_good_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Git is Good 2 | **Category:** forensic 3 | 4 | > The flag used to be there. But then I redacted it. Good Luck. https://mega.nz/#!C483DAYB!Jjr55hfJQJ5-jspnyrnVtqBkMHGJrd6Nn_QqM7iXEuc 5 | --- 6 | 7 | Pada judul sudah terpampang dengan jelas apa yang akan kita lakukan di challenge ini, yaitu menggunakan **git**. Jika belum menginstal silahkan download dan install git [disini](https://git-scm.com/downloads) 8 | 9 | _Extract_ file yang baru kita download. Setelah itu akan muncul semua informasi file apa saja yang di-_extract_ 10 | ``` 11 | unzip gitIsGood.zip 12 | cd gitIsGood 13 | ls -la 14 | ``` 15 | 16 | Ketika masuk ke folder `gitIsGood` disitu terdapat 1 file `flag.txt` dan 1 folder `.git` yang menandakan bahwa folder ini adalah _repository_ git. Kita coba baca isi file `flag.txt`. 17 | ``` 18 | cat flag.txt 19 | ``` 20 | 21 | Ketika `flag.txt` dibaca, ada tulisan flag. Tetapi ini bukanlah flag yang kita cari, karena flag tersebut sudah diedit (_redacted_). 22 | 23 | Dengan **git** kita bisa melihat _history_ pengeditan pada repository dengan perintah `log`. 24 | ``` 25 | git log 26 | ``` 27 | 28 | Dari sini kita bisa lihat _history_ pengeditan yang pernah dilakukan serta tanggal dan keterangannya. Dari sini juga kita tahu bahwa file `flag.txt` telah diedit 3 kali. 29 | 30 | Untuk melihat detail perubahannya kita bisa menggunakan _option_ `-p` (_patch_). 31 | ``` 32 | git log -p 33 | ``` 34 | 35 | Gotcha! Kita bisa melihat flag sebelum dilakukan perubahan. 36 | 37 | flag : `flag{protect_your_git}` 38 | -------------------------------------------------------------------------------- /hat_on_my_head_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Hat on my HEAD 2 | **Category:** forensic 3 | > A Tip of the Hat to anyone who can solve this. 4 | > 5 | > https://mega.nz/#!lKZ2VaiY!DkGHSZZh6msYsvP_iuHDryQdRO-pd7b6qhbWb_f4noY 6 | --- 7 | 8 | Pada challenge ini kita diminta untuk mencari flag yang ada di gambar yang sudah disediakan. 9 | 10 | Karena file tersebut beresktensi `.png` mari kita cek dulu apakah file ini terdapat _corrupt_ atau tidak. 11 | ```bash 12 | pngcheck whitehat.png 13 | ``` 14 | > whitehat.png: CORRUPTED by text conversion 15 | > ERROR: whitehat.png 16 | 17 | Setelah di-_run_ ternyata file ini _corrupt_. Karena file ini corrupt perlu dilakukan _recovering_. Tetapi sebelum itu kita coba untuk melihat string yang ada pada file ini. 18 | ```bash 19 | strings whitehat.png | more 20 | ``` 21 | 22 | Ternyata dengan melihat string kita menemukan flag yang kita cari tanpa melakukan _recovering_ datanya. Tetapi jika kalian ingin mencoba _recovering_ silahkan saja. 23 | ```bash 24 | foremost -v whitehat.png 25 | ``` 26 | 27 | Ternyata ketika proses _recovering_ tidak terdapat data apapun didalamnya. Kemungkinan file ini corrupt karena ditambahkan string flag. 28 | 29 | flag : `Cyber{M'Lady}` -------------------------------------------------------------------------------- /hat_on_my_head_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | strings whitehat.png | grep -i Cyber{ 3 | -------------------------------------------------------------------------------- /i_heard_ROT13_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # I Heard You Can't ROT13 Numbers 2 | **Category:** cryptography 3 | > I saw this in a file but I can't figure out what it meant: MzkuM3gaMKE0nJ5aK3A0LKW0MJE9 4 | > 5 | > Can you help? 6 | --- 7 | 8 | Dari judul kita sudah bisa menebak apa algoritma yang digunakan untuk menyembunyikan pesan rahasianya, yaitu ROT13. Logika dari algoritma enkripsi ini adalah dengan memutar huruf abjad dari A sampai dengan Z sebanyak 13 kali. ([Baca disini](http://datagenetics.com/blog/july42015/index.html)) 9 | 10 | ![ROT 13](http://datagenetics.com/blog/july42015/big.png "sumber: datagenetics.com") 11 | 12 | Oke, kita langsung saja perintahkan terminal untuk menyelesaikannya. 13 | ```bash 14 | echo MzkuM3gaMKE0nJ5aK3A0LKW0MJE9 | tr 'A-Za-z' 'N-ZA-Mn-za-m' 15 | ``` 16 | 17 | > Jika belum paham arti perintah `tr` silahkan baca writeup challenge [Basic ROT 13](https://github.com/cerc-undip/CTF-Learn-Writeup/tree/update/basic_rot_13_COMPLETE). 18 | 19 | Setelah kita eksekusi perintahnya, kita menemukan bahwa pesan ini masih dirahasiakan lagi. Namun pesan ini merupakan besan berbentuk Base64 ([Baca disini](https://en.wikipedia.org/wiki/Base64)), maka dari itu kita perlu men-_decode_ pesan ini 20 | ```bash 21 | echo MzkuM3gaMKE0nJ5aK3A0LKW0MJE9 | tr 'A-Za-z' 'N-ZA-Mn-za-m' | base64 -d 22 | ``` 23 | 24 | Terakhir, kita akan mendapatkan flag yang kita cari. 25 | 26 | flag : `flag{getting_started}` -------------------------------------------------------------------------------- /i_heard_ROT13_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cat quest | tr 'A-Za-z' 'N-ZA-Mn-za-m' | base64 -d 4 | -------------------------------------------------------------------------------- /makefile: -------------------------------------------------------------------------------- 1 | selesai: 2 | ls -lah | grep -i complete 3 | belum: 4 | ls -lah | grep -iv complete | grep -v README | grep -v .git -------------------------------------------------------------------------------- /md5_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # MD5 2 | **Category:** cryptography 3 | > MD5 hash practice. does not start with cyber{} 4 | > b0439fae31f8cbba6294af86234d5a28 5 | --- 6 | 7 | Penyelesaian challenge ini sangat mudah. Kita hanya menggunakan fasilitas MD5 Decrypter Online. 8 | 9 | flag : `securepassword` -------------------------------------------------------------------------------- /milk_best_friend_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Milk's Best Friend 2 | **Category:** forensic 3 | 4 | > There's nothing I love more than oreos, lions, and winning. https://mega.nz/#!qpFlCTiZ!P8UotyST_6n2iW5BS1yYnum8KnU0-2Amw2nq3UoMq0Y Have Fun :) 5 | --- 6 | 7 | Pada challenge ini tidak diberikan clue yang membantu sehingga kita perlu mencari sendiri solusi untuk menyelesaikannya. 8 | 9 | ![Oreo](./oreo.jpg) 10 | 11 | > Seperti biasa, setelah mendownload pastikan lihat jenis file dan juga _string_ yang terdapat di dalam file. Karena file gambar bisa saja disisipi file lain (_Steganografi_) 12 | 13 | ```bash 14 | file oreo.jpg 15 | strings oreo.jpg 16 | ``` 17 | 18 | Dengan command `file` kita tahu bahwa file gambar ini memang benar file gambar berformat **JPEG**. Namun ketika kita eksekusi command `strings` kita hanya melihat kata-kata acak yang bukan kita cari. 19 | 20 | Selanjutnya kita coba cari tahu apakah file gambar ini telah dilakukan steganografi atau belum dengan menggunakan perintah `binwalk`. Jika belum menginstal bisa gunakan `sudo apt-get install binwalk`. 21 | ``` 22 | binwalk oreo.jpg 23 | ``` 24 | 25 | Setelah diteliti ternyata `oreo.jpg` ini telah dilakukan steganografi dan terdapat 1 file berformat RAR. 26 | ``` 27 | DECIMAL HEXADECIMAL DESCRIPTION 28 | -------------------------------------------------------------------------------- 29 | 0 0x0 JPEG image data, JFIF standard 1.01 30 | 9515 0x252B RAR archive data, first volume type: MAIN_HEAD 31 | ``` 32 | 33 | Maka dari itu kita _extract_ file tersembunyi itu menggunakan perintah `foremost`. 34 | ```bash 35 | foremost -v oreo.jpg 36 | ``` 37 | 38 | Setelah diekstrak terdapat 2 file baru di folder output. 1 file asli oreo sebelum dilakukan steganografi dan 1 nya lagi berekstensi `.rar`. 39 | 40 | Kita masuk ke folder tersebut dan _extract_ file yang ada di dalamnya. 41 | ```bash 42 | cd output/rar 43 | unrar x 00000018.rar 44 | ``` 45 | 46 | > Jika belum paham dengan perintah ekstraksi bisa [baca disini](https://linux.die.net/man/1/unrar). 47 | 48 | Setelah di-_extract_ kita mendapat 1 file teks dan 1 file gambar. Gambar ini hampir sama dengan gambar yang pertama, namun ketika kita lihat _string_ yang ada di dalam gambar maka kita akan menemukan flag-nya. 49 | ```bash 50 | cd 1 51 | strings b.jpg 52 | ``` 53 | 54 | flag : `flag{eat_more_oreos}` -------------------------------------------------------------------------------- /milk_best_friend_COMPLETE/oreo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cerc-undip/CTF-Learn-Writeup/137b6bcd6fcdaf1bf4771575cb52b76ea91a19f9/milk_best_friend_COMPLETE/oreo.jpg -------------------------------------------------------------------------------- /milk_best_friend_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # extract file tersembunyi 4 | foremost oreo.jpg 5 | 6 | # masuk ke folder output 7 | cd output/rar 8 | 9 | # extract file rar 10 | unrar x *.rar -inul 11 | cd 1/ 12 | 13 | # baca string file extract 14 | strings *.jpg | tail -1 15 | -------------------------------------------------------------------------------- /name_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Name 2 | **Category:** miscellaneous 3 | > I don't understand, I only see hello at the end 4 | > 5 | > Flag={reDnAxElA si e*an ym ,u0y llet lli2 I nois*cco laic*ps a si ti sa tub tErces sI emAn ym dn*irf olleH} 6 | > 7 | > Help me please!!! 8 | --- 9 | 10 | Pada challenge **Name** kita diminta untuk mencari nama yang ada di dalam pesan "rahasia" yang disediakan. 11 | 12 | Untuk menyelesaikan ini kita bisa menggunakan **bash script** maupun bahasa pemrograman **Python**. Namun pada writeup ini akan dijelaskan menggunakan **bash script**. Script **Python** tetap akan disediakan untuk pembelajaran. 13 | 14 | Pesan rahasia ini dapat dengan mudah ditebak karena pesan ini hanya dibalik saja. Maka kita akan gunakan _command_ `rev` pada bash. 15 | 16 | ```bash 17 | echo reDnAxElA si e*an ym ,u0y llet lli2 I nois*cco laic*ps a si ti sa tub tErces sI emAn ym dn*irf olleH | rev 18 | ``` 19 | 20 | Dengan perintah ini kita bisa melihat pesan aslinya, dan pada akhir kalimat kita melihat nama yang dicari (flag). 21 | 22 | Perintah ini bisa diubah agar hanya menampilkan namanya saja dengan memotong string. 23 | ```bash 24 | echo reDnAxElA si e*an ym ,u0y llet lli2 I nois*cco laic*ps a si ti sa tub tErces sI emAn ym dn*irf olleH | cut -d ' ' -f 1 | rev 25 | ``` 26 | 27 | flag : `AlExAnDer` -------------------------------------------------------------------------------- /name_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | soal = "reDnAxElA si e*an ym ,u0y llet lli2 I nois*cco laic*ps a si ti sa tub tErces sI emAn ym dn*irf olleH" 4 | soal = soal.split(" ")[0] 5 | print(soal[::-1]) 6 | -------------------------------------------------------------------------------- /name_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | soal="reDnAxElA si e*an ym ,u0y llet lli2 I nois*cco laic*ps a si ti sa tub tErces sI emAn ym dn*irf olleH" 4 | echo $soal | cut -d ' ' -f 1 | rev 5 | -------------------------------------------------------------------------------- /photo_analysis_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Photo Analysis 2 | **Category:** miscellaneous 3 | > You can do it, you just gotta belieeeeeeeeeeeeeeeve! 4 | > 5 | > I used the same wrap as with all my other problems. 6 | > 7 | > https://mega.nz/#!MNNAhaSK!IKDHTx9oXNSa4dsn9DG_rwA08yycqc3yC4iFkQY8lvc 8 | --- 9 | 10 | Pada challenge ini kita diberikan 1 file gambar. Mari kita buka file ini dengan image viewer. 11 | ```bash 12 | eog dank\ trump.jpeg 13 | ``` 14 | 15 | Ketika kita lihat, gambar bagian bawah terlihat rusak dan tidak jelas. Kemungkinan gambar ini telah dilakukan _steganografi_. ([Baca disini](https://id.wikipedia.org/wiki/Steganografi)) 16 | 17 | Selanjutnya kita coba lihat data string yang dapat terlihat di file ini. 18 | ```bash 19 | strings dank\ trump.jpeg 20 | ``` 21 | 22 | Gotcha! Di bagian bawah kita bisa menemukan flag yang kita cari. 23 | 24 | flag : `CTF{OMG_You_Believed}` -------------------------------------------------------------------------------- /photo_analysis_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | strings dank\ trump.jpeg | grep -i ctf 4 | -------------------------------------------------------------------------------- /post_practice_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # POST Practice 2 | **Categori:** web 3 | ``` 4 | These website requires authentication, via POST. However, it seems as if someone has defaced our site. Maybe these is still some way to authenticate? https://ctflearn.com/post.php 5 | ``` 6 | --- 7 | 8 | Clue dari challenge ini sangat jelas, yaitu mengirimkan request dengan motode `POST`. Pertama, kita cari tahu dahulu isi dari alamat url `https://ctflearn.com/post.php` 9 | 10 | Challenge ini dapat diselesaikan dengan `bash script` maupun bahasa pemrograman Python. Namun dalam contoh ini menggunakan `bash script`. 11 | ``` 12 | curl https://ctflearn.com/post.php 13 | ``` 14 | 15 | Dengan mengeksekusi perintah diatas, kita mengirimkan request dengan method `GET` ke alamat `https://ctflearn.com/post.php`. Response dari web menyertakan _credential_ yang dapat kita gunakan untuk menembus web ini. 16 | 17 | Selanjutnya kita mengirim request dengan metode `POST` dengan _credential_ yang sudah kita dapatkan, 18 | ``` 19 | curl https://ctflearn.com/post.php -d username=admin -d password=71urlkufpsdnlkadsf 20 | ``` 21 | * `-d username=admin`: mengirim data username dengan nilai `admin` 22 | * `-d password=71urlkufpsdnlkadsf`: mengirim data password dengan nilai `71urlkufpsdnlkadsf` 23 | 24 | > Dalam bahasa pemrograman PHP sama saja dengan `$_POST['username'] = "admin"`, `$_POSt['password'] = "71urlkufpsdnlkadsf"` 25 | 26 | Setelah perintah dieksekusi maka kita akan mendapatkan flag yang kita cari. 27 | 28 | flag : `flag{p0st_d4t4_4ll_d4y}` -------------------------------------------------------------------------------- /post_practice_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | import requests 3 | 4 | url = "https://ctflearn.com/post.php" 5 | 6 | re = requests.post(url, data={'username': 'admin', 'password': '71urlkufpsdnlkadsf'}) 7 | print(re.text) 8 | -------------------------------------------------------------------------------- /post_practice_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | curl https://ctflearn.com/post.php -d username=admin -d password=71urlkufpsdnlkadsf 4 | -------------------------------------------------------------------------------- /privacy_matters_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Privacy Matters 2 | **Category:** programming 3 | 4 | > The URL that has the flag got corrupted again... here it is: êööòõ¼±±åñæçòçð°ëñ±ðëåîçø´²±è÷îî±øûÛÓüɱ 5 | --- 6 | 7 | Solusi dan langkah penyelesaian challenge ini hampir sama dengan [What's Your Favorite Number of the Alpha](https://github.com/cerc-undip/CTF-Learn-Writeup/tree/update/whats_your_fav_num_alpha_COMPLETE). 8 | 9 | Pada challenge ini kita diberikan kumpulan karakter yang tidak bisa dibaca. Untuk memecahkannya kita perlu mengetahui algoritma _encoding_ yang dipakai untuk membuat karakter "_unreadable_" itu. 10 | 11 | Clue dari soal yang dapat membantu adalah `The URL that has the flag ...`. Ini berarti kumpulan karakter tersebut adalah kumpulan karakter yang membentuk suatu URL 12 | 13 | URL terdiri dari kata `http` atau `https` pada awalnya (Baca [disini](https://en.wikipedia.org/wiki/URL)), sehingga kita bisa mencoba untuk decoding karakter tersebut menggunakan bahasa pemrograman Python. Karena bahasa ini menyediakan konversi dari karakter ASCII ke desimal. 14 | 15 | Kita jalankan interpreter Python versi 3. 16 | ```bash 17 | python3 18 | ``` 19 | 20 | Kita coba konversi 4 karakter awal dari karakter menjadi desimal. 21 | 22 | ```python 23 | >>> ord('ê') 24 | 234 25 | >>> ord('ö') 26 | 246 27 | >>> ord('ö') 28 | 246 29 | >>> ord('ò') 30 | 242 31 | ``` 32 | 33 | Perhatikan ada 2 kali karakter `ö`. Kemungkinan besar membentuk kata `http` ataupun `https`. 34 | 35 | Selanjutnya kita coba konversi karakter `http` menjadi desimal. 36 | ```python 37 | >>> ord('h') 38 | 104 39 | >>> ord('t') 40 | 116 41 | >>> ord('t') 42 | 116 43 | >>> ord('p') 44 | 112 45 | ``` 46 | 47 | Oke, dari sini kita coba cocokkan algoritmanya. 48 | 49 | | Encoded | Desimal(Enc) | Decoded | Desimal(Dec) | 50 | |---------|--------------|---------|--------------| 51 | | ê | 234 | h | 104 | 52 | | ö | 246 | t | 116 | 53 | | ö | 246 | t | 116 | 54 | | ò | 242 | p | 112 | 55 | 56 | Ternyata proses decodingnya adalah adalah dengan mengurangi 130 dari angka desimal dari ASCII. Atau bisa kita modelkan seperti ini: 57 | > decode(kar) = desimal(kar) - 130 58 | 59 | Kita bisa mencoba satu-satu seperti pada contoh sebelumnya. Tetapi agar efisien kita gunakan perulangan pada Python. 60 | ```python 61 | >>> soal = "êööòõ¼±±åñæçòçð°ëñ±ðëåîçø´²±è÷îî±øûÛÓüɱ" 62 | >>> hasil = "" 63 | >>> 64 | >>> for karakter in soal: 65 | ... temp = ord(karakter) - 130 66 | ... hasil += chr(temp) 67 | ... 68 | >>> print(hasil) 69 | ``` 70 | 71 | Setelah di-_decode_ ternyata menghasilkan suatu URL. Kemudian kita langsung saja buka url yang tertera. 72 | ``` 73 | https://codepen.io/niclev20/full/vyYQzG/ 74 | ``` 75 | 76 | Pada website Codepen, kita buka Editor View untuk melihat source code project tersebut. Pada kolom HTML, disitulah flag yang kita cari. Mantap! 77 | 78 | flag : `ABCTF{harder_this_time}` -------------------------------------------------------------------------------- /privacy_matters_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | soal = "êööòõ¼±±åñæçòçð°ëñ±ðëåîçø´²±è÷îî±øûÛÓüɱ" 4 | 5 | hasil = "" 6 | 7 | for karakter in soal: 8 | temp = ord(karakter) - 130 9 | hasil += chr(temp) 10 | 11 | print(hasil) 12 | -------------------------------------------------------------------------------- /pumpkin_carving_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Pumpkin Carving 2 | **Category:** forensic 3 | > Something seems to be wrong with the image that I tried to download for Halloween. Perhaps someone has tampered with it. 4 | > 5 | > https://mega.nz/#!kTpy3JqA!9zID1eTwNRHUCxPXl191uDuKoCj1rcMWt6GtwDx5yG8 6 | > 7 | > Hint: The flag is in flag{flag_value} format. 8 | --- 9 | 10 | Pada challenge ini kita diminta untuk mencari flag yang ada di dalam gambar yang disediakan. 11 | 12 | Silahkan download file tersebut dan buka menggunakan image viewer. 13 | ```bash 14 | eog Pumpkin_.png 15 | ``` 16 | 17 | Ketika dibuka, terjadi error yang mengakibatkan gambar tidak bisa dilihat. Kemungkinan besar file ini telah dilakukan _steganografi_. ([Baca disini](https://id.wikipedia.org/wiki/Steganografi)) 18 | 19 | Selanjutnya kita cek jenis file ini. Karena file ini merupakan `.png` maka kita bisa sekaligus mengecek apakah terdapat _corrupt_. 20 | ```bash 21 | file Pumpkin_.png 22 | pngcheck Pumpkin_.png 23 | ``` 24 | 25 | Dengan perintah `pngcheck` kita tahu bahwa file `Pumpkin_.png` memang corrupt. Selanjutnya kita coba lihat data string yang dapat dibaca dari file ini. 26 | ```bash 27 | strings Pumpkin_.png | more 28 | ``` 29 | 30 | Gotcha! Kita temukan flag-nya di bagian atas! Good job! 31 | 32 | flag : `flag{happy_halloween!}` -------------------------------------------------------------------------------- /pumpkin_carving_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | strings Pumpkin_.png | grep -i flag 4 | -------------------------------------------------------------------------------- /qr_code_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # QR Code 2 | **Category:** miscellaneous 3 | 4 | > Do you remember something known as QR Code? Simple. Here for you : 5 | > https://mega.nz/#!Ej4n3RSI!8mbiqg3kosk93qJCP-DBxIilHH2rf7iIVY-kpwyrx-0 6 | --- 7 | 8 | ![QR Code CTFLearn v1](./qrcode.39907201.png "QR Code") 9 | 10 | Untuk menyelesaikan challenge QR Code ini kita perlu membaca pesan yang tersimpan di dalamnya. Kita bisa gunakan [QR Scanner online](https://webqr.com/index.html). 11 | 12 | Kita mulai dengan scan QR Code dan simpan hasilnya kedalam file hasil_scan.txt 13 | ```bash 14 | echo c3ludCB2ZiA6IGEwX29icWxfczBldHJnX2RlX3BicXI= > hasil_scan.txt 15 | ``` 16 | 17 | Bila diperhatikan pesan ini adalah bentuk dari **Base64 Encoding** ([Baca disini](https://en.wikipedia.org/wiki/Base64)) karena terdapat simbol "sama dengan" (`=`) di akhir. Maka kita perlu melakukan _decoding_ terhadap pesan ini. 18 | ```bash 19 | cat hasil_scan.txt | base64 -d 20 | ``` 21 | 22 | > synt vf : a0\_obql\_s0etrg\_de\_pbqr 23 | 24 | Setelah di-_decode_ kita mendapat pesan yang sulit dibaca, namun pesan ini sebenarnya mengandung. Bisa dilihat dari karakteristik pesan tersebut bisa jadi merupakan _ciphertext_ dari enkripsi **ROT13** ([Baca disini](http://datagenetics.com/blog/july42015/index.html)). 25 | 26 | Mari kita coba dekripsi _ciphertext_ ini dengan ROT13. 27 | 28 | ```bash 29 | cat hasil_scan.txt | base64 -d | tr 'A-Za-z' 'N-ZA-Mn-za-m' 30 | ``` 31 | * `tr`: _translate_ karakter sesuai dengan bentuk yang kita inginkan. Baca keterangan _command_ ini dengan `man tr`. 32 | * `A-Za-z`: bentuk pertama (`ABC...XYZabc....xyz`) 33 | * `N-ZA-Mn-za-m`: di-_translate_ menjadi bentuk kedua (`NOP...XYZABC...KLMnop...xyzabc...klm`) 34 | 35 | ![ROT13 Encryption](http://datagenetics.com/blog/july42015/big.png "sumber: datagenetics.com") 36 | 37 | flag : `n0_body_f0rget_qr_code` -------------------------------------------------------------------------------- /qr_code_COMPLETE/hasil_scan.txt: -------------------------------------------------------------------------------- 1 | c3ludCB2ZiA6IGEwX29icWxfczBldHJnX2RlX3BicXI= 2 | -------------------------------------------------------------------------------- /qr_code_COMPLETE/qrcode.39907201.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cerc-undip/CTF-Learn-Writeup/137b6bcd6fcdaf1bf4771575cb52b76ea91a19f9/qr_code_COMPLETE/qrcode.39907201.png -------------------------------------------------------------------------------- /qr_code_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Ada 3 langkah 4 | # 1. Scan dan lihat isi QR 5 | # 2. Decode dengan Base64 6 | # 3. Decode dengan ROT13 7 | 8 | hasil_scan="c3ludCB2ZiA6IGEwX29icWxfczBldHJnX2RlX3BicXI=" 9 | 10 | echo $hasil_scan | base64 -d | tr 'A-Za-z' 'N-ZA-Mn-za-m' 11 | -------------------------------------------------------------------------------- /qr_code_v2_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # QR Code v2 2 | **Category:** miscellaneous 3 | > How well are you in the ways of the QR Code? 4 | > https://mega.nz/#!JItR3aqI!QKGxexShAPt-HUU_2DAdJKUljXc69sx1fXuaGUeoKaY 5 | --- 6 | 7 | ![QR Code Challenge V2](./qr_code.jpg "QR Code V2") 8 | 9 | Penyelesaian challenge kali ini hampir sama dengan penyelesaian challenge [QR Code v1](https://github.com/cerc-undip/CTF-Learn-Writeup/tree/master/qr_code_COMPLETE) 10 | 11 | Untuk menyelesaikan challenge ini kita perlu membaca pesan yang tersimpan di dalamnya. Kita bisa gunakan [QR Scanner Online](https://webqr.com/index.html). 12 | 13 | Setelah upload kode QR-nya kita jadi tahu bahwa kode QR tersebut mengandung url. Langsung saja buka url tersebut dan download file didalamnya. 14 | > https://mega.nz/#!9NFhUbwQ!vtrLVum8z-ZXzur33RrGJ4uivMJhA9_5TW2ulHucXoU 15 | 16 | Buka file yang baru saja didownload, disitulah flag-nya tersimpan. Mantap! 17 | 18 | flag : `CTF{2_QR_4_U}` -------------------------------------------------------------------------------- /qr_code_v2_COMPLETE/hasil_scan: -------------------------------------------------------------------------------- 1 | https://mega.nz/#!9NFhUbwQ!vtrLVum8z-ZXzur33RrGJ4uivMJhA9_5TW2ulHucXoU 2 | -------------------------------------------------------------------------------- /qr_code_v2_COMPLETE/qr_code.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cerc-undip/CTF-Learn-Writeup/137b6bcd6fcdaf1bf4771575cb52b76ea91a19f9/qr_code_v2_COMPLETE/qr_code.jpg -------------------------------------------------------------------------------- /reversal_of_fortune_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Reversal of Fortune 2 | **Category:** miscellaneous 3 | ``` 4 | Our team of agents have been tracking a hacker that sends cryptic messages to other hackers about what he's doing. We intercepted the below message he sent recently, can you figure out what it says? He mentions his hacker name in it, that's the code you need. .nac uoy fi tIe$reveRpilF eldnah ym gnisu em egassem ,avaj yllacificeps ,gnidoc emos htiw pleh deen I ,deifitnedi tegrat txeN 5 | ``` 6 | --- 7 | 8 | Di challenge ini kita diminta untuk memasukkan nama hacker yang terdapat di dalam pesan yang di "Enkripsi". 9 | 10 | Pada kalimat terakhir terdapat pesan yang cukup aneh, jika diperhatikan setiap kata adalah kata yang dibalik posisinya. Untuk menyelesaikan soal ini bisa menggunakan bahasa pemrograman Python dengan teknik substring. [Baca disini](https://www.dotnetperls.com/substring-python) 11 | 12 | ```python 13 | soal = ".nac uoy fi tIe$reveRpilF eldnah ym gnisu em egassem ,avaj yllacificeps ,gnidoc emos htiw pleh deen I ,deifitnedi tegrat txeN" 14 | hasil = soal[::-1] 15 | print(hasil) 16 | ``` 17 | 18 | Pada bagian akhir kalimat terdapat nama hacker yang kita cari, dan itu adalah flag yang kita cari. 19 | 20 | flag : `FlipRever$eIt` 21 | -------------------------------------------------------------------------------- /reversal_of_fortune_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | soal = ".nac uoy fi tIe$reveRpilF eldnah ym gnisu em egassem ,avaj yllacificeps ,gnidoc emos htiw pleh deen I ,deifitnedi tegrat txeN" 4 | hasil = soal[::-1] 5 | print(hasil) 6 | -------------------------------------------------------------------------------- /reverse_polarity_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Reverse Polarity 2 | **Category:** cryptography 3 | 4 | > I got a new hard drive just to hold my flag, but I'm afraid that it rotted. What do I do? 5 | 6 | > The only thing I could get off of it was this: 7 | > 01000011010101000100011001111011010000100110100101110100010111110100011001101100011010010111000001110000011010010110111001111101 8 | --- 9 | 10 | Pada challenge ini kita hanya diminta untuk mengkonversi bentuk biner kedalam bentuk teks. 11 | 12 | Untuk menyelesaikan challenge ini kita bisa menggunakan bahasa pemrograman Python atau jika ingin cepat maka bisa gunakan [Binary to Text translator online](https://www.rapidtables.com/convert/number/binary-to-ascii.html). 13 | 14 | ```bash 15 | touch script.py 16 | chmod +x script.py 17 | ``` 18 | 19 | Kemudian buka file `script.py` dengan text editor. 20 | ```python 21 | #!/usr/bin/python3 22 | 23 | baca = "01000011010101000100011001111011010000100110100101110100010111110100011001101100011010010111000001110000011010010110111001111101" 24 | temp = [] 25 | 26 | for i in range(16): 27 | temp.append(baca[:8]) 28 | baca = baca[8:] 29 | 30 | for i in temp: 31 | print(chr(int(i, 2)), end="") 32 | ``` 33 | 34 | * Kita memecah setiap 8 karakter bit kedalam list/array temp 35 | * Sisa dari 8 karakter itu disimpan kedalam variabel `baca` agar bisa dipecah kembali 36 | * Setiap nilai di `temp` diubah dari bentuk biner menjadi karakter (`chr()`) 37 | 38 | flag : `CTF{Bit_Flippin}` 39 | -------------------------------------------------------------------------------- /reverse_polarity_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | baca = "01000011010101000100011001111011010000100110100101110100010111110100011001101100011010010111000001110000011010010110111001111101" 4 | temp = [] 5 | 6 | 7 | for i in range(16): 8 | temp.append(baca[:8]) 9 | baca = baca[8:] 10 | 11 | for i in temp: 12 | print(chr(int(i, 2)), end="") 13 | -------------------------------------------------------------------------------- /simple_image_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Simple Image 2 | **Category:** forensic 3 | > Hi, i like this website, ctflearn.com so i decided to share my happiness to you all guys. please, can i smile for you all guys? 4 | > 5 | > https://drive.google.com/open?id=17NUxdVfobLpFfJpbXf0EZ6WLkjsbGPSa 6 | --- 7 | 8 | Ketika kita buka gambar yang didownload disana tidak ada informasi apa-apa yang dapat membantu. 9 | 10 | Kita juga tidak menemukan informasi dengan perintah `strings`, `file`, `pngcheck`, `binwalk`, `foremost`. Hmm sungguh "**tersembunyi**". 11 | 12 | Untuk menyelesaikan challenge ini kita perlu **Image Editor** untuk bisa mengedit saturasi dan komposisi warna yang ada pada gambar. Karena mungkin gambar ini sudah dilakukan _steganografi_. 13 | 14 | Tools yang dipakai bisa bermacam-macam, seperti Photoshop, GIMP, dll yang memiliki fitur filter dan komposisi warna. Namun yang akan kita gunakan adalah aplikasi khusus _steganografi_, sehingga kita hanya memilih komposisi yang kita inginkan. 15 | 16 | Download dan instal aplikasi yang diperlukan, yaitu Stegsolve. 17 | ```bash 18 | wget http://www.caesum.com/handbook/Stegsolve.jar -O stegsolve.jar 19 | chmod +x stegsolve.jar 20 | ``` 21 | * Baris pertama kita download dari situsnya dan simpan di file `stegsolve.jar` 22 | * Baris kedua kita membuat file `stegsolve.jar` menjadi _executable_ 23 | 24 | Selanjutnya kita buka aplikasi ini. Karena aplikasi ini berekstensi `.jar` maka ita perlu membukanya menggunakan **Java Runtime**. 25 | ```bash 26 | java -jar ./stegsolve.jar 27 | ``` 28 | 29 | ![Stegsolve](./filtered.bmp "Filter Red Plane 1") 30 | 31 | Selanjutnya buka gambar yang akan kita teliti. Dan terakhir hanya pilih filter komposisi warna dengan klik tanda panah sampai akhirnya kalian menemukan flag-nya. 32 | 33 | > Flag terlihat jelas di filter: **Red plane 0**, **Green plane 0**, dan **Blue plane 0** 34 | 35 | flag : `flag{smile_for_you}` 36 | 37 | -------------------------------------------------------------------------------- /simple_image_COMPLETE/filtered.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cerc-undip/CTF-Learn-Writeup/137b6bcd6fcdaf1bf4771575cb52b76ea91a19f9/simple_image_COMPLETE/filtered.bmp -------------------------------------------------------------------------------- /so_many_64_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # So Many 64s 2 | **Category:** cryptography 3 | 4 | > Help! My friend stole my flashdrive that had the flag on it. When he gave it back the flag was changed! Can you help me decrypt it? https://mega.nz/#!UcYQEArA!H9WxSdG1O7eVcCm0dffggNB0-dBemSpBAXiZ0OXJnLk 5 | --- 6 | 7 | Pada challenge ini sudah diberikan clue pada judul, yaitu **64** yang menandakan bahwa kita perlu menggunakan bentuk encoding dari **Base64** (Baca [disini](https://en.wikipedia.org/wiki/Base64)). 8 | 9 | > Pengunaan Base64 sangat sering di challenge CTF. Maka dari itu diperlukan pemahaman dasar tentang bentuk encoding ini. 10 | 11 | Setelah selesai mendownload mari kita buka file tersebut. Karena ekstensi file ini `.txt` maka kita bisa langsung membacanya. 12 | ``` 13 | cat flag.txt 14 | ``` 15 | 16 | Ketika dibaca, file ini terdiri dari banyak sekali karakter. Sekumpulan karakter ini adalah hasil dari encoding **Base64**. Bisa dengan mudah ditebak dari simbol "sama dengan" (=) di akhir. 17 | ``` 18 | ...ZIZEZaU2JGcFdWRlZTY2xCUlBUMD0= 19 | ``` 20 | 21 | Saat dihitung, file ini memiliki 288956 karakter 22 | ``` 23 | cat flag.txt | wc -c 24 | ``` 25 | 26 | Untuk menyelesaikan ini kita bisa menggunakan bash script ataupun dengan bahasa pemrograman Python. Tetapi sebelum itu mari kita telaah lagi file `flag.txt` ini dengan men-`decode` karakternya dengan **Base64 decoding**. 27 | ``` 28 | cat flag.txt | base64 -d 29 | ``` 30 | 31 | Setelah di-_decode_ ternyata hasilnya adalah dalam bentuk Base64 juga. Tetapi jika diperhatikan, hasil decode ini berbeda dengan file decode aslinya. Mari kita coba decode sekali lagi. 32 | ``` 33 | cat flag.txt | base64 -d | base64 -d 34 | ``` 35 | 36 | Dan memang benar, ketika di-_decode_ kedua kalinya ternyata menghasilkan bentuk Base64 yang berbeda. Bisa dipastikan ini adalah bentuk rekursif Base64 (berulang-ulang). 37 | 38 | Jika kita menulis perintah secara manual maka akan memakan waktu sangat banyak, karena kita tidak tahu berapa kali pesan ini di-_encoding_. Maka dari itu dalam writeup ini kita akan menggunakan bahasa pemrograman Python, namun saya sertakan juga penyelesaian dalam bentuk _bash script_. 39 | 40 | Langsung saja kita buat file python dan ubah aksesnya menjadi _executable_. Kemudian buka file-nya. 41 | ``` 42 | touch script.py 43 | chmod +x script.py 44 | ``` 45 | 46 | Untuk bisa men-_decode_ base64 kita perlu menambahkan library base64. Jika belum terinstal maka gunakan perintah `sudo pip install base64`. Karena kita sudah punya file pesan encoding-nya, maka kita akan membaca dari file-nya saja. 47 | 48 | ```python 49 | #!/usr/bin/python3 50 | import base64 51 | 52 | f = open('flag.txt', 'r') 53 | hasil = f.read() 54 | 55 | print(hasil) 56 | ``` 57 | 58 | Simpan kemudian jalankan dengan `./script.py`. Dalam program ini kita baru membaca file asli dari pesan yang di-_encoding_. Ketika pesannya muncul sesuai dengan file aslinya, maka bisa kita lanjutkan. 59 | 60 | Untuk men-_decode_ pesan kita gunakan _method_ dari library `base64` yaitu `b64decode()`. 61 | 62 | ```python 63 | #!/usr/bin/python3 64 | import base64 65 | 66 | f = open('flag.txt', 'r') 67 | hasil = f.read() 68 | hasil = base64.b64decode(hasil) 69 | 70 | print(hasil) 71 | ``` 72 | 73 | Kode diatas baru men-_decode_ satu kali, maka dari itu kita buat perulangan agar program bekerja otomatis. Ketika hasil decoding-nya memiliki karakter `{` (_karakter yang ada di dalam flag biasanya terdiri dari kurung kurawal_) maka kita akan menghentikan program dan menampilkan hasilnya. 74 | ```python 75 | #!/usr/bin/python3 76 | import base64 77 | 78 | f = open('flag.txt', 'r') 79 | hasil = f.read() 80 | 81 | while True: 82 | hasil = base64.b64decode(hasil).decode('utf-8') 83 | 84 | if '{' in hasil: 85 | print(hasil) 86 | break 87 | ``` 88 | * `.decode('utf-8')`: mengkonversi dari bentuk bytes (hasil decoding) menjadi string. 89 | 90 | Setelah program dijalankan maka, Gotcha! Kita menemukan flag-nya! 91 | 92 | 93 | 94 | flag : `ABCTF{pr3tty_b4s1c_r1ght?}` -------------------------------------------------------------------------------- /so_many_64_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | import base64 3 | 4 | f = open('flag.txt', 'r') 5 | hasil = f.read() 6 | 7 | while True: 8 | hasil = base64.b64decode(hasil).decode('utf-8') 9 | 10 | if '{' in hasil: 11 | print(hasil) 12 | break 13 | -------------------------------------------------------------------------------- /so_many_64_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | soal=$(cat flag.txt) 4 | 5 | while true 6 | do 7 | soal=$(echo $soal | base64 -d) 8 | if [[ $soal == *{* ]] 9 | then 10 | echo $soal 11 | break 12 | fi 13 | done 14 | -------------------------------------------------------------------------------- /solve_this_111_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Solve this 111 2 | **Category:** miscellaneous 3 | > 01001001001000000110110001101111 01110110011001010010000001100011 01101000011010010110001101101011 01100101011011100010000001100001 01101110011001000010000001101100 01100101011011010110111101101110 4 | > Solve this 5 | --- 6 | 7 | Pada challenge ini kita hanya diminta untuk mengkonversi dari bentuk biner kedalam bentuk karakter/string. 8 | 9 | Untuk menyelesaikan ini kita bisa menggunakan bahasa pemrograman Python atau jika ingin cepat bisa gunakan [Binary to Text Online](https://www.rapidtables.com/convert/number/binary-to-ascii.html). 10 | 11 | Penjelasan kode sama dan sudah dijelaskan pada writeup sebelumnya yaitu [Double Encryption](https://github.com/cerc-undip/CTF-Learn-Writeup/tree/update/double_encryption_COMPLETE). 12 | 13 | Buat file `script.py` dan ubah aksesnya menjadi _executable_. 14 | ```bash 15 | touch script.py 16 | chmod +x script.py 17 | ``` 18 | 19 | Buka dan simpan kode ini di `script.py` kemudian jalankan menggunakan `./script.py`. 20 | ```python 21 | #!/usr/bin/python3 22 | 23 | soal = "01001001001000000110110001101111 01110110011001010010000001100011 01101000011010010110001101101011 01100101011011100010000001100001 01101110011001000010000001101100 01100101011011010110111101101110" 24 | soal = "".join(soal.split(" ")) 25 | hasil_temp = [] 26 | 27 | for i in range(len(soal) // 8): 28 | hasil_temp.append(soal[:8]) 29 | soal = soal[8:] 30 | 31 | hasil = "" 32 | 33 | for j in hasil_temp: 34 | temp = int(j, 2) 35 | hasil += chr(temp) 36 | 37 | print(hasil) 38 | ``` 39 | 40 | flag : `I love chicken and lemon` -------------------------------------------------------------------------------- /solve_this_111_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | soal = "01001001001000000110110001101111 01110110011001010010000001100011 01101000011010010110001101101011 01100101011011100010000001100001 01101110011001000010000001101100 01100101011011010110111101101110" 4 | soal = "".join(soal.split(" ")) 5 | hasil_temp = [] 6 | 7 | for i in range(len(soal) // 8): 8 | hasil_temp.append(soal[:8]) 9 | soal = soal[8:] 10 | 11 | hasil = "" 12 | 13 | for j in hasil_temp: 14 | temp = int(j, 2) 15 | hasil += chr(temp) 16 | 17 | print(hasil) 18 | -------------------------------------------------------------------------------- /taking_ls_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Taking LS 2 | **Category:** forensic 3 | 4 | ``` 5 | Just take the Ls 6 | https://mega.nz/#!9Mk00LxR!_FtmAm8s_mpsHr7KWv8GYUzhbThNn0I8cHMBi4fJQp8 7 | NOTE: Problem is really only for mac users - sorry in advance - free points if you have a different operating system though :) 8 | ``` 9 | 10 | Extract file download menggunakan terminal 11 | ``` 12 | unzip The\ Flag.zip 13 | ls -l 14 | ``` 15 | 16 | Setelah di-ekstrak, akan ada folder baru bernama `The Flag`. Masuk ke folder `The Flag` 17 | ``` 18 | cd The\ Flag 19 | ``` 20 | 21 | Setelah itu, list semua file yang ada di dalam folder `The Flag` 22 | ``` 23 | ls -l 24 | ``` 25 | 26 | Disini hanya terdapat file `The Flag.pdf`. Kita coba buka file tersebut, bisa menggunakan **gnome** maupun buka melalui **nautilus** 27 | ``` 28 | gnome-open The\ Flag.pdf 29 | ``` 30 | atau 31 | ``` 32 | nautilus ./ 33 | ``` 34 | 35 | Ketika kita coba buka ternyata file tersebut di-password. Langkah selanjutnya adalah kita mencari password-nya. 36 | Kali ini kita coba list semua file di dalam folder `The Flag` agar kita bisa melihat file yang tersembunyi. 37 | ``` 38 | ls -la 39 | ``` 40 | * `l`: menampilkan dalam bentuk list lengkap 41 | * `a`: menampilkan semua file, termasuk file tersembunyi 42 | 43 | Setelah mencoba perintah diatas ternyata ada 2 file dan folder baru yang tersembunyi (_tanda `.` di awal_), yaitu `.DS_Store` dan `.ThePassword`. 44 | File `.DS_Store` bukan merupakan file yang kita cari. Kita masuk ke folder `.ThePassword`. Di dalam folder ini terdapat 1 file berekstensi `.txt` maka bisa langsung kita lihat isinya. 45 | ``` 46 | cd .ThePassword 47 | ls -la 48 | cat ThePassword.txt 49 | ``` 50 | 51 | Setelah melihat isi file, kita mendapatkan password yang kita inginkan. Kemudian kembali lagi ke folder sebelumnya dan kita buka lagi file pdf dengan memasukkan password yang sudah kita dapat. 52 | ``` 53 | cd .. 54 | gnome-open The\ Flag.pdf 55 | ``` 56 | 57 | flag `ABCTF{T3Rm1n4l_is_C00l}` -------------------------------------------------------------------------------- /up_for_a_little_challenge_COMPLETE/Begin Hack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cerc-undip/CTF-Learn-Writeup/137b6bcd6fcdaf1bf4771575cb52b76ea91a19f9/up_for_a_little_challenge_COMPLETE/Begin Hack.jpg -------------------------------------------------------------------------------- /up_for_a_little_challenge_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Up For A Little Challenge? 2 | **Category:** forensic 3 | 4 | > https://mega.nz/#!LoABFK5K!0sEKbsU3sBUG8zWxpBfD1bQx_JY_MuYEWQvLrFIqWZ0 You Know What To Do ... 5 | --- 6 | 7 | Challenge ini tidak memberikan clue apapun dan beranggapan bahwa kita tahu apa yang kita lakukan. Oke mari kita buka file `Begin Hack.jpg` yang baru didownload 8 | ```bash 9 | eog Begin\ Hack.jpg 10 | ``` 11 | 12 | ![Begin Hack](https://raw.githubusercontent.com/cerc-undip/CTF-Learn-Writeup/update/up_for_a_little_challenge_COMPLETE/Begin%20Hack.jpg) 13 | 14 | Setelah dibuka dengan _image viewer_ tidak ada keterangan yang berarti dan hanya gambar biasa. 15 | 16 | Selalu perhatikan untuk file yang bertipe gambar pasti sudah dilakukan Steganografi, yaitu pesan disembunyikan di dalam gambar ([Baca disini](https://id.wikipedia.org/wiki/Steganografi)). Untuk itu kita perlu mengecek informasi apa saja yang ada di dalam gambar ini dalam bentuk _string_ (karakter yang bisa dibaca oleh manusia). 17 | ```bash 18 | strings Begin\ Hack.jpg | more 19 | ``` 20 | 21 | Perhatikan beberapa kata yang bisa dibaca ketika kita _scroll_. Disitu terdapat satu URL, buka URL itu dan download file yang ada. 22 | 23 | > https://mega.nz/#!z8hACJbb!vQB569ptyQjNEoxIwHrUhwWu5WCj1JWmU-OFjf90Prg 24 | 25 | Extract file tersebut 26 | ```bash 27 | unzip Up\ For\ A\ Little\ Challenge.zip 28 | ``` 29 | 30 | Setelah di-_extract_ kita mendapat ada 2 folder yaitu `Did I Forget Again?` dan `__MACOSX`. Folder yang akan kita jelajah adalah `Did I Forget Again?`, sedangkan folder `__MACOSX` adalah folder yang otomatis dibuat ketika membuat arsip menggunakan komputer Mac. ([Baca disini](https://gotoes.org/sales/Zip_Mac_Files_For_PC/What_Is__MACOSX.php)) 31 | ``` 32 | cd Did\ I\ Forget\ Again\? 33 | ls -la 34 | ``` 35 | 36 | Disini ada 1 file gambar dan 1 file tersembunyi dengan ekstensi `cerb4`. Jika kita buka file `Loo Nothing Becomes Useless ack.jpg` tidak akan ada informasi yang disediakan, begitu juga ketika kita melihat string dari gambar ini. 37 | ```bashi 38 | eog Loo\ Nothing\ Becomes\ Useless\ ack.jpg 39 | strings eog Loo\ Nothing\ Becomes\ Useless\ ack.jpg 40 | ``` 41 | 42 | Kali ini kita coba telaah apa itu file .Processing.cerb4 43 | ``` 44 | file .Processing.cerb4 45 | ``` 46 | 47 | Setelah dilihat, ternyata jenis file ini adalah **Zip**. maka dari itu kita perlu mengubah/menambah ekstensi `.zip` di belakang nama file. Kemudian lakukan _extracting_. 48 | ```bash 49 | mv .Processing.cerb4 .Processing.cerb4.zip 50 | unzip .Processing.cerb4.zip 51 | ``` 52 | 53 | Saat mencoba meng-_extract_ file ini, kita diminta untuk memasukkan password. Lalu dimana kita bisa mendapat password-nya? 54 | 55 | Oke, sekarang kita kembali lagi ke file yang pertama dan lihat lagi bahwa disitu terdapat password yang dapat digunakan untuk meng-_extract_ file tadi. 56 | ``` 57 | cd .. 58 | strings Begin\ Hack.jpg | more 59 | ``` 60 | 61 | > Nothing Is As It Seems 62 | 63 | Kemudian kita extract file `.Processing.cerb4.zip` dengan password yang telah kita dapat. Terakhir, kita buka file yang telah di-_extract_. 64 | ``` 65 | cd Did\ I\ Forget\ Again\? 66 | unzip .Processing.cerb4.zip 67 | eog skycoder.jpg 68 | ``` 69 | 70 | Gotcha! Kita dapat flag-nya! Ada di pojok kanan bawah. 71 | 72 | flag : `flag{hack_complete}` 73 | -------------------------------------------------------------------------------- /whats_your_fav_num_alpha_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # What's Your Favorite Number of the Alpha 2 | **Category:** programming 3 | 4 | > The flag accidentally got changed into something else. Here is the flag: ¥¦§¸ªßØÌÉÃÊÐÅËá If it helps, I think the first letter was an A (capitalized)... Title is supposed to be "What's Your Favorite Number of the Alphabet, got cut off :( 5 | --- 6 | 7 | Pada challenge ini kita langsung diberikan flag-nya, hanya saja dalam bentuk yang tidak bisa dibaca. Kita diharuskan untuk mengubah bentuk itu menjadi bentuk yang bisa dibaca. 8 | 9 | Di soal juga diberikan clue bahwa huruf pertama adalah huruf `A` kapital. 10 | 11 | | Dari | Menjadi | 12 | |------|---------| 13 | | ¥ | A | 14 | 15 | Kita akan coba menyelesaikan challenge ini menggunakan bahawa pemrograman Python karena bahasa ini menyediak konversi dari karakter ASCII menjadi desimal (_ASCII to Decimal_) sehingga kita bisa melihat algoritma yang dipakai untuk membuat rangkaian hurufnya. 16 | 17 | Langsung saja jalankan Python3 interpreter 18 | ``` 19 | python3 20 | ``` 21 | 22 | Kita coba ubah karakter pertama soal menjadi desimal 23 | ```python 24 | >>> ord('¥') 25 | 165 26 | ``` 27 | Ternyata didapat bahwa karakter `¥` memiliki angka desimal 165. Kemudian kita coba dengan karakter A. 28 | ```python 29 | >>> # karakter -> desimal 30 | >>> ord('A') 31 | 65 32 | >>> # sebaliknya (desimal -> karakter) 33 | >>> chr(65) 34 | 'A' 35 | ``` 36 | 37 | Nah, dari sini kita tahu bahwa algoritma yang dipakai untuk _decoding_ adalah dengan mengurangi 100 dari angka desimal dari ASCII. Atau bisa kita modelkan seperti ini: 38 | > decode(kar) = desimal(kar) - 100 39 | 40 | Kita bisa mencoba satu-satu seperti pada contoh sebelumnya. Tetapi agar efisien kita gunakan perulangan pada Python. 41 | ```python 42 | >>> soal = "¥¦§¸ªßØÌÉÃÊÐÅËá" 43 | >>> hasil = "" 44 | >>> for karakter in soal: 45 | ... temp = ord(karakter) - 100 46 | ... hasil += chr(temp) 47 | ... 48 | >>> print(hasil) 49 | ``` 50 | 51 | Gotcha! Kita dapat flag-nya! 52 | 53 | flag : `ABCTF{the flag}` -------------------------------------------------------------------------------- /whats_your_fav_num_alpha_COMPLETE/script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | soal = "¥¦§¸ªßØÌÉÃÊÐÅËá" 4 | hasil = "" 5 | 6 | for karakter in soal: 7 | temp = ord(karakter) - 100 8 | hasil += chr(temp) 9 | 10 | print(hasil) 11 | -------------------------------------------------------------------------------- /where_can_my_robot_go_COMPLETE/README.md: -------------------------------------------------------------------------------- 1 | # Where Can My Robot Go? 2 | **Category:** miscellaneous 3 | ``` 4 | Hint: Where do robots find what pages are on a website? 5 | Hint 2: What does disallow tell a robot? Hint 3: The flag is not 70r3hnanldfspufdsoifnlds 6 | ``` 7 | --- 8 | 9 | Di challenge ini diberikan clue yang cukup membantu untuk menyelesaikan. Robot yang dimaksud disini adalah file `robots.txt` yang ada di setiap halaman web. 10 | 11 | File `robots.txt` dipasang di web untuk menentukan folder mana saja yang diizinkan atau tidak diizinkan untuk di-index oleh mesin pencari. 12 | 13 | Kita coba akses file `robots.txt` website CTFLearn melalui browser 14 | ``` 15 | https://ctflearn.com/robots.txt 16 | ``` 17 | 18 | Di dalam file ini, _developer_ tidak memperbolehkan _search engine_ untuk mengakses file `/70r3hnanldfspufdsoifnlds.html`. Tapi, kita akses file ini dengan harapan bisa mendapatkan flag yang kita cari. 19 | ``` 20 | https://ctflearn.com/70r3hnanldfspufdsoifnlds.html 21 | ``` 22 | 23 | Ternyata kita menemukan flag di dalamnya. 24 | 25 | > Untuk mempersingkat kita bisa menggunakan cURL untuk mendapatkan halaman yang kita akses 26 | > cURL sangat berguna ketika menyelesaikan challenge dengan kategori **web** 27 | 28 | ``` 29 | curl https://ctflearn.com/70r3hnanldfspufdsoifnlds.html 30 | ``` 31 | 32 | flag : `abctf{r0b0ts_4r3_th3_futur3}` -------------------------------------------------------------------------------- /where_can_my_robot_go_COMPLETE/script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | curl https://ctflearn.com/70r3hnanldfspufdsoifnlds.html 4 | --------------------------------------------------------------------------------