Saturday, December 17, 2016

Write Up CTF GKSK - PWN

December 17, 2016


Sedikit meramaikan CTF GKSK yang di selengarakan di stikom bali. Pertama saya akan bahas tentang kategori pwn.

#!/usr/bin/env python2
import socket
import threading
import time
import SocketServer
import random
HOST = "192.168.0.254"
PORT = 4001
WELCOME_MSG = "Format: number1<space><operator><space>number2\n"
ERROR_MSG = "Invalid!\n"
CORRECT_MSG = "Correct!\n"
WRONG_MSG = "Incorrect!\n"
CONGRATS = "CONGRATS DUDE! BUT YOU WON'T GET THE FLAG :P\n"
MAX_TO_SOLVE = 5
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def run_equation(self):
stat = True
min_val = 1; max_val = 10
rand_num = random.randint(min_val, max_val)
num_solved = 0
while stat:
check = rand_num * random.randint(0, rand_num)
self.request.sendall("What is equation of {} ?\n".format(check))
self.request.sendall("Equation: ")
equation = self.request.recv(1024)
if len(equation.split()) == 3:
eq = eval(equation)
self.request.sendall(str(eq) + "\n")
if eq == check:
self.request.sendall(CORRECT_MSG)
num_solved += 1
else:
self.request.sendall(WRONG_MSG)
else:
self.request.sendall(ERROR_MSG)
check = rand_num * random.randint(0, rand_num)
if num_solved == MAX_TO_SOLVE:
stat = False
self.request.sendall(CONGRATS)
def handle(self):
self.request.sendall(WELCOME_MSG)
self.run_equation()
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
pass
if __name__ == "__main__":
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
ip, port = server.server_address
server_thread = threading.Thread(target=server.serve_forever)
server_thread.daemon = False
server_thread.start()
while True:
try:
time.sleep(1)
except:
break
server.shutdown()
server.server_close()
view raw pwn.py hosted with ❤ by GitHub


Di atas merupakan full bagian dari source codenya. Pertama kita analisa apa kejanggalan yang terjadi pada web tersebut. Kejanggalannya berada dari line 29 - 31 yang dimana pada line 29 inputan kita sebagai client akan di tampung pada variable equation yang dimana pada line 30 di lakukan pengecekan yang di split dan di chek panjangnya sama dengan 3. Dan pada line 31 di eksekusi lah inputan kita ke eval yang berarti kita dapat melakukan manipulasi script di inputan kita untuk dapat melakukan RCE ( Remote Code Execution ) untuk mendapatkan flag yang kita cari-cari.

Untuk mengujinya coba kita mengirim balik terlebih dahulu apa inputan kita dengan inputan : self.request.sendall(eqution) - t . Script ini akan mengirimkan ke kita inputan kita lagi. Berarti kita perlu sedikit refrensi ke link ini http://sethsec.blogspot.co.id/2016/11/exploiting-python-code-injection-in-web.html. Disana di berikan contoh rce eval yang kasusnya sama seperti contoh ini. Mari kita coba melakukan command ls terlebih dahulu dengan script seperti ini self.request.sendall(__import__("os").popen("ls").read()) - t  oiya - t ini untuk melengkapi pengechekan yang terjadi di line 30
Hasilnya seperti berikut.



Nah okeh rupanya sudah berhasil melakukan rce selanjutnya kita tinggal melakukan pembacaan file dengan menggunakan command cat karena disini tidak dapat menggunakan space berarti kita perlu sedikit mengubahnya seperti ini cat<nama_file sehingga script lengkapnya seperti ini self.request.sendall(__import__("os").popen("cat<flag.txt").read() dan hasilnya seperti ini.


Nah flagnya muncul disini saya mengujinya di local di karenakan saya tidak punya servernya. Lagi 1 kita juga bisa membaca file dengan open("nama_file").read(). Ok untuk writeup lainnya nanti saya share.

Written by

aringan komputer (jaringan) adalah sebuah sistem yang terdiri atas dua komputer atau lebih yang didesain untuk dapat berbagi sumber daya ...

0 comments:

 

© 2015 Learning Basic Network. All rights resevered. Designed by Templateism

Back To Top