Writeup CCUG Hackfest 0x02 (Website Hacking)

Website Hacking

InspectMe!

Diberikan website dengan link http://fallcrescent.ccug.gunadarma.ac.id/hackfest/inspect/
setelah dibuka maka akan menampilkan
lalu cek pada bagian tentang
dari sini dudah di dapatkan clue untuk melihat pada HTML, CSS dan Javascript(JS) yang dari judul challenge ini sudah jelas harus di inspect, maka untuk menyrlrsaikanya penulis menggunakan fitur inspect element pada browser atau tekan ctrl + shift + c pada chrome untuk inspect element



pada HTML di dapat bagian 1 dari 3 flag ( HackFest{ur_4_real_1nspe.
dan jika dibuka pada bagian CSS

Terdapat sisa dari flag nya ( ct0r_g4dget} )
Flag : HackFest{ur_4_real_1nspect0r_g4dget}

Bad Request 400

Diberikan website dengan alamat http://ccug.gunadarma.ac.id:6007 dan ketika dibuka maka akan menampilkan pesan error
dan diberi juga source code untuk websitenya, pada bagian settings.py terdapat

ALLOWED_HOSTS = ['google.com','youtube.com','google.co.id','gmail.com']

yang berarti yang diperbolehkan untuk mengakses website tersebut hanya salah satu dari ke 4 host tersebut, untuk menyelesaikan challenge ini penulis menggunakan burpsuite untuk tamper data sebelum membuka link http://ccug.gunadarma.ac.id:6007 dan mengubah host menjadi google.com

maka akan terbuka

lalu penulis membuka source code website dengan menggunakan ctrl + u pada browser dan menemukan sesuatu pada urls.py

urlpatterns = [
   path('716a165aa758863193399a3d65dfacd05e8d8a30', FlagView.as_view(),name='flag'),
   path('', HomeView.as_view(),name='home'),
]

Berarti flag nya berada di path 716a165aa758863193399a3d65dfacd05e8d8a30. lalu masukkan path tadi ke url dan di dapatkan flag
Flag : HackFest{HTTP_HOST_itu_gampang_banget_untuk_dimanipulasi}

WebFlag Checker

diberikan website dengan alamat http://104.250.105.158:8002/index ketika di buka maka akan menampilkan :
dan diberikan script python :


from flask import Flask, render_template_string,request, session, render_template
import hashlib
import os
app = Flask(__name__)
app.config['FLAG'] = open("flag.txt","rb").read()

@app.route("/",methods=["GET","POST"])
@app.route("/index",methods=["GET","POST"])
def check_flag():
if request.method == "GET":
    session['token'] = hashlib.md5(os.urandom(32)).hexdigest()
    return render_template("index.html",token=session['token'])

if request.method == "POST":
    check_token = request.form['token']
    if check_token == session['token']:
        template = open("templates/index.html","rb").read()
        check_flag = request.form['check_flag']
        if check_flag != "":
            if check_flag == app.config['FLAG']:
                res = """
                <br>
                <div class='alert alert-success' role='alert'>
                <strong>{0}</strong> is the correct flag.
                </div>
                """.format(check_flag)
            else:
                res = """
                <br>
                <div class='alert alert-danger' role='alert'>
                <strong>{0}</strong> is not the correct flag.
                </div>
                """.format(check_flag)
            template = template.replace("<!--result-->",res)
            session['token'] = hashlib.md5(os.urandom(32)).hexdigest()
        return render_template_string(template,token=session['token'])
    else:
        session['token'] = hashlib.md5(os.urandom(32)).hexdigest()
        return render_template("index.html",token=session['token'])


if __name__ == "__main__":
app.secret_key = os.urandom(16)
app.run(port=8002)

dengan hint yang diberikan, pada link tersebut terdapat payload yang dapat digunakan untuk website yang menggunakan flask dengan mengisi kolom flag dengan {{7*7}}
berarti pada kolom flag dapat dijalankan perintah python, dan ternyata lag terdapat di config['FLAG'] maka saat dimasukkan



Flag : HackFest{th15_15_fl4g_f000r_y00u_SSTI_n1nj4}

Baby Codeigniter

diberikan website dengan link https://target.ccug.gunadarma.ac.id/386f44/index.php dan saat di buka
dan login menggunakan data yang sudah kita register sebelumnya
yang berarti flag akan muncul pada bagian message, dan duberikan source code webnya yang menggunakan framework codeigniter setelah ditelusuri pada bagian controller terdapat code :

if($res[0]['is_admin'] == 1) {
  //echo 'uuuu';
  $flag = 'The first flag is HackFest{[CENSORED]}. The second flag is secret user\'s password';

dengan ini bisa di simpulkan bahwa parameter is_admin dapat digunakan untuk melakukan exploit, penulis menggunakan hackbar untuk merubah post data saat register
setelah berhasil login dengan username dan password yang telah di daftarkan tadi dan didapatkan flag
Flag :  HackFest{3776aeb22c9453304430525b92c2cea1}.

Categories: ,

Writeup CCUG Hackfest 0x02 (Reverse Engineering)

Reverse Engineering

Ular Terbungkus

Diberikan file dengan ekstensi file python yang sudah di compile (.pyc) dan ketika di run maka akan menampilkan :


----- Sarang Ular -----
Flag :

untuk menyelesaikan challenge ini, penulis terlebih dahulu mendecompyle dengan bantuan Uncompyle6, dan saat di run akan tampil :



┌─[fallcrescent@parrot]─[~/Hackfest/Crypto/Multibyte_XOR_Source] └──╼ $ uncompyle6 ular_terbungkus.pyc
# uncompyle6 version 3.2.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 2.7.15+ (default, Nov 28 2018, 16:27:22)
# [GCC 8.2.0]
# Embedded file name: ular_terbungkus.py
# Compiled at: 2018-12-12 08:33:32
from Crypto.Cipher import AES
import hashlib, base64

class Ular:

def __init__(self):
    self.ular_flag = 'Gda+wKa52rT/1WaWzVXDVi23VemIwUNTpttG4JJddYGHDF4eSGj2/9tCZs8OTwzaizI75GTfxS/QGDKEVm9XBz2zM/WQGrM7gqDNfx3SCpVKtaENNnnYOZHwk8Lpo1wt'

def unpad(self, s):
    return s[:-ord(s[-1])]

def decrypt(self, s):
    cip = base64.b64decode(s)
    key = hashlib.md5(cip[:16]).hexdigest()
    IV = cip[-16:]
    cipher = cip[16:-16]
    aes_obj = AES.new(key, AES.MODE_CBC, IV)
    return self.unpad(aes_obj.decrypt(cipher))

def get_flag(self):
    return self.decrypt(self.ular_flag)


def main():
print '----- Sarang Ular -----'
inp_flag = raw_input('Flag : ')
real_flag = Ular().get_flag()
if inp_flag == real_flag:
    print '[+] Correct'
else:
    print '[x] Wrong'


if __name__ == '__main__':
main()
# okay decompiling ular_terbungkus.pyc

dari script diatas penulis hanya membenarkan penulisan script dengan menghapous bagian if dan input lalu menampilkan fungsi real_flag


def main():
print '----- Sarang Ular -----'
real_flag = Ular().get_flag()
print(real_flag)

Flag : HackFest{88df7b7657844da585f1590c887bbaefdb2685c6}

Serial Number

diberikan service netcat dengan alamat nc ccug.gunadarma.ac.id 6006 dan jika di run maka akan menampilkan :


HackFest 0x02 Secret Software

[?] Serial number :

dan juga diberikan sebuah file exe yang sudah, lalu penulis membukanya dengan IDA Pro dan mendapatkan :

Dan dapat di lihat bahwa service menerima angka dengan format %d-%d-%d-%d-%d dan akan dimasukkan fungsi sub_AC0 dan ketika dibuka fungsinya tertulis

Untuk menyelesaikan challenge ini penulis menggunakan perhitungan manual dikarenakan pada saat mengerjakan tidak mengetahui ada z3 tools yang dapat membantu solve perhitungan ini. Dengan membandingkan nilai dengan ketentuan if agar tidak return 0 Maka didapatkan
a1 = 2000
a2 = 2000
a3 = 4000
a4 = 8000
a5 = 4000

dan ketika dimasukan ke service



HackFest 0x02 Secret Software

[?] Serial number : 2000-2000-4000-8000-4000

Nice bro
HackFest{z3_akan_setia_menemanimu_di_masa_masa_sulit_seperti_ini}

Flag : HackFest{z3_akan_setia_menemanimu_di_masa_masa_sulit_seperti_ini}

Categories: ,

Writeup CCUG HackFest 0x02 (Cryptography)

Cryptography

One Byte XOR

diberikan file ZIP berisi source code python encryptor dan hasil enkripsinya berikut adalah scriptnya



from Crypto import Random
import base64

def main():
flag = open("flag.txt","rb").read()
key = Random.new().read(1)
res = ""
for i in range(len(flag)):
    res += chr(ord(flag[i]) ^ ord(key))
res = base64.b64encode(res)
open("encrypted","wb").write(res)

if __name__ == "__main__":
main()

Fungsi enkirptor diatas adalah meng-XOR setiap character dengan 1 byte key random, lalu hasilnya di encode ke base64. Untuk menyelesaikan challenge ini, penulis menggunakan Brute Force untuk angka dari 0 sampai 256
berikut adalah script solvernya


from Crypto import Random
import base64

flag = open("flag.txt","rb").read()
flag = base64.b64decode(flag)

def xorString(string,key):
   res = ""
   for i in range(len(string)):
   res += chr(ord(flag[i]) ^ key)
   return res

for j in range(0,256):
   resu = xorString(flag,j)
   if "HackFest" in resu:
   print j,resu

Setelah di run maka di dapatkan output :

Selamat, ini flagnya : HackFest{ketika_ragu_dan_galau_brute_force_aja}



Flag: HackFest{ketika_ragu_dan_galau_brute_force_aja}



Cryptizi


Diberikan file zip berisi source code python berupa enkriptor, berikut adalah Scriptnya





def main():
   print("#[][][]ENKRIPTOR mini " )
   x = raw_input("\n\ntYPE : \n")
   x = duniasakti(x)
   print("\n\n {}RESULT :\n" + x)
   return 0

def duniasakti(yy):
   x = list(yy)
   a = len(x) - 1
   n = a/2
   for i in range(n,a+1):
   temp = x[a-i]
   x[a-i] = x[i]
   x[i]   = temp
   a = a + 1
   v = a * 3
   for h in range(a):
   temp = x[h]
   for j in range(256):
   karakter = chr(j)
   if(karakter==temp):
   x[h] = str(j*v)
   break
   continue
   x = "Un%".join(x)
   x = list(x)
   z = list()
   yuyu = ['1','2','3','4']
   kangkang = ['!*','x','_','q']
   for i in x:
   c = i in yuyu
   if(c == True):
   i = kangkang[yuyu.index(i)]
   z.append(i)
   z = ''.join(z)
   return(z)

if __name__ == '__main__':
   main()

enkripsi ini merubah text asli (Plain text) menjadi list dan merubahnya dengan sebuah inyeger lalu di gabung dengan "Un5%" dan merubah angka menjadi !*,x,_,q secara berurutan, berikut adalah solvernya



cipher = open("xxcheap.enc","rb").read()

cipher = cipher.replace("!*","1")
cipher = cipher.replace("x","2")
cipher = cipher.replace("_","3")
cipher = cipher.replace("q","4")
cipher = cipher.replace("Un%"," ")
print cipher

a = 33
v = a * 3
x = [12375, 10395, 11484, 11286, 9999, 10197, 10890, 9999, 10791, 10395, 9900, 9405, 11484, 10395, 10692, 11583, 11385, 9405, 9603, 10395, 11385, 11583, 10890, 9603, 10791, 9405, 10197, 10890, 9603, 9900, 9603, 10593, 12177]
t = ""

print v

for i in range(33):
   h = x[i]
   y = h/v
   t += chr(y)

print(t[::-1])

maka akan keluar output


12375 10395 11484 11286 9999 10197 10890 9999 10791 10395 9900 9405 11484 10395 10692 11583 11385 9405 9603 10395 11385 11583 10890 9603 10791 9405 10197 10890 9603 9900 9603 10593 12177
99
{kadang_manusia_sulit_dimengerti}

Flag : HackFest{kadang_manusia_sulit_dimengerti}

AES Machine

diberikan sebuah koneksi netcat dengan alamat nc ccug.gunafarma.ac.id 6008 jika di jalankan maka akan keluar :



┌─[fallcrescent@parrot]─[~] └──╼ $nc ccug.gunadarma.ac.id 6008
   _ ___   ___ __ __      _ _
  /_\ |    __/ __| |   \/ |__ _ __| |_ (_)_ _  ___
 / _ \|   _| \__ \ |  |\/| / _` / _| ' \  | | ' \/ -_)
/_/ \_\___|___/ |_|  |_ \__,_\__|_||_|_|_||_\___| v1.0
                                              
Options : encrypt, decrypt, getflag, quit
[!] NOTE : You only have 3 times to encrypt your plaintext or flag
>>

dan jika di masukkan getflah akan di dapatkan flag yang terenkripsi seperti berikut:



[+] Ciphertext : b5X77CB4DqBfWtrHHF14GySO/BctWdJKkmIp5f7opxJi6HcQTL37vteKjFyn2ReXxLjq2gh6iwwNTyLSXKpSWA==

diberikan juga source code untuk menencryptnya, berikut adalah script encrpyptornya



import sys
from base64 import b64encode
from base64 import b64decode
from Crypto.Cipher import AES
from Crypto import Random
import hashlib

BLOCK_SIZE = 16
IV = hashlib.md5(Random.new().read(32)).digest()
key = hashlib.sha256(Random.new().read(64)).digest()

def pad(s):
return s + Random.new().read(BLOCK_SIZE - (len(s) % 16))

def encrypt(msg):
msg = pad(msg)
cipher = AES.new(key,AES.MODE_OFB,IV)
return b64encode(cipher.encrypt(msg))

def _unpad(s):
    return s[:-ord(s[len(s)-1:])]

def getflag():
flag = open("flag.txt","rb").read()
return encrypt(flag)

def print_(s):
sys.stdout.write(s)
sys.stdout.flush()

def println(s):
print_(s+"\n")

def welcome():
print_(""" _   ___ ___   __ __ _ _
  /_\ | __/ __| |  \/ |__ _ __| |_ (_)_ _  ___
 / _ \| _|\__ \ | |\/| / _` / _| ' \| | ' \/ -_)
/_/ \_\___|___/ |_|  |_\__,_\__|_||_|_|_||_\___| v1.0
                                                """)
def main():
num = 1
welcome()
println("")
println("Options : encrypt, decrypt, getflag, quit")
println("[!] NOTE : You only have 3 times to encrypt your plaintext or flag")
while True:
    try:
        print_(">> ")
        pil = raw_input()
        if pil == "encrypt":
            if num > 3:
                println("[!] You have use this more than 3 times")
                break
            print_("[?] Plaintext : ")
            plain = raw_input()
            println("[+] Ciphertext : " + encrypt(plain))
            num += 1
        elif pil == "decrypt":
   print_("[?] Plaintext : ")
            plain = raw_input()
   println("[+] Flag : " + decrypt(plain))
   num += 1
        elif pil == "getflag":
            if num > 3:
                println("[!] You have use this more than 3 times")
                break
            println("[+] Ciphertext : " + getflag())
            num += 1
        elif pil == "quit":
            println("[+] Exiting Program ")
            break
        else:
            println("[-] Invalid option ")
            break
    except:
        break

if __name__ == "__main__":
main()

dari source code diatas bisa disimpulkan bahwa IV dan key akan di buat random srtiap di jalankan jenis AESnya yang digunakan adalah OFB dan diencrypt menjadi base 64

untuk menyelesaikan soal ini dapat menggunakan cara menXOR kan plaintextnya lalu akan di dapatkan key yang akan di XOR untuk mendapatkan Flag.

dapat diambil contoh dari service yang di jalankan sbb:



>> encrypt
[?] Plaintext : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
[+] Ciphertext : ZrXZxidcPJVlKq+zOH0LaQT6iW8IfaY44xJZlY2Z0zAXkAJobsuDmvT6rn/RqDDisYShfbYVzTVGkjGLSbsZWA==

script solver



import base64

flag = "b5X77CB4DqBfWtrHHF14GySO/BctWdJKkmIp5f7opxJi6HcQTL37vteKjFyn2ReXxLjq2gh6iwwNTyLSXKpSWA=="
flag = base64.b64decode(flag)

plain = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
cipher = "ZrXZxidcPJVlKq+zOH0LaQT6iW8IfaY44xJZlY2Z0zAXkAJobsuDmvT6rn/RqDDisYShfbYVzTVGkjGLSbsZWA=="

def xorString(string,key):
   res = ""
   for i in range(len(string)):
   res += chr(ord(string[i]) ^ ord(key[i]))
   return res.encode("hex")

key = xorString(plain,cipher)
print xorString(flag,key)

setelah di run maka di dapatkan flag
Flag : HackFest{145ea23a549de530111205c4949c79eb1cb70f44}

MultiByte Xor

Diberikan file zip berisi Source Code Python, beserta hasil enkripsinya berikut adalah source codenya :

def main():
key = open("key.txt","rb").read().strip()
message = open("message.txt","rb").read().strip()

assert(len(key) == 12)
assert('HackFest' in message)
assert(key.isalnum() == True)
message_enc = ""
for x in range(len(message)):
    message_enc += chr(ord(message[x]) ^ ord(key[x % len(key)]))
open("message.txt.encrypted","wb").write(message_enc)

if __name__ == "__main__":
main()

Berikut Hasil dari enkripsi yang di jalankan

*I<Q;3'    I/N+;[ 7:I{
^QGxc.+(N.1? &.N,D* i9(<7$*U/

9+39k

9@.&"kI:Q='i
9N+;[    7:Gk&
?Q&r*?
9,:(.    I1^&~i
*?Uo;'I/;Q!5i*N+U=&(N!*%+Do?,#
I:U;'%N
*
9^.r"

untuk menyelesaikan challenge ini penulis menggunakan Known Plain Attack dapat menggunakan tools yang ada di internet, untuk toolsnya bisa di lihat disini. dan ketika dijalankan maka akan menampilkan :

┌─[fallcrescent@parrot]─[~/Hackfest/Crypto/Multibyte_XOR_Source] └──╼ $ ./KPA.py message.txt.encrypted 'HackFest' 12
Searching XOR-encrypted message.txt.encrypted for string 'HackFest' (max_key_length = 12)
Key length: 12
Partial Key: In����ciX0OR
Plaintext: Se����t datang����HackFest����2. Saya ����gai prob����setter b����rap semo����nda dapa����ndapatka����l baru d����HackFest����bagai co����nya chal����e ini, c����enge ini����ancang a����peserta ����Fest mem����i betul ����imana kr����grafi XO����rkerja d����enyerang����dengan m����unakan K���� Plainte����ttack.
D����ni dia f����yang bis����da submi����HackFest����wn_plain����_attack_����e2f67cdf����4ddc8e09����4cd7}

Key length: 12
Partial Key: In����ciX0OR
Plaintext: Se����t datang����HackFest����2. Saya ����gai prob����setter b����rap semo����nda dapa����ndapatka����l baru d����HackFest����bagai co����nya chal����e ini, c����enge ini����ancang a����peserta ����Fest mem����i betul ����imana kr����grafi XO����rkerja d����enyerang����dengan m����unakan K���� Plainte����ttack.
D����ni dia f����yang bis����da submi����HackFest����wn_plain����_attack_����e2f67cdf����4ddc8e09����4cd7}

Key length: 12
Partial Key: ��iKunciX0��
Plaintext: ��lamat da���� di Hack���� 0x02. S����sebagai ����lem sett����erharap ����ga Anda ����t mendap����n hal ba����ari Hack����. Sebaga����ntohnya ����lenge in����hallenge���� diranca����gar pese����HackFest����ahami be����bagaiman����iptograf����R berker����an menye����nya deng����enggunak����nown Pla����xt Attac����an ini d����lag yang����a Anda s����t : Hack����{known_p����text_att����9276e2f6����a9b94ddc����fb2d4cd7�

Key length: 12
Partial Key: In����ciX0OR
Plaintext: Se����t datang����HackFest����2. Saya ����gai prob����setter b����rap semo����nda dapa����ndapatka����l baru d����HackFest����bagai co����nya chal����e ini, c����enge ini����ancang a����peserta ����Fest mem����i betul ����imana kr����grafi XO����rkerja d����enyerang����dengan m����unakan K���� Plainte����ttack.
D����ni dia f����yang bis����da submi����HackFest����wn_plain����_attack_����e2f67cdf����4ddc8e09����4cd7}

Didapat key = IniKunciX0OR


┌─[fallcrescent@parrot]─[~/Hackfest/Crypto/Multibyte_XOR_Source]
└──╼ $ ./KPA.py message.txt.encrypted --key=IniKunciX0OR
Key length: 12
Partial Key: IniKunciX0OR
Plaintext: Selamat datang di HackFest 0x02. Saya sebagai problem setter berharap semoga Anda dapat mendapatkan hal baru dari HackFest. Sebagai contohnya challenge ini, challenge ini dirancang agar peserta HackFest memahami betul bagaimana kriptografi XOR berkerja dan menyerangnya dengan menggunakan Known Plaintext Attack.
Dan ini dia flag yang bisa Anda submit : HackFest{known_plaintext_attack_9276e2f67cdfa9b94ddc8e09fb2d4cd7}

Flag : HackFest{known_plaintext_attack_9276e2f67cdfa9b94ddc8e09fb2d4cd7}

Kindergarten Encryption

Diberikan Script Encrpytor dan emkripsi seperti berikut :


import string
import random
import sys
character = string.digits + string.lowercase + string.uppercase + string.punctuation
BLOCK_SIZE = 8
key = random.randint(2**4,len(character))

def pad(s):
res = s
while len(res) % BLOCK_SIZE != 0:
    res += " "
return res

def encrypt(s):
p = pad(s)
c = ""
mx = []
mx_t = []
for x in range(len(p)):
    if p[x] not in character:
        c += p[x]
    else:
        pos = (character.index(p[x]) + key) % len(character)
        c += character[pos]
for x in range(0,len(c),BLOCK_SIZE):
    mx.append(c[x:x+BLOCK_SIZE])
for i in range(BLOCK_SIZE):
    tmp = ""
    for j in range(len(mx)):
        tmp += mx[j][i]
    mx_t.append(tmp)
return ''.join(mx_t)[::-1]

def main():
if len(sys.argv) == 2:
    f = sys.argv[1]
    cip = open(f,"rb").read()
    cip = encrypt(cip)
    open(f+".enc","wb").write(cip)
else:
    exit()

if __name__ == "__main__":
main()

bisa disimpulkan enkripsi tersebut merupakan implementasi dari kriptografi caesar  dan column transposition cipher, berikut solvernya :

import string

BLOCK_SIZE = 8
message = open("message.txt.enc","rb").read()
message = message[::-1]
character = string.digits + string.lowercase + string.uppercase + string.punctuation

def test(key):
   mx_t = []
   ka = len(message)
   ma = ka/BLOCK_SIZE

   for i in range(0,len(message),ma):
   mx_t.append(message[i:i+ma])
   mx = ""
   
   for i in range(0,len(mx_t[0])):
   for j in range(0,len(mx_t)):
   mx += (mx_t[j][i])
   c = ""
   for x in range(len(mx)):
   if mx[x] not in character:
   c+= mx[x]
   else:
   pos = (character.index(mx[x]) - key ) % len(character)
   c += character[pos]
   return c

for key in range(2**4,len(character)):
   c = test(key)
   if "HackFest" in c:
   print "key:",key
   print "plain:\n",c
   break

Output yang di dapat :

key: 16
plain:
IKLAN UNIVERSITAS GUNADARMA
Universitas Gunadarma
Membangun Insan Cerdas Berkompetitif dan Berkarakter
Universitas Gunadarma
Bersama UG masa depan diraih saat ini
HackFest{orang_pintar_kalah_sama_orang_sabar_tekun_dan_rajin}
MARS UNIVERSITAS GUNADARMA
Majulah Gunadarma
Majulah Putra Indonesia
Tuntut Ilmu Bersemangat Baja Tuk Mengemban Tugas Mulia
Majulah Gunadarma
Majulah Putra Indonesia
Kibarkan Panji Panji Cita
Tonggak Membangun Negara
Hiduplah Gunadarma
Hidup Siswa Pendidiknya
Mengabdi Pada Negara Bangsa Nan Jaya

Flag: HackFest{orang_pintar_kalah_sama_orang_sabar_tekun_dan_rajin}

Classic Crypto Machine

diberikan service netcat yang beralamatkan nc ccug.gunadarma.ac.id 6003 yang ketika di run maka akan tampil :


--------------------------------------------
   Random Classic Crypto Machine
--------------------------------------------
Option : encrypt, decrypt, getflag, exit

>> getflag
[+] Result : DJgqTxk5GqxsqH{xiUPxUo+5s}xr+5x+Ta+xi+5UaKjuU5j+

penulis mencoba untuk input setiap huruf uppercase, lowercase, dan numerik untuk mengetahui apa saja yang akan di rubah


Asli      = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}"
Cipher = "aHDsq5YVS3kneRmfIZGPW189lC06NdXgcuME2A7FtbpywzO4QLvhUrTiJKjBxo{}"

lalu penulis mencoba encrpyt pesan seperti berikut :


>> encrypt
[?] Message : HackFest{123456ABCDEGIJKLMOPQRSTUVWXYZ789}    
[+] Result : D2gcv0kyGEBMqz{Ao7PhTt+bi}Jp+4K+jw+LN+6OaxXudQr+

lalu penulis menyusun script sbb untuk solvernya :


from string import maketrans

#raw = "HackFest{123456ABCDEGIJKLMOPQRSTUVWXYZ789}"
#raw = "D2gcv0kyGEBMqz{Ao7PhTt+bi}Jp+4K+jw+LN+6OaxXudQr+"
raw = "DJgqTxk5GqxsqH{xiUPxUo+5s}xr+5x+Ta+xi+5UaKjuU5j+"
raw = raw.replace("+","")


asli   = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}"
cipher = "aHDsq5YVS3kneRmfIZGPW189lC06NdXgcuME2A7FtbpywzO4QLvhUrTiJKjBxo{}"
transtbl = maketrans(cipher,asli)

plain = raw.translate(transtbl)

print plain

t = "cKFGYAkRsJ7IeT{L9MtZ2OP3}4QV56SXCBUa8EHDW1"
h = "HackFest{123456ABCDEGIJKLMOPQRSTUVWXYZ789}"

result = ""
for i in range(len(h)):
   pos = t.find(h[i])
   result += plain[pos]

print result

flag : HackFest{60d8828f306ede4809f1fab0ff828853}


Baby RSA


Diberikan sebuah service nc ccug.gunadarma.ac.id 6004 yang ketika dibuka akan melakukan

-----     Basic RSA HackFest 0x02     -----

[+] Level 1 : Temukan nilai n

p = 112929231839133764922499650211502042983992522246363389414474183288140649720837
q = 109099903505021106777266264281880454823285926834179667561051699220281661035493
n =

Dapat disimpulkan bahwa challenge ini akan memiliki beberapa level dengan soal yang berbeda beda. Untuk menyelesaikan level-level terdapat hint berupa link yang menunjukan halaman Wikipedia dengan itu penulis dapat mendapatkan untuk mencari nilai n dapat di lakukan n = pq maka dibuatlah script di python

>>> def soal1(p,q):
... n=p*q
... print(n)
... return;
...
>>> soal1(p,q)
12320568296545651007975344558539473699506190984476704529033056826916623164536349893268304478908382864342093065085644220702536014936470661634136750798667641

Lalu level 2
[+] Level 2 : Temukan nilai p

n = 10872329446459129667921644340962528388878929362939012297295288926876443586605345820094871187376734268471914144532889920441052111516485840345063304798849199
q = 97964102664819230216369526981268162507859658722305600628418624802857385115189
p =

Dapat menggunakan persamaan sebelumnya hanya ditukar posisi p = nq

>>> def soal2(n,q):
... p = n/q
... print(p)
... return;
...
>>> soal2(n,q)
110982790131385439183723482973777784066553128829290195687134540527228330203091





Level 3

[+] Level 3 : Temukan nilai m

pesan = aku pasti bisa jadi juara hackfest 0x02
m =

Untuk mendapatkan m dapat dilakukan pengubahan pesan menjadi hexadecimal

>>> def soal3(pesan):
... m = int(pesan.encode("hex"),16)
... print(m)
... return;
...
>>> pesan = "aku pasti bisa jadi juara hackfest 0x02"
>>> soal3(pesan)
3175160763199730136104003070276660270796333966900447388966212557680438006565173088752158388274

Level 4
[+] Level 4 : Temukan nilai phi(n)

n = 9206319279554238079698747425008417624874207283636875034394462687384683731832770440746049983145925424382008526538789703529606606309114020211552708433112187
q = 98392596907614538909695412992547731548149407230658364699581726812760734593153
phi(n) =

Untuk mendapatkan (n)dapat digunakan rumus (n) =(p-1)(q-1) maka untuk level 4

>>> def soal4(n,q):
... p = n/q
... phin = (p-1)*(q-1)
... print(phin)
... return;
...
>>> soal4(n,q)
9206319279554238079698747425008417624874207283636875034394462687384683731832578480954364508576426459271964149847992919399995028606507027058104941207936256
Level 5

[+] Level 5 : Temukan nilai d

n = 9853378978342277246592854301601474299315203685648314474324753473155118482252169802617906434483572961369844016154721468959046212604116497292113114162231737
p = 110033185946243101710239017871774914594735109397409265529182580549501277407929
e = 65537
d =

Untuk level 5, q nya tidak diketahui maka harus melakukan q = nplalu untuk (n) =(p-1)(q-1)dan d = modulo inverse e dan (n)maka dalam python di lakukan

>>> from libnum import invmod
>>> def soal5(n,p,e):
...      q = n/p
...      phin = (p-1)*(q-1)
...      d = invmod(e, phin)
...      print(d)
...      return;
...
>>> soal5(n,p,e)
3440120304613419071353450711429319826092606856147200565894451748161531134968145179213649016515631007988591748561673347510075940851176671740951158297856001

Level 6

[+] Level 6 : Temukan nilai c

pesan = 6J4fGdqv2mER1pq0cYOTiYsDOpJjJgKRIVmA9d0DQtMPAZyr
n = 160530120449698853323914225889124288546202333785790888734659128737331626915319316700266511731408151927180987601275757530973277653384961677715161263674205308817194621469376259337292610388151469412735064526307603622141517435842801463275101483227977200587303919482938745312230648306154070691886591194934605433409
q = 13165879531906425940330381135111494537878458358222582656432653812513061043891386238791888923754391942196746222741546266017174542138733300161390873843866919
e = 65537
c =

Pada level 6 ini p tidak diketahui maka harus dilakukan p = nqdan pesan masih harus di ubah ke dalam hexadecimal dan untuk c = me % nmaka dalam python dapat dilakukan

>>> def soal6(m,n,q,e):
... p = n/q
... m = int(m.encode("hex"),16)
... c = pow(m,e,n)
... print(c)
... return;
...
>>> soal6(pesan,n,q,e)
100501547972271070798318369578645466989911616757748641372952916585423785490588909924189274460434149361552127069392971622473595503186907497335888977716049079304160335989197580325853248310829095991132035902793603908571011915641163207424630738539889500138614509900784220676722179766888454341208545415304372961547

Level 7

[+] Level 7 : Temukan nilai m

ciphertext in base64 = NBhrA55dSfY00kwWshL0e3WKcXYM6QqoDxt+cP2BCcwHPc7wNHTZ+L+89wyKw3TCXDgp8GpHLEAMvOPrJFZO6KaFoyHt8R46cCrwzFwx1x5C+miHhpUNVMcExnhG4M90VPq9EfEkCmHZJtXUfjbncXs5d7kBtT/8znjc9CdB9vw=
n = 105634545350227668733616554822704614788920475329747055385504294275239128530470142574808200030192609373682071201808841553172406658025654874765485132609987007425076979724142236031162853736147304603432629192223788297598717680324572795857452903934488917270781541310261931620206108863609139447378538166776891718573
q = 10057149911218765533626529011598670489153341897417383198981179878497158384644852029373336716203886373181491358314668788822752936362913099867066628093325287
e = 65537
m =

Untuk level 7 pesan nya telah di encode dengan base64 berarti harus di decode dahulu dan di encode lagi menjadi hexadecimal lalu p dan (n)sama seperti sebelumnya dengan m =md % n dengan d =modulo inverse e dan (n)lalu m adalah pesan yang telah di decode dan di encode menjadi hex. Dalam python

>>> import base64
>>> def soal7(c,n,q,e):
... tempc = base64.b64decode(c)
... tempc = int(tempc.encode("hex"),16)
... p = n/q
... phin = (p-1)*(q-1)
... d = invmod(e, phin)
... m = pow(tempc,d,n)
... print(m)
... return;
...
>>> soal7(pesan,n,q,e)
15920080425091568109598387832238350405708995466701118404360496515404108810595592823358106083566318505980095945388855

Level 8

[+] Level 8 : Temukan plaintext

ciphertext in base64 = X4eztVA+M9+dkuxSgS3e6JdLdbv9pFy1eWx0YuQyfCBS/8N9dvX9n+VZlEtCZDmqxfHW19TdO6tiHor34fhlWOmc0X8OyBF6ywIL6l9Z0fupNv+kPnoAS1LrQb/WPfq2YmT8tuE89Nm1erDI8tjsz9Cxq2BvW1geC/aH0l5xqvw=
n = 112159657044006086576915455759176679621763496017981700046200895529676073817474177034245292799763333996176042362769229641412420129561323219586574124980985619853051416733196196651657810439513884095626601902976547198664947223165325332365109374872968723598810114042756682864529920654837856721441582636538549146817
p = 10303880386138735355196665822024787118841643672219032647140881217742041465754554143032067331382589882001248527861118412427798577586084906701529625378686187
e = 65537
plaintext =

Level 8 sama seperti level 7 dalam pengerjaan hanya tinggal mengubah hasil m dari angka ke string

>>> from libnum import n2s
>>> def soal8(c,n,q,e):
... tempc = base64.b64decode(c)
... tempc = int(tempc.encode("hex"),16)
... p = n/q
... phin = (p-1)*(q-1)
... d = invmod(e, phin)
... m = pow(tempc,d,n)
... str = n2s(m)
... print(str)
... return;
...
>>> soal8(c,n,p,e)
FBaZgCWjZ7n0QxUqH5LUD8opOegltdBGThfGkw8VdOmxNYmU

Dan di dapatkan output

[+] Baik, sudah saatnya aku memberi kakak flag
[+] Ini flagnya kak : HackFest{basic_RSA_itu_pentiing_buangeet_lhoo_kak_hehe}

Flag : HackFest{basic_RSA_itu_pentiing_buangeet_lhoo_kak_hehe}

Categories: ,

http://www.resepkuekeringku.com/2014/11/resep-donat-empuk-ala-dunkin-donut.html http://www.resepkuekeringku.com/2015/03/resep-kue-cubit-coklat-enak-dan-sederhana.html http://www.resepkuekeringku.com/2014/10/resep-donat-kentang-empuk-lembut-dan-enak.html http://www.resepkuekeringku.com/2014/07/resep-es-krim-goreng-coklat-kriuk-mudah-dan-sederhana-dengan-saus-strawberry.html http://www.resepkuekeringku.com/2014/06/resep-kue-es-krim-goreng-enak-dan-mudah.html http://www.resepkuekeringku.com/2014/09/resep-bolu-karamel-panggang-sarang-semut-lembut.html

Copyright © FallCrescent | Powered by Blogger

Design by Anders Noren       Up ↑