This document summarizes a Capture the Flag (CTF) competition report. It describes the different challenges in the competition under categories like Web Hacking, Exploitation, Networking, Cryptography, Reverse Engineering, and Programming. For the Web Hacking challenges, the document explains how the author solved an easy challenge by spoofing the client IP address and a medium challenge by decrypting an AES-encrypted ciphertext to retrieve system information. Overall, the document provides details on the CTF challenges and the author's approaches to solving some of them.
1 of 26
More Related Content
IDSECCONF2013 CTF online Write Up
1. IDSECCONF
2013
CTF
Report
by
Rizki
Wicaksono
/
ilmuHacking.com
A.
WEB
HACKING
2
A.1
EASY
2
A.2
MEDIUM
2
A.3
HARD
6
B.
EXPLOITATION
9
B.1
EASY
9
B.
2
MEDIUM
9
B.3
HARD
EXPLOIT
10
C.
NETWORKING
13
C.1
EASY
13
C.2
MEDIUM
13
D.
CRYPTOGRAPHY
21
D.1
EASY
21
E.
REVERSE
ENGINEERING
23
E.1
EASY
23
E.2
MEDIUM
24
F.
PROGRAMMING
25
F.1
EASY
25
F.2
MEDIUM
25
2. A.
Web
Hacking
A.1
Easy
Accomplishing
this
mission
exploits
the
X-‐Forwarded-‐For
header.
PHP
provides
$_SERVER[‘REMOTE_ADDR’]
variable
as
client
IP
address.
This
methods
perfect
for
non-‐proxied
client.
Unfortunately,
client
accessing
web
behind
proxy
is
not
detected
with
this
method.
Apparently
the
target
script
use
X-‐Forwarded-‐For
header
to
detect
client
address
behind
proxy.
Since
request
header
is
controlled
by
attacker,
I
can
provide
spoofed
address
to
make
me
looks
like
coming
from
inside
their
own
network.
This
figure
below
show
how
I
managed
to
bypass
the
filter
by
pretending
to
be
coming
from
67.220.79.46
address
using
X-‐Forwarded-‐For
header.
A.2
Medium
Goal
of
this
mission
is
to
get
system
information
of
the
target
server
(w2.ctf.2013.idsecconf.org).
The
figure
below
is
its
index
page
with
detail
POST
parameters
revealed
for
clarity.
3.
Thankfully,
mission
author
tIeted
a
clue
later
on
in
the
figure
below.
It
clearly
shoId
the
path
to
accomplish
this
mission.
Apparently
server
try
to
retrieve
data
from
a
URL,
decrypt
retrieved
data
and
execute
either
“date”
command
or
other
command
suspected
to
be
“uname
-‐a”
based
on
decrypted
data.
POST
parameters
domain
and
file
are
together
combined
as
URL
from
which
the
server
retrieve
data.
Since
retrieved
data
will
be
decrypted
by
decryptData()
function,
data
that
will
be
retrieved
must
be
in
the
form
of
encrypted
data.
I
are
given
with
default
value
of
domain
(w2.ctf.2013.idsecconf.org)
and
file
parameter.
(psPokWxZxrUJE.txt)
so
that
the
URL
will
be
http://w2.ctf.2013.idsecconf.org/psPokWxZxrUJE.txt.
This
figure
below
shows
the
content
of
the
default
domain
and
file
URL.
4.
The
file
contents
is
base64
encoded
32
byte
size
ciphertext.
What
facts
can
I
draw
about
this?
• I
know
the
plaintext
of
this
ciphertext
is
either
date
or
uname
command
in
the
$white
array
• Ciphertext
size
is
either
multiple
of
8
or
16
byte.
DES
block
size
is
8
byte
and
AES
block
size
is
16
byte.
If
it
was
DES
this
ciphertext
takes
4
blocks,
but
if
it
was
AES
this
ciphertext
takes
2
blocks
• I
are
sure
that
it
can’t
be
uname
command
because
it
will
be
padded
to
16
bytes
in
DES
(8x2
blocks)
and
also
16
byte
in
AES
(16x1
block).
• I
know
that
date
command’s
length
is
20
byte
which
will
be
padded
to
24
byte
(8x3
blocks)
in
DES
or
will
be
padded
to
32
byte
(16x2
blocks)
in
AES
• Since
I
know
that
default
ciphertext
value
is
32
byte
size
I
assume
that
it
was
an
AES
(known
as
RIJNDAEL
in
PHP)
encrypted
data.
Okay
I
know
that
it
was
AES
encryption.
I
still
have
two
more
questions.
What
is
the
key
and
mode
of
operation
used
?
AES
have
two
popular
variants,
AES-‐128
needs
16
byte
key
and
AES-‐256
needs
32
byte
key.
In
the
index
page
I
are
given
with
token
parameter
that
has
32
byte
long
string
of
hex
characters.
This
token
size
match
match
with
AES-‐256
variant,
so
I
assume
that
it
must
be
AES-‐256
encryption.
One
more
question
to
answer
is
what
the
mode
of
operation
used?
Is
it
CBC
or
ECB.
Since
I
know
that
ciphertext
size
is
32
which
is
an
encrypted
form
of
20
byte
of
plaintext
+
12
byte
of
padding,
there
are
no
initialization
vector
(IV)
embedded
in
ciphertext.
Mode
of
operation
that
use
no
IV
is
ECB
mode.
I
made
little
script
in
figure
below,
to
decrypt
and
encrypt
data
in
AES-‐256
operated
under
ECB
mode.
5.
This
figure
below
shows
output
of
above
script.
I
have
prepared
a
file
resides
containing
encrypted
“uname
-‐a”
on
this
URL:
http://www.ilmuhacking.com/wp-‐content/uploads/2013/05/kriptonite.txt
Parameter
POST
domain
must
be
“www.ilmuhacking.com”
and
parameter
POST
file
must
be
“/wp-‐content/uploads/2013/05/kriptonite.txt”
to
make
the
target
retrieve
data
from
my
URL.
After
all
preparation
made,
I
can
start
attacking.
This
figure
below
shows
a
successful
attack.
6.
A.3
Hard
This
mission
start
with
a
url
which
says
“Hi,
I'm
secure
Webservice
application,
you
can
connect
with
REST,XML-‐RPC
or
SOAP”
:
http://services.ctf.2013.idsecconf.org:8000/ctf.php
Since
it
is
a
Webservice,
i
need
to
get
WSDL.
Usually
many
Web
service
products
will
expose
its
wsdl
by
appending
string
“?wsdl”,
lets
try
that.
Great!
Now
i
will
use
soapUI
as
Web
service
client
to
invoke
services
provided.
getTicket
service
needs
a
valid
username
and
password.
7.
I
start
by
brute
forcing
the
most
common
username
and
password
until
finally
know
that
the
username
and
password
is
admin/admin.
I
now
have
a
valid
ticket.
The
author
of
this
challenge
tIeted
about
this
mission.
The
ticket
i
already
have
is
correct
and
i
spotted
an
sql
injection
vulnerability
on
the
ID
parameter.
Strategy
I
used
to
accomplish
this
mission
is
by
exploiting
sql
injection
vulnerability.
The
query
is
select
from
challenge
table
so
I
know
that
this
source
code
is
getChallenge
service.
When
getChallenge
service
receive
invalid
ticket
it
respond
with
this
error
message.
Valid
request
must
be
submitted
in
the
form
of
ticket|secureRequest.
I
already
have
ticket,
but
what
secureRequest
is
?
Apparently
secureRequest
will
be
decrypted
and
will
be
used
as
ID
parameter
in
the
SQL
query.
Since
I
will
exploit
SQL
injection,
I
have
to
submit
encrypted
injection
payload.
I
just
guess
the
decryptData
in
this
challenge
is
similar
to
the
one
used
in
medium
challenge
since
it
has
the
same
function
name.
Now
there
is
no
token
parameter,
but
there
is
another
32
byte
value
that
is
the
ticket
So
I
use
the
same
function
to
encrypt
and
decrypt
as
medium
challenge
but
using
different
key.
8.
This
figure
below
is
the
script
I
made
to
exploit
the
sql
injection
vulnerability.
I
use
“union
select”
and
subquery
to
be
able
to
query
from
another
table.
This
figure
below
shows
user(),
database()
and
tables
available
in
ctf2013
database.
The
key
is
inside
the
punyaadmin
table.
This
key
is
encrypted
using
the
same
method
as
encrypting
request.
9.
B.
Exploitation
B.1
Easy
The
target
program
check
file
permission
of
patch.file
and
delay
a
few
seconds
before
read
and
print
the
contents
of
file
to
stdout.
Since
there
is
a
delay
between
checking
permission
and
actually
open
and
read
the
file,
i
can
trick
this
program
to
read
level0.key
via
symbolic
link
just
after
the
program
successfully
check
permission
and
before
the
program
read
the
file.
This
kind
of
exploitation
is
called
TOCTOU
(time
of
check-‐time
of
use)
race
condition
attack.
First
I
use
empty
file
and
get
patch.file
symlinked
to
that
file.
Because
file
kosong
is
readable
by
level0,
it
must
passed
permission
check.
Then,
i
run
./level0
in
the
background
and
immediately
invoke
“ln
-‐f
-‐s
level0.key
patch.file”
to
had
patch.file
symlinked
to
level0.key
while
the
program
still
in
delay
period.
The
figure
below
show
how
to
attack
the
target.
B.
2
Medium
This
target
program
called
wget
to
retrieve
level2a.key
in
the
URL
localhost/~level2a/level2a.key.
Although
the
file
is
not
really
exist
in
the
URL,
the
URL
tell
us
about
full
path
of
level2a.key
(/home/level2a/level2a.key).
10. The
program
called
wget
without
specifying
absolute
path.
In
this
situation
I
can
trick
the
program
to
call
my
wget
instead
of
the
real
wget
by
preparing
my
malicious
wget
and
setting
PATH
environment
to
current
directory.
This
figure
below
show
how
to
attack
this
target
program.
B.3
Hard
Exploit
This
time
we
deal
with
classic
buffer
overflow
situation
but
with
hardened
environment
because
ASLR
is
activated.
Although
ASLR
is
used
to
randomize
memory
layout,
actually
ASLR
in
32
bit
environment
is
not
really
effective
because
the
address
is
still
highly
predictable.
The
strategy
I
used
is
to
spray
environment
with
500
environment
variables
consisted
of
900
bytes
NOP
sled
and
35
byte
shellcode
and
then
i
run
the
target
program
with
return
address
of
one
of
those
environment
variables.
Hopefully
the
return
address
hit
NOP
sled
and
eventually
execute
my
shellcode.
envpayload.py
This
tool
prints
to
stdout
900
byte
NOP
sled
+
35
byte
shellcode.
injectenv.sh
This
tool
inject
shellcode
into
500
environment
variables,
named
EGG1
to
EGG500.
This
figure
below
confirms
that
my
shellcode
has
been
injected
to
500
environment
variables.
11.
getegg
This
tool
compiled
outside
(no
gcc
on
the
target
box),
hexdump
copied
and
converted
to
binary
using
xxd
command.
This
tool
get
address
of
EGG250
environment
variable
and
the
address
is
used
as
guess
for
return
address.
makepayload.py
This
tool
filled
“thefile”
with
60
byte
junk
and
return
address
specified
by
argument
1.
12.
prepare.sh
This
tool
create
thefile
using
address
of
EGG250
environment
variables
as
return
address.
Lets
Hack
it
In
order
to
defeat
ASLR,
i
need
to
run
two
things:
prepare.sh
and
level2
iteratively
until
it
hit
my
NOP
sled
+
shellcode.
This
figure
below
shows
it
hit
just
on
the
second
try.
13. C.
Networking
C.1
Easy
There
are
3
files
PCAPNG
containing
WPA
handshake
frame.
Actually
i
didn’t
manage
to
crack
network1
cap
file
even
after
i
used
very
big
wordlist.
The
other
file,
network3
is
very
easy
to
crack
with
standard
wordlist.
The
figure
below
shows
successful
attack
against
network3
cap
file
using
aircrack-‐ng.
C.2
Medium
The
scenario
in
this
challenge
is
OBEX
file
transfer
has
been
captured,
extract
the
file
and
get
key
hidden
inside
the
file.
I
found
good
reference
in
this
http://www.fbakan.de/serexxobex/Commented-‐
Example-‐OBEX-‐Communication-‐with-‐SE-‐K310i.txt
and
managed
to
manually
extract
file
contents.
Frame
48
14.
02
=
PUT
1000
=
4096
bytes
length
01
=
HI
for
Name
0015
=
Length
of
Name
header
0064006100740061002e007400780074
=
data.txt
0000c3
=
HEader,
length
object
000010f5
=
total
length
of
file
=
4341
48
=
content
of
file
0fe3
=
length
of
body
part
(4067)
976
byte
of
byte
chunk:
66666438666665303030313034613436343934363030303130313030303030
31303030313030303066666462303034333030303230313031303130313031
30323031303130313032303230323032303230343033303230323032303230
35303430343033303430363035303630363036303530363036303630373039
30383036303730393037303630363038306230383039306130613061306130
61303630383062306330623061306330393061306130616666646230303433
30313032303230323032303230323035303330333035306130373036303730
61306130613061306130613061306130613061306130613061306130613061
30613061306130613061306130613061306130613061306130613061306130
61306130613061306130613061306130613061306130613061306130613061
30613061306166666330303031313038303033323030333230333031323230
30303231313031303331313031666663343030316630303030303130353031
30313031303130313031303030303030303030303030303030303031303230
33303430353036303730383039306130626666633430306235313030303032
30313033303330323034303330353035303430343030303030313764303130
32303330303034313130353132323133313431303631333531363130373232
37313134333238313931613130383233343262316331313535326431663032
34333336323732383230393061313631373138313931613235323632373238
20.
02
=
PUT
011b
=
283
bytes
48
=
header
(content
of
file)
0118
=
280
bytes
66643639633561393663373364356131336132393337366437623334666630
30323666393765363566646162666463333435336266653037343535393838
38653036633363353763633766313733633131653061643433653236646364
65356666383366346262383939666566346233353832333331666139326239
61323861303064386630396638306663306338313763626630363639326264
33613639643038666630306439366264306234316630393738353632303363
61663063653965626337366232386337663461323861303065616234636431
33343538393733306539313661383437343262366530376634616438633035
303430313861323861303033306265393435313435303037666664390a
After
combining
all
data
from
all
frames
related
to
data
transfer,
I
can
convert
those
bytes
into
binary
file.
This
figure
below
is
file
extracted
from
OBEX
capture
file.
21.
The
key
is
not
apparent
in
that
file,
it
is
hidden
using
steghide,
one
of
steganography
tools.
I
made
simple
script
to
brute
force
steghide
password
based
on
standard
john
the
ripper
wordlist.
D.
Cryptography
D.1
Easy
I
use
this
simple
script
to
brute
force
possible
shift
count
in
julius
cipher.
22.
This
figure
below
shows
a
valid
key
found,
27.
Even
though
the
text
is
not
perfectly
decrypted,
the
decrypted
text
is
good
enough
to
be
googled.
That
text
is
a
poem
created
by
rendra.
23.
E.
Reverse
Engineering
E.1
Easy
The
goal
of
this
challenge
is
to
find
password.
Here
is
the
main
function
disassembled
in
GDB.
24. On
main+38
the
program
call
scanf
and
stored
inputted
value
in
EAX
register.
Later,
on
main+52,
a
cmp
instruction
compare
EAX
register
(the
value
inputted
by
user)
with
0x56C1FAE
value.
This
comparison
leads
to
two
branches
of
code:
• Jump
to
main+77
and
print
string
stored
in
address
0x80485d9
which
is
“Password
Salah
gan!”
• Continue
to
main+54
and
print
formatted
string
stored
in
address
0x80485b8
which
is
“Yeah,
itulah
Flag/key
kamu!
%d
n”
Based
on
this
condition
and
branches
I
know
that
the
key
must
be
0x56C1FAE
or
90972078
in
decimal.
E.2
Medium
The
goal
of
this
challenge
is
to
find
serial
number
for
our
own
username.
Lets
start
debugging
it
with
gdb.
The
most
important
part
is
when
this
program
call
strcmp
to
compare
the
right
key
and
the
key
inputted
by
user.
Lets
add
breakpoint
at
that
point.
I
run
this
program
with
username
“abcd”.
Just
right
before
strcmpt
called,
we
can
see
what
RSI
registers
pointed
to.
RSI
register
point
to
address
of
string
“2345”,
and
apparently
this
is
the
serial
number
for
“abcd”.
25.
From
my
last
trial
and
a
few
other
trials,
I
know
that
serial
number
formula
of
a
given
username
is
just
like
julius
caesar
cipher
with
-‐47
as
key.
My
own
username
is
“kriptonite”,
so
I
can
easily
find
serial
number
by
shifting
each
character
47
times
to
the
left.
The
serial
for
user
kriptonite
is
“<C:AE@?:E6”
and
the
key
is
ascii
code
for
each
serial
character.
F.
Programming
F.1
Easy
In
this
challenge
we
must
find
the
10131337th
prime
number.
I
use
very
naïve
strategy,
i
generate
around
all
prime
numbers
from
2
upto
200
million.
I
use
the
following
code
to
generate
prime
numbers
(
the
source
borrowed
from
http://rebrained.com/?p=458
)
.
It
takes
only
4minutes
to
generate
11
million
prime
numbers.
After
generating
all
those
numbers,
I
can
easily
find
the
10131337th
prime
number.
F.2
Medium
26. This
challenge
is
not
hard
because
I
already
have
list
of
prime
numbers.
My
strategy
was
to
convert
PDF
to
text
and
reformatted
into
one
number
per
line.
After
I
have
two
list,
one
with
prime
number
only
and
the
other
with
prime
and
some
non-‐prime
number,
I
can
diff
them
to
get
the
non-‐prime
number.
First
I
must
cut
my
list
because
my
list
is
too
much.
I
want
my
list
to
have
the
same
maximum
number
as
given
in
CTF
challenge.
Now,
I
am
ready
to
diff
them
out.
The
key
is
concatenation
of
10849,
52605735,
and
190077777.