├── .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 | 
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 | 
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 |
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!
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!
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!
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
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!
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 | 
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 | 
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 | 
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 | 
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 | 
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 | 
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 | 
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 | 
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 |
--------------------------------------------------------------------------------