This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
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.
0 comments:
Post a Comment